/[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 2599 by schoenebeck, Sat Jun 7 00:00:10 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            protected:
884                Script(ScriptGroup* group, RIFF::Chunk* ckScri);
885                virtual ~Script();
886                void UpdateChunks();
887                void RemoveAllScriptReferences();
888                friend class ScriptGroup;
889                friend class Instrument;
890            private:
891                ScriptGroup*          pGroup;
892                RIFF::Chunk*          pChunk; ///< 'Scri' chunk
893                std::vector<uint8_t>  data;
894                uint32_t              crc; ///< CRC-32 checksum of the raw script data
895        };
896    
897        /** @brief Group of instrument scripts (gig format extension).
898         *
899         * This class is simply used to sort a bunch of real-time instrument scripts
900         * into individual groups. This allows instrument designers and script
901         * developers to keep scripts in a certain order while working with a larger
902         * amount of scripts in an instrument editor.
903         *
904         * This is an extension of the GigaStudio format, thus a feature which was
905         * not available in the GigaStudio 4 software. It is currently only
906         * supported by LinuxSampler and gigedit.
907         */
908        class ScriptGroup {
909            public:
910                String   Name; ///< Name of this script group. For example to be displayed in an instrument editor.
911    
912                Script*  GetScript(uint index);
913                Script*  AddScript();
914                void     DeleteScript(Script* pScript);
915            protected:
916                ScriptGroup(File* file, RIFF::List* lstRTIS);
917                virtual ~ScriptGroup();
918                void LoadScripts();
919                void UpdateChunks();
920                friend class Script;
921                friend class File;
922            private:
923                File*                pFile;
924                RIFF::List*          pList; ///< 'RTIS' list chunk
925                std::list<Script*>*  pScripts;
926        };
927    
928      /** Provides all neccessary information for the synthesis of an <i>Instrument</i>. */      /** Provides all neccessary information for the synthesis of an <i>Instrument</i>. */
929      class Instrument : protected DLS::Instrument {      class Instrument : protected DLS::Instrument {
930          public:          public:
# Line 869  namespace gig { Line 963  namespace gig {
963              MidiRuleLegato*      AddMidiRuleLegato();              MidiRuleLegato*      AddMidiRuleLegato();
964              MidiRuleAlternator*  AddMidiRuleAlternator();              MidiRuleAlternator*  AddMidiRuleAlternator();
965              void      DeleteMidiRule(int i);              void      DeleteMidiRule(int i);
966                // real-time instrument script methods
967                Script*   GetScriptOfSlot(uint index);
968                void      AddScriptSlot(Script* pScript, bool bypass = false);
969                void      SwapScriptSlots(uint index1, uint index2);
970                void      RemoveScriptSlot(uint index);
971                void      RemoveScript(Script* pScript);
972                uint      ScriptSlotCount() const;
973                bool      IsScriptSlotBypassed(uint index);
974                void      SetScriptSlotBypassed(uint index, bool bBypass);
975          protected:          protected:
976              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
977    
# Line 876  namespace gig { Line 979  namespace gig {
979             ~Instrument();             ~Instrument();
980              void CopyAssign(const Instrument* orig, const std::map<Sample*,Sample*>* mSamples);              void CopyAssign(const Instrument* orig, const std::map<Sample*,Sample*>* mSamples);
981              void UpdateRegionKeyTable();              void UpdateRegionKeyTable();
982                void LoadScripts();
983              friend class File;              friend class File;
984              friend class Region; // so Region can call UpdateRegionKeyTable()              friend class Region; // so Region can call UpdateRegionKeyTable()
985          private:          private:
986                struct _ScriptPooolEntry {
987                    uint32_t fileOffset;
988                    bool     bypass;
989                };
990                struct _ScriptPooolRef {
991                    Script*  script;
992                    bool     bypass;
993                };
994              MidiRule** pMidiRules;              MidiRule** pMidiRules;
995                std::vector<_ScriptPooolEntry> scriptPoolFileOffsets;
996                std::vector<_ScriptPooolRef>* pScriptRefs;
997      };      };
998    
999      /** @brief Group of Gigasampler objects      /** @brief Group of Gigasampler objects
# Line 958  namespace gig { Line 1072  namespace gig {
1072              void        SetAutoLoad(bool b);              void        SetAutoLoad(bool b);
1073              bool        GetAutoLoad();              bool        GetAutoLoad();
1074              void        AddContentOf(File* pFile);              void        AddContentOf(File* pFile);
1075                ScriptGroup* GetScriptGroup(uint index);
1076                ScriptGroup* GetScriptGroup(const String& name);
1077                ScriptGroup* AddScriptGroup();
1078                void        DeleteScriptGroup(ScriptGroup* pGroup);
1079              virtual    ~File();              virtual    ~File();
1080              virtual void UpdateChunks();              virtual void UpdateChunks();
1081          protected:          protected:
# Line 968  namespace gig { Line 1086  namespace gig {
1086              // own protected methods              // own protected methods
1087              virtual void LoadSamples(progress_t* pProgress);              virtual void LoadSamples(progress_t* pProgress);
1088              virtual void LoadInstruments(progress_t* pProgress);              virtual void LoadInstruments(progress_t* pProgress);
1089                virtual void LoadScriptGroups();
1090              void SetSampleChecksum(Sample* pSample, uint32_t crc);              void SetSampleChecksum(Sample* pSample, uint32_t crc);
1091              friend class Region;              friend class Region;
1092              friend class Sample;              friend class Sample;
1093              friend class Group; // so Group can access protected member pRIFF              friend class Group; // so Group can access protected member pRIFF
1094                friend class ScriptGroup; // so ScriptGroup can access protected member pRIFF
1095          private:          private:
1096              std::list<Group*>*          pGroups;              std::list<Group*>*          pGroups;
1097              std::list<Group*>::iterator GroupsIterator;              std::list<Group*>::iterator GroupsIterator;
1098              bool                        bAutoLoad;              bool                        bAutoLoad;
1099                std::list<ScriptGroup*>*    pScriptGroups;
1100      };      };
1101    
1102      /**      /**

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

  ViewVC Help
Powered by ViewVC