/[svn]/libgig/trunk/src/DLS.h
ViewVC logotype

Annotation of /libgig/trunk/src/DLS.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2543 - (hide annotations) (download) (as text)
Sat May 10 02:06:58 2014 UTC (9 years, 11 months ago) by schoenebeck
File MIME type: text/x-c++hdr
File size: 26746 byte(s)
* Initial support for sample based instruments in KORG's file format (.KMP
  and .KSF files) -> Korg.h, Korg.cpp.
* Added new command line tool "korgdump" (and a man page for it).
* Added new command line tool "korg2gig" (and a man page for it), for
  converting KORG sounds to Giga format.
* riftree tool: Added more command line options for being able to also dump
  other kind of file formats similar but not equal to the RIFF format.
* gig.h/.cpp: Added new method File::GetGroup(String name) for retrieving
  group by name.
* RIFF.h/.cpp: Added support for loading RIFF-like files with a bit
  different layout than "real" RIFF files (used for KORG format support).
* RIFF.h/.cpp: Added new method Chunk::GetFile().
* RIFF.h/.cpp: Added new method Chunk::GetLayout().
* Bumped version (3.3.0.svn9).

1 schoenebeck 2 /***************************************************************************
2     * *
3 schoenebeck 933 * libgig - C++ cross-platform Gigasampler format file access library *
4 schoenebeck 2 * *
5 schoenebeck 2543 * Copyright (C) 2003-2014 by Christian Schoenebeck *
6 schoenebeck 384 * <cuse@users.sourceforge.net> *
7 schoenebeck 2 * *
8     * This library is free software; you can redistribute it and/or modify *
9     * it under the terms of the GNU General Public License as published by *
10     * the Free Software Foundation; either version 2 of the License, or *
11     * (at your option) any later version. *
12     * *
13     * This library is distributed in the hope that it will be useful, *
14     * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
16     * GNU General Public License for more details. *
17     * *
18     * You should have received a copy of the GNU General Public License *
19     * along with this library; if not, write to the Free Software *
20     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
21     * MA 02111-1307 USA *
22     ***************************************************************************/
23    
24     #ifndef __DLS_H__
25     #define __DLS_H__
26    
27     #include "RIFF.h"
28    
29 schoenebeck 11 #if WORDS_BIGENDIAN
30 schoenebeck 802 # define RIFF_TYPE_DLS 0x444C5320
31 schoenebeck 2 # define LIST_TYPE_WVPL 0x7776706C
32     # define LIST_TYPE_DWPL 0x6477706C ///< Seen on some files instead of a wvpl list chunk.
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 schoenebeck 800 # define CHUNK_ID_ARTL 0x6172746C
62     # define CHUNK_ID_ART2 0x61727432
63 schoenebeck 2 #else // little endian
64 schoenebeck 802 # define RIFF_TYPE_DLS 0x20534C44
65 schoenebeck 2 # define LIST_TYPE_WVPL 0x6C707677
66     # define LIST_TYPE_DWPL 0x6C707764 ///< Seen on some files instead of a wvpl list chunk.
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 persson 928 # define CHUNK_ID_IMED 0x44454D49
81 schoenebeck 2 # 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 schoenebeck 800 # define CHUNK_ID_ARTL 0x6C747261
96     # define CHUNK_ID_ART2 0x32747261
97 schoenebeck 2 #endif // WORDS_BIGENDIAN
98    
99 schoenebeck 1050 #define DLS_WAVE_FORMAT_PCM 0x0001
100 schoenebeck 2
101     //TODO: no support for conditional chunks <cdl> yet
102    
103     /** DLS specific classes and definitions */
104     namespace DLS {
105    
106     typedef std::string String;
107    
108     /** Quadtuple version number ("major.minor.release.build"). */
109     struct version_t {
110     uint16_t minor;
111     uint16_t major;
112     uint16_t build;
113     uint16_t release;
114     };
115    
116     /** Every subject of an DLS file and the file itself can have an unique, computer generated ID. */
117     struct dlsid_t {
118     uint32_t ulData1;
119     uint16_t usData2;
120     uint16_t usData3;
121     uint8_t abData[8];
122     };
123    
124     /** Connection Sources */
125     typedef enum {
126     // Modulator Sources
127     conn_src_none = 0x0000,
128     conn_src_lfo = 0x0001,
129     conn_src_keyonvelocity = 0x0002,
130     conn_src_keynumber = 0x0003,
131     conn_src_eg1 = 0x0004,
132     conn_src_eg2 = 0x0005,
133     conn_src_pitchwheel = 0x0006,
134     conn_src_polypressure = 0x0007,
135     conn_src_channelpressure = 0x0008,
136     conn_src_vibrato = 0x0009,
137     // MIDI Controller Sources
138     conn_src_cc1 = 0x0081,
139     conn_src_cc7 = 0x0087,
140     conn_src_cc10 = 0x008A,
141     conn_src_cc11 = 0x008B,
142     conn_src_cc91 = 0x00DB,
143     conn_src_cc93 = 0x00DD,
144     // Registered Parameter Numbers
145     conn_src_rpn0 = 0x0100,
146     conn_src_rpn1 = 0x0101,
147     conn_src_rpn2 = 0x0102
148     } conn_src_t;
149    
150     /** Connection Destinations */
151     typedef enum {
152     // Generic Destinations
153     conn_dst_none = 0x0000,
154     conn_dst_gain = 0x0001,
155     conn_dst_reserved = 0x0002,
156     conn_dst_pitch = 0x0003,
157     conn_dst_pan = 0x0004,
158     conn_dst_keynumber = 0x0005,
159     // Channel Output Destinations
160     conn_dst_left = 0x0010,
161     conn_dst_right = 0x0011,
162     conn_dst_center = 0x0012,
163     conn_dst_lfe_channel = 0x0013,
164     conn_dst_leftrear = 0x0014,
165     conn_dst_rightrear = 0x0015,
166     conn_dst_chorus = 0x0080,
167     conn_dst_reverb = 0x0081,
168     // Modulator LFO Destinations
169     conn_dst_lfo_frequency = 0x0104,
170     conn_dst_lfo_startdelay = 0x0105,
171     // Vibrato LFO Destinations
172     conn_dst_vib_frequency = 0x0114,
173     conn_dst_vib_startdelay = 0x0115,
174     // EG Destinations
175     conn_dst_eg1_attacktime = 0x0206,
176     conn_dst_eg1_decaytime = 0x0207,
177     conn_dst_eg1_reserved = 0x0208,
178     conn_dst_eg1_releasetime = 0x0209,
179     conn_dst_eg1_sustainlevel = 0x020A,
180     conn_dst_eg1_delaytime = 0x020B,
181     conn_dst_eg1_holdtime = 0x020C,
182     conn_dst_eg1_shutdowntime = 0x020D,
183     conn_dst_eg2_attacktime = 0x030A,
184     conn_dst_eg2_decaytime = 0x030B,
185     conn_dst_eg2_reserved = 0x030C,
186     conn_dst_eg2_releasetime = 0x030D,
187     conn_dst_eg2_sustainlevel = 0x030E,
188     conn_dst_eg2_delaytime = 0x030F,
189     conn_dst_eg2_holdtime = 0x0310,
190     // Filter Destinations
191     conn_dst_filter_cutoff = 0x0500,
192     conn_dst_filter_q = 0x0501
193     } conn_dst_t;
194    
195     /** Connection Transforms */
196     typedef enum {
197     conn_trn_none = 0x0000,
198     conn_trn_concave = 0x0001,
199     conn_trn_convex = 0x0002,
200     conn_trn_switch = 0x0003
201     } conn_trn_t;
202    
203     /** Lower and upper limit of a range. */
204     struct range_t {
205     uint16_t low; ///< Low value of range.
206     uint16_t high; ///< High value of range.
207 schoenebeck 2543
208     inline bool operator< (const range_t& other) const {
209     if (low < other.low) return true;
210     if (low > other.low) return false;
211     return high < other.high;
212     }
213    
214     inline bool operator== (const range_t& other) const {
215     return low == other.low && high == other.high;
216     }
217 schoenebeck 2 };
218    
219     /** Defines Sample Loop Points. */
220     struct sample_loop_t {
221 schoenebeck 1154 uint32_t Size; ///< For internal usage only: usually reflects exactly @c sizeof(sample_loop_t), otherwise if the value is larger then the DLS format was extended!
222     uint32_t LoopType; ///< Defines how the waveform samples will be looped (appropriate loop types for the gig format are defined by gig::loop_type_t).
223     uint32_t LoopStart; ///< The start value specifies the offset (in sample points) in the waveform data of the first sample point to be played in the loop.
224     uint32_t LoopLength; ///< Length of the looping area (in sample points).
225 schoenebeck 2 };
226    
227     // just symbol prototyping
228     class File;
229     class Instrument;
230     class Region;
231     class Sample;
232    
233     /** Defines a connection within the synthesis model. */
234     class Connection {
235     public:
236     conn_src_t Source;
237     conn_trn_t SourceTransform;
238     bool SourceInvert;
239     bool SourceBipolar;
240     conn_src_t Control;
241     conn_trn_t ControlTransform;
242     bool ControlInvert;
243     bool ControlBipolar;
244     conn_dst_t Destination;
245     conn_trn_t DestinationTransform;
246     uint32_t Scale;
247     protected:
248     struct conn_block_t {
249     uint16_t source;
250     uint16_t control;
251     uint16_t destination;
252     uint16_t transform;
253     uint32_t scale;
254     };
255 persson 1713 Connection() {}
256 schoenebeck 2 void Init(conn_block_t* Header);
257 schoenebeck 800 conn_block_t ToConnBlock();
258 persson 1713 virtual ~Connection() {}
259 schoenebeck 2 friend class Articulation;
260     };
261    
262     /** Provides access to the defined connections used for the synthesis model. */
263     class Articulation {
264     public:
265     Connection* pConnections; ///< Points to the beginning of a <i>Connection</i> array.
266     uint32_t Connections; ///< Reflects the number of Connections.
267 schoenebeck 800
268     Articulation(RIFF::Chunk* artl);
269 schoenebeck 384 virtual ~Articulation();
270 schoenebeck 800 virtual void UpdateChunks();
271     protected:
272     RIFF::Chunk* pArticulationCk;
273     uint32_t HeaderSize;
274 schoenebeck 2 };
275    
276     /** Abstract base class for classes that provide articulation information (thus for <i>Instrument</i> and <i>Region</i> class). */
277     class Articulator {
278     public:
279     Articulator(RIFF::List* ParentList);
280     Articulation* GetFirstArticulation();
281     Articulation* GetNextArticulation();
282 schoenebeck 800 virtual void UpdateChunks();
283 schoenebeck 2394 virtual void CopyAssign(const Articulator* orig);
284 schoenebeck 2 protected:
285     typedef std::list<Articulation*> ArticulationList;
286     RIFF::List* pParentList;
287     ArticulationList* pArticulations;
288     ArticulationList::iterator ArticulationsIterator;
289    
290     void LoadArticulations();
291 schoenebeck 384 virtual ~Articulator();
292 schoenebeck 2 };
293    
294     /** Optional information for DLS files, instruments, samples, etc. */
295     class Info {
296     public:
297     String Name; ///< <INAM-ck>. Stores the title of the subject of the file, such as, Seattle From Above.
298     String ArchivalLocation; ///< <IARL-ck>. Indicates where the subject of the file is stored.
299     String CreationDate; ///< <ICRD-ck>. Specifies the date the subject of the file was created. List dates in yyyy-mm-dd format.
300     String Comments; ///< <ICMT-ck>. Provides general comments about the file or the subject of the file. Sentences might end with semicolon.
301     String Product; ///< <IPRD-ck>. Specifies the name of the title the file was originally intended for, such as World Ruler V.
302     String Copyright; ///< <ICOP-ck>. Records the copyright information for the file.
303     String Artists; ///< <IART-ck>. Lists the artist of the original subject of the file.
304     String Genre; ///< <IGNR-ck>. Descirbes the original work, such as, Jazz, Classic, Rock, Techno, Rave, etc.
305     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.
306     String Engineer; ///< <IENG-ck>. Stores the name of the engineer who worked on the file. Multiple engineer names are separated by semicolon and blank, e.g, Smith, John; Adams, Joe.
307     String Technician; ///< <ITCH-ck>. Identifies the technician who sampled the subject file.
308     String Software; ///< <ISFT-ck>. Identifies the name of the sofware package used to create the file.
309     String Medium; ///< <IMED-ck>. Describes the original subject of the file, such as, record, CD, and so forth.
310     String Source; ///< <ISRC-ck>. Identifies the name of the person or organization who supplied the original subject of the file.
311     String SourceForm; ///< <ISRF-ck>. Identifies the original form of the material that was digitized, such as record, sampling CD, TV sound track. This is not neccessarily the same as <i>Medium</i>.
312     String Commissioned; ///< <ICMS-ck>. Lists the name of the person or organization that commissioned the subject of the file, e.g., Pope Julian II.
313 persson 928 String Subject; ///< <ISBJ-ck>. Describes the contents of the file.
314 schoenebeck 1416 bool UseFixedLengthStrings; ///< @deprecated Not used anymore, use SetFixedStringLengths() instead.
315 schoenebeck 2
316 schoenebeck 1416 struct string_length_t {
317 persson 1180 uint32_t chunkId;
318 schoenebeck 1416 int length;
319 persson 1180 };
320 schoenebeck 1416
321 schoenebeck 2 Info(RIFF::List* list);
322 schoenebeck 1416 void SetFixedStringLengths(const string_length_t* lengths);
323 schoenebeck 823 virtual ~Info();
324 schoenebeck 800 virtual void UpdateChunks();
325 schoenebeck 2394 virtual void CopyAssign(const Info* orig);
326 schoenebeck 2 private:
327 schoenebeck 1416 RIFF::List* pResourceListChunk;
328     const string_length_t* pFixedStringLengths; ///< List of IDs and string lengths for strings that should be stored in a fixed length format. This is used for gig files, not for ordinary DLS files.
329 schoenebeck 800
330 schoenebeck 929 static void LoadString(uint32_t ChunkID, RIFF::List* lstINFO, String& s);
331 persson 1180 void SaveString(uint32_t ChunkID, RIFF::List* lstINFO, const String& s, const String& sDefault);
332 schoenebeck 2 };
333    
334     /** Abstract base class which encapsulates data structures which all DLS resources are able to provide. */
335     class Resource {
336     public:
337 schoenebeck 800 Info* pInfo; ///< Points (in any case) to an <i>Info</i> object, providing additional, optional infos and comments.
338     dlsid_t* pDLSID; ///< Points to a <i>dlsid_t</i> structure if the file provided a DLS ID else is <i>NULL</i>.
339 schoenebeck 2
340 persson 1713 Resource* GetParent() { return pParent; }
341 schoenebeck 2482 const Resource* GetParent() const { return pParent; }
342 schoenebeck 800 virtual void UpdateChunks();
343 persson 1209 void GenerateDLSID();
344 schoenebeck 2394 virtual void CopyAssign(const Resource* orig);
345 schoenebeck 2 protected:
346     Resource* pParent;
347 schoenebeck 800 RIFF::List* pResourceList;
348 schoenebeck 2
349     Resource(Resource* Parent, RIFF::List* lstResource);
350 schoenebeck 384 virtual ~Resource();
351 schoenebeck 2 };
352    
353     /** Abstract base class which provides mandatory informations about sample players in general. */
354     class Sampler {
355     public:
356     uint8_t UnityNote;
357     int16_t FineTune;
358 schoenebeck 1358 int32_t Gain; ///< @deprecated Don't alter directly, use SetGain() instead!
359 schoenebeck 2 bool NoSampleDepthTruncation;
360     bool NoSampleCompression;
361 schoenebeck 800 uint32_t SampleLoops; ///< Reflects the number of sample loops.
362     sample_loop_t* pSampleLoops; ///< Points to the beginning of a sample loop array, or is NULL if there are no loops defined.
363    
364 schoenebeck 1154 void AddSampleLoop(sample_loop_t* pLoopDef);
365     void DeleteSampleLoop(sample_loop_t* pLoopDef);
366 schoenebeck 1358 virtual void SetGain(int32_t gain);
367 schoenebeck 800 virtual void UpdateChunks();
368 schoenebeck 2394 virtual void CopyAssign(const Sampler* orig);
369 schoenebeck 2 protected:
370 schoenebeck 800 RIFF::List* pParentList;
371     uint32_t uiHeaderSize;
372 schoenebeck 2 uint32_t SamplerOptions;
373     Sampler(RIFF::List* ParentList);
374 schoenebeck 384 virtual ~Sampler();
375 schoenebeck 2 };
376    
377 schoenebeck 800 /** @brief Encapsulates sample waves used for playback.
378     *
379     * In case you created a new sample with File::AddSample(), you should
380 schoenebeck 806 * first update all attributes with the desired meta informations
381     * (amount of channels, bit depth, sample rate, etc.), then call
382     * Resize() with the desired sample size. The latter will create
383 schoenebeck 800 * the mandatory RIFF chunk which will hold the sample wave data.
384     */
385 schoenebeck 2 class Sample : public Resource {
386     public:
387 schoenebeck 1050 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()).
388 schoenebeck 806 uint16_t Channels; ///< Number of channels represented in the waveform data, e.g. 1 for mono, 2 for stereo (defaults to 1=mono if Sample was created with Instrument::AddSample() previously).
389     uint32_t SamplesPerSecond; ///< Sampling rate at which each channel should be played (defaults to 44100 if Sample was created with Instrument::AddSample() previously).
390 schoenebeck 2 uint32_t AverageBytesPerSecond; ///< The average number of bytes per second at which the waveform data should be transferred (Playback software can estimate the buffer size using this value).
391     uint16_t BlockAlign; ///< The block alignment (in bytes) of the waveform data. Playback software needs to process a multiple of <i>BlockAlign</i> bytes of data at a time, so the value of <i>BlockAlign</i> can be used for buffer alignment.
392     uint16_t BitDepth; ///< Size of each sample per channel (only if known sample data format is used, 0 otherwise).
393 schoenebeck 800 unsigned long SamplesTotal; ///< Reflects total number of sample points (only if known sample data format is used, 0 otherwise), do not bother to change this value, it will not be saved.
394 schoenebeck 806 uint FrameSize; ///< Reflects the size (in bytes) of one single sample point (only if known sample data format is used, 0 otherwise). <b>Caution:</b> with the current version of libgig you have to upate this field by yourself whenever you change one of the following fields: Channels, BitDepth ! Ignoring this might lead to undesired behavior when i.e. calling Resize(), SetPos(), Write() or Read().
395 schoenebeck 2
396 schoenebeck 800 void* LoadSampleData();
397     void ReleaseSampleData();
398 schoenebeck 2482 unsigned long GetSize() const;
399 schoenebeck 800 void Resize(int iNewSize);
400 schoenebeck 2 unsigned long SetPos(unsigned long SampleCount, RIFF::stream_whence_t Whence = RIFF::stream_start);
401     unsigned long Read(void* pBuffer, unsigned long SampleCount);
402 schoenebeck 800 unsigned long Write(void* pBuffer, unsigned long SampleCount);
403     virtual void UpdateChunks();
404 schoenebeck 2482 virtual void CopyAssign(const Sample* orig);
405 schoenebeck 2 protected:
406 schoenebeck 800 RIFF::List* pWaveList;
407 schoenebeck 2 RIFF::Chunk* pCkData;
408     RIFF::Chunk* pCkFormat;
409     unsigned long ulWavePoolOffset; // needed for comparison with the wave pool link table, thus the link to instruments
410    
411     Sample(File* pFile, RIFF::List* waveList, unsigned long WavePoolOffset);
412 schoenebeck 800 virtual ~Sample();
413 schoenebeck 2482 void CopyAssignCore(const Sample* orig);
414 schoenebeck 2 friend class File;
415     friend class Region; // Region has to compare the wave pool offset to get its sample
416     };
417    
418     /** Defines <i>Region</i> information of an <i>Instrument</i>. */
419     class Region : public Resource, public Articulator, public Sampler {
420     public:
421 schoenebeck 1335 range_t KeyRange; ///< @deprecated Only read, don't write! Use SetKeyRange() instead.
422 schoenebeck 2 range_t VelocityRange;
423     uint16_t KeyGroup;
424     uint16_t Layer;
425     bool SelfNonExclusive;
426     bool PhaseMaster;
427     uint16_t PhaseGroup;
428     bool MultiChannel;
429     uint32_t Channel;
430    
431     Sample* GetSample();
432 schoenebeck 800 void SetSample(Sample* pSample);
433 schoenebeck 1335 virtual void SetKeyRange(uint16_t Low, uint16_t High);
434 schoenebeck 800 virtual void UpdateChunks();
435 schoenebeck 2394 virtual void CopyAssign(const Region* orig);
436 schoenebeck 2 protected:
437     RIFF::List* pCkRegion;
438     uint32_t WavePoolTableIndex; // index in the wave pool table to the sample wave this region is linked to
439     Sample* pSample; // every region refers to exactly one sample
440 schoenebeck 800 uint16_t FormatOptionFlags;
441     uint16_t WaveLinkOptionFlags;
442 schoenebeck 2
443     Region(Instrument* pInstrument, RIFF::List* rgnList);
444 schoenebeck 384 virtual ~Region();
445 schoenebeck 2 friend class Instrument;
446     };
447    
448     /** Provides all neccessary information for the synthesis of a DLS <i>Instrument</i>. */
449     class Instrument : public Resource, public Articulator {
450     public:
451     bool IsDrum; ///< Indicates if the <i>Instrument</i> is a drum type, as they differ in the synthesis model of DLS from melodic instruments.
452 schoenebeck 800 uint16_t MIDIBank; ///< Reflects combination of <i>MIDIBankCoarse</i> and <i>MIDIBankFine</i> (bank 1 - bank 16384). Do not change this value, it will not be saved! Change MIDIBankCoarse and MIDIBankFine instead (we might change that in future).
453 schoenebeck 2 uint8_t MIDIBankCoarse; ///< Reflects the MIDI Bank number for MIDI Control Change 0 (bank 1 - 128).
454     uint8_t MIDIBankFine; ///< Reflects the MIDI Bank number for MIDI Control Change 32 (bank 1 - 128).
455     uint32_t MIDIProgram; ///< Specifies the MIDI Program Change Number this Instrument should be assigned to.
456     uint32_t Regions; ///< Reflects the number of <i>Region</i> defintions this Instrument has.
457    
458     Region* GetFirstRegion();
459     Region* GetNextRegion();
460 schoenebeck 800 Region* AddRegion();
461     void DeleteRegion(Region* pRegion);
462     virtual void UpdateChunks();
463 schoenebeck 2394 virtual void CopyAssign(const Instrument* orig);
464 schoenebeck 2 protected:
465     typedef std::list<Region*> RegionList;
466     struct midi_locale_t {
467     uint32_t bank;
468     uint32_t instrument;
469     };
470    
471     RIFF::List* pCkInstrument;
472     RegionList* pRegions;
473     RegionList::iterator RegionsIterator;
474    
475     Instrument(File* pFile, RIFF::List* insList);
476 schoenebeck 2394 void CopyAssignCore(const Instrument* orig);
477 schoenebeck 823 virtual void LoadRegions();
478 schoenebeck 384 virtual ~Instrument();
479 schoenebeck 2 friend class File;
480 schoenebeck 1335 friend class Region;
481     private:
482     void MoveRegion(Region* pSrc, Region* pDst);
483 schoenebeck 2 };
484    
485     /** Parses DLS Level 1 and 2 compliant files and provides abstract access to the data. */
486     class File : public Resource {
487     public:
488     version_t* pVersion; ///< Points to a <i>version_t</i> structure if the file provided a version number else is set to <i>NULL</i>.
489     uint32_t Instruments; ///< Reflects the number of available <i>Instrument</i> objects.
490    
491 schoenebeck 800 File();
492 schoenebeck 2 File(RIFF::File* pRIFF);
493 schoenebeck 2274 String GetFileName();
494 schoenebeck 2482 void SetFileName(const String& name);
495 schoenebeck 2 Sample* GetFirstSample(); ///< Returns a pointer to the first <i>Sample</i> object of the file, <i>NULL</i> otherwise.
496     Sample* GetNextSample(); ///< Returns a pointer to the next <i>Sample</i> object of the file, <i>NULL</i> otherwise.
497 schoenebeck 800 Sample* AddSample();
498     void DeleteSample(Sample* pSample);
499 schoenebeck 2 Instrument* GetFirstInstrument(); ///< Returns a pointer to the first <i>Instrument</i> object of the file, <i>NULL</i> otherwise.
500     Instrument* GetNextInstrument(); ///< Returns a pointer to the next <i>Instrument</i> object of the file, <i>NULL</i> otherwise.
501 schoenebeck 800 Instrument* AddInstrument();
502     void DeleteInstrument(Instrument* pInstrument);
503 schoenebeck 2329 RIFF::File* GetExtensionFile(int index);
504 schoenebeck 800 virtual void UpdateChunks();
505     virtual void Save(const String& Path);
506     virtual void Save();
507 schoenebeck 384 virtual ~File();
508 schoenebeck 2 protected:
509     typedef std::list<Sample*> SampleList;
510     typedef std::list<Instrument*> InstrumentList;
511    
512     RIFF::File* pRIFF;
513 persson 834 std::list<RIFF::File*> ExtensionFiles;
514 schoenebeck 2 SampleList* pSamples;
515     SampleList::iterator SamplesIterator;
516     InstrumentList* pInstruments;
517     InstrumentList::iterator InstrumentsIterator;
518 schoenebeck 800 uint32_t WavePoolHeaderSize;
519 schoenebeck 2 uint32_t WavePoolCount;
520     uint32_t* pWavePoolTable;
521 persson 666 uint32_t* pWavePoolTableHi;
522 schoenebeck 800 bool b64BitWavePoolOffsets;
523 schoenebeck 2
524 schoenebeck 823 virtual void LoadSamples();
525     virtual void LoadInstruments();
526 schoenebeck 800 void __ensureMandatoryChunksExist();
527 schoenebeck 2 friend class Region; // Region has to look in the wave pool table to get its sample
528 schoenebeck 800 private:
529     void __UpdateWavePoolTableChunk();
530     void __UpdateWavePoolTable();
531 schoenebeck 2 };
532    
533 schoenebeck 1093 /**
534     * Will be thrown whenever a DLS specific error occurs while trying to
535     * access a DLS File. Note: In your application you should better catch
536     * for RIFF::Exception rather than this one, except you explicitly want
537     * to catch and handle DLS::Exception and RIFF::Exception independently,
538     * which usually shouldn't be necessary though.
539     */
540 schoenebeck 2 class Exception : public RIFF::Exception {
541     public:
542     Exception(String Message);
543     void PrintMessage();
544     };
545    
546 schoenebeck 518 String libraryName();
547     String libraryVersion();
548    
549 schoenebeck 2 } // namespace DLS
550    
551     #endif // __DLS_H__

  ViewVC Help
Powered by ViewVC