30 # define RIFF_TYPE_DLS 0x444C5320 31 # define LIST_TYPE_WVPL 0x7776706C 32 # define LIST_TYPE_DWPL 0x6477706C 33 # define LIST_TYPE_WAVE 0x77617665 34 # define LIST_TYPE_LINS 0X6C696E73 35 # define LIST_TYPE_INS 0X696E7320 36 # define LIST_TYPE_LRGN 0x6C72676E 37 # define LIST_TYPE_LART 0x6C617274 38 # define LIST_TYPE_LAR2 0x6C617232 39 # define LIST_TYPE_RGN 0x72676E20 40 # define LIST_TYPE_RGN2 0x72676E32 41 # define CHUNK_ID_IARL 0x4941524C 42 # define CHUNK_ID_IART 0x49415254 43 # define CHUNK_ID_ICMS 0x49434D53 44 # define CHUNK_ID_IGNR 0x49474E52 45 # define CHUNK_ID_IKEY 0x494B4559 46 # define CHUNK_ID_IMED 0x494D4544 47 # define CHUNK_ID_ISBJ 0x4953424A 48 # define CHUNK_ID_ISRC 0x49535243 49 # define CHUNK_ID_ISRF 0x49535246 50 # define CHUNK_ID_ITCH 0x49544348 51 # define CHUNK_ID_VERS 0x76657273 52 # define CHUNK_ID_DLID 0x646C6964 53 # define CHUNK_ID_FMT 0x666D7420 54 # define CHUNK_ID_DATA 0x64617461 55 # define CHUNK_ID_INSH 0x696E7368 56 # define CHUNK_ID_RGNH 0x72676E68 57 # define CHUNK_ID_WLNK 0x776C6E6B 58 # define CHUNK_ID_PTBL 0x7074626C 59 # define CHUNK_ID_WSMP 0x77736D70 60 # define CHUNK_ID_COLH 0x636F6C68 61 # define CHUNK_ID_ARTL 0x6172746C 62 # define CHUNK_ID_ART2 0x61727432 63 #else // little endian 64 # define RIFF_TYPE_DLS 0x20534C44 65 # define LIST_TYPE_WVPL 0x6C707677 66 # define LIST_TYPE_DWPL 0x6C707764 67 # define LIST_TYPE_WAVE 0x65766177 68 # define LIST_TYPE_LINS 0X736E696C 69 # define LIST_TYPE_INS 0X20736E69 70 # define LIST_TYPE_LRGN 0x6E67726C 71 # define LIST_TYPE_LART 0x7472616C 72 # define LIST_TYPE_LAR2 0x3272616C 73 # define LIST_TYPE_RGN 0x206E6772 74 # define LIST_TYPE_RGN2 0x326E6772 75 # define CHUNK_ID_IARL 0x4C524149 76 # define CHUNK_ID_IART 0x54524149 77 # define CHUNK_ID_ICMS 0x534D4349 78 # define CHUNK_ID_IGNR 0x524E4749 79 # define CHUNK_ID_IKEY 0x59454B49 80 # define CHUNK_ID_IMED 0x44454D49 81 # define CHUNK_ID_ISBJ 0x4A425349 82 # define CHUNK_ID_ISRC 0x43525349 83 # define CHUNK_ID_ISRF 0x46525349 84 # define CHUNK_ID_ITCH 0x48435449 85 # define CHUNK_ID_VERS 0x73726576 86 # define CHUNK_ID_DLID 0x64696C64 87 # define CHUNK_ID_FMT 0x20746D66 88 # define CHUNK_ID_DATA 0x61746164 89 # define CHUNK_ID_INSH 0x68736E69 90 # define CHUNK_ID_RGNH 0x686E6772 91 # define CHUNK_ID_WLNK 0x6B6E6C77 92 # define CHUNK_ID_PTBL 0x6C627470 93 # define CHUNK_ID_WSMP 0x706D7377 94 # define CHUNK_ID_COLH 0x686C6F63 95 # define CHUNK_ID_ARTL 0x6C747261 96 # define CHUNK_ID_ART2 0x32747261 97 #endif // WORDS_BIGENDIAN 99 #define DLS_WAVE_FORMAT_PCM 0x0001 106 typedef std::string String;
129 conn_src_none = 0x0000,
130 conn_src_lfo = 0x0001,
131 conn_src_keyonvelocity = 0x0002,
132 conn_src_keynumber = 0x0003,
133 conn_src_eg1 = 0x0004,
134 conn_src_eg2 = 0x0005,
135 conn_src_pitchwheel = 0x0006,
136 conn_src_polypressure = 0x0007,
137 conn_src_channelpressure = 0x0008,
138 conn_src_vibrato = 0x0009,
140 conn_src_cc1 = 0x0081,
141 conn_src_cc7 = 0x0087,
142 conn_src_cc10 = 0x008A,
143 conn_src_cc11 = 0x008B,
144 conn_src_cc91 = 0x00DB,
145 conn_src_cc93 = 0x00DD,
147 conn_src_rpn0 = 0x0100,
148 conn_src_rpn1 = 0x0101,
149 conn_src_rpn2 = 0x0102
155 conn_dst_none = 0x0000,
156 conn_dst_gain = 0x0001,
157 conn_dst_reserved = 0x0002,
158 conn_dst_pitch = 0x0003,
159 conn_dst_pan = 0x0004,
160 conn_dst_keynumber = 0x0005,
162 conn_dst_left = 0x0010,
163 conn_dst_right = 0x0011,
164 conn_dst_center = 0x0012,
165 conn_dst_lfe_channel = 0x0013,
166 conn_dst_leftrear = 0x0014,
167 conn_dst_rightrear = 0x0015,
168 conn_dst_chorus = 0x0080,
169 conn_dst_reverb = 0x0081,
171 conn_dst_lfo_frequency = 0x0104,
172 conn_dst_lfo_startdelay = 0x0105,
174 conn_dst_vib_frequency = 0x0114,
175 conn_dst_vib_startdelay = 0x0115,
177 conn_dst_eg1_attacktime = 0x0206,
178 conn_dst_eg1_decaytime = 0x0207,
179 conn_dst_eg1_reserved = 0x0208,
180 conn_dst_eg1_releasetime = 0x0209,
181 conn_dst_eg1_sustainlevel = 0x020A,
182 conn_dst_eg1_delaytime = 0x020B,
183 conn_dst_eg1_holdtime = 0x020C,
184 conn_dst_eg1_shutdowntime = 0x020D,
185 conn_dst_eg2_attacktime = 0x030A,
186 conn_dst_eg2_decaytime = 0x030B,
187 conn_dst_eg2_reserved = 0x030C,
188 conn_dst_eg2_releasetime = 0x030D,
189 conn_dst_eg2_sustainlevel = 0x030E,
190 conn_dst_eg2_delaytime = 0x030F,
191 conn_dst_eg2_holdtime = 0x0310,
193 conn_dst_filter_cutoff = 0x0500,
194 conn_dst_filter_q = 0x0501
199 conn_trn_none = 0x0000,
200 conn_trn_concave = 0x0001,
201 conn_trn_convex = 0x0002,
202 conn_trn_switch = 0x0003
210 inline bool operator< (
const range_t& other)
const {
211 if (
low < other.
low)
return true;
212 if (
low > other.
low)
return false;
216 inline bool operator== (
const range_t& other)
const {
220 inline bool overlaps(uint16_t scalar)
const {
221 return low <= scalar && scalar <=
high;
224 inline bool overlaps(
const range_t& other)
const {
225 return overlaps(other.low) || overlaps(other.high) ||
226 other.overlaps(
low) || other.overlaps(
high);
259 struct conn_block_t {
262 uint16_t destination;
267 void Init(conn_block_t* Header);
268 conn_block_t ToConnBlock();
296 typedef std::list<Articulation*> ArticulationList;
298 ArticulationList* pArticulations;
299 ArticulationList::iterator ArticulationsIterator;
301 void LoadArticulations();
327 struct string_length_t {
339 const string_length_t* pFixedStringLengths;
341 static void LoadString(uint32_t ChunkID,
RIFF::List* lstINFO, String& s);
342 void SaveString(uint32_t ChunkID,
RIFF::List* lstINFO,
const String& s,
const String& sDefault);
351 Resource* GetParent() {
return pParent; }
352 const Resource* GetParent()
const {
return pParent; }
370 bool NoSampleDepthTruncation;
371 bool NoSampleCompression;
377 virtual void SetGain(int32_t gain);
382 uint32_t uiHeaderSize;
383 uint32_t SamplerOptions;
410 void Resize(file_offset_t NewSize);
412 file_offset_t
Read(
void* pBuffer, file_offset_t SampleCount);
413 file_offset_t
Write(
void* pBuffer, file_offset_t SampleCount);
421 file_offset_t ullWavePoolOffset;
437 bool SelfNonExclusive;
445 virtual void SetKeyRange(uint16_t Low, uint16_t High);
450 uint32_t WavePoolTableIndex;
452 uint16_t FormatOptionFlags;
453 uint16_t WaveLinkOptionFlags;
473 void DeleteRegion(
Region* pRegion);
477 typedef std::list<Region*> RegionList;
478 struct midi_locale_t {
484 RegionList* pRegions;
485 RegionList::iterator RegionsIterator;
489 virtual void LoadRegions();
517 virtual void Save(
const String& Path,
progress_t* pProgress = NULL);
521 typedef std::list<Sample*> SampleList;
522 typedef std::list<Instrument*> InstrumentList;
525 std::list<RIFF::File*> ExtensionFiles;
526 SampleList* pSamples;
527 SampleList::iterator SamplesIterator;
528 InstrumentList* pInstruments;
529 InstrumentList::iterator InstrumentsIterator;
530 uint32_t WavePoolHeaderSize;
531 uint32_t WavePoolCount;
532 uint32_t* pWavePoolTable;
533 uint32_t* pWavePoolTableHi;
534 bool b64BitWavePoolOffsets;
536 virtual void LoadSamples();
537 virtual void LoadInstruments();
542 void __UpdateWavePoolTableChunk();
543 void __UpdateWavePoolTable();
uint16_t BlockAlign
The block alignment (in bytes) of the waveform data. Playback software needs to process a multiple of...
sample_loop_t * pSampleLoops
Points to the beginning of a sample loop array, or is NULL if there are no loops defined.
uint32_t Regions
Reflects the number of Region defintions this Instrument has.
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.
String CreationDate
<ICRD-ck>. Specifies the date the subject of the file was created. List dates in yyyy-mm-dd format.
uint32_t LoopType
Defines how the waveform samples will be looped (appropriate loop types for the gig format are define...
String Engineer
<IENG-ck>. Stores the name of the engineer who worked on the file. Multiple engineer names are separa...
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.
virtual void CopyAssign(const Region *orig)
Make a (semi) deep copy of the Region object given by orig and assign it to this object.
file_offset_t SetPos(file_offset_t SampleCount, RIFF::stream_whence_t Whence=RIFF::stream_start)
Sets the position within the sample (in sample points, not in bytes).
Will be thrown whenever a DLS specific error occurs while trying to access a DLS File.
Optional information for DLS files, instruments, samples, etc.
virtual void UpdateChunks(progress_t *pProgress)
Update chunks with current Resource data.
RIFF::File * GetExtensionFile(int index)
Returns extension file of given index.
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....
virtual void UpdateChunks(progress_t *pProgress)
Apply sample and its settings to the respective RIFF chunks.
conn_src_t
Connection Sources.
file_offset_t GetSize() const
Returns sample size.
uint16_t Channels
Number of channels represented in the waveform data, e.g. 1 for mono, 2 for stereo (defaults to 1=mon...
file_offset_t SamplesTotal
Reflects total number of sample points (only if known sample data format is used, 0 otherwise),...
String SourceForm
<ISRF-ck>. Identifies the original form of the material that was digitized, such as record,...
Defines Sample Loop Points.
uint16_t MIDIBank
Reflects combination of MIDIBankCoarse and MIDIBankFine (bank 1 - bank 16384). Do not change this val...
virtual ~Region()
Destructor.
virtual void CopyAssign(const Info *orig)
Make a deep copy of the Info object given by orig and assign it to this object.
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.
Sample * GetFirstSample()
Returns a pointer to the first Sample object of the file, NULL otherwise.
uint FrameSize
Reflects the size (in bytes) of one single sample point (only if known sample data format is used,...
Every subject of an DLS file and the file itself can have an unique, computer generated ID.
Lower and upper limit of a range.
virtual void CopyAssign(const Sample *orig)
Make a deep copy of the Sample object given by orig and assign it to this object.
void DeleteSampleLoop(sample_loop_t *pLoopDef)
Deletes an existing sample loop.
virtual ~Instrument()
Destructor.
file_offset_t Write(void *pBuffer, file_offset_t SampleCount)
Write sample wave data.
uint16_t low
Low value of range.
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,...
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.
void Resize(file_offset_t NewSize)
Resize sample.
Sample * GetNextSample()
Returns a pointer to the next Sample object of the file, NULL otherwise.
Region * GetNextRegion()
Returns the next Region of the instrument.
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.
virtual void Save(const String &Path, progress_t *pProgress=NULL)
Save changes to another file.
conn_dst_t
Connection Destinations.
Sample * AddSample()
Add a new sample.
virtual void UpdateChunks(progress_t *pProgress)
Apply Instrument with all its Regions to the respective RIFF chunks.
void DeleteSample(Sample *pSample)
Delete a sample.
uint16_t high
High value of range.
uint64_t file_offset_t
Type used by libgig for handling file positioning during file I/O tasks.
uint32_t Size
For internal usage only: usually reflects exactly sizeof(sample_loop_t), otherwise if the value is la...
virtual void UpdateChunks(progress_t *pProgress)
Apply all the DLS file's current instruments, samples and settings to the respective RIFF chunks.
Info(RIFF::List *list)
Constructor.
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.
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).
virtual ~Sample()
Destructor.
Sample(File *pFile, RIFF::List *waveList, file_offset_t WavePoolOffset)
Constructor.
uint32_t MIDIProgram
Specifies the MIDI Program Change Number this Instrument should be assigned to.
virtual void UpdateChunks(progress_t *pProgress)
Update chunks with current info values.
String Commissioned
<ICMS-ck>. Lists the name of the person or organization that commissioned the subject of the file,...
uint32_t LoopLength
Length of the looping area (in sample points).
void SetSample(Sample *pSample)
Assign another sample to this Region.
Used for indicating the progress of a certain task.
void DeleteInstrument(Instrument *pInstrument)
Delete an instrument.
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.
uint32_t LoopStart
The start value specifies the offset (in sample points) in the waveform data of the first sample poin...
Instrument(File *pFile, RIFF::List *insList)
Constructor.
uint32_t AverageBytesPerSecond
The average number of bytes per second at which the waveform data should be transferred (Playback sof...
virtual void UpdateChunks(progress_t *pProgress)
Apply Region settings to the respective RIFF chunks.
uint8_t MIDIBankFine
Reflects the MIDI Bank number for MIDI Control Change 32 (bank 1 - 128).
virtual void UpdateFileOffsets()
Updates all file offsets stored all over the file.
virtual void UpdateChunks(progress_t *pProgress)
Apply all articulations to the respective RIFF chunks.
Abstract base class which encapsulates data structures which all DLS resources are able to provide.
virtual void CopyAssign(const Instrument *orig)
Make a (semi) deep copy of the Instrument object given by orig and assign it to this object.
virtual void UpdateChunks(progress_t *pProgress)
Apply all sample player options to the respective RIFF chunk.
String Software
<ISFT-ck>. Identifies the name of the sofware package used to create the file.
String ArchivalLocation
<IARL-ck>. Indicates where the subject of the file is stored.
Encapsulates sample waves used for playback.
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 ...
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.
Instrument * AddInstrument()
Add a new instrument definition.
file_offset_t Read(void *pBuffer, file_offset_t SampleCount)
Reads SampleCount number of sample points from the current position into the buffer pointed by pBuffe...
Will be thrown whenever an error occurs while handling a RIFF file.
void CopyAssignCore(const Sample *orig)
Make a deep copy of the Sample object given by orig (without the actual sample waveform data however)...
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.
Provides access to the defined connections used for the synthesis model.
virtual void UpdateChunks(progress_t *pProgress)
Apply articulation connections to the respective RIFF chunks.
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
<IGNR-ck>. Descirbes the original work, such as, Jazz, Classic, Rock, Techno, Rave,...
Provides all neccessary information for the synthesis of a DLS Instrument.
Quadtuple version number ("major.minor.release.build").
Instrument * GetNextInstrument()
Returns a pointer to the next Instrument object of the file, NULL otherwise.
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.
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.
Defines a connection within the synthesis model.
bool UseFixedLengthStrings
String Comments
<ICMT-ck>. Provides general comments about the file or the subject of the file. Sentences might end w...
Region * GetFirstRegion()
Returns the first Region of the instrument.
Defines Region information of an Instrument.
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...
void * LoadSampleData()
Load sample data into RAM.
void AddSampleLoop(sample_loop_t *pLoopDef)
Adds a new sample loop with the provided loop definition.
Resource(Resource *Parent, RIFF::List *lstResource)
Constructor.