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 # define CHUNK_ID_XFIL 0x7866696C
64 # define CHUNK_ID_DOXF 0x646F7866
65 #else // little endian
66 # define RIFF_TYPE_DLS 0x20534C44
67 # define LIST_TYPE_WVPL 0x6C707677
68 # define LIST_TYPE_DWPL 0x6C707764
69 # define LIST_TYPE_WAVE 0x65766177
70 # define LIST_TYPE_LINS 0X736E696C
71 # define LIST_TYPE_INS 0X20736E69
72 # define LIST_TYPE_LRGN 0x6E67726C
73 # define LIST_TYPE_LART 0x7472616C
74 # define LIST_TYPE_LAR2 0x3272616C
75 # define LIST_TYPE_RGN 0x206E6772
76 # define LIST_TYPE_RGN2 0x326E6772
77 # define CHUNK_ID_IARL 0x4C524149
78 # define CHUNK_ID_IART 0x54524149
79 # define CHUNK_ID_ICMS 0x534D4349
80 # define CHUNK_ID_IGNR 0x524E4749
81 # define CHUNK_ID_IKEY 0x59454B49
82 # define CHUNK_ID_IMED 0x44454D49
83 # define CHUNK_ID_ISBJ 0x4A425349
84 # define CHUNK_ID_ISRC 0x43525349
85 # define CHUNK_ID_ISRF 0x46525349
86 # define CHUNK_ID_ITCH 0x48435449
87 # define CHUNK_ID_VERS 0x73726576
88 # define CHUNK_ID_DLID 0x64696C64
89 # define CHUNK_ID_FMT 0x20746D66
90 # define CHUNK_ID_DATA 0x61746164
91 # define CHUNK_ID_INSH 0x68736E69
92 # define CHUNK_ID_RGNH 0x686E6772
93 # define CHUNK_ID_WLNK 0x6B6E6C77
94 # define CHUNK_ID_PTBL 0x6C627470
95 # define CHUNK_ID_WSMP 0x706D7377
96 # define CHUNK_ID_COLH 0x686C6F63
97 # define CHUNK_ID_ARTL 0x6C747261
98 # define CHUNK_ID_ART2 0x32747261
99 # define CHUNK_ID_XFIL 0x6C696678
100 # define CHUNK_ID_DOXF 0x66786F64
101 #endif // WORDS_BIGENDIAN
103 #define DLS_WAVE_FORMAT_PCM 0x0001
110 typedef std::string String;
133 conn_src_none = 0x0000,
134 conn_src_lfo = 0x0001,
135 conn_src_keyonvelocity = 0x0002,
136 conn_src_keynumber = 0x0003,
137 conn_src_eg1 = 0x0004,
138 conn_src_eg2 = 0x0005,
139 conn_src_pitchwheel = 0x0006,
140 conn_src_polypressure = 0x0007,
141 conn_src_channelpressure = 0x0008,
142 conn_src_vibrato = 0x0009,
144 conn_src_cc1 = 0x0081,
145 conn_src_cc7 = 0x0087,
146 conn_src_cc10 = 0x008A,
147 conn_src_cc11 = 0x008B,
148 conn_src_cc91 = 0x00DB,
149 conn_src_cc93 = 0x00DD,
151 conn_src_rpn0 = 0x0100,
152 conn_src_rpn1 = 0x0101,
153 conn_src_rpn2 = 0x0102
159 conn_dst_none = 0x0000,
160 conn_dst_gain = 0x0001,
161 conn_dst_reserved = 0x0002,
162 conn_dst_pitch = 0x0003,
163 conn_dst_pan = 0x0004,
164 conn_dst_keynumber = 0x0005,
166 conn_dst_left = 0x0010,
167 conn_dst_right = 0x0011,
168 conn_dst_center = 0x0012,
169 conn_dst_lfe_channel = 0x0013,
170 conn_dst_leftrear = 0x0014,
171 conn_dst_rightrear = 0x0015,
172 conn_dst_chorus = 0x0080,
173 conn_dst_reverb = 0x0081,
175 conn_dst_lfo_frequency = 0x0104,
176 conn_dst_lfo_startdelay = 0x0105,
178 conn_dst_vib_frequency = 0x0114,
179 conn_dst_vib_startdelay = 0x0115,
181 conn_dst_eg1_attacktime = 0x0206,
182 conn_dst_eg1_decaytime = 0x0207,
183 conn_dst_eg1_reserved = 0x0208,
184 conn_dst_eg1_releasetime = 0x0209,
185 conn_dst_eg1_sustainlevel = 0x020A,
186 conn_dst_eg1_delaytime = 0x020B,
187 conn_dst_eg1_holdtime = 0x020C,
188 conn_dst_eg1_shutdowntime = 0x020D,
189 conn_dst_eg2_attacktime = 0x030A,
190 conn_dst_eg2_decaytime = 0x030B,
191 conn_dst_eg2_reserved = 0x030C,
192 conn_dst_eg2_releasetime = 0x030D,
193 conn_dst_eg2_sustainlevel = 0x030E,
194 conn_dst_eg2_delaytime = 0x030F,
195 conn_dst_eg2_holdtime = 0x0310,
197 conn_dst_filter_cutoff = 0x0500,
198 conn_dst_filter_q = 0x0501
203 conn_trn_none = 0x0000,
204 conn_trn_concave = 0x0001,
205 conn_trn_convex = 0x0002,
206 conn_trn_switch = 0x0003
214 inline bool operator< (
const range_t& other)
const {
215 if (
low < other.
low)
return true;
216 if (
low > other.
low)
return false;
220 inline bool operator== (
const range_t& other)
const {
224 inline bool overlaps(uint16_t scalar)
const {
225 return low <= scalar && scalar <=
high;
228 inline bool overlaps(
const range_t& other)
const {
229 return overlaps(other.low) || overlaps(other.high) ||
230 other.overlaps(
low) || other.overlaps(
high);
263 struct conn_block_t {
266 uint16_t destination;
271 void Init(conn_block_t* Header);
272 conn_block_t ToConnBlock();
338 RIFF::Chunk* pArticulationCk;
352 typedef std::list<Articulation*> ArticulationList;
354 ArticulationList* pArticulations;
355 ArticulationList::iterator ArticulationsIterator;
357 void LoadArticulations();
383 struct string_length_t {
389 void SetFixedStringLengths(
const string_length_t* lengths);
393 virtual
void CopyAssign(const
Info* orig);
395 RIFF::List* pResourceListChunk;
396 const string_length_t* pFixedStringLengths;
398 static
void LoadString(uint32_t ChunkID,
RIFF::List* lstINFO, String& s);
399 void SaveString(uint32_t ChunkID,
RIFF::List* lstINFO, const String& s, const String& sDefault);
408 Resource* GetParent() {
return pParent; }
409 const Resource* GetParent()
const {
return pParent; }
410 virtual void UpdateChunks(progress_t* pProgress) OVERRIDE;
412 void GenerateDLSID();
413 static
void GenerateDLSID(dlsid_t* pDLSID);
414 virtual
void CopyAssign(const Resource* orig);
417 RIFF::List* pResourceList;
419 Resource(Resource* Parent,
RIFF::List* lstResource);
429 bool NoSampleDepthTruncation;
430 bool NoSampleCompression;
436 virtual void SetGain(int32_t gain);
439 virtual
void CopyAssign(const
Sampler* orig);
441 RIFF::List* pParentList;
442 uint32_t uiHeaderSize;
443 uint32_t SamplerOptions;
467 void* LoadSampleData();
468 void ReleaseSampleData();
469 file_offset_t GetSize()
const;
470 void Resize(file_offset_t NewSize);
472 file_offset_t Read(
void* pBuffer, file_offset_t SampleCount);
473 file_offset_t Write(
void* pBuffer, file_offset_t SampleCount);
476 virtual
void CopyAssign(const
Sample* orig);
479 RIFF::List* pWaveList;
480 RIFF::Chunk* pCkData;
481 RIFF::Chunk* pCkFormat;
482 file_offset_t ullWavePoolOffset;
484 Sample(
File* pFile,
RIFF::List* waveList, file_offset_t WavePoolOffset);
486 void CopyAssignCore(const
Sample* orig);
498 bool SelfNonExclusive;
505 void SetSample(
Sample* pSample);
506 virtual void SetKeyRange(uint16_t Low, uint16_t High);
509 virtual
void CopyAssign(const
Region* orig);
511 RIFF::List* pCkRegion;
512 uint32_t WavePoolTableIndex;
514 uint16_t FormatOptionFlags;
515 uint16_t WaveLinkOptionFlags;
535 void DeleteRegion(
Region* pRegion);
538 virtual
void CopyAssign(const
Instrument* orig);
540 typedef std::list<
Region*> RegionList;
541 struct midi_locale_t {
547 RegionList* pRegions;
548 RegionList::iterator RegionsIterator;
552 virtual void LoadRegions();
568 String GetFileName();
569 void SetFileName(
const String& name);
573 void DeleteSample(
Sample* pSample);
577 void DeleteInstrument(
Instrument* pInstrument);
581 virtual void Save(
const String& Path,
progress_t* pProgress = NULL);
582 virtual void Save(
progress_t* pProgress = NULL);
585 typedef std::list<Sample*> SampleList;
586 typedef std::list<Instrument*> InstrumentList;
589 std::list<RIFF::File*> ExtensionFiles;
590 SampleList* pSamples;
591 SampleList::iterator SamplesIterator;
592 InstrumentList* pInstruments;
593 InstrumentList::iterator InstrumentsIterator;
594 uint32_t WavePoolHeaderSize;
595 uint32_t WavePoolCount;
596 uint32_t* pWavePoolTable;
597 uint32_t* pWavePoolTableHi;
598 bool b64BitWavePoolOffsets;
601 virtual void LoadSamples();
602 virtual void LoadInstruments();
603 virtual void UpdateFileOffsets();
604 void __ensureMandatoryChunksExist();
607 void __UpdateWavePoolTableChunk();
608 void __UpdateWavePoolTable();