/[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 933 by schoenebeck, Fri Nov 24 12:50:05 2006 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 489  namespace gig { Line 496  namespace gig {
496       */       */
497      class Sample : public DLS::Sample {      class Sample : public DLS::Sample {
498          public:          public:
             uint16_t       SampleGroup;  
499              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.
500              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.
501              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 532  namespace gig {
532              unsigned long Read(void* pBuffer, unsigned long SampleCount, buffer_t* pExternalDecompressionBuffer = NULL);              unsigned long Read(void* pBuffer, unsigned long SampleCount, buffer_t* pExternalDecompressionBuffer = NULL);
533              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);
534              unsigned long Write(void* pBuffer, unsigned long SampleCount);              unsigned long Write(void* pBuffer, unsigned long SampleCount);
535                Group*        GetGroup() const;
536              virtual void  UpdateChunks();              virtual void  UpdateChunks();
537          protected:          protected:
538              static unsigned int  Instances;               ///< Number of instances of class Sample.              static unsigned int  Instances;               ///< Number of instances of class Sample.
539              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.
540                Group*               pGroup;                  ///< pointer to the Group this sample belongs to (always not-NULL)
541              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).
542              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.
543              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 577  namespace gig {
577              void ScanCompressedSample();              void ScanCompressedSample();
578              friend class File;              friend class File;
579              friend class Region;              friend class Region;
580                friend class Group; // allow to modify protected member pGroup
581      };      };
582    
583      // 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 646  namespace gig {
646              friend class File;              friend class File;
647      };      };
648    
649      // TODO: <3gnm> chunk not added yet (just contains the names of the sample groups)      /** @brief Group of Gigasampler objects
650         *
651         * Groups help to organize a huge collection of Gigasampler objects.
652         * Groups are not concerned at all for the synthesis, but they help
653         * sound library developers when working on complex instruments with an
654         * instrument editor (as long as that instrument editor supports it ;-).
655         *
656         * At the moment, it seems as only samples can be grouped together in
657         * the Gigasampler format yet. If this is false in the meantime, please
658         * tell us !
659         *
660         * A sample is always assigned to exactly one Group. This also means
661         * there is always at least one Group in a .gig file, no matter if you
662         * created one yet or not.
663         */
664        class Group {
665            public:
666                String Name; ///< Stores the name of this Group.
667    
668                Sample* GetFirstSample();
669                Sample* GetNextSample();
670                void AddSample(Sample* pSample);
671            protected:
672                Group(File* file, RIFF::Chunk* ck3gnm);
673                virtual ~Group();
674                virtual void UpdateChunks();
675                void MoveAll();
676                friend class File;
677            private:
678                File*        pFile;
679                RIFF::Chunk* pNameChunk;
680        };
681    
682      /** Parses Gigasampler files and provides abstract access to the data. */      /** Parses Gigasampler files and provides abstract access to the data. */
683      class File : protected DLS::File {      class File : protected DLS::File {
684          public:          public:
# Line 657  namespace gig { Line 698  namespace gig {
698              File(RIFF::File* pRIFF);              File(RIFF::File* pRIFF);
699              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.
700              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.  
701              Sample*     AddSample();              Sample*     AddSample();
702              void        DeleteSample(Sample* pSample);              void        DeleteSample(Sample* pSample);
703                Instrument* GetFirstInstrument(); ///< Returns a pointer to the first <i>Instrument</i> object of the file, <i>NULL</i> otherwise.
704              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.
705              Instrument* GetInstrument(uint index, progress_t* pProgress = NULL);              Instrument* GetInstrument(uint index, progress_t* pProgress = NULL);
706              Instrument* AddInstrument();              Instrument* AddInstrument();
707              void        DeleteInstrument(Instrument* pInstrument);              void        DeleteInstrument(Instrument* pInstrument);
708                Group*      GetFirstGroup(); ///< Returns a pointer to the first <i>Group</i> object of the file, <i>NULL</i> otherwise.
709                Group*      GetNextGroup();  ///< Returns a pointer to the next <i>Group</i> object of the file, <i>NULL</i> otherwise.
710                Group*      GetGroup(uint index);
711                Group*      AddGroup();
712                void        DeleteGroup(Group* pGroup);
713                virtual    ~File();
714          protected:          protected:
715              // overridden protected methods from DLS::File              // overridden protected methods from DLS::File
716              virtual void LoadSamples();              virtual void LoadSamples();
717              virtual void LoadInstruments();              virtual void LoadInstruments();
718                virtual void LoadGroups();
719              // own protected methods              // own protected methods
720              virtual void LoadSamples(progress_t* pProgress);              virtual void LoadSamples(progress_t* pProgress);
721              virtual void LoadInstruments(progress_t* pProgress);              virtual void LoadInstruments(progress_t* pProgress);
722              friend class Region;              friend class Region;
723                friend class Sample;
724                friend class Group; // so Group can access protected member pRIFF
725            private:
726                std::list<Group*>*          pGroups;
727                std::list<Group*>::iterator GroupsIterator;
728      };      };
729    
730      /** 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.933

  ViewVC Help
Powered by ViewVC