/[svn]/libgig/trunk/src/gig.h
ViewVC logotype

Diff of /libgig/trunk/src/gig.h

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 3443 by schoenebeck, Sat Dec 22 20:48:34 2018 UTC revision 3952 by schoenebeck, Sat Jun 19 09:10:33 2021 UTC
# Line 2  Line 2 
2   *                                                                         *   *                                                                         *
3   *   libgig - C++ cross-platform Gigasampler format file access library    *   *   libgig - C++ cross-platform Gigasampler format file access library    *
4   *                                                                         *   *                                                                         *
5   *   Copyright (C) 2003-2018 by Christian Schoenebeck                      *   *   Copyright (C) 2003-2021 by Christian Schoenebeck                      *
6   *                              <cuse@users.sourceforge.net>               *   *                              <cuse@users.sourceforge.net>               *
7   *                                                                         *   *                                                                         *
8   *   This library is free software; you can redistribute it and/or modify  *   *   This library is free software; you can redistribute it and/or modify  *
# Line 26  Line 26 
26    
27  #include "DLS.h"  #include "DLS.h"
28  #include <vector>  #include <vector>
29    #include <array> // since C++11
30    
31  #ifndef __has_feature  #ifndef __has_feature
32  # define __has_feature(x) 0  # define __has_feature(x) 0
# Line 50  Line 51 
51  # define LIST_TYPE_3GNL 0x33676E6C  # define LIST_TYPE_3GNL 0x33676E6C
52  # define LIST_TYPE_3LS  0x334c5320 // own gig format extension  # define LIST_TYPE_3LS  0x334c5320 // own gig format extension
53  # define LIST_TYPE_RTIS 0x52544953 // own gig format extension  # define LIST_TYPE_RTIS 0x52544953 // own gig format extension
54    # define LIST_TYPE_3DNM 0x33646e6d
55  # define CHUNK_ID_3GIX  0x33676978  # define CHUNK_ID_3GIX  0x33676978
56  # define CHUNK_ID_3EWA  0x33657761  # define CHUNK_ID_3EWA  0x33657761
57  # define CHUNK_ID_3LNK  0x336C6E6B  # define CHUNK_ID_3LNK  0x336C6E6B
# Line 61  Line 63 
63  # define CHUNK_ID_SCRI  0x53637269 // own gig format extension  # define CHUNK_ID_SCRI  0x53637269 // own gig format extension
64  # define CHUNK_ID_LSNM  0x4c534e4d // own gig format extension  # define CHUNK_ID_LSNM  0x4c534e4d // own gig format extension
65  # define CHUNK_ID_SCSL  0x5343534c // own gig format extension  # define CHUNK_ID_SCSL  0x5343534c // own gig format extension
66    # define CHUNK_ID_SCPV  0x53435056 // own gig format extension
67  # define CHUNK_ID_LSDE  0x4c534445 // own gig format extension  # define CHUNK_ID_LSDE  0x4c534445 // own gig format extension
68    # define CHUNK_ID_3DDP  0x33646470
69  #else  // little endian  #else  // little endian
70  # define LIST_TYPE_3PRG 0x67727033  # define LIST_TYPE_3PRG 0x67727033
71  # define LIST_TYPE_3EWL 0x6C776533  # define LIST_TYPE_3EWL 0x6C776533
# Line 69  Line 73 
73  # define LIST_TYPE_3GNL 0x6C6E6733  # define LIST_TYPE_3GNL 0x6C6E6733
74  # define LIST_TYPE_3LS  0x20534c33 // own gig format extension  # define LIST_TYPE_3LS  0x20534c33 // own gig format extension
75  # define LIST_TYPE_RTIS 0x53495452 // own gig format extension  # define LIST_TYPE_RTIS 0x53495452 // own gig format extension
76    # define LIST_TYPE_3DNM 0x6d6e6433
77  # define CHUNK_ID_3GIX  0x78696733  # define CHUNK_ID_3GIX  0x78696733
78  # define CHUNK_ID_3EWA  0x61776533  # define CHUNK_ID_3EWA  0x61776533
79  # define CHUNK_ID_3LNK  0x6B6E6C33  # define CHUNK_ID_3LNK  0x6B6E6C33
# Line 80  Line 85 
85  # define CHUNK_ID_SCRI  0x69726353 // own gig format extension  # define CHUNK_ID_SCRI  0x69726353 // own gig format extension
86  # define CHUNK_ID_LSNM  0x4d4e534c // own gig format extension  # define CHUNK_ID_LSNM  0x4d4e534c // own gig format extension
87  # define CHUNK_ID_SCSL  0x4c534353 // own gig format extension  # define CHUNK_ID_SCSL  0x4c534353 // own gig format extension
88    # define CHUNK_ID_SCPV  0x56504353 // own gig format extension
89  # define CHUNK_ID_LSDE  0x4544534c // own gig format extension  # define CHUNK_ID_LSDE  0x4544534c // own gig format extension
90    # define CHUNK_ID_3DDP  0x70646433
91  #endif // WORDS_BIGENDIAN  #endif // WORDS_BIGENDIAN
92    
93  #ifndef GIG_DECLARE_ENUM  #ifndef GIG_DECLARE_ENUM
# Line 148  namespace gig { Line 155  namespace gig {
155          curve_type_unknown   = 0xffffffff  /**< Unknown curve type. */          curve_type_unknown   = 0xffffffff  /**< Unknown curve type. */
156      );      );
157    
158        /** Defines the wave form type used by an LFO (gig format extension).
159         *
160         * This is a gig format extension. The original Gigasampler/GigaStudio
161         * software always used a sine (sinus) wave form for all its 3 LFOs, so this
162         * was not configurable in the original gig format. Accordingly setting any
163         * other wave form than sine (sinus) will be ignored by the original
164         * Gigasampler/GigaStudio software.
165         *
166         * @see enumCount(), enumKey(), enumKeys(), enumValue()
167         */
168        GIG_DECLARE_ENUM(lfo_wave_t,
169            lfo_wave_sine     = 0,  /**< Sine (sinus) wave form (this is the default wave form). */
170            lfo_wave_triangle = 1,  /**< Triangle wave form. */
171            lfo_wave_saw      = 2,  /**< Saw (up) wave form (saw down wave form can be achieved by flipping the phase). */
172            lfo_wave_square   = 3,  /**< Square wave form. */
173        );
174    
175      /** Dimensions allow to bypass one of the following controllers.      /** Dimensions allow to bypass one of the following controllers.
176       *       *
177       * @see enumCount(), enumKey(), enumKeys(), enumValue()       * @see enumCount(), enumKey(), enumKeys(), enumValue()
# Line 338  namespace gig { Line 362  namespace gig {
362          float        zone_size;  ///< Intended for internal usage: reflects the size of each zone (128/zones) for normal split types only, 0 otherwise.          float        zone_size;  ///< Intended for internal usage: reflects the size of each zone (128/zones) for normal split types only, 0 otherwise.
363      };      };
364    
365      /** Defines which frequencies are filtered by the VCF.      /** Audio filter types.
366         *
367         * The first 5 filter types are the ones which exist in GigaStudio, and
368         * which are very accurately modeled on LinuxSampler side such that they
369         * would sound with LinuxSampler exactly as with GigaStudio.
370         *
371         * The other filter types listed here are extensions to the gig format and
372         * are LinuxSampler specific filter type implementations. Note that none of
373         * these are duplicates of the GigaStudio filter types. For instance
374         * @c vcf_type_lowpass (GigaStudio) and @c vcf_type_lowpass_2p
375         * (LinuxSampler) are both lowpass filters with 2 poles, however they do
376         * sound differently.
377       *       *
378       * @see enumCount(), enumKey(), enumKeys(), enumValue()       * @see enumCount(), enumKey(), enumKeys(), enumValue()
379       */       */
380      GIG_DECLARE_ENUM(vcf_type_t,      GIG_DECLARE_ENUM(vcf_type_t,
381          vcf_type_lowpass      = 0x00, /**< Standard lowpass filter type. */          vcf_type_lowpass       = 0x00, /**< Standard lowpass filter type (GigaStudio). */
382          vcf_type_lowpassturbo = 0xff, /**< More poles than normal lowpass. */          vcf_type_lowpassturbo  = 0xff, /**< More poles than normal lowpass (GigaStudio). */
383          vcf_type_bandpass     = 0x01, /**< Bandpass filter type. */          vcf_type_bandpass      = 0x01, /**< Bandpass filter type (GigaStudio). */
384          vcf_type_highpass     = 0x02, /**< Highpass filter type. */          vcf_type_highpass      = 0x02, /**< Highpass filter type (GigaStudio). */
385          vcf_type_bandreject   = 0x03  /**< Band reject filter type. */          vcf_type_bandreject    = 0x03, /**< Band reject filter type (GigaStudio). */
386            vcf_type_lowpass_1p    = 0x11, /**< [gig extension]: 1-pole lowpass filter type (LinuxSampler). */
387            vcf_type_lowpass_2p    = 0x12, /**< [gig extension]: 2-pole lowpass filter type (LinuxSampler). */
388            vcf_type_lowpass_4p    = 0x14, /**< [gig extension]: 4-pole lowpass filter type (LinuxSampler). */
389            vcf_type_lowpass_6p    = 0x16, /**< [gig extension]: 6-pole lowpass filter type (LinuxSampler). */
390            vcf_type_highpass_1p   = 0x21, /**< [gig extension]: 1-pole highpass filter type (LinuxSampler). */
391            vcf_type_highpass_2p   = 0x22, /**< [gig extension]: 2-pole highpass filter type (LinuxSampler). */
392            vcf_type_highpass_4p   = 0x24, /**< [gig extension]: 4-pole highpass filter type (LinuxSampler). */
393            vcf_type_highpass_6p   = 0x26, /**< [gig extension]: 6-pole highpass filter type (LinuxSampler). */
394            vcf_type_bandpass_2p   = 0x32, /**< [gig extension]: 2-pole bandpass filter type (LinuxSampler). */
395            vcf_type_bandreject_2p = 0x42  /**< [gig extension]: 2-pole bandreject filter type (LinuxSampler). */
396      );      );
397    
398      /**      /**
# Line 433  namespace gig { Line 478  namespace gig {
478      GIG_DECLARE_ENUM(sust_rel_trg_t,      GIG_DECLARE_ENUM(sust_rel_trg_t,
479          sust_rel_trg_none        = 0x00, /**< No release triggered sample(s) are played on sustain pedal up (default). */          sust_rel_trg_none        = 0x00, /**< No release triggered sample(s) are played on sustain pedal up (default). */
480          sust_rel_trg_maxvelocity = 0x01, /**< Play release trigger sample(s) on sustain pedal up, and simply use 127 as MIDI velocity for playback. */          sust_rel_trg_maxvelocity = 0x01, /**< Play release trigger sample(s) on sustain pedal up, and simply use 127 as MIDI velocity for playback. */
481          sust_rel_trg_keyvelocity = 0x02  /**< Play release trigger sample(s) on sustain pedal up, and use the key's last MIDI note-on velocity for playback. */          sust_rel_trg_keyvelocity = 0x02  /**< Play release trigger sample(s) on sustain pedal up, and use the key`s last MIDI note-on velocity for playback. */
482      );      );
483    
484      // just symbol prototyping      // just symbol prototyping
# Line 505  namespace gig { Line 550  namespace gig {
550              uint8_t            EG1ControllerAttackInfluence;  ///< Amount EG1 Controller has influence on the EG1 Attack time (0 - 3, where 0 means off).              uint8_t            EG1ControllerAttackInfluence;  ///< Amount EG1 Controller has influence on the EG1 Attack time (0 - 3, where 0 means off).
551              uint8_t            EG1ControllerDecayInfluence;   ///< Amount EG1 Controller has influence on the EG1 Decay time (0 - 3, where 0 means off).              uint8_t            EG1ControllerDecayInfluence;   ///< Amount EG1 Controller has influence on the EG1 Decay time (0 - 3, where 0 means off).
552              uint8_t            EG1ControllerReleaseInfluence; ///< Amount EG1 Controller has influence on the EG1 Release time (0 - 3, where 0 means off).              uint8_t            EG1ControllerReleaseInfluence; ///< Amount EG1 Controller has influence on the EG1 Release time (0 - 3, where 0 means off).
553                lfo_wave_t         LFO1WaveForm;                  ///< [gig extension]: The fundamental wave form to be used by the amplitude LFO, e.g. sine, triangle, saw, square (default: sine).
554              double             LFO1Frequency;                 ///< Frequency of the sample amplitude LFO (0.10 - 10.00 Hz).              double             LFO1Frequency;                 ///< Frequency of the sample amplitude LFO (0.10 - 10.00 Hz).
555                double             LFO1Phase;                     ///< [gig extension]: Phase displacement of the amplitude LFO's wave form (0.0° - 360.0°).
556              uint16_t           LFO1InternalDepth;             ///< Firm pitch of the sample amplitude LFO (0 - 1200 cents).              uint16_t           LFO1InternalDepth;             ///< Firm pitch of the sample amplitude LFO (0 - 1200 cents).
557              uint16_t           LFO1ControlDepth;              ///< Controller depth influencing sample amplitude LFO pitch (0 - 1200 cents).              uint16_t           LFO1ControlDepth;              ///< Controller depth influencing sample amplitude LFO pitch (0 - 1200 cents).
558              lfo1_ctrl_t        LFO1Controller;                ///< MIDI Controller which controls sample amplitude LFO.              lfo1_ctrl_t        LFO1Controller;                ///< MIDI Controller which controls sample amplitude LFO.
559              bool               LFO1FlipPhase;                 ///< Inverts phase of the sample amplitude LFO wave.              bool               LFO1FlipPhase;                 ///< Inverts the polarity of the sample amplitude LFO wave, so it flips the wave form vertically.
560              bool               LFO1Sync;                      ///< If set to <i>true</i> only one LFO should be used for all voices.              bool               LFO1Sync;                      ///< If set to <i>true</i> only one LFO should be used for all voices.
561              // Filter Cutoff Frequency EG/LFO              // Filter Cutoff Frequency EG/LFO
562              uint16_t           EG2PreAttack;                  ///< Preattack value of the filter cutoff EG (0 - 1000 permille).              uint16_t           EG2PreAttack;                  ///< Preattack value of the filter cutoff EG (0 - 1000 permille).
# Line 524  namespace gig { Line 571  namespace gig {
571              uint8_t            EG2ControllerAttackInfluence;  ///< Amount EG2 Controller has influence on the EG2 Attack time (0 - 3, where 0 means off).              uint8_t            EG2ControllerAttackInfluence;  ///< Amount EG2 Controller has influence on the EG2 Attack time (0 - 3, where 0 means off).
572              uint8_t            EG2ControllerDecayInfluence;   ///< Amount EG2 Controller has influence on the EG2 Decay time (0 - 3, where 0 means off).              uint8_t            EG2ControllerDecayInfluence;   ///< Amount EG2 Controller has influence on the EG2 Decay time (0 - 3, where 0 means off).
573              uint8_t            EG2ControllerReleaseInfluence; ///< Amount EG2 Controller has influence on the EG2 Release time (0 - 3, where 0 means off).              uint8_t            EG2ControllerReleaseInfluence; ///< Amount EG2 Controller has influence on the EG2 Release time (0 - 3, where 0 means off).
574                lfo_wave_t         LFO2WaveForm;                  ///< [gig extension]: The fundamental wave form to be used by the filter cutoff LFO, e.g. sine, triangle, saw, square (default: sine).
575              double             LFO2Frequency;                 ///< Frequency of the filter cutoff LFO (0.10 - 10.00 Hz).              double             LFO2Frequency;                 ///< Frequency of the filter cutoff LFO (0.10 - 10.00 Hz).
576                double             LFO2Phase;                     ///< [gig extension]: Phase displacement of the filter cutoff LFO's wave form (0.0° - 360.0°).
577              uint16_t           LFO2InternalDepth;             ///< Firm pitch of the filter cutoff LFO (0 - 1200 cents).              uint16_t           LFO2InternalDepth;             ///< Firm pitch of the filter cutoff LFO (0 - 1200 cents).
578              uint16_t           LFO2ControlDepth;              ///< Controller depth influencing filter cutoff LFO pitch (0 - 1200).              uint16_t           LFO2ControlDepth;              ///< Controller depth influencing filter cutoff LFO pitch (0 - 1200).
579              lfo2_ctrl_t        LFO2Controller;                ///< MIDI Controlle which controls the filter cutoff LFO.              lfo2_ctrl_t        LFO2Controller;                ///< MIDI Controlle which controls the filter cutoff LFO.
580              bool               LFO2FlipPhase;                 ///< Inverts phase of the filter cutoff LFO wave.              bool               LFO2FlipPhase;                 ///< Inverts the polarity of the filter cutoff LFO wave, so it flips the wave form vertically.
581              bool               LFO2Sync;                      ///< If set to <i>true</i> only one LFO should be used for all voices.              bool               LFO2Sync;                      ///< If set to <i>true</i> only one LFO should be used for all voices.
582              // Sample Pitch EG/LFO              // Sample Pitch EG/LFO
583              double             EG3Attack;                     ///< Attack time of the sample pitch EG (0.000 - 10.000s).              double             EG3Attack;                     ///< Attack time of the sample pitch EG (0.000 - 10.000s).
584              int16_t            EG3Depth;                      ///< Depth of the sample pitch EG (-1200 - +1200).              int16_t            EG3Depth;                      ///< Depth of the sample pitch EG (-1200 - +1200).
585                lfo_wave_t         LFO3WaveForm;                  ///< [gig extension]: The fundamental wave form to be used by the pitch LFO, e.g. sine, triangle, saw, square (default: sine).
586              double             LFO3Frequency;                 ///< Frequency of the sample pitch LFO (0.10 - 10.00 Hz).              double             LFO3Frequency;                 ///< Frequency of the sample pitch LFO (0.10 - 10.00 Hz).
587                double             LFO3Phase;                     ///< [gig extension]: Phase displacement of the pitch LFO's wave form (0.0° - 360.0°).
588              int16_t            LFO3InternalDepth;             ///< Firm depth of the sample pitch LFO (-1200 - +1200 cents).              int16_t            LFO3InternalDepth;             ///< Firm depth of the sample pitch LFO (-1200 - +1200 cents).
589              int16_t            LFO3ControlDepth;              ///< Controller depth of the sample pitch LFO (-1200 - +1200 cents).              int16_t            LFO3ControlDepth;              ///< Controller depth of the sample pitch LFO (-1200 - +1200 cents).
590              lfo3_ctrl_t        LFO3Controller;                ///< MIDI Controller which controls the sample pitch LFO.              lfo3_ctrl_t        LFO3Controller;                ///< MIDI Controller which controls the sample pitch LFO.
591                bool               LFO3FlipPhase;                 ///< [gig extension]: Inverts the polarity of the pitch LFO wave, so it flips the wave form vertically (@b NOTE: this setting for LFO3 is a gig format extension; flipping the polarity was only available for LFO1 and LFO2 in the original Gigasampler/GigaStudio software).
592              bool               LFO3Sync;                      ///< If set to <i>true</i> only one LFO should be used for all voices.              bool               LFO3Sync;                      ///< If set to <i>true</i> only one LFO should be used for all voices.
593              // Filter              // Filter
594              bool               VCFEnabled;                    ///< If filter should be used.              bool               VCFEnabled;                    ///< If filter should be used.
# Line 577  namespace gig { Line 629  namespace gig {
629              eg_opt_t           EG1Options;                    ///< [gig extension]: Behavior options which should be used for envelope generator 1 (volume amplitude EG).              eg_opt_t           EG1Options;                    ///< [gig extension]: Behavior options which should be used for envelope generator 1 (volume amplitude EG).
630              eg_opt_t           EG2Options;                    ///< [gig extension]: Behavior options which should be used for envelope generator 2 (filter cutoff EG).              eg_opt_t           EG2Options;                    ///< [gig extension]: Behavior options which should be used for envelope generator 2 (filter cutoff EG).
631              sust_rel_trg_t     SustainReleaseTrigger;         ///< [gig extension]: Whether a sustain pedal up event shall play release trigger sample.              sust_rel_trg_t     SustainReleaseTrigger;         ///< [gig extension]: Whether a sustain pedal up event shall play release trigger sample.
632                bool               NoNoteOffReleaseTrigger;       ///< [gig extension]: If @c true then don't play a release trigger sample on MIDI note-off events.
633    
634              // derived attributes from DLS::Sampler              // derived attributes from DLS::Sampler
635              using DLS::Sampler::UnityNote;              using DLS::Sampler::UnityNote;
# Line 603  namespace gig { Line 656  namespace gig {
656              using DLS::Sampler::AddSampleLoop;              using DLS::Sampler::AddSampleLoop;
657              using DLS::Sampler::DeleteSampleLoop;              using DLS::Sampler::DeleteSampleLoop;
658              // overridden methods              // overridden methods
659              virtual void SetGain(int32_t gain);              virtual void SetGain(int32_t gain) OVERRIDE;
660              virtual void UpdateChunks(progress_t* pProgress);              virtual void UpdateChunks(progress_t* pProgress) OVERRIDE;
661              virtual void CopyAssign(const DimensionRegion* orig);              virtual void CopyAssign(const DimensionRegion* orig);
662          protected:          protected:
663              uint8_t* VelocityTable; ///< For velocity dimensions with custom defined zone ranges only: used for fast converting from velocity MIDI value to dimension bit number.              uint8_t* VelocityTable; ///< For velocity dimensions with custom defined zone ranges only: used for fast converting from velocity MIDI value to dimension bit number.
# Line 730  namespace gig { Line 783  namespace gig {
783              double* GetCutoffVelocityTable(curve_type_t vcfVelocityCurve, uint8_t vcfVelocityDynamicRange, uint8_t vcfVelocityScale, vcf_cutoff_ctrl_t vcfCutoffController);              double* GetCutoffVelocityTable(curve_type_t vcfVelocityCurve, uint8_t vcfVelocityDynamicRange, uint8_t vcfVelocityScale, vcf_cutoff_ctrl_t vcfCutoffController);
784              double* GetVelocityTable(curve_type_t curveType, uint8_t depth, uint8_t scaling);              double* GetVelocityTable(curve_type_t curveType, uint8_t depth, uint8_t scaling);
785              double* CreateVelocityTable(curve_type_t curveType, uint8_t depth, uint8_t scaling);              double* CreateVelocityTable(curve_type_t curveType, uint8_t depth, uint8_t scaling);
786                bool UsesAnyGigFormatExtension() const;
787      };      };
788    
789      /** @brief Encapsulates sample waves of Gigasampler/GigaStudio files used for playback.      /** @brief Encapsulates sample waves of Gigasampler/GigaStudio files used for playback.
# Line 796  namespace gig { Line 850  namespace gig {
850              file_offset_t ReadAndLoop(void* pBuffer, file_offset_t SampleCount, playback_state_t* pPlaybackState, DimensionRegion* pDimRgn, buffer_t* pExternalDecompressionBuffer = NULL);              file_offset_t ReadAndLoop(void* pBuffer, file_offset_t SampleCount, playback_state_t* pPlaybackState, DimensionRegion* pDimRgn, buffer_t* pExternalDecompressionBuffer = NULL);
851              file_offset_t Write(void* pBuffer, file_offset_t SampleCount);              file_offset_t Write(void* pBuffer, file_offset_t SampleCount);
852              Group*        GetGroup() const;              Group*        GetGroup() const;
853              virtual void  UpdateChunks(progress_t* pProgress);              virtual void  UpdateChunks(progress_t* pProgress) OVERRIDE;
854              void CopyAssignMeta(const Sample* orig);              void CopyAssignMeta(const Sample* orig);
855              void CopyAssignWave(const Sample* orig);              void CopyAssignWave(const Sample* orig);
856              uint32_t GetWaveDataCRC32Checksum();              uint32_t GetWaveDataCRC32Checksum();
857              bool VerifyWaveData(uint32_t* pActually = NULL);              bool VerifyWaveData(uint32_t* pActually = NULL);
858          protected:          protected:
859              static size_t        Instances;               ///< Number of instances of class Sample.              static size_t        Instances;               ///< Number of instances of class Sample.
860              static buffer_t      InternalDecompressionBuffer; ///< Buffer used for decompression as well as for truncation of 24 Bit -> 16 Bit samples.              static buffer_t      InternalDecompressionBuffer; ///< Buffer used for decompression of samples, and only if no external decompression buffer was supplied.
861              Group*               pGroup;                  ///< pointer to the Group this sample belongs to (always not-NULL)              Group*               pGroup;                  ///< pointer to the Group this sample belongs to (always not-NULL)
862              file_offset_t        FrameOffset;             ///< Current offset (sample points) in current sample frame (for decompression only).              file_offset_t        FrameOffset;             ///< Current offset (sample points) in current sample frame (for decompression only).
863              file_offset_t*       FrameTable;              ///< For positioning within compressed samples only: stores the offset values for each frame.              file_offset_t*       FrameTable;              ///< For positioning within compressed samples only: stores the offset values for each frame.
# Line 890  namespace gig { Line 944  namespace gig {
944              void             SplitDimensionZone(dimension_t type, int zone);              void             SplitDimensionZone(dimension_t type, int zone);
945              void             SetDimensionType(dimension_t oldType, dimension_t newType);              void             SetDimensionType(dimension_t oldType, dimension_t newType);
946              // overridden methods              // overridden methods
947              virtual void     SetKeyRange(uint16_t Low, uint16_t High);              virtual void     SetKeyRange(uint16_t Low, uint16_t High) OVERRIDE;
948              virtual void     UpdateChunks(progress_t* pProgress);              virtual void     UpdateChunks(progress_t* pProgress) OVERRIDE;
949              virtual void     CopyAssign(const Region* orig);              virtual void     CopyAssign(const Region* orig);
950          protected:          protected:
951              Region(Instrument* pInstrument, RIFF::List* rgnList);              Region(Instrument* pInstrument, RIFF::List* rgnList);
# Line 902  namespace gig { Line 956  namespace gig {
956              DimensionRegion* GetDimensionRegionByBit(const std::map<dimension_t,int>& DimCase);              DimensionRegion* GetDimensionRegionByBit(const std::map<dimension_t,int>& DimCase);
957             ~Region();             ~Region();
958              friend class Instrument;              friend class Instrument;
959            private:
960                bool UsesAnyGigFormatExtension() const;
961      };      };
962    
963      /** @brief Abstract base class for all MIDI rules.      /** @brief Abstract base class for all MIDI rules.
# Line 984  namespace gig { Line 1040  namespace gig {
1040          protected:          protected:
1041              MidiRuleCtrlTrigger(RIFF::Chunk* _3ewg);              MidiRuleCtrlTrigger(RIFF::Chunk* _3ewg);
1042              MidiRuleCtrlTrigger();              MidiRuleCtrlTrigger();
1043              void UpdateChunks(uint8_t* pData) const;              void UpdateChunks(uint8_t* pData) const OVERRIDE;
1044              friend class Instrument;              friend class Instrument;
1045      };      };
1046    
# Line 1024  namespace gig { Line 1080  namespace gig {
1080          protected:          protected:
1081              MidiRuleLegato(RIFF::Chunk* _3ewg);              MidiRuleLegato(RIFF::Chunk* _3ewg);
1082              MidiRuleLegato();              MidiRuleLegato();
1083              void UpdateChunks(uint8_t* pData) const;              void UpdateChunks(uint8_t* pData) const OVERRIDE;
1084              friend class Instrument;              friend class Instrument;
1085      };      };
1086    
# Line 1076  namespace gig { Line 1132  namespace gig {
1132          protected:          protected:
1133              MidiRuleAlternator(RIFF::Chunk* _3ewg);              MidiRuleAlternator(RIFF::Chunk* _3ewg);
1134              MidiRuleAlternator();              MidiRuleAlternator();
1135              void UpdateChunks(uint8_t* pData) const;              void UpdateChunks(uint8_t* pData) const OVERRIDE;
1136              friend class Instrument;              friend class Instrument;
1137      };      };
1138    
# Line 1096  namespace gig { Line 1152  namespace gig {
1152      class MidiRuleUnknown : public MidiRule {      class MidiRuleUnknown : public MidiRule {
1153          protected:          protected:
1154              MidiRuleUnknown() { }              MidiRuleUnknown() { }
1155              void UpdateChunks(uint8_t* pData) const { }              void UpdateChunks(uint8_t* pData) const OVERRIDE { }
1156              friend class Instrument;              friend class Instrument;
1157      };      };
1158    
# Line 1120  namespace gig { Line 1176  namespace gig {
1176       * - <a href="http://doc.linuxsampler.org/Instrument_Scripts/NKSP_Language/Reference/">NKSP Reference Manual</a>       * - <a href="http://doc.linuxsampler.org/Instrument_Scripts/NKSP_Language/Reference/">NKSP Reference Manual</a>
1177       * - <a href="http://doc.linuxsampler.org/Gigedit/Managing_Scripts">Using Instrument Scripts with Gigedit</a>       * - <a href="http://doc.linuxsampler.org/Gigedit/Managing_Scripts">Using Instrument Scripts with Gigedit</a>
1178       */       */
1179      class Script {      class Script : protected DLS::Storage {
1180          public:          public:
1181              enum Encoding_t {              enum Encoding_t {
1182                  ENCODING_ASCII = 0 ///< Standard 8 bit US ASCII character encoding (default).                  ENCODING_ASCII = 0 ///< Standard 8 bit US ASCII character encoding (default).
# Line 1137  namespace gig { Line 1193  namespace gig {
1193              Encoding_t     Encoding;    ///< Format the script's source code text is encoded with.              Encoding_t     Encoding;    ///< Format the script's source code text is encoded with.
1194              Language_t     Language;    ///< Programming language and dialect the script is written in.              Language_t     Language;    ///< Programming language and dialect the script is written in.
1195              bool           Bypass;      ///< Global bypass: if enabled, this script shall not be executed by the sampler for any instrument.              bool           Bypass;      ///< Global bypass: if enabled, this script shall not be executed by the sampler for any instrument.
1196                uint8_t        Uuid[16];    ///< Persistent Universally Unique Identifier of this script, which remains identical after any changes to this script.
1197    
1198              String GetScriptAsText();              String GetScriptAsText();
1199              void   SetScriptAsText(const String& text);              void   SetScriptAsText(const String& text);
# Line 1146  namespace gig { Line 1203  namespace gig {
1203          protected:          protected:
1204              Script(ScriptGroup* group, RIFF::Chunk* ckScri);              Script(ScriptGroup* group, RIFF::Chunk* ckScri);
1205              virtual ~Script();              virtual ~Script();
1206              void UpdateChunks(progress_t* pProgress);              void UpdateChunks(progress_t* pProgress) OVERRIDE;
1207                void DeleteChunks() OVERRIDE;
1208              void RemoveAllScriptReferences();              void RemoveAllScriptReferences();
1209                void GenerateUuid();
1210              friend class ScriptGroup;              friend class ScriptGroup;
1211              friend class Instrument;              friend class Instrument;
1212          private:          private:
# Line 1168  namespace gig { Line 1227  namespace gig {
1227       * not available in the GigaStudio 4 software. It is currently only       * not available in the GigaStudio 4 software. It is currently only
1228       * supported by LinuxSampler and gigedit.       * supported by LinuxSampler and gigedit.
1229       */       */
1230      class ScriptGroup {      class ScriptGroup : protected DLS::Storage {
1231          public:          public:
1232              String   Name; ///< Name of this script group. For example to be displayed in an instrument editor.              String   Name; ///< Name of this script group. For example to be displayed in an instrument editor.
1233    
1234              Script*  GetScript(uint index);              Script*  GetScript(size_t index);
1235              Script*  AddScript();              Script*  AddScript();
1236              void     DeleteScript(Script* pScript);              void     DeleteScript(Script* pScript);
1237          protected:          protected:
1238              ScriptGroup(File* file, RIFF::List* lstRTIS);              ScriptGroup(File* file, RIFF::List* lstRTIS);
1239              virtual ~ScriptGroup();              virtual ~ScriptGroup();
1240              void LoadScripts();              void LoadScripts();
1241              void UpdateChunks(progress_t* pProgress);              virtual void UpdateChunks(progress_t* pProgress) OVERRIDE;
1242                virtual void DeleteChunks() OVERRIDE;
1243              friend class Script;              friend class Script;
1244              friend class File;              friend class File;
1245          private:          private:
1246              File*                pFile;              File*                pFile;
1247              RIFF::List*          pList; ///< 'RTIS' list chunk              RIFF::List*          pList; ///< 'RTIS' list chunk
1248              std::list<Script*>*  pScripts;              std::vector<Script*>* pScripts;
1249      };      };
1250    
1251      /** @brief Provides access to a Gigasampler/GigaStudio instrument.      /** @brief Provides access to a Gigasampler/GigaStudio instrument.
# Line 1227  namespace gig { Line 1287  namespace gig {
1287              // derived methods from DLS::Resource              // derived methods from DLS::Resource
1288              using DLS::Resource::GetParent;              using DLS::Resource::GetParent;
1289              // overridden methods              // overridden methods
1290              Region*   GetFirstRegion();              Region*   GetRegionAt(size_t pos);
1291              Region*   GetNextRegion();              Region*   GetFirstRegion() LIBGIG_DEPRECATED_API("Use GetRegionAt() instead.");
1292                Region*   GetNextRegion() LIBGIG_DEPRECATED_API("Use GetRegionAt() instead.");
1293              Region*   AddRegion();              Region*   AddRegion();
1294              void      DeleteRegion(Region* pRegion);              void      DeleteRegion(Region* pRegion);
1295              void      MoveTo(Instrument* dst);              void      MoveTo(Instrument* dst);
1296              virtual void UpdateChunks(progress_t* pProgress);              virtual void UpdateChunks(progress_t* pProgress) OVERRIDE;
1297              virtual void CopyAssign(const Instrument* orig);              virtual void CopyAssign(const Instrument* orig);
1298              // own methods              // own methods
1299              Region*   GetRegion(unsigned int Key);              Region*   GetRegion(unsigned int Key);
# Line 1242  namespace gig { Line 1303  namespace gig {
1303              MidiRuleAlternator*  AddMidiRuleAlternator();              MidiRuleAlternator*  AddMidiRuleAlternator();
1304              void      DeleteMidiRule(int i);              void      DeleteMidiRule(int i);
1305              // real-time instrument script methods              // real-time instrument script methods
1306              Script*   GetScriptOfSlot(uint index);              Script*   GetScriptOfSlot(size_t index);
1307              void      AddScriptSlot(Script* pScript, bool bypass = false);              void      AddScriptSlot(Script* pScript, bool bypass = false);
1308              void      SwapScriptSlots(uint index1, uint index2);              void      SwapScriptSlots(uint index1, uint index2);
1309              void      RemoveScriptSlot(uint index);              void      RemoveScriptSlot(uint index);
# Line 1250  namespace gig { Line 1311  namespace gig {
1311              uint      ScriptSlotCount() const;              uint      ScriptSlotCount() const;
1312              bool      IsScriptSlotBypassed(uint index);              bool      IsScriptSlotBypassed(uint index);
1313              void      SetScriptSlotBypassed(uint index, bool bBypass);              void      SetScriptSlotBypassed(uint index, bool bBypass);
1314                bool      IsScriptPatchVariableSet(int slot, String variable);
1315                std::map<String,String> GetScriptPatchVariables(int slot);
1316                String    GetScriptPatchVariable(int slot, String variable);
1317                void      SetScriptPatchVariable(int slot, String variable, String value);
1318                void      UnsetScriptPatchVariable(int slot = -1, String variable = "");
1319          protected:          protected:
1320              Region*   RegionKeyTable[128]; ///< fast lookup for the corresponding Region of a MIDI key              Region*   RegionKeyTable[128]; ///< fast lookup for the corresponding Region of a MIDI key
1321    
# Line 1270  namespace gig { Line 1336  namespace gig {
1336                  Script*  script;                  Script*  script;
1337                  bool     bypass;                  bool     bypass;
1338              };              };
1339                typedef std::array<uint8_t,16> _UUID;
1340                typedef std::map<String,String> _PatchVars;
1341                typedef std::map<int,_PatchVars> _VarsBySlot;
1342                typedef std::map<_UUID,_VarsBySlot> _VarsByScript;
1343              MidiRule** pMidiRules;              MidiRule** pMidiRules;
1344              std::vector<_ScriptPooolEntry> scriptPoolFileOffsets;              std::vector<_ScriptPooolEntry> scriptPoolFileOffsets;
1345              std::vector<_ScriptPooolRef>* pScriptRefs;              std::vector<_ScriptPooolRef>* pScriptRefs;
1346                _VarsByScript scriptVars;
1347    
1348                _VarsByScript stripScriptVars();
1349                bool ReferencesScriptWithUuid(const _UUID& uuid);
1350                bool UsesAnyGigFormatExtension() const;
1351      };      };
1352    
1353      /** @brief Group of Gigasampler samples      /** @brief Group of Gigasampler samples
# Line 1286  namespace gig { Line 1361  namespace gig {
1361       * there is always at least one Group in a .gig file, no matter if you       * there is always at least one Group in a .gig file, no matter if you
1362       * created one yet or not.       * created one yet or not.
1363       */       */
1364      class Group {      class Group : public DLS::Storage {
1365          public:          public:
1366              String Name; ///< Stores the name of this Group.              String Name; ///< Stores the name of this Group.
1367    
1368              Sample* GetFirstSample();              Sample* GetSample(size_t index);
1369              Sample* GetNextSample();              Sample* GetFirstSample() LIBGIG_DEPRECATED_API("Use GetSample() instead.");
1370                Sample* GetNextSample() LIBGIG_DEPRECATED_API("Use GetSample() instead.");
1371              void AddSample(Sample* pSample);              void AddSample(Sample* pSample);
1372          protected:          protected:
1373              Group(File* file, RIFF::Chunk* ck3gnm);              Group(File* file, RIFF::Chunk* ck3gnm);
1374              virtual ~Group();              virtual ~Group();
1375              virtual void UpdateChunks(progress_t* pProgress);              virtual void UpdateChunks(progress_t* pProgress) OVERRIDE;
1376                virtual void DeleteChunks() OVERRIDE;
1377              void MoveAll();              void MoveAll();
1378              friend class File;              friend class File;
1379          private:          private:
1380              File*        pFile;              File*        pFile;
1381              RIFF::Chunk* pNameChunk; ///< '3gnm' chunk              RIFF::Chunk* pNameChunk; ///< '3gnm' chunk
1382                size_t       SamplesIterator; ///< Used by GetFirstSample(), GetNextSample() only.
1383      };      };
1384    
1385      /** @brief Provides convenient access to Gigasampler/GigaStudio .gig files.      /** @brief Provides convenient access to Gigasampler/GigaStudio .gig files.
# Line 1359  namespace gig { Line 1437  namespace gig {
1437              using DLS::File::Save;              using DLS::File::Save;
1438              using DLS::File::GetFileName;              using DLS::File::GetFileName;
1439              using DLS::File::SetFileName;              using DLS::File::SetFileName;
1440                using DLS::File::GetRiffFile;
1441              // overridden  methods              // overridden  methods
1442              File();              File();
1443              File(RIFF::File* pRIFF);              File(RIFF::File* pRIFF);
1444              Sample*     GetFirstSample(progress_t* pProgress = NULL); ///< Returns a pointer to the first <i>Sample</i> object of the file, <i>NULL</i> otherwise.              Sample*     GetFirstSample(progress_t* pProgress = NULL) LIBGIG_DEPRECATED_API("Use GetSample() instead.");
1445              Sample*     GetNextSample();      ///< Returns a pointer to the next <i>Sample</i> object of the file, <i>NULL</i> otherwise.              Sample*     GetNextSample() LIBGIG_DEPRECATED_API("Use GetSample() instead.");
1446              Sample*     GetSample(uint index);              Sample*     GetSample(size_t index, progress_t* pProgress = NULL);
1447              Sample*     AddSample();              Sample*     AddSample();
1448              size_t      CountSamples();              size_t      CountSamples();
1449              void        DeleteSample(Sample* pSample);              void        DeleteSample(Sample* pSample);
1450              Instrument* GetFirstInstrument(); ///< Returns a pointer to the first <i>Instrument</i> object of the file, <i>NULL</i> otherwise.              Instrument* GetFirstInstrument() LIBGIG_DEPRECATED_API("Use GetInstrument() instead.");
1451              Instrument* GetNextInstrument();  ///< Returns a pointer to the next <i>Instrument</i> object of the file, <i>NULL</i> otherwise.              Instrument* GetNextInstrument() LIBGIG_DEPRECATED_API("Use GetInstrument() instead.");
1452              Instrument* GetInstrument(uint index, progress_t* pProgress = NULL);              Instrument* GetInstrument(size_t index, progress_t* pProgress = NULL);
1453              Instrument* AddInstrument();              Instrument* AddInstrument();
1454              Instrument* AddDuplicateInstrument(const Instrument* orig);              Instrument* AddDuplicateInstrument(const Instrument* orig);
1455              size_t      CountInstruments();              size_t      CountInstruments();
1456              void        DeleteInstrument(Instrument* pInstrument);              void        DeleteInstrument(Instrument* pInstrument);
1457              Group*      GetFirstGroup(); ///< Returns a pointer to the first <i>Group</i> object of the file, <i>NULL</i> otherwise.              Group*      GetFirstGroup() LIBGIG_DEPRECATED_API("Use GetGroup() instead.");
1458              Group*      GetNextGroup();  ///< Returns a pointer to the next <i>Group</i> object of the file, <i>NULL</i> otherwise.              Group*      GetNextGroup() LIBGIG_DEPRECATED_API("Use GetGroup() instead.");
1459              Group*      GetGroup(uint index);              Group*      GetGroup(size_t index);
1460              Group*      GetGroup(String name);              Group*      GetGroup(String name);
1461              Group*      AddGroup();              Group*      AddGroup();
1462              void        DeleteGroup(Group* pGroup);              void        DeleteGroup(Group* pGroup);
# Line 1385  namespace gig { Line 1464  namespace gig {
1464              void        SetAutoLoad(bool b);              void        SetAutoLoad(bool b);
1465              bool        GetAutoLoad();              bool        GetAutoLoad();
1466              void        AddContentOf(File* pFile);              void        AddContentOf(File* pFile);
1467              ScriptGroup* GetScriptGroup(uint index);              ScriptGroup* GetScriptGroup(size_t index);
1468              ScriptGroup* GetScriptGroup(const String& name);              ScriptGroup* GetScriptGroup(const String& name);
1469              ScriptGroup* AddScriptGroup();              ScriptGroup* AddScriptGroup();
1470              void        DeleteScriptGroup(ScriptGroup* pGroup);              void        DeleteScriptGroup(ScriptGroup* pGroup);
1471              virtual    ~File();              virtual    ~File();
1472              virtual void UpdateChunks(progress_t* pProgress);              virtual void UpdateChunks(progress_t* pProgress) OVERRIDE;
1473          protected:          protected:
1474              // overridden protected methods from DLS::File              // overridden protected methods from DLS::File
1475              virtual void LoadSamples();              virtual void LoadSamples() OVERRIDE;
1476              virtual void LoadInstruments();              virtual void LoadInstruments() OVERRIDE;
1477              virtual void LoadGroups();              virtual void LoadGroups();
1478              virtual void UpdateFileOffsets();              virtual void UpdateFileOffsets() OVERRIDE;
1479              // own protected methods              // own protected methods
1480              virtual void LoadSamples(progress_t* pProgress);              virtual void LoadSamples(progress_t* pProgress);
1481              virtual void LoadInstruments(progress_t* pProgress);              virtual void LoadInstruments(progress_t* pProgress);
# Line 1413  namespace gig { Line 1492  namespace gig {
1492              friend class Group; // so Group can access protected member pRIFF              friend class Group; // so Group can access protected member pRIFF
1493              friend class ScriptGroup; // so ScriptGroup can access protected member pRIFF              friend class ScriptGroup; // so ScriptGroup can access protected member pRIFF
1494          private:          private:
1495              std::list<Group*>*          pGroups;              std::vector<Group*>*          pGroups;
1496              std::list<Group*>::iterator GroupsIterator;              std::vector<Group*>::iterator GroupsIterator;
1497              bool                        bAutoLoad;              bool                        bAutoLoad;
1498              std::list<ScriptGroup*>*    pScriptGroups;              std::vector<ScriptGroup*>*    pScriptGroups;
1499    
1500                bool UsesAnyGigFormatExtension() const;
1501      };      };
1502    
1503      /**      /**

Legend:
Removed from v.3443  
changed lines
  Added in v.3952

  ViewVC Help
Powered by ViewVC