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

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

  ViewVC Help
Powered by ViewVC