30 #include <CoreFoundation/CFUUID.h>
31 #elif defined(HAVE_UUID_UUID_H)
32 #include <uuid/uuid.h>
38 #define CONN_TRANSFORM_SRC(x) ((x >> 10) & 0x000F)
39 #define CONN_TRANSFORM_CTL(x) ((x >> 4) & 0x000F)
40 #define CONN_TRANSFORM_DST(x) (x & 0x000F)
41 #define CONN_TRANSFORM_BIPOLAR_SRC(x) (x & 0x4000)
42 #define CONN_TRANSFORM_BIPOLAR_CTL(x) (x & 0x0100)
43 #define CONN_TRANSFORM_INVERT_SRC(x) (x & 0x8000)
44 #define CONN_TRANSFORM_INVERT_CTL(x) (x & 0x0200)
47 #define CONN_TRANSFORM_SRC_ENCODE(x) ((x & 0x000F) << 10)
48 #define CONN_TRANSFORM_CTL_ENCODE(x) ((x & 0x000F) << 4)
49 #define CONN_TRANSFORM_DST_ENCODE(x) (x & 0x000F)
50 #define CONN_TRANSFORM_BIPOLAR_SRC_ENCODE(x) ((x) ? 0x4000 : 0)
51 #define CONN_TRANSFORM_BIPOLAR_CTL_ENCODE(x) ((x) ? 0x0100 : 0)
52 #define CONN_TRANSFORM_INVERT_SRC_ENCODE(x) ((x) ? 0x8000 : 0)
53 #define CONN_TRANSFORM_INVERT_CTL_ENCODE(x) ((x) ? 0x0200 : 0)
55 #define DRUM_TYPE_MASK 0x80000000
57 #define F_RGN_OPTION_SELFNONEXCLUSIVE 0x0001
59 #define F_WAVELINK_PHASE_MASTER 0x0001
60 #define F_WAVELINK_MULTICHANNEL 0x0002
62 #define F_WSMP_NO_TRUNCATION 0x0001
63 #define F_WSMP_NO_COMPRESSION 0x0002
65 #define MIDI_BANK_COARSE(x) ((x & 0x00007F00) >> 8) // CC0
66 #define MIDI_BANK_FINE(x) (x & 0x0000007F) // CC32
67 #define MIDI_BANK_MERGE(coarse, fine) ((((uint16_t) coarse) << 7) | fine) // CC0 + CC32
68 #define MIDI_BANK_ENCODE(coarse, fine) (((coarse & 0x0000007F) << 8) | (fine & 0x0000007F))
149 const int iEntrySize = 12;
209 while (iter != end) {
225 for (; iter != end; ++iter) {
226 (*iter)->UpdateChunks();
252 pFixedStringLengths = NULL;
253 pResourceListChunk = list;
293 pFixedStringLengths = lengths;
323 if (pFixedStringLengths) {
324 for (
int i = 0 ; pFixedStringLengths[i].
length ; i++) {
325 if (pFixedStringLengths[i].chunkId == ChunkID) {
326 size = pFixedStringLengths[i].
length;
332 ::SaveString(ChunkID, ck, lstINFO, s, sDefault, size != 0, size);
341 if (!pResourceListChunk)
return;
347 String defaultCreationDate =
"";
348 String defaultSoftware =
"";
349 String defaultComments =
"";
351 uint32_t resourceType = pResourceListChunk->
GetListType();
357 defaultName =
"NONAME";
361 time_t now = time(NULL);
362 tm* pNowBroken = localtime(&now);
364 strftime(buf, 11,
"%F", pNowBroken);
365 defaultCreationDate = buf;
421 pFixedStringLengths = orig->pFixedStringLengths;
488 #if defined(WIN32) || defined(__APPLE__) || defined(HAVE_UUID_GENERATE)
501 #elif defined(__APPLE__)
503 CFUUIDRef uuidRef = CFUUIDCreate(NULL);
504 CFUUIDBytes uuid = CFUUIDGetUUIDBytes(uuidRef);
506 pDLSID->
ulData1 = uuid.byte0 | uuid.byte1 << 8 | uuid.byte2 << 16 | uuid.byte3 << 24;
520 pDLSID->
ulData1 = uuid[0] | uuid[1] << 8 | uuid[2] << 16 | uuid[3] << 24;
592 }
else if (wsmp->
GetSize() != wsmpSize) {
605 store32(&pData[8],
Gain);
607 store32(&pData[16], SampleLoops);
650 if (o == SampleLoops - 1) {
652 throw Exception(
"Could not delete Sample Loop, because it does not exist");
788 for (
unsigned long todo = pOrig->
GetSize(), i = 0; todo; ) {
789 const int iReadAtOnce = 64*1024;
790 unsigned long n = (iReadAtOnce < todo) ? iReadAtOnce : todo;
791 n = pOrig->
Read(&buf[i], n);
883 if (iNewSize < 1)
throw Exception(
"Sample size must be at least one sample point");
884 const int iSizeInBytes = iNewSize *
FrameSize;
908 if (!
pCkData)
throw Exception(
"No data chunk created for sample yet, call Sample::Resize() to create one");
909 unsigned long orderedBytes = SampleCount *
FrameSize;
910 unsigned long result =
pCkData->
SetPos(orderedBytes, Whence);
911 return (result == orderedBytes) ? SampleCount
946 if (
GetSize() < SampleCount)
throw Exception(
"Could not write sample data, current sample size to small");
959 throw Exception(
"Could not save sample, only PCM format is supported");
962 throw Exception(
"Could not save sample, there is no sample data to save");
1072 if (!pInstrument->
pRegions)
return;
1077 Region* prev_region = NULL;
1079 Instrument::RegionList::iterator iter = pInstrument->
pRegions->begin();
1080 iter != pInstrument->
pRegions->end(); iter++
1082 if ((*iter)->KeyRange.low > this->KeyRange.low) {
1086 prev_region = *iter;
1090 if (prev_region !=
this) pInstrument->MoveRegion(
this, r);
1135 File::SampleList::iterator iter = pFile->
pSamples->begin();
1136 File::SampleList::iterator end = pFile->
pSamples->end();
1137 for (
int i = 0; iter != end; ++iter, i++) {
1215 insh->
Read(&locale, 2, 4);
1270 void Instrument::MoveRegion(
Region* pSrc,
Region* pDst) {
1275 RegionList::iterator iter = find(
pRegions->begin(),
pRegions->end(), pDst);
1281 RegionList::iterator iter = find(
pRegions->begin(),
pRegions->end(), pRegion);
1282 if (iter ==
pRegions->end())
return;
1310 store32(&pData[4], locale.
bank);
1314 RegionList::iterator iter =
pRegions->begin();
1315 RegionList::iterator end =
pRegions->end();
1316 for (; iter != end; ++iter) {
1317 (*iter)->UpdateChunks();
1328 RegionList::iterator iter =
pRegions->begin();
1329 RegionList::iterator end =
pRegions->end();
1330 while (iter != end) {
1369 RegionList::const_iterator it = orig->
pRegions->begin();
1370 for (
int i = 0; i < orig->
Regions; ++i, ++it) {
1418 if (!pRIFF)
throw DLS::Exception(
"NULL pointer reference to RIFF::File object.");
1419 this->pRIFF =
pRIFF;
1429 if (!colh)
throw DLS::Exception(
"Mandatory chunks in RIFF list chunk not found.");
1453 throw DLS::Exception(
"Files larger than 2 GB not yet supported");
1469 while (iter != end) {
1477 SampleList::iterator iter =
pSamples->begin();
1478 SampleList::iterator end =
pSamples->end();
1479 while (iter != end) {
1510 unsigned long wvplFileOffset = wvpl->
GetFilePos();
1514 unsigned long waveFileOffset = wave->
GetFilePos();
1515 pSamples->push_back(
new Sample(
this, wave, waveFileOffset - wvplFileOffset));
1523 unsigned long dwplFileOffset = dwpl->
GetFilePos();
1527 unsigned long waveFileOffset = wave->
GetFilePos();
1528 pSamples->push_back(
new Sample(
this, wave, waveFileOffset - dwplFileOffset));
1563 SampleList::iterator iter = find(
pSamples->begin(),
pSamples->end(), pSample);
1564 if (iter ==
pSamples->end())
return;
1585 if (lstInstruments) {
1644 if (i == index)
return *iter;
1702 for (; iter != end; ++iter) {
1703 (*iter)->UpdateChunks();
1722 SampleList::iterator iter =
pSamples->begin();
1723 SampleList::iterator end =
pSamples->end();
1724 for (; iter != end; ++iter) {
1725 (*iter)->UpdateChunks();
1775 __UpdateWavePoolTableChunk();
1807 void File::__UpdateWavePoolTableChunk() {
1808 __UpdateWavePoolTable();
1814 if (ptbl->
GetSize() < ulRequiredSize)
throw Exception(
"Fatal error, 'ptbl' chunk too small");
1816 unsigned long ulOriginalPos = ptbl->
GetPos();
1839 ptbl->
SetPos(ulOriginalPos);
1847 void File::__UpdateWavePoolTable() {
1857 uint64_t wvplFileOffset = wvpl->
GetFilePos();
1859 SampleList::iterator iter =
pSamples->begin();
1860 SampleList::iterator end =
pSamples->end();
1861 for (
int i = 0 ; iter != end ; ++iter, i++) {
1862 uint64_t _64BitOffset = (*iter)->pWaveList->GetFilePos() - wvplFileOffset -
LIST_HEADER_SIZE;
1863 (*iter)->ulWavePoolOffset = _64BitOffset;
1868 SampleList::iterator iter =
pSamples->begin();
1869 SampleList::iterator end =
pSamples->end();
1870 for (
int i = 0 ; iter != end ; ++iter, i++) {
1871 uint64_t _64BitOffset = (*iter)->pWaveList->GetFilePos() - wvplFileOffset -
LIST_HEADER_SIZE;
1872 (*iter)->ulWavePoolOffset = _64BitOffset;
1887 std::cout <<
"DLS::Exception: " <<
Message << std::endl;
virtual void CopyAssign(const Instrument *orig)
Make a (semi) deep copy of the Instrument object given by orig and assign it to this object...
#define CONN_TRANSFORM_BIPOLAR_CTL_ENCODE(x)
unsigned long WriteUint32(uint32_t *pData, unsigned long WordCount=1)
Writes WordCount number of 32 Bit unsigned integer words from the buffer pointed by pData to the chun...
ArticulationList * pArticulations
uint16_t BlockAlign
The block alignment (in bytes) of the waveform data. Playback software needs to process a multiple of...
#define LIST_TYPE_DWPL
Seen on some files instead of a wvpl list chunk.
sample_loop_t * pSampleLoops
Points to the beginning of a sample loop array, or is NULL if there are no loops defined.
virtual void UpdateChunks()
Update chunks with current info values.
uint32_t Regions
Reflects the number of Region defintions this Instrument has.
virtual void UpdateChunks()
Apply Instrument with all its Regions to the respective RIFF chunks.
Parses DLS Level 1 and 2 compliant files and provides abstract access to the data.
stream_whence_t
File stream position dependent to these relations.
unsigned long Read(void *pData, unsigned long WordCount, unsigned long WordSize)
Reads WordCount number of data words with given WordSize and copies it into a buffer pointed by pData...
String CreationDate
. Specifies the date the subject of the file was created. List dates in yyyy-mm-dd format...
Chunk * GetFirstSubChunk()
Returns the first subchunk within the list.
#define F_WAVELINK_PHASE_MASTER
ArticulationList::iterator ArticulationsIterator
virtual void UpdateChunks()
Apply all articulations to the respective RIFF chunks.
uint32_t GetChunkID()
Chunk ID in unsigned integer representation.
String Engineer
. Stores the name of the engineer who worked on the file. Multiple engineer names are separa...
virtual void SetKeyRange(uint16_t Low, uint16_t High)
Modifies the key range of this Region and makes sure the respective chunks are in correct order...
void __ensureMandatoryChunksExist()
Checks if all (for DLS) mandatory chunks exist, if not they will be created.
String Artists
. Lists the artist of the original subject of the file.
Sample * GetFirstSample()
Returns a pointer to the first Sample object of the file, NULL otherwise.
Instrument * GetNextInstrument()
Returns a pointer to the next Instrument object of the file, NULL otherwise.
Will be thrown whenever a DLS specific error occurs while trying to access a DLS File.
conn_trn_t SourceTransform
Optional information for DLS files, instruments, samples, etc.
virtual void CopyAssign(const Region *orig)
Make a (semi) deep copy of the Region object given by orig and assign it to this object.
unsigned long Read(void *pBuffer, unsigned long SampleCount)
Reads SampleCount number of sample points from the current position into the buffer pointed by pBuffe...
#define CONN_TRANSFORM_INVERT_SRC_ENCODE(x)
RIFF::File * GetExtensionFile(int index)
Returns extension file of given index.
virtual ~Region()
Destructor.
Instrument * AddInstrument()
Add a new instrument definition.
Instrument * GetFirstInstrument()
Returns a pointer to the first Instrument object of the file, NULL otherwise.
String Keywords
. Provides a list of keywords that refer to the file or subject of the file. Keywords are separated with semicolon and blank, e.g., FX; death; murder.
#define DLS_WAVE_FORMAT_PCM
unsigned long GetSize() const
Returns sample size.
#define CONN_TRANSFORM_DST(x)
std::list< Articulation * > ArticulationList
conn_src_t
Connection Sources.
unsigned long SetPos(unsigned long Where, stream_whence_t Whence=stream_start)
Sets the position within the chunk body, thus within the data portion of the chunk (in bytes)...
#define CONN_TRANSFORM_SRC_ENCODE(x)
uint32_t * pWavePoolTable
uint32_t WavePoolTableIndex
uint16_t Channels
Number of channels represented in the waveform data, e.g. 1 for mono, 2 for stereo (defaults to 1=mon...
#define CONN_TRANSFORM_BIPOLAR_SRC(x)
RIFF::List * pCkInstrument
String SourceForm
. Identifies the original form of the material that was digitized, such as record...
Sampler(RIFF::List *ParentList)
List * GetSubList(uint32_t ListType)
Returns sublist chunk with list type ListType within this chunk list.
void DeleteSubChunk(Chunk *pSubChunk)
Removes a sub chunk.
Defines Sample Loop Points.
virtual void UpdateChunks()
Apply articulation connections to the respective RIFF chunks.
unsigned long SetPos(unsigned long SampleCount, RIFF::stream_whence_t Whence=RIFF::stream_start)
Sets the position within the sample (in sample points, not in bytes).
RIFF::List * pResourceList
virtual ~Sample()
Destructor.
virtual void LoadSamples()
uint16_t MIDIBank
Reflects combination of MIDIBankCoarse and MIDIBankFine (bank 1 - bank 16384). Do not change this val...
virtual void SetGain(int32_t gain)
#define CONN_TRANSFORM_BIPOLAR_CTL(x)
unsigned long RemainingBytes()
Returns the number of bytes left to read in the chunk body.
List * GetFirstSubList()
Returns the first sublist within the list (that is a subchunk with chunk ID "LIST").
#define MIDI_BANK_MERGE(coarse, fine)
#define MIDI_BANK_FINE(x)
virtual void CopyAssign(const Info *orig)
Make a deep copy of the Info object given by orig and assign it to this object.
std::list< Sample * > SampleList
virtual void UpdateChunks()
Apply all the DLS file's current instruments, samples and settings to the respective RIFF chunks...
InstrumentList::iterator InstrumentsIterator
uint8_t MIDIBankCoarse
Reflects the MIDI Bank number for MIDI Control Change 0 (bank 1 - 128).
void GenerateDLSID()
Generates a new DLSID for the resource.
uint FrameSize
Reflects the size (in bytes) of one single sample point (only if known sample data format is used...
#define MIDI_BANK_COARSE(x)
unsigned long ReadUint32(uint32_t *pData, unsigned long WordCount=1)
Reads WordCount number of 32 Bit unsigned integer words and copies it into the buffer pointed by pDat...
Every subject of an DLS file and the file itself can have an unique, computer generated ID...
unsigned long GetPos()
Position within the chunk data body.
#define F_WAVELINK_MULTICHANNEL
virtual void CopyAssign(const Sample *orig)
Make a deep copy of the Sample object given by orig and assign it to this object. ...
Region * GetFirstRegion()
void DeleteSampleLoop(sample_loop_t *pLoopDef)
Deletes an existing sample loop.
virtual ~Instrument()
Destructor.
uint16_t low
Low value of range.
void SetByteOrder(endian_t Endian)
Set the byte order to be used when saving.
#define CONN_TRANSFORM_BIPOLAR_SRC_ENCODE(x)
bool b64BitWavePoolOffsets
void SetFixedStringLengths(const string_length_t *lengths)
Forces specific Info fields to be of a fixed length when being saved to a file.
uint16_t FormatTag
Format ID of the waveform data (should be DLS_WAVE_FORMAT_PCM for DLS1 compliant files, this is also the default value if Sample was created with Instrument::AddSample()).
virtual void CopyAssign(const Sampler *orig)
Make a deep copy of the Sampler object given by orig and assign it to this object.
void ReleaseSampleData()
Free sample data from RAM.
virtual void CopyAssign(const Articulator *orig)
Not yet implemented in this version, since the .gig format does not need to copy DLS articulators and...
Abstract base class which provides mandatory informations about sample players in general...
String libraryName()
Returns the name of this C++ library.
Exception(String Message)
#define CONN_TRANSFORM_DST_ENCODE(x)
conn_trn_t
Connection Transforms.
void SetFileName(const String &name)
You may call this method store a future file name, so you don't have to to pass it to the Save() call...
uint32_t SampleLoops
Reflects the number of sample loops.
conn_trn_t DestinationTransform
void Resize(int iNewSize)
Resize sample.
conn_dst_t
Connection Destinations.
bool NoSampleDepthTruncation
void DeleteSample(Sample *pSample)
Delete a sample.
unsigned long ReadInt32(int32_t *pData, unsigned long WordCount=1)
Reads WordCount number of 32 Bit signed integer words and copies it into the buffer pointed by pData...
uint16_t high
High value of range.
virtual void UpdateChunks()
Apply Region settings to the respective RIFF chunks.
Articulation * GetFirstArticulation()
uint32_t Size
For internal usage only: usually reflects exactly sizeof(sample_loop_t), otherwise if the value is la...
Chunk * GetSubChunk(uint32_t ChunkID)
Returns subchunk with chunk ID ChunkID within this chunk list.
Chunk * GetNextSubChunk()
Returns the next subchunk within the list.
Info(RIFF::List *list)
Constructor.
std::list< Instrument * > InstrumentList
Region(Instrument *pInstrument, RIFF::List *rgnList)
unsigned long SamplesTotal
Reflects total number of sample points (only if known sample data format is used, 0 otherwise)...
String Source
. Identifies the name of the person or organization who supplied the original subject of the...
uint16_t BitDepth
Size of each sample per channel (only if known sample data format is used, 0 otherwise).
uint32_t GetListType()
Returns unsigned integer representation of the list's ID.
unsigned long GetFilePos()
Current, actual offset in file.
#define F_WSMP_NO_COMPRESSION
#define CONN_TRANSFORM_SRC(x)
uint32_t MIDIProgram
Specifies the MIDI Program Change Number this Instrument should be assigned to.
String Commissioned
. Lists the name of the person or organization that commissioned the subject of the file...
unsigned long ReadInt16(int16_t *pData, unsigned long WordCount=1)
Reads WordCount number of 16 Bit signed integer words and copies it into the buffer pointed by pData...
#define F_RGN_OPTION_SELFNONEXCLUSIVE
void SetSample(Sample *pSample)
Assign another sample to this Region.
unsigned long Write(void *pData, unsigned long WordCount, unsigned long WordSize)
Writes WordCount number of data words with given WordSize from the buffer pointed by pData...
SampleList::iterator SamplesIterator
List * GetParent()
Returns pointer to the chunk's parent list chunk.
Articulation * GetNextArticulation()
Chunk * AddSubChunk(uint32_t uiChunkID, uint uiBodySize)
Creates a new sub chunk.
#define CONN_TRANSFORM_INVERT_CTL_ENCODE(x)
uint16_t WaveLinkOptionFlags
#define F_WSMP_NO_TRUNCATION
#define CONN_TRANSFORM_CTL(x)
#define MIDI_BANK_ENCODE(coarse, fine)
#define CONN_TRANSFORM_INVERT_SRC(x)
void DeleteInstrument(Instrument *pInstrument)
Delete an instrument.
unsigned long Write(void *pBuffer, unsigned long SampleCount)
Write sample wave data.
version_t * pVersion
Points to a version_t structure if the file provided a version number else is set to NULL...
String Technician
. Identifies the technician who sampled the subject file.
Instrument(File *pFile, RIFF::List *insList)
Constructor.
RegionList::iterator RegionsIterator
void SetFileName(const String &path)
void * LoadChunkData()
Load chunk body into RAM.
RIFF::Chunk * pArticulationCk
uint32_t AverageBytesPerSecond
The average number of bytes per second at which the waveform data should be transferred (Playback sof...
uint8_t MIDIBankFine
Reflects the MIDI Bank number for MIDI Control Change 32 (bank 1 - 128).
unsigned long GetSize() const
Chunk size in bytes (without header, thus the chunk data body)
uint32_t WavePoolHeaderSize
Abstract base class which encapsulates data structures which all DLS resources are able to provide...
void Init(conn_block_t *Header)
List * AddSubList(uint32_t uiListType)
Creates a new list sub chunk.
InstrumentList * pInstruments
virtual void LoadInstruments()
virtual void UpdateChunks()
Apply sample and its settings to the respective RIFF chunks.
RIFF specific classes and definitions.
String Software
. Identifies the name of the sofware package used to create the file.
virtual void UpdateChunks()
Update chunks with current Resource data.
#define CONN_TRANSFORM_CTL_ENCODE(x)
String ArchivalLocation
. Indicates where the subject of the file is stored.
unsigned long ulWavePoolOffset
virtual void Save()
Save changes to same file.
Encapsulates sample waves used for playback.
Sample * GetNextSample()
Returns a pointer to the next Sample object of the file, NULL otherwise.
void MoveSubChunk(Chunk *pSrc, Chunk *pDst)
Moves a sub chunk witin this list.
String Name
. Stores the title of the subject of the file, such as, Seattle From Above.
uint32_t SamplesPerSecond
Sampling rate at which each channel should be played (defaults to 44100 if Sample was created with In...
String Product
. Specifies the name of the title the file was originally intended for, such as World Ruler ...
Sample(File *pFile, RIFF::List *waveList, unsigned long WavePoolOffset)
Constructor.
String GetFileName()
File name of this DLS file.
String Medium
. Describes the original subject of the file, such as, record, CD, and so forth...
String Subject
. Describes the contents of the file.
virtual void LoadRegions()
virtual void Save()
Save changes to same file.
unsigned long ReadUint16(uint16_t *pData, unsigned long WordCount=1)
Reads WordCount number of 16 Bit unsigned integer words and copies it into the buffer pointed by pDat...
void CopyAssignCore(const Sample *orig)
Make a deep copy of the Sample object given by orig (without the actual sample waveform data however)...
conn_block_t ToConnBlock()
void ReleaseChunkData()
Free loaded chunk body from RAM.
void DeleteRegion(Region *pRegion)
Abstract base class for classes that provide articulation information (thus for Instrument and Region...
Connection * pConnections
Points to the beginning of a Connection array.
uint32_t Connections
Reflects the number of Connections.
conn_trn_t ControlTransform
Provides access to the defined connections used for the synthesis model.
#define CONN_TRANSFORM_INVERT_CTL(x)
dlsid_t * pDLSID
Points to a dlsid_t structure if the file provided a DLS ID else is NULL.
uint32_t Instruments
Reflects the number of available Instrument objects.
String Genre
. Descirbes the original work, such as, Jazz, Classic, Rock, Techno, Rave, etc.
Provides all neccessary information for the synthesis of a DLS Instrument.
Quadtuple version number ("major.minor.release.build").
virtual void CopyAssign(const Resource *orig)
Make a deep copy of the Resource object given by orig and assign it to this object.
String Copyright
. Records the copyright information for the file.
Sample * AddSample()
Add a new sample.
void CopyAssignCore(const Instrument *orig)
DLS specific classes and definitions.
Info * pInfo
Points (in any case) to an Info object, providing additional, optional infos and comments.
String libraryVersion()
Returns version of this C++ library.
virtual void UpdateChunks()
Apply all sample player options to the respective RIFF chunk.
Defines a connection within the synthesis model.
uint16_t FormatOptionFlags
uint32_t * pWavePoolTableHi
String Comments
. Provides general comments about the file or the subject of the file. Sentences might end w...
void Resize(int iNewSize)
Resize chunk.
Articulator(RIFF::List *ParentList)
List * GetNextSubList()
Returns the next sublist (that is a subchunk with chunk ID "LIST") within the list.
Defines Region information of an Instrument.
std::list< RIFF::File * > ExtensionFiles
Articulation(RIFF::Chunk *artl)
Constructor.
bool IsDrum
Indicates if the Instrument is a drum type, as they differ in the synthesis model of DLS from melodic...
std::list< Region * > RegionList
void * LoadSampleData()
Load sample data into RAM.
void AddSampleLoop(sample_loop_t *pLoopDef)
Adds a new sample loop with the provided loop definition.
virtual void UpdateFileOffsets()
Updates all file offsets stored all over the file.
Resource(Resource *Parent, RIFF::List *lstResource)
Constructor.