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 */ |
69 |
namespace gig { |
namespace gig { |
70 |
|
|
71 |
typedef std::string String; |
typedef std::string String; |
72 |
|
typedef RIFF::progress_t progress_t; |
73 |
|
|
74 |
/** Lower and upper limit of a range. */ |
/** Lower and upper limit of a range. */ |
75 |
struct range_t { |
struct range_t { |
312 |
unsigned long loop_cycles_left; ///< How many times the loop has still to be passed, this value will be decremented with each loop cycle. |
unsigned long loop_cycles_left; ///< How many times the loop has still to be passed, this value will be decremented with each loop cycle. |
313 |
}; |
}; |
314 |
|
|
|
/** |
|
|
* @brief Used for indicating the progress of a certain task. |
|
|
* |
|
|
* The function pointer argument has to be supplied with a valid |
|
|
* function of the given signature which will then be called on |
|
|
* progress changes. An equivalent progress_t structure will be passed |
|
|
* back as argument to the callback function on each progress change. |
|
|
* The factor field of the supplied progress_t structure will then |
|
|
* reflect the current progress as value between 0.0 and 1.0. You might |
|
|
* want to use the custom field for data needed in your callback |
|
|
* function. |
|
|
*/ |
|
|
struct progress_t { |
|
|
void (*callback)(progress_t*); ///< Callback function pointer which has to be assigned to a function for progress notification. |
|
|
float factor; ///< Reflects current progress as value between 0.0 and 1.0. |
|
|
void* custom; ///< This pointer can be used for arbitrary data. |
|
|
float __range_min; ///< Only for internal usage, do not modify! |
|
|
float __range_max; ///< Only for internal usage, do not modify! |
|
|
progress_t(); |
|
|
}; |
|
|
|
|
315 |
// just symbol prototyping |
// just symbol prototyping |
316 |
class File; |
class File; |
317 |
class Instrument; |
class Instrument; |
318 |
class Sample; |
class Sample; |
319 |
class Region; |
class Region; |
320 |
class Group; |
class Group; |
321 |
|
class Script; |
322 |
|
class ScriptGroup; |
323 |
|
|
324 |
/** @brief Encapsulates articulation information of a dimension region. |
/** @brief Encapsulates articulation information of a dimension region. |
325 |
* |
* |
447 |
using DLS::Sampler::DeleteSampleLoop; |
using DLS::Sampler::DeleteSampleLoop; |
448 |
// overridden methods |
// overridden methods |
449 |
virtual void SetGain(int32_t gain); |
virtual void SetGain(int32_t gain); |
450 |
virtual void UpdateChunks(); |
virtual void UpdateChunks(progress_t* pProgress); |
451 |
virtual void CopyAssign(const DimensionRegion* orig); |
virtual void CopyAssign(const DimensionRegion* orig); |
452 |
protected: |
protected: |
453 |
uint8_t* VelocityTable; ///< For velocity dimensions with custom defined zone ranges only: used for fast converting from velocity MIDI value to dimension bit number. |
uint8_t* VelocityTable; ///< For velocity dimensions with custom defined zone ranges only: used for fast converting from velocity MIDI value to dimension bit number. |
627 |
unsigned long ReadAndLoop(void* pBuffer, unsigned long SampleCount, playback_state_t* pPlaybackState, DimensionRegion* pDimRgn, buffer_t* pExternalDecompressionBuffer = NULL); |
unsigned long ReadAndLoop(void* pBuffer, unsigned long SampleCount, playback_state_t* pPlaybackState, DimensionRegion* pDimRgn, buffer_t* pExternalDecompressionBuffer = NULL); |
628 |
unsigned long Write(void* pBuffer, unsigned long SampleCount); |
unsigned long Write(void* pBuffer, unsigned long SampleCount); |
629 |
Group* GetGroup() const; |
Group* GetGroup() const; |
630 |
virtual void UpdateChunks(); |
virtual void UpdateChunks(progress_t* pProgress); |
631 |
void CopyAssignMeta(const Sample* orig); |
void CopyAssignMeta(const Sample* orig); |
632 |
void CopyAssignWave(const Sample* orig); |
void CopyAssignWave(const Sample* orig); |
633 |
protected: |
protected: |
705 |
// own methods |
// own methods |
706 |
DimensionRegion* GetDimensionRegionByValue(const uint DimValues[8]); |
DimensionRegion* GetDimensionRegionByValue(const uint DimValues[8]); |
707 |
DimensionRegion* GetDimensionRegionByBit(const uint8_t DimBits[8]); |
DimensionRegion* GetDimensionRegionByBit(const uint8_t DimBits[8]); |
708 |
|
int GetDimensionRegionIndexByValue(const uint DimValues[8]); |
709 |
Sample* GetSample(); |
Sample* GetSample(); |
710 |
void AddDimension(dimension_def_t* pDimDef); |
void AddDimension(dimension_def_t* pDimDef); |
711 |
void DeleteDimension(dimension_def_t* pDimDef); |
void DeleteDimension(dimension_def_t* pDimDef); |
712 |
dimension_def_t* GetDimensionDefinition(dimension_t type); |
dimension_def_t* GetDimensionDefinition(dimension_t type); |
713 |
|
void DeleteDimensionZone(dimension_t type, int zone); |
714 |
|
void SplitDimensionZone(dimension_t type, int zone); |
715 |
|
void SetDimensionType(dimension_t oldType, dimension_t newType); |
716 |
// overridden methods |
// overridden methods |
717 |
virtual void SetKeyRange(uint16_t Low, uint16_t High); |
virtual void SetKeyRange(uint16_t Low, uint16_t High); |
718 |
virtual void UpdateChunks(); |
virtual void UpdateChunks(progress_t* pProgress); |
719 |
virtual void CopyAssign(const Region* orig); |
virtual void CopyAssign(const Region* orig); |
720 |
protected: |
protected: |
721 |
Region(Instrument* pInstrument, RIFF::List* rgnList); |
Region(Instrument* pInstrument, RIFF::List* rgnList); |
723 |
void UpdateVelocityTable(); |
void UpdateVelocityTable(); |
724 |
Sample* GetSampleFromWavePool(unsigned int WavePoolTableIndex, progress_t* pProgress = NULL); |
Sample* GetSampleFromWavePool(unsigned int WavePoolTableIndex, progress_t* pProgress = NULL); |
725 |
void CopyAssign(const Region* orig, const std::map<Sample*,Sample*>* mSamples); |
void CopyAssign(const Region* orig, const std::map<Sample*,Sample*>* mSamples); |
726 |
|
DimensionRegion* GetDimensionRegionByBit(const std::map<dimension_t,int>& DimCase); |
727 |
~Region(); |
~Region(); |
728 |
friend class Instrument; |
friend class Instrument; |
729 |
}; |
}; |
829 |
friend class Instrument; |
friend class Instrument; |
830 |
}; |
}; |
831 |
|
|
832 |
|
/** @brief Real-time instrument script (gig format extension). |
833 |
|
* |
834 |
|
* Real-time instrument scripts are user supplied small programs which can |
835 |
|
* be used by instrument designers to create custom behaviors and features |
836 |
|
* not available in the stock sampler engine. Features which might be very |
837 |
|
* exotic or specific for the respective instrument. |
838 |
|
* |
839 |
|
* This is an extension of the GigaStudio format, thus a feature which was |
840 |
|
* not available in the GigaStudio 4 software. It is currently only |
841 |
|
* supported by LinuxSampler and gigedit. |
842 |
|
*/ |
843 |
|
class Script { |
844 |
|
public: |
845 |
|
enum Encoding_t { |
846 |
|
ENCODING_ASCII = 0 ///< Standard 8 bit US ASCII character encoding (default). |
847 |
|
}; |
848 |
|
enum Compression_t { |
849 |
|
COMPRESSION_NONE = 0 ///< Is not compressed at all (default). |
850 |
|
}; |
851 |
|
enum Language_t { |
852 |
|
LANGUAGE_NKSP = 0 ///< NKSP stands for "Is Not KSP" (default). |
853 |
|
}; |
854 |
|
|
855 |
|
String Name; ///< Arbitrary name of the script, which may be displayed i.e. in an instrument editor. |
856 |
|
Compression_t Compression; ///< Whether the script was/should be compressed, and if so, which compression algorithm shall be used. |
857 |
|
Encoding_t Encoding; ///< Format the script's source code text is encoded with. |
858 |
|
Language_t Language; ///< Programming language and dialect the script is written in. |
859 |
|
bool Bypass; ///< Global bypass: if enabled, this script shall not be executed by the sampler for any instrument. |
860 |
|
|
861 |
|
String GetScriptAsText(); |
862 |
|
void SetScriptAsText(const String& text); |
863 |
|
void SetGroup(ScriptGroup* pGroup); |
864 |
|
ScriptGroup* GetGroup() const; |
865 |
|
protected: |
866 |
|
Script(ScriptGroup* group, RIFF::Chunk* ckScri); |
867 |
|
virtual ~Script(); |
868 |
|
void UpdateChunks(progress_t* pProgress); |
869 |
|
void RemoveAllScriptReferences(); |
870 |
|
friend class ScriptGroup; |
871 |
|
friend class Instrument; |
872 |
|
private: |
873 |
|
ScriptGroup* pGroup; |
874 |
|
RIFF::Chunk* pChunk; ///< 'Scri' chunk |
875 |
|
std::vector<uint8_t> data; |
876 |
|
uint32_t crc; ///< CRC-32 checksum of the raw script data |
877 |
|
}; |
878 |
|
|
879 |
|
/** @brief Group of instrument scripts (gig format extension). |
880 |
|
* |
881 |
|
* This class is simply used to sort a bunch of real-time instrument scripts |
882 |
|
* into individual groups. This allows instrument designers and script |
883 |
|
* developers to keep scripts in a certain order while working with a larger |
884 |
|
* amount of scripts in an instrument editor. |
885 |
|
* |
886 |
|
* This is an extension of the GigaStudio format, thus a feature which was |
887 |
|
* not available in the GigaStudio 4 software. It is currently only |
888 |
|
* supported by LinuxSampler and gigedit. |
889 |
|
*/ |
890 |
|
class ScriptGroup { |
891 |
|
public: |
892 |
|
String Name; ///< Name of this script group. For example to be displayed in an instrument editor. |
893 |
|
|
894 |
|
Script* GetScript(uint index); |
895 |
|
Script* AddScript(); |
896 |
|
void DeleteScript(Script* pScript); |
897 |
|
protected: |
898 |
|
ScriptGroup(File* file, RIFF::List* lstRTIS); |
899 |
|
virtual ~ScriptGroup(); |
900 |
|
void LoadScripts(); |
901 |
|
void UpdateChunks(progress_t* pProgress); |
902 |
|
friend class Script; |
903 |
|
friend class File; |
904 |
|
private: |
905 |
|
File* pFile; |
906 |
|
RIFF::List* pList; ///< 'RTIS' list chunk |
907 |
|
std::list<Script*>* pScripts; |
908 |
|
}; |
909 |
|
|
910 |
/** Provides all neccessary information for the synthesis of an <i>Instrument</i>. */ |
/** Provides all neccessary information for the synthesis of an <i>Instrument</i>. */ |
911 |
class Instrument : protected DLS::Instrument { |
class Instrument : protected DLS::Instrument { |
912 |
public: |
public: |
936 |
Region* GetNextRegion(); |
Region* GetNextRegion(); |
937 |
Region* AddRegion(); |
Region* AddRegion(); |
938 |
void DeleteRegion(Region* pRegion); |
void DeleteRegion(Region* pRegion); |
939 |
virtual void UpdateChunks(); |
virtual void UpdateChunks(progress_t* pProgress); |
940 |
virtual void CopyAssign(const Instrument* orig); |
virtual void CopyAssign(const Instrument* orig); |
941 |
// own methods |
// own methods |
942 |
Region* GetRegion(unsigned int Key); |
Region* GetRegion(unsigned int Key); |
945 |
MidiRuleLegato* AddMidiRuleLegato(); |
MidiRuleLegato* AddMidiRuleLegato(); |
946 |
MidiRuleAlternator* AddMidiRuleAlternator(); |
MidiRuleAlternator* AddMidiRuleAlternator(); |
947 |
void DeleteMidiRule(int i); |
void DeleteMidiRule(int i); |
948 |
|
// real-time instrument script methods |
949 |
|
Script* GetScriptOfSlot(uint index); |
950 |
|
void AddScriptSlot(Script* pScript, bool bypass = false); |
951 |
|
void SwapScriptSlots(uint index1, uint index2); |
952 |
|
void RemoveScriptSlot(uint index); |
953 |
|
void RemoveScript(Script* pScript); |
954 |
|
uint ScriptSlotCount() const; |
955 |
|
bool IsScriptSlotBypassed(uint index); |
956 |
|
void SetScriptSlotBypassed(uint index, bool bBypass); |
957 |
protected: |
protected: |
958 |
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 |
959 |
|
|
961 |
~Instrument(); |
~Instrument(); |
962 |
void CopyAssign(const Instrument* orig, const std::map<Sample*,Sample*>* mSamples); |
void CopyAssign(const Instrument* orig, const std::map<Sample*,Sample*>* mSamples); |
963 |
void UpdateRegionKeyTable(); |
void UpdateRegionKeyTable(); |
964 |
|
void LoadScripts(); |
965 |
|
void UpdateScriptFileOffsets(); |
966 |
friend class File; |
friend class File; |
967 |
friend class Region; // so Region can call UpdateRegionKeyTable() |
friend class Region; // so Region can call UpdateRegionKeyTable() |
968 |
private: |
private: |
969 |
|
struct _ScriptPooolEntry { |
970 |
|
uint32_t fileOffset; |
971 |
|
bool bypass; |
972 |
|
}; |
973 |
|
struct _ScriptPooolRef { |
974 |
|
Script* script; |
975 |
|
bool bypass; |
976 |
|
}; |
977 |
MidiRule** pMidiRules; |
MidiRule** pMidiRules; |
978 |
|
std::vector<_ScriptPooolEntry> scriptPoolFileOffsets; |
979 |
|
std::vector<_ScriptPooolRef>* pScriptRefs; |
980 |
}; |
}; |
981 |
|
|
982 |
/** @brief Group of Gigasampler objects |
/** @brief Group of Gigasampler objects |
1004 |
protected: |
protected: |
1005 |
Group(File* file, RIFF::Chunk* ck3gnm); |
Group(File* file, RIFF::Chunk* ck3gnm); |
1006 |
virtual ~Group(); |
virtual ~Group(); |
1007 |
virtual void UpdateChunks(); |
virtual void UpdateChunks(progress_t* pProgress); |
1008 |
void MoveAll(); |
void MoveAll(); |
1009 |
friend class File; |
friend class File; |
1010 |
private: |
private: |
1055 |
void SetAutoLoad(bool b); |
void SetAutoLoad(bool b); |
1056 |
bool GetAutoLoad(); |
bool GetAutoLoad(); |
1057 |
void AddContentOf(File* pFile); |
void AddContentOf(File* pFile); |
1058 |
|
ScriptGroup* GetScriptGroup(uint index); |
1059 |
|
ScriptGroup* GetScriptGroup(const String& name); |
1060 |
|
ScriptGroup* AddScriptGroup(); |
1061 |
|
void DeleteScriptGroup(ScriptGroup* pGroup); |
1062 |
virtual ~File(); |
virtual ~File(); |
1063 |
virtual void UpdateChunks(); |
virtual void UpdateChunks(progress_t* pProgress); |
1064 |
protected: |
protected: |
1065 |
// overridden protected methods from DLS::File |
// overridden protected methods from DLS::File |
1066 |
virtual void LoadSamples(); |
virtual void LoadSamples(); |
1067 |
virtual void LoadInstruments(); |
virtual void LoadInstruments(); |
1068 |
virtual void LoadGroups(); |
virtual void LoadGroups(); |
1069 |
|
virtual void UpdateFileOffsets(); |
1070 |
// own protected methods |
// own protected methods |
1071 |
virtual void LoadSamples(progress_t* pProgress); |
virtual void LoadSamples(progress_t* pProgress); |
1072 |
virtual void LoadInstruments(progress_t* pProgress); |
virtual void LoadInstruments(progress_t* pProgress); |
1073 |
|
virtual void LoadScriptGroups(); |
1074 |
void SetSampleChecksum(Sample* pSample, uint32_t crc); |
void SetSampleChecksum(Sample* pSample, uint32_t crc); |
1075 |
friend class Region; |
friend class Region; |
1076 |
friend class Sample; |
friend class Sample; |
1077 |
friend class Group; // so Group can access protected member pRIFF |
friend class Group; // so Group can access protected member pRIFF |
1078 |
|
friend class ScriptGroup; // so ScriptGroup can access protected member pRIFF |
1079 |
private: |
private: |
1080 |
std::list<Group*>* pGroups; |
std::list<Group*>* pGroups; |
1081 |
std::list<Group*>::iterator GroupsIterator; |
std::list<Group*>::iterator GroupsIterator; |
1082 |
bool bAutoLoad; |
bool bAutoLoad; |
1083 |
|
std::list<ScriptGroup*>* pScriptGroups; |
1084 |
}; |
}; |
1085 |
|
|
1086 |
/** |
/** |