/[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 1154 by schoenebeck, Wed Apr 11 16:33:56 2007 UTC revision 1335 by schoenebeck, Sun Sep 9 21:22:58 2007 UTC
# Line 38  Line 38 
38  # define CHUNK_ID_3EWG  0x33657767  # define CHUNK_ID_3EWG  0x33657767
39  # define CHUNK_ID_EWAV  0x65776176  # define CHUNK_ID_EWAV  0x65776176
40  # define CHUNK_ID_3GNM  0x33676E6D  # define CHUNK_ID_3GNM  0x33676E6D
41    # define CHUNK_ID_EINF  0x65696E66
42    # define CHUNK_ID_3CRC  0x33637263
43  #else  // little endian  #else  // little endian
44  # define LIST_TYPE_3PRG 0x67727033  # define LIST_TYPE_3PRG 0x67727033
45  # define LIST_TYPE_3EWL 0x6C776533  # define LIST_TYPE_3EWL 0x6C776533
# Line 50  Line 52 
52  # define CHUNK_ID_3EWG  0x67776533  # define CHUNK_ID_3EWG  0x67776533
53  # define CHUNK_ID_EWAV  0x76617765  # define CHUNK_ID_EWAV  0x76617765
54  # define CHUNK_ID_3GNM  0x6D6E6733  # define CHUNK_ID_3GNM  0x6D6E6733
55    # define CHUNK_ID_EINF  0x666E6965
56    # define CHUNK_ID_3CRC  0x63726333
57  #endif // WORDS_BIGENDIAN  #endif // WORDS_BIGENDIAN
58    
59  /** Gigasampler specific classes and definitions */  /** Gigasampler specific classes and definitions */
# Line 319  namespace gig { Line 323  namespace gig {
323          progress_t();          progress_t();
324      };      };
325    
326        /** @brief CRC-32 checksum implementation
327         *
328         * This class is used to calculate checksums of the sample data in
329         * a gig file. The checksums are stored in the 3crc chunk of the
330         * gig file and automatically updated when a sample is written
331         * with Sample::Write().
332         */
333        class CRC {
334        private:
335            uint32_t value;
336            static const uint32_t* table;
337            static uint32_t* initTable();
338        public:
339            CRC() {
340                reset();
341            }
342            void reset() {
343                value = 0xffffffff;
344            }
345            void update(unsigned char* buf, int len) {
346                for (int i = 0 ; i < len ; i++) {
347                    value = table[(value ^ buf[i]) & 0xff] ^ (value >> 8);
348                }
349            }
350            uint32_t getValue() {
351                return value ^ 0xffffffff;
352            }
353        };
354    
355      // just symbol prototyping      // just symbol prototyping
356      class File;      class File;
357      class Instrument;      class Instrument;
# Line 437  namespace gig { Line 470  namespace gig {
470              double GetVelocityAttenuation(uint8_t MIDIKeyVelocity);              double GetVelocityAttenuation(uint8_t MIDIKeyVelocity);
471              double GetVelocityRelease(uint8_t MIDIKeyVelocity);              double GetVelocityRelease(uint8_t MIDIKeyVelocity);
472              double GetVelocityCutoff(uint8_t MIDIKeyVelocity);              double GetVelocityCutoff(uint8_t MIDIKeyVelocity);
473                Region* GetParent() const;
474                // derived methods
475                DLS::Sampler::AddSampleLoop;
476                DLS::Sampler::DeleteSampleLoop;
477              // overridden methods              // overridden methods
478              virtual void UpdateChunks();              virtual void UpdateChunks();
479          protected:          protected:
480              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.
481              DimensionRegion(RIFF::List* _3ewl);              DimensionRegion(Region* pParent, RIFF::List* _3ewl);
482                DimensionRegion(RIFF::List* _3ewl, const DimensionRegion& src);
483             ~DimensionRegion();             ~DimensionRegion();
484              friend class Region;              friend class Region;
485          private:          private:
# Line 480  namespace gig { Line 518  namespace gig {
518              double*                  pVelocityAttenuationTable;  ///< Points to the velocity table corresponding to the velocity parameters of this DimensionRegion.              double*                  pVelocityAttenuationTable;  ///< Points to the velocity table corresponding to the velocity parameters of this DimensionRegion.
519              double*                  pVelocityReleaseTable;      ///< Points to the velocity table corresponding to the release velocity parameters of this DimensionRegion              double*                  pVelocityReleaseTable;      ///< Points to the velocity table corresponding to the release velocity parameters of this DimensionRegion
520              double*                  pVelocityCutoffTable;       ///< Points to the velocity table corresponding to the filter velocity parameters of this DimensionRegion              double*                  pVelocityCutoffTable;       ///< Points to the velocity table corresponding to the filter velocity parameters of this DimensionRegion
521                Region*                  pRegion;
522    
523              leverage_ctrl_t DecodeLeverageController(_lev_ctrl_t EncodedController);              leverage_ctrl_t DecodeLeverageController(_lev_ctrl_t EncodedController);
524              _lev_ctrl_t     EncodeLeverageController(leverage_ctrl_t DecodedController);              _lev_ctrl_t     EncodeLeverageController(leverage_ctrl_t DecodedController);
# Line 556  namespace gig { Line 595  namespace gig {
595              unsigned long        FileNo;                  ///< File number (> 0 when sample is stored in an extension file, 0 when it's in the gig)              unsigned long        FileNo;                  ///< File number (> 0 when sample is stored in an extension file, 0 when it's in the gig)
596              RIFF::Chunk*         pCk3gix;              RIFF::Chunk*         pCk3gix;
597              RIFF::Chunk*         pCkSmpl;              RIFF::Chunk*         pCkSmpl;
598                CRC                  crc;                     ///< CRC-32 checksum of the raw sample data
599    
600              Sample(File* pFile, RIFF::List* waveList, unsigned long WavePoolOffset, unsigned long fileNo = 0);              Sample(File* pFile, RIFF::List* waveList, unsigned long WavePoolOffset, unsigned long fileNo = 0);
601             ~Sample();             ~Sample();
# Line 598  namespace gig { Line 638  namespace gig {
638              DimensionRegion*        pDimensionRegions[256];   ///< Pointer array to the 32 (gig2) or 256 (gig3) possible dimension regions (reflects NULL for dimension regions not in use). Avoid to access the array directly and better use GetDimensionRegionByValue() instead, but of course in some cases it makes sense to use the array (e.g. iterating through all DimensionRegions). Use AddDimension() and DeleteDimension() to create a new dimension or delete an existing one (which will create or delete the respective dimension region(s) automatically).              DimensionRegion*        pDimensionRegions[256];   ///< Pointer array to the 32 (gig2) or 256 (gig3) possible dimension regions (reflects NULL for dimension regions not in use). Avoid to access the array directly and better use GetDimensionRegionByValue() instead, but of course in some cases it makes sense to use the array (e.g. iterating through all DimensionRegions). Use AddDimension() and DeleteDimension() to create a new dimension or delete an existing one (which will create or delete the respective dimension region(s) automatically).
639              unsigned int            Layers;                   ///< Amount of defined layers (1 - 32). A value of 1 actually means no layering, a value > 1 means there is Layer dimension. The same information can of course also be obtained by accessing pDimensionDefinitions. Do not alter this value!              unsigned int            Layers;                   ///< Amount of defined layers (1 - 32). A value of 1 actually means no layering, a value > 1 means there is Layer dimension. The same information can of course also be obtained by accessing pDimensionDefinitions. Do not alter this value!
640    
641                // own methods
642              DimensionRegion* GetDimensionRegionByValue(const uint DimValues[8]);              DimensionRegion* GetDimensionRegionByValue(const uint DimValues[8]);
643              DimensionRegion* GetDimensionRegionByBit(const uint8_t DimBits[8]);              DimensionRegion* GetDimensionRegionByBit(const uint8_t DimBits[8]);
644              Sample*          GetSample();              Sample*          GetSample();
645              void             AddDimension(dimension_def_t* pDimDef);              void             AddDimension(dimension_def_t* pDimDef);
646              void             DeleteDimension(dimension_def_t* pDimDef);              void             DeleteDimension(dimension_def_t* pDimDef);
647                // overridden methods
648                virtual void     SetKeyRange(uint16_t Low, uint16_t High);
649              virtual void     UpdateChunks();              virtual void     UpdateChunks();
650          protected:          protected:
651              Region(Instrument* pInstrument, RIFF::List* rgnList);              Region(Instrument* pInstrument, RIFF::List* rgnList);
# Line 637  namespace gig { Line 680  namespace gig {
680    
681              // derived methods from DLS::Resource              // derived methods from DLS::Resource
682              DLS::Resource::GetParent;              DLS::Resource::GetParent;
             // derived methods from DLS::Instrument  
             DLS::Instrument::MoveRegion;  
683              // overridden methods              // overridden methods
684              Region*   GetFirstRegion();              Region*   GetFirstRegion();
685              Region*   GetNextRegion();              Region*   GetNextRegion();
# Line 654  namespace gig { Line 695  namespace gig {
695             ~Instrument();             ~Instrument();
696              void UpdateRegionKeyTable();              void UpdateRegionKeyTable();
697              friend class File;              friend class File;
698                friend class Region; // so Region can call UpdateRegionKeyTable()
699      };      };
700    
701      /** @brief Group of Gigasampler objects      /** @brief Group of Gigasampler objects
# Line 692  namespace gig { Line 734  namespace gig {
734      /** Parses Gigasampler files and provides abstract access to the data. */      /** Parses Gigasampler files and provides abstract access to the data. */
735      class File : protected DLS::File {      class File : protected DLS::File {
736          public:          public:
737                static const DLS::version_t VERSION_2;
738                static const DLS::version_t VERSION_3;
739    
740              // derived attributes from DLS::Resource              // derived attributes from DLS::Resource
741              DLS::Resource::pInfo;              DLS::Resource::pInfo;
742              DLS::Resource::pDLSID;              DLS::Resource::pDLSID;
# Line 731  namespace gig { Line 776  namespace gig {
776              // own protected methods              // own protected methods
777              virtual void LoadSamples(progress_t* pProgress);              virtual void LoadSamples(progress_t* pProgress);
778              virtual void LoadInstruments(progress_t* pProgress);              virtual void LoadInstruments(progress_t* pProgress);
779                void SetSampleChecksum(Sample* pSample, uint32_t crc);
780              friend class Region;              friend class Region;
781              friend class Sample;              friend class Sample;
782              friend class Group; // so Group can access protected member pRIFF              friend class Group; // so Group can access protected member pRIFF
783          private:          private:
784                static const DLS::Info::FixedStringLength FixedStringLengths[];
785              std::list<Group*>*          pGroups;              std::list<Group*>*          pGroups;
786              std::list<Group*>::iterator GroupsIterator;              std::list<Group*>::iterator GroupsIterator;
787      };      };

Legend:
Removed from v.1154  
changed lines
  Added in v.1335

  ViewVC Help
Powered by ViewVC