/[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 2547 by schoenebeck, Tue May 13 11:17:24 2014 UTC revision 2639 by schoenebeck, Mon Jun 16 13:22:50 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 */
# Line 327  namespace gig { Line 338  namespace gig {
338      class Sample;      class Sample;
339      class Region;      class Region;
340      class Group;      class Group;
341        class Script;
342        class ScriptGroup;
343    
344      /** @brief Encapsulates articulation information of a dimension region.      /** @brief Encapsulates articulation information of a dimension region.
345       *       *
# Line 712  namespace gig { Line 725  namespace gig {
725              // own methods              // own methods
726              DimensionRegion* GetDimensionRegionByValue(const uint DimValues[8]);              DimensionRegion* GetDimensionRegionByValue(const uint DimValues[8]);
727              DimensionRegion* GetDimensionRegionByBit(const uint8_t DimBits[8]);              DimensionRegion* GetDimensionRegionByBit(const uint8_t DimBits[8]);
728                int              GetDimensionRegionIndexByValue(const uint DimValues[8]);
729              Sample*          GetSample();              Sample*          GetSample();
730              void             AddDimension(dimension_def_t* pDimDef);              void             AddDimension(dimension_def_t* pDimDef);
731              void             DeleteDimension(dimension_def_t* pDimDef);              void             DeleteDimension(dimension_def_t* pDimDef);
732              dimension_def_t* GetDimensionDefinition(dimension_t type);              dimension_def_t* GetDimensionDefinition(dimension_t type);
733                void             DeleteDimensionZone(dimension_t type, int zone);
734                void             SplitDimensionZone(dimension_t type, int zone);
735                void             SetDimensionType(dimension_t oldType, dimension_t newType);
736              // overridden methods              // overridden methods
737              virtual void     SetKeyRange(uint16_t Low, uint16_t High);              virtual void     SetKeyRange(uint16_t Low, uint16_t High);
738              virtual void     UpdateChunks();              virtual void     UpdateChunks();
# Line 726  namespace gig { Line 743  namespace gig {
743              void UpdateVelocityTable();              void UpdateVelocityTable();
744              Sample* GetSampleFromWavePool(unsigned int WavePoolTableIndex, progress_t* pProgress = NULL);              Sample* GetSampleFromWavePool(unsigned int WavePoolTableIndex, progress_t* pProgress = NULL);
745              void CopyAssign(const Region* orig, const std::map<Sample*,Sample*>* mSamples);              void CopyAssign(const Region* orig, const std::map<Sample*,Sample*>* mSamples);
746                DimensionRegion* GetDimensionRegionByBit(const std::map<dimension_t,int>& DimCase);
747             ~Region();             ~Region();
748              friend class Instrument;              friend class Instrument;
749      };      };
# Line 831  namespace gig { Line 849  namespace gig {
849              friend class Instrument;              friend class Instrument;
850      };      };
851    
852        /** @brief Real-time instrument script (gig format extension).
853         *
854         * Real-time instrument scripts are user supplied small programs which can
855         * be used by instrument designers to create custom behaviors and features
856         * not available in the stock sampler engine. Features which might be very
857         * exotic or specific for the respective instrument.
858         *
859         * This is an extension of the GigaStudio format, thus a feature which was
860         * not available in the GigaStudio 4 software. It is currently only
861         * supported by LinuxSampler and gigedit.
862         */
863        class Script {
864            public:
865                enum Encoding_t {
866                    ENCODING_ASCII = 0 ///< Standard 8 bit US ASCII character encoding (default).
867                };
868                enum Compression_t {
869                    COMPRESSION_NONE = 0 ///< Is not compressed at all (default).
870                };
871                enum Language_t {
872                    LANGUAGE_NKSP = 0 ///< NKSP stands for "Is Not KSP" (default).
873                };
874    
875                String         Name;        ///< Arbitrary name of the script, which may be displayed i.e. in an instrument editor.
876                Compression_t  Compression; ///< Whether the script was/should be compressed, and if so, which compression algorithm shall be used.
877                Encoding_t     Encoding;    ///< Format the script's source code text is encoded with.
878                Language_t     Language;    ///< Programming language and dialect the script is written in.
879                bool           Bypass;      ///< Global bypass: if enabled, this script shall not be executed by the sampler for any instrument.
880    
881                String GetScriptAsText();
882                void   SetScriptAsText(const String& text);
883                void   SetGroup(ScriptGroup* pGroup);
884                ScriptGroup* GetGroup() const;
885            protected:
886                Script(ScriptGroup* group, RIFF::Chunk* ckScri);
887                virtual ~Script();
888                void UpdateChunks();
889                void RemoveAllScriptReferences();
890                friend class ScriptGroup;
891                friend class Instrument;
892            private:
893                ScriptGroup*          pGroup;
894                RIFF::Chunk*          pChunk; ///< 'Scri' chunk
895                std::vector<uint8_t>  data;
896                uint32_t              crc; ///< CRC-32 checksum of the raw script data
897        };
898    
899        /** @brief Group of instrument scripts (gig format extension).
900         *
901         * This class is simply used to sort a bunch of real-time instrument scripts
902         * into individual groups. This allows instrument designers and script
903         * developers to keep scripts in a certain order while working with a larger
904         * amount of scripts in an instrument editor.
905         *
906         * This is an extension of the GigaStudio format, thus a feature which was
907         * not available in the GigaStudio 4 software. It is currently only
908         * supported by LinuxSampler and gigedit.
909         */
910        class ScriptGroup {
911            public:
912                String   Name; ///< Name of this script group. For example to be displayed in an instrument editor.
913    
914                Script*  GetScript(uint index);
915                Script*  AddScript();
916                void     DeleteScript(Script* pScript);
917            protected:
918                ScriptGroup(File* file, RIFF::List* lstRTIS);
919                virtual ~ScriptGroup();
920                void LoadScripts();
921                void UpdateChunks();
922                friend class Script;
923                friend class File;
924            private:
925                File*                pFile;
926                RIFF::List*          pList; ///< 'RTIS' list chunk
927                std::list<Script*>*  pScripts;
928        };
929    
930      /** Provides all neccessary information for the synthesis of an <i>Instrument</i>. */      /** Provides all neccessary information for the synthesis of an <i>Instrument</i>. */
931      class Instrument : protected DLS::Instrument {      class Instrument : protected DLS::Instrument {
932          public:          public:
# Line 869  namespace gig { Line 965  namespace gig {
965              MidiRuleLegato*      AddMidiRuleLegato();              MidiRuleLegato*      AddMidiRuleLegato();
966              MidiRuleAlternator*  AddMidiRuleAlternator();              MidiRuleAlternator*  AddMidiRuleAlternator();
967              void      DeleteMidiRule(int i);              void      DeleteMidiRule(int i);
968                // real-time instrument script methods
969                Script*   GetScriptOfSlot(uint index);
970                void      AddScriptSlot(Script* pScript, bool bypass = false);
971                void      SwapScriptSlots(uint index1, uint index2);
972                void      RemoveScriptSlot(uint index);
973                void      RemoveScript(Script* pScript);
974                uint      ScriptSlotCount() const;
975                bool      IsScriptSlotBypassed(uint index);
976                void      SetScriptSlotBypassed(uint index, bool bBypass);
977          protected:          protected:
978              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
979    
# Line 876  namespace gig { Line 981  namespace gig {
981             ~Instrument();             ~Instrument();
982              void CopyAssign(const Instrument* orig, const std::map<Sample*,Sample*>* mSamples);              void CopyAssign(const Instrument* orig, const std::map<Sample*,Sample*>* mSamples);
983              void UpdateRegionKeyTable();              void UpdateRegionKeyTable();
984                void LoadScripts();
985                void UpdateScriptFileOffsets();
986              friend class File;              friend class File;
987              friend class Region; // so Region can call UpdateRegionKeyTable()              friend class Region; // so Region can call UpdateRegionKeyTable()
988          private:          private:
989                struct _ScriptPooolEntry {
990                    uint32_t fileOffset;
991                    bool     bypass;
992                };
993                struct _ScriptPooolRef {
994                    Script*  script;
995                    bool     bypass;
996                };
997              MidiRule** pMidiRules;              MidiRule** pMidiRules;
998                std::vector<_ScriptPooolEntry> scriptPoolFileOffsets;
999                std::vector<_ScriptPooolRef>* pScriptRefs;
1000      };      };
1001    
1002      /** @brief Group of Gigasampler objects      /** @brief Group of Gigasampler objects
# Line 958  namespace gig { Line 1075  namespace gig {
1075              void        SetAutoLoad(bool b);              void        SetAutoLoad(bool b);
1076              bool        GetAutoLoad();              bool        GetAutoLoad();
1077              void        AddContentOf(File* pFile);              void        AddContentOf(File* pFile);
1078                ScriptGroup* GetScriptGroup(uint index);
1079                ScriptGroup* GetScriptGroup(const String& name);
1080                ScriptGroup* AddScriptGroup();
1081                void        DeleteScriptGroup(ScriptGroup* pGroup);
1082              virtual    ~File();              virtual    ~File();
1083              virtual void UpdateChunks();              virtual void UpdateChunks();
1084          protected:          protected:
# Line 965  namespace gig { Line 1086  namespace gig {
1086              virtual void LoadSamples();              virtual void LoadSamples();
1087              virtual void LoadInstruments();              virtual void LoadInstruments();
1088              virtual void LoadGroups();              virtual void LoadGroups();
1089                virtual void UpdateFileOffsets();
1090              // own protected methods              // own protected methods
1091              virtual void LoadSamples(progress_t* pProgress);              virtual void LoadSamples(progress_t* pProgress);
1092              virtual void LoadInstruments(progress_t* pProgress);              virtual void LoadInstruments(progress_t* pProgress);
1093                virtual void LoadScriptGroups();
1094              void SetSampleChecksum(Sample* pSample, uint32_t crc);              void SetSampleChecksum(Sample* pSample, uint32_t crc);
1095              friend class Region;              friend class Region;
1096              friend class Sample;              friend class Sample;
1097              friend class Group; // so Group can access protected member pRIFF              friend class Group; // so Group can access protected member pRIFF
1098                friend class ScriptGroup; // so ScriptGroup can access protected member pRIFF
1099          private:          private:
1100              std::list<Group*>*          pGroups;              std::list<Group*>*          pGroups;
1101              std::list<Group*>::iterator GroupsIterator;              std::list<Group*>::iterator GroupsIterator;
1102              bool                        bAutoLoad;              bool                        bAutoLoad;
1103                std::list<ScriptGroup*>*    pScriptGroups;
1104      };      };
1105    
1106      /**      /**

Legend:
Removed from v.2547  
changed lines
  Added in v.2639

  ViewVC Help
Powered by ViewVC