/[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 926 by schoenebeck, Tue Oct 24 14:29:16 2006 UTC revision 1070 by persson, Mon Mar 5 17:42:35 2007 UTC
# Line 1  Line 1 
1  /***************************************************************************  /***************************************************************************
2   *                                                                         *   *                                                                         *
3   *   libgig - C++ cross-platform Gigasampler format file loader library    *   *   libgig - C++ cross-platform Gigasampler format file access library    *
4   *                                                                         *   *                                                                         *
5   *   Copyright (C) 2003-2006 by Christian Schoenebeck                      *   *   Copyright (C) 2003-2006 by Christian Schoenebeck                      *
6   *                              <cuse@users.sourceforge.net>               *   *                              <cuse@users.sourceforge.net>               *
# Line 29  Line 29 
29  #if WORDS_BIGENDIAN  #if WORDS_BIGENDIAN
30  # define LIST_TYPE_3PRG 0x33707267  # define LIST_TYPE_3PRG 0x33707267
31  # define LIST_TYPE_3EWL 0x3365776C  # define LIST_TYPE_3EWL 0x3365776C
32    # define LIST_TYPE_3GRI 0x33677269
33    # define LIST_TYPE_3GNL 0x33676E6C
34  # define CHUNK_ID_SMPL  0x736D706C  # define CHUNK_ID_SMPL  0x736D706C
35  # define CHUNK_ID_3GIX  0x33676978  # define CHUNK_ID_3GIX  0x33676978
36  # define CHUNK_ID_3EWA  0x33657761  # define CHUNK_ID_3EWA  0x33657761
37  # define CHUNK_ID_3LNK  0x336C6E6B  # define CHUNK_ID_3LNK  0x336C6E6B
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
41  #else  // little endian  #else  // little endian
42  # define LIST_TYPE_3PRG 0x67727033  # define LIST_TYPE_3PRG 0x67727033
43  # define LIST_TYPE_3EWL 0x6C776533  # define LIST_TYPE_3EWL 0x6C776533
44    # define LIST_TYPE_3GRI 0x69726733
45    # define LIST_TYPE_3GNL 0x6C6E6733
46  # define CHUNK_ID_SMPL  0x6C706D73  # define CHUNK_ID_SMPL  0x6C706D73
47  # define CHUNK_ID_3GIX  0x78696733  # define CHUNK_ID_3GIX  0x78696733
48  # define CHUNK_ID_3EWA  0x61776533  # define CHUNK_ID_3EWA  0x61776533
49  # define CHUNK_ID_3LNK  0x6B6E6C33  # define CHUNK_ID_3LNK  0x6B6E6C33
50  # define CHUNK_ID_3EWG  0x67776533  # define CHUNK_ID_3EWG  0x67776533
51  # define CHUNK_ID_EWAV  0x76617765  # define CHUNK_ID_EWAV  0x76617765
52    # define CHUNK_ID_3GNM  0x6D6E6733
53  #endif // WORDS_BIGENDIAN  #endif // WORDS_BIGENDIAN
54    
55  /** Gigasampler specific classes and definitions */  /** Gigasampler specific classes and definitions */
# Line 316  namespace gig { Line 322  namespace gig {
322      class Instrument;      class Instrument;
323      class Sample;      class Sample;
324      class Region;      class Region;
325        class Group;
326    
327      /** Encapsulates articulation information of a dimension region.      /** Encapsulates articulation information of a dimension region.
328       *       *
# Line 331  namespace gig { Line 338  namespace gig {
338       */       */
339      class DimensionRegion : protected DLS::Sampler {      class DimensionRegion : protected DLS::Sampler {
340          public:          public:
341              uint8_t            VelocityUpperLimit;            ///< Defines the upper velocity value limit of a velocity split (only if an user defined limit was set, thus a value not equal to 128/NumberOfSplits, else this value is 0).              uint8_t            VelocityUpperLimit;            ///< Defines the upper velocity value limit of a velocity split (only if an user defined limit was set, thus a value not equal to 128/NumberOfSplits, else this value is 0). Only for gig2, otherwise the DimensionUpperLimts are used instead.
342              Sample*            pSample;                       ///< Points to the Sample which is assigned to the dimension region.              Sample*            pSample;                       ///< Points to the Sample which is assigned to the dimension region.
343              // Sample Amplitude EG/LFO              // Sample Amplitude EG/LFO
344              uint16_t           EG1PreAttack;                  ///< Preattack value of the sample amplitude EG (0 - 1000 permille).              uint16_t           EG1PreAttack;                  ///< Preattack value of the sample amplitude EG (0 - 1000 permille).
# Line 415  namespace gig { Line 422  namespace gig {
422              bool               MSDecode;                      ///< Gigastudio flag: defines if Mid Side Recordings should be decoded.              bool               MSDecode;                      ///< Gigastudio flag: defines if Mid Side Recordings should be decoded.
423              uint16_t           SampleStartOffset;             ///< Number of samples the sample start should be moved (0 - 2000).              uint16_t           SampleStartOffset;             ///< Number of samples the sample start should be moved (0 - 2000).
424              double             SampleAttenuation;             ///< Sample volume (calculated from DLS::Sampler::Gain)              double             SampleAttenuation;             ///< Sample volume (calculated from DLS::Sampler::Gain)
425                uint8_t            DimensionUpperLimits[8];       ///< gig3: defines the upper limit of the dimension values for this dimension region
426    
427              // derived attributes from DLS::Sampler              // derived attributes from DLS::Sampler
428              DLS::Sampler::UnityNote;              DLS::Sampler::UnityNote;
# Line 489  namespace gig { Line 497  namespace gig {
497       */       */
498      class Sample : public DLS::Sample {      class Sample : public DLS::Sample {
499          public:          public:
             uint16_t       SampleGroup;  
500              uint32_t       Manufacturer;      ///< Specifies the MIDI Manufacturer's Association (MMA) Manufacturer code for the sampler intended to receive this file's waveform. If no particular manufacturer is to be specified, a value of 0 should be used.              uint32_t       Manufacturer;      ///< Specifies the MIDI Manufacturer's Association (MMA) Manufacturer code for the sampler intended to receive this file's waveform. If no particular manufacturer is to be specified, a value of 0 should be used.
501              uint32_t       Product;           ///< Specifies the MIDI model ID defined by the manufacturer corresponding to the Manufacturer field. If no particular manufacturer's product is to be specified, a value of 0 should be used.              uint32_t       Product;           ///< Specifies the MIDI model ID defined by the manufacturer corresponding to the Manufacturer field. If no particular manufacturer's product is to be specified, a value of 0 should be used.
502              uint32_t       SamplePeriod;      ///< Specifies the duration of time that passes during the playback of one sample in nanoseconds (normally equal to 1 / Samples Per Second, where Samples Per Second is the value found in the format chunk), don't bother to update this attribute, it won't be saved.              uint32_t       SamplePeriod;      ///< Specifies the duration of time that passes during the playback of one sample in nanoseconds (normally equal to 1 / Samples Per Second, where Samples Per Second is the value found in the format chunk), don't bother to update this attribute, it won't be saved.
# Line 526  namespace gig { Line 533  namespace gig {
533              unsigned long Read(void* pBuffer, unsigned long SampleCount, buffer_t* pExternalDecompressionBuffer = NULL);              unsigned long Read(void* pBuffer, unsigned long SampleCount, buffer_t* pExternalDecompressionBuffer = NULL);
534              unsigned long ReadAndLoop(void* pBuffer, unsigned long SampleCount, playback_state_t* pPlaybackState, DimensionRegion* pDimRgn, buffer_t* pExternalDecompressionBuffer = NULL);              unsigned long ReadAndLoop(void* pBuffer, unsigned long SampleCount, playback_state_t* pPlaybackState, DimensionRegion* pDimRgn, buffer_t* pExternalDecompressionBuffer = NULL);
535              unsigned long Write(void* pBuffer, unsigned long SampleCount);              unsigned long Write(void* pBuffer, unsigned long SampleCount);
536                Group*        GetGroup() const;
537              virtual void  UpdateChunks();              virtual void  UpdateChunks();
538          protected:          protected:
539              static unsigned int  Instances;               ///< Number of instances of class Sample.              static unsigned int  Instances;               ///< Number of instances of class Sample.
540              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 as well as for truncation of 24 Bit -> 16 Bit samples.
541                Group*               pGroup;                  ///< pointer to the Group this sample belongs to (always not-NULL)
542              unsigned long        FrameOffset;             ///< Current offset (sample points) in current sample frame (for decompression only).              unsigned long        FrameOffset;             ///< Current offset (sample points) in current sample frame (for decompression only).
543              unsigned long*       FrameTable;              ///< For positioning within compressed samples only: stores the offset values for each frame.              unsigned long*       FrameTable;              ///< For positioning within compressed samples only: stores the offset values for each frame.
544              unsigned long        SamplePos;               ///< For compressed samples only: stores the current position (in sample points).              unsigned long        SamplePos;               ///< For compressed samples only: stores the current position (in sample points).
# Line 569  namespace gig { Line 578  namespace gig {
578              void ScanCompressedSample();              void ScanCompressedSample();
579              friend class File;              friend class File;
580              friend class Region;              friend class Region;
581                friend class Group; // allow to modify protected member pGroup
582      };      };
583    
584      // TODO: <3dnl> list not used yet - not important though (just contains optional descriptions for the dimensions)      // TODO: <3dnl> list not used yet - not important though (just contains optional descriptions for the dimensions)
# Line 637  namespace gig { Line 647  namespace gig {
647              friend class File;              friend class File;
648      };      };
649    
650      // TODO: <3gnm> chunk not added yet (just contains the names of the sample groups)      /** @brief Group of Gigasampler objects
651         *
652         * Groups help to organize a huge collection of Gigasampler objects.
653         * Groups are not concerned at all for the synthesis, but they help
654         * sound library developers when working on complex instruments with an
655         * instrument editor (as long as that instrument editor supports it ;-).
656         *
657         * At the moment, it seems as only samples can be grouped together in
658         * the Gigasampler format yet. If this is false in the meantime, please
659         * tell us !
660         *
661         * A sample is always assigned to exactly one Group. This also means
662         * there is always at least one Group in a .gig file, no matter if you
663         * created one yet or not.
664         */
665        class Group {
666            public:
667                String Name; ///< Stores the name of this Group.
668    
669                Sample* GetFirstSample();
670                Sample* GetNextSample();
671                void AddSample(Sample* pSample);
672            protected:
673                Group(File* file, RIFF::Chunk* ck3gnm);
674                virtual ~Group();
675                virtual void UpdateChunks();
676                void MoveAll();
677                friend class File;
678            private:
679                File*        pFile;
680                RIFF::Chunk* pNameChunk;
681        };
682    
683      /** Parses Gigasampler files and provides abstract access to the data. */      /** Parses Gigasampler files and provides abstract access to the data. */
684      class File : protected DLS::File {      class File : protected DLS::File {
685          public:          public:
# Line 657  namespace gig { Line 699  namespace gig {
699              File(RIFF::File* pRIFF);              File(RIFF::File* pRIFF);
700              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); ///< Returns a pointer to the first <i>Sample</i> object of the file, <i>NULL</i> otherwise.
701              Sample*     GetNextSample();      ///< Returns a pointer to the next <i>Sample</i> object of the file, <i>NULL</i> otherwise.              Sample*     GetNextSample();      ///< Returns a pointer to the next <i>Sample</i> object of the file, <i>NULL</i> otherwise.
             Instrument* GetFirstInstrument(); ///< Returns a pointer to the first <i>Instrument</i> object of the file, <i>NULL</i> otherwise.  
702              Sample*     AddSample();              Sample*     AddSample();
703              void        DeleteSample(Sample* pSample);              void        DeleteSample(Sample* pSample);
704                Instrument* GetFirstInstrument(); ///< Returns a pointer to the first <i>Instrument</i> object of the file, <i>NULL</i> otherwise.
705              Instrument* GetNextInstrument();  ///< Returns a pointer to the next <i>Instrument</i> object of the file, <i>NULL</i> otherwise.              Instrument* GetNextInstrument();  ///< Returns a pointer to the next <i>Instrument</i> object of the file, <i>NULL</i> otherwise.
706              Instrument* GetInstrument(uint index, progress_t* pProgress = NULL);              Instrument* GetInstrument(uint index, progress_t* pProgress = NULL);
707              Instrument* AddInstrument();              Instrument* AddInstrument();
708              void        DeleteInstrument(Instrument* pInstrument);              void        DeleteInstrument(Instrument* pInstrument);
709                Group*      GetFirstGroup(); ///< Returns a pointer to the first <i>Group</i> object of the file, <i>NULL</i> otherwise.
710                Group*      GetNextGroup();  ///< Returns a pointer to the next <i>Group</i> object of the file, <i>NULL</i> otherwise.
711                Group*      GetGroup(uint index);
712                Group*      AddGroup();
713                void        DeleteGroup(Group* pGroup);
714                virtual    ~File();
715          protected:          protected:
716              // overridden protected methods from DLS::File              // overridden protected methods from DLS::File
717              virtual void LoadSamples();              virtual void LoadSamples();
718              virtual void LoadInstruments();              virtual void LoadInstruments();
719                virtual void LoadGroups();
720              // own protected methods              // own protected methods
721              virtual void LoadSamples(progress_t* pProgress);              virtual void LoadSamples(progress_t* pProgress);
722              virtual void LoadInstruments(progress_t* pProgress);              virtual void LoadInstruments(progress_t* pProgress);
723              friend class Region;              friend class Region;
724                friend class Sample;
725                friend class Group; // so Group can access protected member pRIFF
726            private:
727                std::list<Group*>*          pGroups;
728                std::list<Group*>::iterator GroupsIterator;
729      };      };
730    
731      /** Will be thrown whenever a gig specific error occurs while trying to access a Gigasampler File. */      /** Will be thrown whenever a gig specific error occurs while trying to access a Gigasampler File. */

Legend:
Removed from v.926  
changed lines
  Added in v.1070

  ViewVC Help
Powered by ViewVC