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 |
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 |
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 */ |
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 |
* |
* |
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: |
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 |
|
|
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 |
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: |
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 |
/** |
/** |