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)) 119 pArticulationCk = artl;
130 for (uint32_t i = 0; i < Connections; i++) {
136 pConnections[i].Init(&connblock);
141 if (pConnections)
delete[] pConnections;
149 const int iEntrySize = 12;
150 pArticulationCk->Resize(HeaderSize + Connections * iEntrySize);
151 uint8_t* pData = (uint8_t*) pArticulationCk->LoadChunkData();
152 store16(&pData[0], HeaderSize);
153 store16(&pData[2], Connections);
154 for (uint32_t i = 0; i < Connections; i++) {
156 store16(&pData[HeaderSize + i * iEntrySize], c.
source);
157 store16(&pData[HeaderSize + i * iEntrySize + 2], c.
control);
158 store16(&pData[HeaderSize + i * iEntrySize + 4], c.
destination);
159 store16(&pData[HeaderSize + i * iEntrySize + 6], c.
transform);
160 store32(&pData[HeaderSize + i * iEntrySize + 8], c.
scale);
170 pParentList = ParentList;
171 pArticulations = NULL;
175 if (!pArticulations) LoadArticulations();
176 if (!pArticulations)
return NULL;
177 ArticulationsIterator = pArticulations->begin();
178 return (ArticulationsIterator != pArticulations->end()) ? *ArticulationsIterator : NULL;
182 if (!pArticulations)
return NULL;
183 ArticulationsIterator++;
184 return (ArticulationsIterator != pArticulations->end()) ? *ArticulationsIterator : NULL;
206 if (pArticulations) {
207 ArticulationList::iterator iter = pArticulations->begin();
208 ArticulationList::iterator end = pArticulations->end();
209 while (iter != end) {
213 delete pArticulations;
222 if (pArticulations) {
223 ArticulationList::iterator iter = pArticulations->begin();
224 ArticulationList::iterator end = pArticulations->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;
380 SaveString(
CHUNK_ID_ICMT, lstINFO, Comments, defaultComments);
382 SaveString(
CHUNK_ID_ICRD, lstINFO, CreationDate, defaultCreationDate);
390 SaveString(
CHUNK_ID_ISFT, lstINFO, Software, defaultSoftware);
421 pFixedStringLengths = orig->pFixedStringLengths;
440 pResourceList = lstResource;
442 pInfo =
new Info(lstResource);
447 ckDLSID->
Read(&pDLSID->ulData1, 1, 4);
448 ckDLSID->
Read(&pDLSID->usData2, 1, 2);
449 ckDLSID->
Read(&pDLSID->usData3, 1, 2);
450 ckDLSID->
Read(pDLSID->abData, 8, 1);
456 if (pDLSID)
delete pDLSID;
457 if (pInfo)
delete pInfo;
469 pInfo->UpdateChunks();
474 if (!ckDLSID) ckDLSID = pResourceList->AddSubChunk(
CHUNK_ID_DLID, 16);
477 store32(&pData[0], pDLSID->ulData1);
478 store16(&pData[4], pDLSID->usData2);
479 store16(&pData[6], pDLSID->usData3);
480 memcpy(&pData[8], pDLSID->abData, 8);
488 #if defined(WIN32) || defined(__APPLE__) || defined(HAVE_UUID_GENERATE) 490 if (!pDLSID) pDLSID =
new dlsid_t;
496 pDLSID->ulData1 = uuid.Data1;
497 pDLSID->usData2 = uuid.Data2;
498 pDLSID->usData3 = uuid.Data3;
499 memcpy(pDLSID->abData, uuid.Data4, 8);
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;
507 pDLSID->usData2 = uuid.byte4 | uuid.byte5 << 8;
508 pDLSID->usData3 = uuid.byte6 | uuid.byte7 << 8;
509 pDLSID->abData[0] = uuid.byte8;
510 pDLSID->abData[1] = uuid.byte9;
511 pDLSID->abData[2] = uuid.byte10;
512 pDLSID->abData[3] = uuid.byte11;
513 pDLSID->abData[4] = uuid.byte12;
514 pDLSID->abData[5] = uuid.byte13;
515 pDLSID->abData[6] = uuid.byte14;
516 pDLSID->abData[7] = uuid.byte15;
520 pDLSID->ulData1 = uuid[0] | uuid[1] << 8 | uuid[2] << 16 | uuid[3] << 24;
521 pDLSID->usData2 = uuid[4] | uuid[5] << 8;
522 pDLSID->usData3 = uuid[6] | uuid[7] << 8;
523 memcpy(pDLSID->abData, &uuid[8], 8);
535 pInfo->CopyAssign(orig->
pInfo);
543 pParentList = ParentList;
562 pSampleLoops = (SampleLoops) ?
new sample_loop_t[SampleLoops] : NULL;
564 wsmp->
SetPos(uiHeaderSize);
565 for (uint32_t i = 0; i < SampleLoops; i++) {
566 wsmp->
Read(pSampleLoops + i, 4, 4);
575 if (pSampleLoops)
delete[] pSampleLoops;
589 int wsmpSize = uiHeaderSize + SampleLoops * 16;
592 }
else if (wsmp->
GetSize() != wsmpSize) {
597 store32(&pData[0], uiHeaderSize);
603 store16(&pData[4], UnityNote);
604 store16(&pData[6], FineTune);
605 store32(&pData[8], Gain);
606 store32(&pData[12], SamplerOptions);
607 store32(&pData[16], SampleLoops);
609 for (uint32_t i = 0; i < SampleLoops; i++) {
611 store32(&pData[uiHeaderSize + i * 16], pSampleLoops[i].Size);
612 store32(&pData[uiHeaderSize + i * 16 + 4], pSampleLoops[i].LoopType);
613 store32(&pData[uiHeaderSize + i * 16 + 8], pSampleLoops[i].LoopStart);
614 store32(&pData[uiHeaderSize + i * 16 + 12], pSampleLoops[i].LoopLength);
626 for (
int i = 0; i < SampleLoops; i++) {
627 pNewLoops[i] = pSampleLoops[i];
630 pNewLoops[SampleLoops] = *pLoopDef;
634 if (SampleLoops)
delete[] pSampleLoops;
635 pSampleLoops = pNewLoops;
648 for (
int i = 0, o = 0; i < SampleLoops; i++) {
649 if (&pSampleLoops[i] == pLoopDef)
continue;
650 if (o == SampleLoops - 1) {
652 throw Exception(
"Could not delete Sample Loop, because it does not exist");
654 pNewLoops[o] = pSampleLoops[i];
658 if (SampleLoops)
delete[] pSampleLoops;
659 pSampleLoops = pNewLoops;
679 if (SampleLoops)
delete[] pSampleLoops;
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...
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
<ICRD-ck>. 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
virtual void UpdateChunks()
Apply all articulations to the respective RIFF chunks.
uint32_t GetChunkID()
Chunk ID in unsigned integer representation.
String Engineer
<IENG-ck>. 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
<IART-ck>. 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
<IKEY-ck>. 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
<ISRF-ck>. 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).
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.
void LoadString(RIFF::Chunk *ck, std::string &s, int strLength)
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
<ISRC-ck>. 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
<ICMS-ck>. Lists the name of the person or organization that commissioned the subject of the file...
friend class Articulation
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
<ITCH-ck>. 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.
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
<ISFT-ck>. 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
<IARL-ck>. 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
<INAM-ck>. 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
<IPRD-ck>. 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
<IMED-ck>. Describes the original subject of the file, such as, record, CD, and so forth...
String Subject
<ISBJ-ck>. 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...
conn_trn_t ControlTransform
Provides access to the defined connections used for the synthesis model.
#define CONN_TRANSFORM_INVERT_CTL(x)
uint32_t Instruments
Reflects the number of available Instrument objects.
String Genre
<IGNR-ck>. 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
<ICOP-ck>. 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
<ICMT-ck>. 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.