/[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 2555 by schoenebeck, Fri May 16 23:08:42 2014 UTC revision 2682 by schoenebeck, Mon Dec 29 16:25:51 2014 UTC
# Line 25  Line 25 
25  #define __GIG_H__  #define __GIG_H__
26    
27  #include "DLS.h"  #include "DLS.h"
28    #include <vector>
29    
30  #if WORDS_BIGENDIAN  #if WORDS_BIGENDIAN
31  # define LIST_TYPE_3PRG 0x33707267  # define LIST_TYPE_3PRG 0x33707267
32  # define LIST_TYPE_3EWL 0x3365776C  # define LIST_TYPE_3EWL 0x3365776C
33  # define LIST_TYPE_3GRI 0x33677269  # define LIST_TYPE_3GRI 0x33677269
34  # define LIST_TYPE_3GNL 0x33676E6C  # define LIST_TYPE_3GNL 0x33676E6C
35    # define LIST_TYPE_3LS  0x334c5320 // own gig format extension
36    # define LIST_TYPE_RTIS 0x52544953 // own gig format extension
37  # define CHUNK_ID_3GIX  0x33676978  # define CHUNK_ID_3GIX  0x33676978
38  # define CHUNK_ID_3EWA  0x33657761  # define CHUNK_ID_3EWA  0x33657761
39  # define CHUNK_ID_3LNK  0x336C6E6B  # define CHUNK_ID_3LNK  0x336C6E6B
# Line 39  Line 42 
42  # define CHUNK_ID_3GNM  0x33676E6D  # define CHUNK_ID_3GNM  0x33676E6D
43  # define CHUNK_ID_EINF  0x65696E66  # define CHUNK_ID_EINF  0x65696E66
44  # define CHUNK_ID_3CRC  0x33637263  # define CHUNK_ID_3CRC  0x33637263
45    # define CHUNK_ID_SCRI  0x53637269 // own gig format extension
46    # define CHUNK_ID_LSNM  0x4c534e4d // own gig format extension
47    # define CHUNK_ID_SCSL  0x5343534c // own gig format extension
48  #else  // little endian  #else  // little endian
49  # define LIST_TYPE_3PRG 0x67727033  # define LIST_TYPE_3PRG 0x67727033
50  # define LIST_TYPE_3EWL 0x6C776533  # define LIST_TYPE_3EWL 0x6C776533
51  # define LIST_TYPE_3GRI 0x69726733  # define LIST_TYPE_3GRI 0x69726733
52  # define LIST_TYPE_3GNL 0x6C6E6733  # define LIST_TYPE_3GNL 0x6C6E6733
53    # define LIST_TYPE_3LS  0x20534c33 // own gig format extension
54    # define LIST_TYPE_RTIS 0x53495452 // own gig format extension
55  # define CHUNK_ID_3GIX  0x78696733  # define CHUNK_ID_3GIX  0x78696733
56  # define CHUNK_ID_3EWA  0x61776533  # define CHUNK_ID_3EWA  0x61776533
57  # define CHUNK_ID_3LNK  0x6B6E6C33  # define CHUNK_ID_3LNK  0x6B6E6C33
# Line 52  Line 60 
60  # define CHUNK_ID_3GNM  0x6D6E6733  # define CHUNK_ID_3GNM  0x6D6E6733
61  # define CHUNK_ID_EINF  0x666E6965  # define CHUNK_ID_EINF  0x666E6965
62  # define CHUNK_ID_3CRC  0x63726333  # define CHUNK_ID_3CRC  0x63726333
63    # define CHUNK_ID_SCRI  0x69726353 // own gig format extension
64    # define CHUNK_ID_LSNM  0x4d4e534c // own gig format extension
65    # define CHUNK_ID_SCSL  0x4c534353 // own gig format extension
66  #endif // WORDS_BIGENDIAN  #endif // WORDS_BIGENDIAN
67    
68  /** Gigasampler specific classes and definitions */  /** Gigasampler specific classes and definitions */
69  namespace gig {  namespace gig {
70    
71      typedef std::string String;      typedef std::string String;
72        typedef RIFF::progress_t progress_t;
73    
74      /** Lower and upper limit of a range. */      /** Lower and upper limit of a range. */
75      struct range_t {      struct range_t {
# Line 300  namespace gig { Line 312  namespace gig {
312          unsigned long loop_cycles_left;  ///< How many times the loop has still to be passed, this value will be decremented with each loop cycle.          unsigned long loop_cycles_left;  ///< How many times the loop has still to be passed, this value will be decremented with each loop cycle.
313      };      };
314    
     /**  
      * @brief Used for indicating the progress of a certain task.  
      *  
      * The function pointer argument has to be supplied with a valid  
      * function of the given signature which will then be called on  
      * progress changes. An equivalent progress_t structure will be passed  
      * back as argument to the callback function on each progress change.  
      * The factor field of the supplied progress_t structure will then  
      * reflect the current progress as value between 0.0 and 1.0. You might  
      * want to use the custom field for data needed in your callback  
      * function.  
      */  
     struct progress_t {  
         void (*callback)(progress_t*); ///< Callback function pointer which has to be assigned to a function for progress notification.  
         float factor;                  ///< Reflects current progress as value between 0.0 and 1.0.  
         void* custom;                  ///< This pointer can be used for arbitrary data.  
         float __range_min;             ///< Only for internal usage, do not modify!  
         float __range_max;             ///< Only for internal usage, do not modify!  
         progress_t();  
     };  
   
315      // just symbol prototyping      // just symbol prototyping
316      class File;      class File;
317      class Instrument;      class Instrument;
318      class Sample;      class Sample;
319      class Region;      class Region;
320      class Group;      class Group;
321        class Script;
322        class ScriptGroup;
323    
324      /** @brief Encapsulates articulation information of a dimension region.      /** @brief Encapsulates articulation information of a dimension region.
325       *       *
# Line 454  namespace gig { Line 447  namespace gig {
447              using DLS::Sampler::DeleteSampleLoop;              using DLS::Sampler::DeleteSampleLoop;
448              // overridden methods              // overridden methods
449              virtual void SetGain(int32_t gain);              virtual void SetGain(int32_t gain);
450              virtual void UpdateChunks();              virtual void UpdateChunks(progress_t* pProgress);
451              virtual void CopyAssign(const DimensionRegion* orig);              virtual void CopyAssign(const DimensionRegion* orig);
452          protected:          protected:
453              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 634  namespace gig { Line 627  namespace gig {
627              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);
628              unsigned long Write(void* pBuffer, unsigned long SampleCount);              unsigned long Write(void* pBuffer, unsigned long SampleCount);
629              Group*        GetGroup() const;              Group*        GetGroup() const;
630              virtual void  UpdateChunks();              virtual void  UpdateChunks(progress_t* pProgress);
631              void CopyAssignMeta(const Sample* orig);              void CopyAssignMeta(const Sample* orig);
632              void CopyAssignWave(const Sample* orig);              void CopyAssignWave(const Sample* orig);
633          protected:          protected:
# Line 712  namespace gig { Line 705  namespace gig {
705              // own methods              // own methods
706              DimensionRegion* GetDimensionRegionByValue(const uint DimValues[8]);              DimensionRegion* GetDimensionRegionByValue(const uint DimValues[8]);
707              DimensionRegion* GetDimensionRegionByBit(const uint8_t DimBits[8]);              DimensionRegion* GetDimensionRegionByBit(const uint8_t DimBits[8]);
708                int              GetDimensionRegionIndexByValue(const uint DimValues[8]);
709              Sample*          GetSample();              Sample*          GetSample();
710              void             AddDimension(dimension_def_t* pDimDef);              void             AddDimension(dimension_def_t* pDimDef);
711              void             DeleteDimension(dimension_def_t* pDimDef);              void             DeleteDimension(dimension_def_t* pDimDef);
712              dimension_def_t* GetDimensionDefinition(dimension_t type);              dimension_def_t* GetDimensionDefinition(dimension_t type);
713              void             DeleteDimensionZone(dimension_t type, int zone);              void             DeleteDimensionZone(dimension_t type, int zone);
714              void             SplitDimensionZone(dimension_t type, int zone);              void             SplitDimensionZone(dimension_t type, int zone);
715                void             SetDimensionType(dimension_t oldType, dimension_t newType);
716              // overridden methods              // overridden methods
717              virtual void     SetKeyRange(uint16_t Low, uint16_t High);              virtual void     SetKeyRange(uint16_t Low, uint16_t High);
718              virtual void     UpdateChunks();              virtual void     UpdateChunks(progress_t* pProgress);
719              virtual void     CopyAssign(const Region* orig);              virtual void     CopyAssign(const Region* orig);
720          protected:          protected:
721              Region(Instrument* pInstrument, RIFF::List* rgnList);              Region(Instrument* pInstrument, RIFF::List* rgnList);
# Line 834  namespace gig { Line 829  namespace gig {
829              friend class Instrument;              friend class Instrument;
830      };      };
831    
832        /** @brief Real-time instrument script (gig format extension).
833         *
834         * Real-time instrument scripts are user supplied small programs which can
835         * be used by instrument designers to create custom behaviors and features
836         * not available in the stock sampler engine. Features which might be very
837         * exotic or specific for the respective instrument.
838         *
839         * This is an extension of the GigaStudio format, thus a feature which was
840         * not available in the GigaStudio 4 software. It is currently only
841         * supported by LinuxSampler and gigedit.
842         */
843        class Script {
844            public:
845                enum Encoding_t {
846                    ENCODING_ASCII = 0 ///< Standard 8 bit US ASCII character encoding (default).
847                };
848                enum Compression_t {
849                    COMPRESSION_NONE = 0 ///< Is not compressed at all (default).
850                };
851                enum Language_t {
852                    LANGUAGE_NKSP = 0 ///< NKSP stands for "Is Not KSP" (default).
853                };
854    
855                String         Name;        ///< Arbitrary name of the script, which may be displayed i.e. in an instrument editor.
856                Compression_t  Compression; ///< Whether the script was/should be compressed, and if so, which compression algorithm shall be used.
857                Encoding_t     Encoding;    ///< Format the script's source code text is encoded with.
858                Language_t     Language;    ///< Programming language and dialect the script is written in.
859                bool           Bypass;      ///< Global bypass: if enabled, this script shall not be executed by the sampler for any instrument.
860    
861                String GetScriptAsText();
862                void   SetScriptAsText(const String& text);
863                void   SetGroup(ScriptGroup* pGroup);
864                ScriptGroup* GetGroup() const;
865            protected:
866                Script(ScriptGroup* group, RIFF::Chunk* ckScri);
867                virtual ~Script();
868                void UpdateChunks(progress_t* pProgress);
869                void RemoveAllScriptReferences();
870                friend class ScriptGroup;
871                friend class Instrument;
872            private:
873                ScriptGroup*          pGroup;
874                RIFF::Chunk*          pChunk; ///< 'Scri' chunk
875                std::vector<uint8_t>  data;
876                uint32_t              crc; ///< CRC-32 checksum of the raw script data
877        };
878    
879        /** @brief Group of instrument scripts (gig format extension).
880         *
881         * This class is simply used to sort a bunch of real-time instrument scripts
882         * into individual groups. This allows instrument designers and script
883         * developers to keep scripts in a certain order while working with a larger
884         * amount of scripts in an instrument editor.
885         *
886         * This is an extension of the GigaStudio format, thus a feature which was
887         * not available in the GigaStudio 4 software. It is currently only
888         * supported by LinuxSampler and gigedit.
889         */
890        class ScriptGroup {
891            public:
892                String   Name; ///< Name of this script group. For example to be displayed in an instrument editor.
893    
894                Script*  GetScript(uint index);
895                Script*  AddScript();
896                void     DeleteScript(Script* pScript);
897            protected:
898                ScriptGroup(File* file, RIFF::List* lstRTIS);
899                virtual ~ScriptGroup();
900                void LoadScripts();
901                void UpdateChunks(progress_t* pProgress);
902                friend class Script;
903                friend class File;
904            private:
905                File*                pFile;
906                RIFF::List*          pList; ///< 'RTIS' list chunk
907                std::list<Script*>*  pScripts;
908        };
909    
910      /** Provides all neccessary information for the synthesis of an <i>Instrument</i>. */      /** Provides all neccessary information for the synthesis of an <i>Instrument</i>. */
911      class Instrument : protected DLS::Instrument {      class Instrument : protected DLS::Instrument {
912          public:          public:
# Line 863  namespace gig { Line 936  namespace gig {
936              Region*   GetNextRegion();              Region*   GetNextRegion();
937              Region*   AddRegion();              Region*   AddRegion();
938              void      DeleteRegion(Region* pRegion);              void      DeleteRegion(Region* pRegion);
939              virtual void UpdateChunks();              virtual void UpdateChunks(progress_t* pProgress);
940              virtual void CopyAssign(const Instrument* orig);              virtual void CopyAssign(const Instrument* orig);
941              // own methods              // own methods
942              Region*   GetRegion(unsigned int Key);              Region*   GetRegion(unsigned int Key);
# Line 872  namespace gig { Line 945  namespace gig {
945              MidiRuleLegato*      AddMidiRuleLegato();              MidiRuleLegato*      AddMidiRuleLegato();
946              MidiRuleAlternator*  AddMidiRuleAlternator();              MidiRuleAlternator*  AddMidiRuleAlternator();
947              void      DeleteMidiRule(int i);              void      DeleteMidiRule(int i);
948                // real-time instrument script methods
949                Script*   GetScriptOfSlot(uint index);
950                void      AddScriptSlot(Script* pScript, bool bypass = false);
951                void      SwapScriptSlots(uint index1, uint index2);
952                void      RemoveScriptSlot(uint index);
953                void      RemoveScript(Script* pScript);
954                uint      ScriptSlotCount() const;
955                bool      IsScriptSlotBypassed(uint index);
956                void      SetScriptSlotBypassed(uint index, bool bBypass);
957          protected:          protected:
958              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
959    
# Line 879  namespace gig { Line 961  namespace gig {
961             ~Instrument();             ~Instrument();
962              void CopyAssign(const Instrument* orig, const std::map<Sample*,Sample*>* mSamples);              void CopyAssign(const Instrument* orig, const std::map<Sample*,Sample*>* mSamples);
963              void UpdateRegionKeyTable();              void UpdateRegionKeyTable();
964                void LoadScripts();
965                void UpdateScriptFileOffsets();
966              friend class File;              friend class File;
967              friend class Region; // so Region can call UpdateRegionKeyTable()              friend class Region; // so Region can call UpdateRegionKeyTable()
968          private:          private:
969                struct _ScriptPooolEntry {
970                    uint32_t fileOffset;
971                    bool     bypass;
972                };
973                struct _ScriptPooolRef {
974                    Script*  script;
975                    bool     bypass;
976                };
977              MidiRule** pMidiRules;              MidiRule** pMidiRules;
978                std::vector<_ScriptPooolEntry> scriptPoolFileOffsets;
979                std::vector<_ScriptPooolRef>* pScriptRefs;
980      };      };
981    
982      /** @brief Group of Gigasampler objects      /** @brief Group of Gigasampler objects
# Line 910  namespace gig { Line 1004  namespace gig {
1004          protected:          protected:
1005              Group(File* file, RIFF::Chunk* ck3gnm);              Group(File* file, RIFF::Chunk* ck3gnm);
1006              virtual ~Group();              virtual ~Group();
1007              virtual void UpdateChunks();              virtual void UpdateChunks(progress_t* pProgress);
1008              void MoveAll();              void MoveAll();
1009              friend class File;              friend class File;
1010          private:          private:
# Line 961  namespace gig { Line 1055  namespace gig {
1055              void        SetAutoLoad(bool b);              void        SetAutoLoad(bool b);
1056              bool        GetAutoLoad();              bool        GetAutoLoad();
1057              void        AddContentOf(File* pFile);              void        AddContentOf(File* pFile);
1058                ScriptGroup* GetScriptGroup(uint index);
1059                ScriptGroup* GetScriptGroup(const String& name);
1060                ScriptGroup* AddScriptGroup();
1061                void        DeleteScriptGroup(ScriptGroup* pGroup);
1062              virtual    ~File();              virtual    ~File();
1063              virtual void UpdateChunks();              virtual void UpdateChunks(progress_t* pProgress);
1064          protected:          protected:
1065              // overridden protected methods from DLS::File              // overridden protected methods from DLS::File
1066              virtual void LoadSamples();              virtual void LoadSamples();
1067              virtual void LoadInstruments();              virtual void LoadInstruments();
1068              virtual void LoadGroups();              virtual void LoadGroups();
1069                virtual void UpdateFileOffsets();
1070              // own protected methods              // own protected methods
1071              virtual void LoadSamples(progress_t* pProgress);              virtual void LoadSamples(progress_t* pProgress);
1072              virtual void LoadInstruments(progress_t* pProgress);              virtual void LoadInstruments(progress_t* pProgress);
1073                virtual void LoadScriptGroups();
1074              void SetSampleChecksum(Sample* pSample, uint32_t crc);              void SetSampleChecksum(Sample* pSample, uint32_t crc);
1075              friend class Region;              friend class Region;
1076              friend class Sample;              friend class Sample;
1077              friend class Group; // so Group can access protected member pRIFF              friend class Group; // so Group can access protected member pRIFF
1078                friend class ScriptGroup; // so ScriptGroup can access protected member pRIFF
1079          private:          private:
1080              std::list<Group*>*          pGroups;              std::list<Group*>*          pGroups;
1081              std::list<Group*>::iterator GroupsIterator;              std::list<Group*>::iterator GroupsIterator;
1082              bool                        bAutoLoad;              bool                        bAutoLoad;
1083                std::list<ScriptGroup*>*    pScriptGroups;
1084      };      };
1085    
1086      /**      /**

Legend:
Removed from v.2555  
changed lines
  Added in v.2682

  ViewVC Help
Powered by ViewVC