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 |
* |
* |
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(); |
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 |
}; |
}; |
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: |
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 |
|
|
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 |
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: |
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 |
/** |
/** |