2 |
* * |
* * |
3 |
* libgig - C++ cross-platform Gigasampler format file access library * |
* libgig - C++ cross-platform Gigasampler format file access library * |
4 |
* * |
* * |
5 |
* Copyright (C) 2003-2007 by Christian Schoenebeck * |
* Copyright (C) 2003-2014 by Christian Schoenebeck * |
6 |
* <cuse@users.sourceforge.net> * |
* <cuse@users.sourceforge.net> * |
7 |
* * |
* * |
8 |
* This library is free software; you can redistribute it and/or modify * |
* This library is free software; you can redistribute it and/or modify * |
28 |
|
|
29 |
#if WORDS_BIGENDIAN |
#if WORDS_BIGENDIAN |
30 |
# define RIFF_TYPE_DLS 0x444C5320 |
# define RIFF_TYPE_DLS 0x444C5320 |
|
# define LIST_TYPE_INFO 0x494E464F |
|
31 |
# define LIST_TYPE_WVPL 0x7776706C |
# define LIST_TYPE_WVPL 0x7776706C |
32 |
# define LIST_TYPE_DWPL 0x6477706C ///< Seen on some files instead of a wvpl list chunk. |
# define LIST_TYPE_DWPL 0x6477706C ///< Seen on some files instead of a wvpl list chunk. |
33 |
# define LIST_TYPE_WAVE 0x77617665 |
# define LIST_TYPE_WAVE 0x77617665 |
41 |
# define CHUNK_ID_IARL 0x4941524C |
# define CHUNK_ID_IARL 0x4941524C |
42 |
# define CHUNK_ID_IART 0x49415254 |
# define CHUNK_ID_IART 0x49415254 |
43 |
# define CHUNK_ID_ICMS 0x49434D53 |
# define CHUNK_ID_ICMS 0x49434D53 |
|
# define CHUNK_ID_ICMT 0x49434D54 |
|
|
# define CHUNK_ID_ICOP 0x49434F50 |
|
|
# define CHUNK_ID_ICRD 0x49435244 |
|
|
# define CHUNK_ID_IENG 0x49454E47 |
|
44 |
# define CHUNK_ID_IGNR 0x49474E52 |
# define CHUNK_ID_IGNR 0x49474E52 |
45 |
# define CHUNK_ID_IKEY 0x494B4559 |
# define CHUNK_ID_IKEY 0x494B4559 |
46 |
# define CHUNK_ID_IMED 0x494D4544 |
# define CHUNK_ID_IMED 0x494D4544 |
|
# define CHUNK_ID_INAM 0x494E414D |
|
|
# define CHUNK_ID_IPRD 0x49505244 |
|
47 |
# define CHUNK_ID_ISBJ 0x4953424A |
# define CHUNK_ID_ISBJ 0x4953424A |
|
# define CHUNK_ID_ISFT 0x49534654 |
|
48 |
# define CHUNK_ID_ISRC 0x49535243 |
# define CHUNK_ID_ISRC 0x49535243 |
49 |
# define CHUNK_ID_ISRF 0x49535246 |
# define CHUNK_ID_ISRF 0x49535246 |
50 |
# define CHUNK_ID_ITCH 0x49544348 |
# define CHUNK_ID_ITCH 0x49544348 |
62 |
# define CHUNK_ID_ART2 0x61727432 |
# define CHUNK_ID_ART2 0x61727432 |
63 |
#else // little endian |
#else // little endian |
64 |
# define RIFF_TYPE_DLS 0x20534C44 |
# define RIFF_TYPE_DLS 0x20534C44 |
|
# define LIST_TYPE_INFO 0x4F464E49 |
|
65 |
# define LIST_TYPE_WVPL 0x6C707677 |
# define LIST_TYPE_WVPL 0x6C707677 |
66 |
# define LIST_TYPE_DWPL 0x6C707764 ///< Seen on some files instead of a wvpl list chunk. |
# define LIST_TYPE_DWPL 0x6C707764 ///< Seen on some files instead of a wvpl list chunk. |
67 |
# define LIST_TYPE_WAVE 0x65766177 |
# define LIST_TYPE_WAVE 0x65766177 |
75 |
# define CHUNK_ID_IARL 0x4C524149 |
# define CHUNK_ID_IARL 0x4C524149 |
76 |
# define CHUNK_ID_IART 0x54524149 |
# define CHUNK_ID_IART 0x54524149 |
77 |
# define CHUNK_ID_ICMS 0x534D4349 |
# define CHUNK_ID_ICMS 0x534D4349 |
|
# define CHUNK_ID_ICMT 0x544D4349 |
|
|
# define CHUNK_ID_ICOP 0x504F4349 |
|
|
# define CHUNK_ID_ICRD 0x44524349 |
|
|
# define CHUNK_ID_IENG 0x474E4549 |
|
78 |
# define CHUNK_ID_IGNR 0x524E4749 |
# define CHUNK_ID_IGNR 0x524E4749 |
79 |
# define CHUNK_ID_IKEY 0x59454B49 |
# define CHUNK_ID_IKEY 0x59454B49 |
80 |
# define CHUNK_ID_IMED 0x44454D49 |
# define CHUNK_ID_IMED 0x44454D49 |
|
# define CHUNK_ID_INAM 0x4D414E49 |
|
|
# define CHUNK_ID_IPRD 0x44525049 |
|
81 |
# define CHUNK_ID_ISBJ 0x4A425349 |
# define CHUNK_ID_ISBJ 0x4A425349 |
|
# define CHUNK_ID_ISFT 0x54465349 |
|
82 |
# define CHUNK_ID_ISRC 0x43525349 |
# define CHUNK_ID_ISRC 0x43525349 |
83 |
# define CHUNK_ID_ISRF 0x46525349 |
# define CHUNK_ID_ISRF 0x46525349 |
84 |
# define CHUNK_ID_ITCH 0x48435449 |
# define CHUNK_ID_ITCH 0x48435449 |
204 |
struct range_t { |
struct range_t { |
205 |
uint16_t low; ///< Low value of range. |
uint16_t low; ///< Low value of range. |
206 |
uint16_t high; ///< High value of range. |
uint16_t high; ///< High value of range. |
207 |
|
|
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 |
}; |
}; |
218 |
|
|
219 |
/** Defines Sample Loop Points. */ |
/** Defines Sample Loop Points. */ |
252 |
uint16_t transform; |
uint16_t transform; |
253 |
uint32_t scale; |
uint32_t scale; |
254 |
}; |
}; |
255 |
Connection() {}; |
Connection() {} |
256 |
void Init(conn_block_t* Header); |
void Init(conn_block_t* Header); |
257 |
conn_block_t ToConnBlock(); |
conn_block_t ToConnBlock(); |
258 |
virtual ~Connection() {}; |
virtual ~Connection() {} |
259 |
friend class Articulation; |
friend class Articulation; |
260 |
}; |
}; |
261 |
|
|
280 |
Articulation* GetFirstArticulation(); |
Articulation* GetFirstArticulation(); |
281 |
Articulation* GetNextArticulation(); |
Articulation* GetNextArticulation(); |
282 |
virtual void UpdateChunks(); |
virtual void UpdateChunks(); |
283 |
|
virtual void CopyAssign(const Articulator* orig); |
284 |
protected: |
protected: |
285 |
typedef std::list<Articulation*> ArticulationList; |
typedef std::list<Articulation*> ArticulationList; |
286 |
RIFF::List* pParentList; |
RIFF::List* pParentList; |
322 |
void SetFixedStringLengths(const string_length_t* lengths); |
void SetFixedStringLengths(const string_length_t* lengths); |
323 |
virtual ~Info(); |
virtual ~Info(); |
324 |
virtual void UpdateChunks(); |
virtual void UpdateChunks(); |
325 |
|
virtual void CopyAssign(const Info* orig); |
326 |
private: |
private: |
327 |
RIFF::List* pResourceListChunk; |
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. |
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. |
337 |
Info* pInfo; ///< Points (in any case) to an <i>Info</i> object, providing additional, optional infos and comments. |
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>. |
dlsid_t* pDLSID; ///< Points to a <i>dlsid_t</i> structure if the file provided a DLS ID else is <i>NULL</i>. |
339 |
|
|
340 |
Resource* GetParent() { return pParent; }; |
Resource* GetParent() { return pParent; } |
341 |
|
const Resource* GetParent() const { return pParent; } |
342 |
virtual void UpdateChunks(); |
virtual void UpdateChunks(); |
343 |
void GenerateDLSID(); |
void GenerateDLSID(); |
344 |
|
virtual void CopyAssign(const Resource* orig); |
345 |
protected: |
protected: |
346 |
Resource* pParent; |
Resource* pParent; |
347 |
RIFF::List* pResourceList; |
RIFF::List* pResourceList; |
365 |
void DeleteSampleLoop(sample_loop_t* pLoopDef); |
void DeleteSampleLoop(sample_loop_t* pLoopDef); |
366 |
virtual void SetGain(int32_t gain); |
virtual void SetGain(int32_t gain); |
367 |
virtual void UpdateChunks(); |
virtual void UpdateChunks(); |
368 |
|
virtual void CopyAssign(const Sampler* orig); |
369 |
protected: |
protected: |
370 |
RIFF::List* pParentList; |
RIFF::List* pParentList; |
371 |
uint32_t uiHeaderSize; |
uint32_t uiHeaderSize; |
395 |
|
|
396 |
void* LoadSampleData(); |
void* LoadSampleData(); |
397 |
void ReleaseSampleData(); |
void ReleaseSampleData(); |
398 |
unsigned long GetSize(); |
unsigned long GetSize() const; |
399 |
void Resize(int iNewSize); |
void Resize(int iNewSize); |
400 |
unsigned long SetPos(unsigned long SampleCount, RIFF::stream_whence_t Whence = RIFF::stream_start); |
unsigned long SetPos(unsigned long SampleCount, RIFF::stream_whence_t Whence = RIFF::stream_start); |
401 |
unsigned long Read(void* pBuffer, unsigned long SampleCount); |
unsigned long Read(void* pBuffer, unsigned long SampleCount); |
402 |
unsigned long Write(void* pBuffer, unsigned long SampleCount); |
unsigned long Write(void* pBuffer, unsigned long SampleCount); |
403 |
virtual void UpdateChunks(); |
virtual void UpdateChunks(); |
404 |
|
virtual void CopyAssign(const Sample* orig); |
405 |
protected: |
protected: |
406 |
RIFF::List* pWaveList; |
RIFF::List* pWaveList; |
407 |
RIFF::Chunk* pCkData; |
RIFF::Chunk* pCkData; |
410 |
|
|
411 |
Sample(File* pFile, RIFF::List* waveList, unsigned long WavePoolOffset); |
Sample(File* pFile, RIFF::List* waveList, unsigned long WavePoolOffset); |
412 |
virtual ~Sample(); |
virtual ~Sample(); |
413 |
|
void CopyAssignCore(const Sample* orig); |
414 |
friend class File; |
friend class File; |
415 |
friend class Region; // Region has to compare the wave pool offset to get its sample |
friend class Region; // Region has to compare the wave pool offset to get its sample |
416 |
}; |
}; |
432 |
void SetSample(Sample* pSample); |
void SetSample(Sample* pSample); |
433 |
virtual void SetKeyRange(uint16_t Low, uint16_t High); |
virtual void SetKeyRange(uint16_t Low, uint16_t High); |
434 |
virtual void UpdateChunks(); |
virtual void UpdateChunks(); |
435 |
|
virtual void CopyAssign(const Region* orig); |
436 |
protected: |
protected: |
437 |
RIFF::List* pCkRegion; |
RIFF::List* pCkRegion; |
438 |
uint32_t WavePoolTableIndex; // index in the wave pool table to the sample wave this region is linked to |
uint32_t WavePoolTableIndex; // index in the wave pool table to the sample wave this region is linked to |
460 |
Region* AddRegion(); |
Region* AddRegion(); |
461 |
void DeleteRegion(Region* pRegion); |
void DeleteRegion(Region* pRegion); |
462 |
virtual void UpdateChunks(); |
virtual void UpdateChunks(); |
463 |
|
virtual void CopyAssign(const Instrument* orig); |
464 |
protected: |
protected: |
465 |
typedef std::list<Region*> RegionList; |
typedef std::list<Region*> RegionList; |
466 |
struct midi_locale_t { |
struct midi_locale_t { |
473 |
RegionList::iterator RegionsIterator; |
RegionList::iterator RegionsIterator; |
474 |
|
|
475 |
Instrument(File* pFile, RIFF::List* insList); |
Instrument(File* pFile, RIFF::List* insList); |
476 |
|
void CopyAssignCore(const Instrument* orig); |
477 |
virtual void LoadRegions(); |
virtual void LoadRegions(); |
478 |
virtual ~Instrument(); |
virtual ~Instrument(); |
479 |
friend class File; |
friend class File; |
490 |
|
|
491 |
File(); |
File(); |
492 |
File(RIFF::File* pRIFF); |
File(RIFF::File* pRIFF); |
493 |
|
String GetFileName(); |
494 |
|
void SetFileName(const String& name); |
495 |
Sample* GetFirstSample(); ///< Returns a pointer to the first <i>Sample</i> object of the file, <i>NULL</i> otherwise. |
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. |
Sample* GetNextSample(); ///< Returns a pointer to the next <i>Sample</i> object of the file, <i>NULL</i> otherwise. |
497 |
Sample* AddSample(); |
Sample* AddSample(); |
500 |
Instrument* GetNextInstrument(); ///< Returns a pointer to the next <i>Instrument</i> object of the file, <i>NULL</i> otherwise. |
Instrument* GetNextInstrument(); ///< Returns a pointer to the next <i>Instrument</i> object of the file, <i>NULL</i> otherwise. |
501 |
Instrument* AddInstrument(); |
Instrument* AddInstrument(); |
502 |
void DeleteInstrument(Instrument* pInstrument); |
void DeleteInstrument(Instrument* pInstrument); |
503 |
|
RIFF::File* GetExtensionFile(int index); |
504 |
virtual void UpdateChunks(); |
virtual void UpdateChunks(); |
505 |
virtual void Save(const String& Path); |
virtual void Save(const String& Path); |
506 |
virtual void Save(); |
virtual void Save(); |