2 |
* * |
* * |
3 |
* libgig - C++ cross-platform Gigasampler format file access library * |
* libgig - C++ cross-platform Gigasampler format file access library * |
4 |
* * |
* * |
5 |
* Copyright (C) 2003-2019 by Christian Schoenebeck * |
* Copyright (C) 2003-2021 by Christian Schoenebeck * |
6 |
* <cuse@users.sourceforge.net> * |
* <cuse@users.sourceforge.net> * |
7 |
* * |
* * |
8 |
* This library is free software; you can redistribute it and/or modify * |
* This library is free software; you can redistribute it and/or modify * |
26 |
|
|
27 |
#include "DLS.h" |
#include "DLS.h" |
28 |
#include <vector> |
#include <vector> |
29 |
|
#include <array> // since C++11 |
30 |
|
|
31 |
#ifndef __has_feature |
#ifndef __has_feature |
32 |
# define __has_feature(x) 0 |
# define __has_feature(x) 0 |
63 |
# define CHUNK_ID_SCRI 0x53637269 // own gig format extension |
# define CHUNK_ID_SCRI 0x53637269 // own gig format extension |
64 |
# define CHUNK_ID_LSNM 0x4c534e4d // own gig format extension |
# define CHUNK_ID_LSNM 0x4c534e4d // own gig format extension |
65 |
# define CHUNK_ID_SCSL 0x5343534c // own gig format extension |
# define CHUNK_ID_SCSL 0x5343534c // own gig format extension |
66 |
|
# define CHUNK_ID_SCPV 0x53435056 // own gig format extension |
67 |
# define CHUNK_ID_LSDE 0x4c534445 // own gig format extension |
# define CHUNK_ID_LSDE 0x4c534445 // own gig format extension |
68 |
# define CHUNK_ID_3DDP 0x33646470 |
# define CHUNK_ID_3DDP 0x33646470 |
69 |
#else // little endian |
#else // little endian |
85 |
# define CHUNK_ID_SCRI 0x69726353 // own gig format extension |
# define CHUNK_ID_SCRI 0x69726353 // own gig format extension |
86 |
# define CHUNK_ID_LSNM 0x4d4e534c // own gig format extension |
# define CHUNK_ID_LSNM 0x4d4e534c // own gig format extension |
87 |
# define CHUNK_ID_SCSL 0x4c534353 // own gig format extension |
# define CHUNK_ID_SCSL 0x4c534353 // own gig format extension |
88 |
|
# define CHUNK_ID_SCPV 0x56504353 // own gig format extension |
89 |
# define CHUNK_ID_LSDE 0x4544534c // own gig format extension |
# define CHUNK_ID_LSDE 0x4544534c // own gig format extension |
90 |
# define CHUNK_ID_3DDP 0x70646433 |
# define CHUNK_ID_3DDP 0x70646433 |
91 |
#endif // WORDS_BIGENDIAN |
#endif // WORDS_BIGENDIAN |
857 |
bool VerifyWaveData(uint32_t* pActually = NULL); |
bool VerifyWaveData(uint32_t* pActually = NULL); |
858 |
protected: |
protected: |
859 |
static size_t Instances; ///< Number of instances of class Sample. |
static size_t Instances; ///< Number of instances of class Sample. |
860 |
static buffer_t InternalDecompressionBuffer; ///< Buffer used for decompression as well as for truncation of 24 Bit -> 16 Bit samples. |
static buffer_t InternalDecompressionBuffer; ///< Buffer used for decompression of samples, and only if no external decompression buffer was supplied. |
861 |
Group* pGroup; ///< pointer to the Group this sample belongs to (always not-NULL) |
Group* pGroup; ///< pointer to the Group this sample belongs to (always not-NULL) |
862 |
file_offset_t FrameOffset; ///< Current offset (sample points) in current sample frame (for decompression only). |
file_offset_t FrameOffset; ///< Current offset (sample points) in current sample frame (for decompression only). |
863 |
file_offset_t* FrameTable; ///< For positioning within compressed samples only: stores the offset values for each frame. |
file_offset_t* FrameTable; ///< For positioning within compressed samples only: stores the offset values for each frame. |
956 |
DimensionRegion* GetDimensionRegionByBit(const std::map<dimension_t,int>& DimCase); |
DimensionRegion* GetDimensionRegionByBit(const std::map<dimension_t,int>& DimCase); |
957 |
~Region(); |
~Region(); |
958 |
friend class Instrument; |
friend class Instrument; |
959 |
|
private: |
960 |
|
bool UsesAnyGigFormatExtension() const; |
961 |
}; |
}; |
962 |
|
|
963 |
/** @brief Abstract base class for all MIDI rules. |
/** @brief Abstract base class for all MIDI rules. |
1193 |
Encoding_t Encoding; ///< Format the script's source code text is encoded with. |
Encoding_t Encoding; ///< Format the script's source code text is encoded with. |
1194 |
Language_t Language; ///< Programming language and dialect the script is written in. |
Language_t Language; ///< Programming language and dialect the script is written in. |
1195 |
bool Bypass; ///< Global bypass: if enabled, this script shall not be executed by the sampler for any instrument. |
bool Bypass; ///< Global bypass: if enabled, this script shall not be executed by the sampler for any instrument. |
1196 |
|
uint8_t Uuid[16]; ///< Persistent Universally Unique Identifier of this script, which remains identical after any changes to this script. |
1197 |
|
|
1198 |
String GetScriptAsText(); |
String GetScriptAsText(); |
1199 |
void SetScriptAsText(const String& text); |
void SetScriptAsText(const String& text); |
1206 |
void UpdateChunks(progress_t* pProgress) OVERRIDE; |
void UpdateChunks(progress_t* pProgress) OVERRIDE; |
1207 |
void DeleteChunks() OVERRIDE; |
void DeleteChunks() OVERRIDE; |
1208 |
void RemoveAllScriptReferences(); |
void RemoveAllScriptReferences(); |
1209 |
|
void GenerateUuid(); |
1210 |
friend class ScriptGroup; |
friend class ScriptGroup; |
1211 |
friend class Instrument; |
friend class Instrument; |
1212 |
private: |
private: |
1231 |
public: |
public: |
1232 |
String Name; ///< Name of this script group. For example to be displayed in an instrument editor. |
String Name; ///< Name of this script group. For example to be displayed in an instrument editor. |
1233 |
|
|
1234 |
Script* GetScript(uint index); |
Script* GetScript(size_t index); |
1235 |
Script* AddScript(); |
Script* AddScript(); |
1236 |
void DeleteScript(Script* pScript); |
void DeleteScript(Script* pScript); |
1237 |
protected: |
protected: |
1245 |
private: |
private: |
1246 |
File* pFile; |
File* pFile; |
1247 |
RIFF::List* pList; ///< 'RTIS' list chunk |
RIFF::List* pList; ///< 'RTIS' list chunk |
1248 |
std::list<Script*>* pScripts; |
std::vector<Script*>* pScripts; |
1249 |
}; |
}; |
1250 |
|
|
1251 |
/** @brief Provides access to a Gigasampler/GigaStudio instrument. |
/** @brief Provides access to a Gigasampler/GigaStudio instrument. |
1287 |
// derived methods from DLS::Resource |
// derived methods from DLS::Resource |
1288 |
using DLS::Resource::GetParent; |
using DLS::Resource::GetParent; |
1289 |
// overridden methods |
// overridden methods |
1290 |
Region* GetFirstRegion(); |
Region* GetRegionAt(size_t pos); |
1291 |
Region* GetNextRegion(); |
Region* GetFirstRegion() LIBGIG_DEPRECATED_API("Use GetRegionAt() instead."); |
1292 |
|
Region* GetNextRegion() LIBGIG_DEPRECATED_API("Use GetRegionAt() instead."); |
1293 |
Region* AddRegion(); |
Region* AddRegion(); |
1294 |
void DeleteRegion(Region* pRegion); |
void DeleteRegion(Region* pRegion); |
1295 |
void MoveTo(Instrument* dst); |
void MoveTo(Instrument* dst); |
1303 |
MidiRuleAlternator* AddMidiRuleAlternator(); |
MidiRuleAlternator* AddMidiRuleAlternator(); |
1304 |
void DeleteMidiRule(int i); |
void DeleteMidiRule(int i); |
1305 |
// real-time instrument script methods |
// real-time instrument script methods |
1306 |
Script* GetScriptOfSlot(uint index); |
Script* GetScriptOfSlot(size_t index); |
1307 |
void AddScriptSlot(Script* pScript, bool bypass = false); |
void AddScriptSlot(Script* pScript, bool bypass = false); |
1308 |
void SwapScriptSlots(uint index1, uint index2); |
void SwapScriptSlots(uint index1, uint index2); |
1309 |
void RemoveScriptSlot(uint index); |
void RemoveScriptSlot(uint index); |
1311 |
uint ScriptSlotCount() const; |
uint ScriptSlotCount() const; |
1312 |
bool IsScriptSlotBypassed(uint index); |
bool IsScriptSlotBypassed(uint index); |
1313 |
void SetScriptSlotBypassed(uint index, bool bBypass); |
void SetScriptSlotBypassed(uint index, bool bBypass); |
1314 |
|
bool IsScriptPatchVariableSet(int slot, String variable); |
1315 |
|
std::map<String,String> GetScriptPatchVariables(int slot); |
1316 |
|
String GetScriptPatchVariable(int slot, String variable); |
1317 |
|
void SetScriptPatchVariable(int slot, String variable, String value); |
1318 |
|
void UnsetScriptPatchVariable(int slot = -1, String variable = ""); |
1319 |
protected: |
protected: |
1320 |
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 |
1321 |
|
|
1336 |
Script* script; |
Script* script; |
1337 |
bool bypass; |
bool bypass; |
1338 |
}; |
}; |
1339 |
|
typedef std::array<uint8_t,16> _UUID; |
1340 |
|
typedef std::map<String,String> _PatchVars; |
1341 |
|
typedef std::map<int,_PatchVars> _VarsBySlot; |
1342 |
|
typedef std::map<_UUID,_VarsBySlot> _VarsByScript; |
1343 |
MidiRule** pMidiRules; |
MidiRule** pMidiRules; |
1344 |
std::vector<_ScriptPooolEntry> scriptPoolFileOffsets; |
std::vector<_ScriptPooolEntry> scriptPoolFileOffsets; |
1345 |
std::vector<_ScriptPooolRef>* pScriptRefs; |
std::vector<_ScriptPooolRef>* pScriptRefs; |
1346 |
|
_VarsByScript scriptVars; |
1347 |
|
|
1348 |
|
_VarsByScript stripScriptVars(); |
1349 |
|
bool ReferencesScriptWithUuid(const _UUID& uuid); |
1350 |
|
bool UsesAnyGigFormatExtension() const; |
1351 |
}; |
}; |
1352 |
|
|
1353 |
/** @brief Group of Gigasampler samples |
/** @brief Group of Gigasampler samples |
1365 |
public: |
public: |
1366 |
String Name; ///< Stores the name of this Group. |
String Name; ///< Stores the name of this Group. |
1367 |
|
|
1368 |
Sample* GetFirstSample(); |
Sample* GetSample(size_t index); |
1369 |
Sample* GetNextSample(); |
Sample* GetFirstSample() LIBGIG_DEPRECATED_API("Use GetSample() instead."); |
1370 |
|
Sample* GetNextSample() LIBGIG_DEPRECATED_API("Use GetSample() instead."); |
1371 |
void AddSample(Sample* pSample); |
void AddSample(Sample* pSample); |
1372 |
protected: |
protected: |
1373 |
Group(File* file, RIFF::Chunk* ck3gnm); |
Group(File* file, RIFF::Chunk* ck3gnm); |
1379 |
private: |
private: |
1380 |
File* pFile; |
File* pFile; |
1381 |
RIFF::Chunk* pNameChunk; ///< '3gnm' chunk |
RIFF::Chunk* pNameChunk; ///< '3gnm' chunk |
1382 |
|
size_t SamplesIterator; ///< Used by GetFirstSample(), GetNextSample() only. |
1383 |
}; |
}; |
1384 |
|
|
1385 |
/** @brief Provides convenient access to Gigasampler/GigaStudio .gig files. |
/** @brief Provides convenient access to Gigasampler/GigaStudio .gig files. |
1441 |
// overridden methods |
// overridden methods |
1442 |
File(); |
File(); |
1443 |
File(RIFF::File* pRIFF); |
File(RIFF::File* pRIFF); |
1444 |
Sample* GetFirstSample(progress_t* pProgress = NULL); ///< Returns a pointer to the first <i>Sample</i> object of the file, <i>NULL</i> otherwise. |
Sample* GetFirstSample(progress_t* pProgress = NULL) LIBGIG_DEPRECATED_API("Use GetSample() instead."); |
1445 |
Sample* GetNextSample(); ///< Returns a pointer to the next <i>Sample</i> object of the file, <i>NULL</i> otherwise. |
Sample* GetNextSample() LIBGIG_DEPRECATED_API("Use GetSample() instead."); |
1446 |
Sample* GetSample(uint index); |
Sample* GetSample(size_t index, progress_t* pProgress = NULL); |
1447 |
Sample* AddSample(); |
Sample* AddSample(); |
1448 |
size_t CountSamples(); |
size_t CountSamples(); |
1449 |
void DeleteSample(Sample* pSample); |
void DeleteSample(Sample* pSample); |
1450 |
Instrument* GetFirstInstrument(); ///< Returns a pointer to the first <i>Instrument</i> object of the file, <i>NULL</i> otherwise. |
Instrument* GetFirstInstrument() LIBGIG_DEPRECATED_API("Use GetInstrument() instead."); |
1451 |
Instrument* GetNextInstrument(); ///< Returns a pointer to the next <i>Instrument</i> object of the file, <i>NULL</i> otherwise. |
Instrument* GetNextInstrument() LIBGIG_DEPRECATED_API("Use GetInstrument() instead."); |
1452 |
Instrument* GetInstrument(uint index, progress_t* pProgress = NULL); |
Instrument* GetInstrument(size_t index, progress_t* pProgress = NULL); |
1453 |
Instrument* AddInstrument(); |
Instrument* AddInstrument(); |
1454 |
Instrument* AddDuplicateInstrument(const Instrument* orig); |
Instrument* AddDuplicateInstrument(const Instrument* orig); |
1455 |
size_t CountInstruments(); |
size_t CountInstruments(); |
1456 |
void DeleteInstrument(Instrument* pInstrument); |
void DeleteInstrument(Instrument* pInstrument); |
1457 |
Group* GetFirstGroup(); ///< Returns a pointer to the first <i>Group</i> object of the file, <i>NULL</i> otherwise. |
Group* GetFirstGroup() LIBGIG_DEPRECATED_API("Use GetGroup() instead."); |
1458 |
Group* GetNextGroup(); ///< Returns a pointer to the next <i>Group</i> object of the file, <i>NULL</i> otherwise. |
Group* GetNextGroup() LIBGIG_DEPRECATED_API("Use GetGroup() instead."); |
1459 |
Group* GetGroup(uint index); |
Group* GetGroup(size_t index); |
1460 |
Group* GetGroup(String name); |
Group* GetGroup(String name); |
1461 |
Group* AddGroup(); |
Group* AddGroup(); |
1462 |
void DeleteGroup(Group* pGroup); |
void DeleteGroup(Group* pGroup); |
1464 |
void SetAutoLoad(bool b); |
void SetAutoLoad(bool b); |
1465 |
bool GetAutoLoad(); |
bool GetAutoLoad(); |
1466 |
void AddContentOf(File* pFile); |
void AddContentOf(File* pFile); |
1467 |
ScriptGroup* GetScriptGroup(uint index); |
ScriptGroup* GetScriptGroup(size_t index); |
1468 |
ScriptGroup* GetScriptGroup(const String& name); |
ScriptGroup* GetScriptGroup(const String& name); |
1469 |
ScriptGroup* AddScriptGroup(); |
ScriptGroup* AddScriptGroup(); |
1470 |
void DeleteScriptGroup(ScriptGroup* pGroup); |
void DeleteScriptGroup(ScriptGroup* pGroup); |
1492 |
friend class Group; // so Group can access protected member pRIFF |
friend class Group; // so Group can access protected member pRIFF |
1493 |
friend class ScriptGroup; // so ScriptGroup can access protected member pRIFF |
friend class ScriptGroup; // so ScriptGroup can access protected member pRIFF |
1494 |
private: |
private: |
1495 |
std::list<Group*>* pGroups; |
std::vector<Group*>* pGroups; |
1496 |
std::list<Group*>::iterator GroupsIterator; |
std::vector<Group*>::iterator GroupsIterator; |
1497 |
bool bAutoLoad; |
bool bAutoLoad; |
1498 |
std::list<ScriptGroup*>* pScriptGroups; |
std::vector<ScriptGroup*>* pScriptGroups; |
1499 |
|
|
1500 |
|
bool UsesAnyGigFormatExtension() const; |
1501 |
}; |
}; |
1502 |
|
|
1503 |
/** |
/** |