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

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

  ViewVC Help
Powered by ViewVC