38 |
# define CHUNK_ID_3EWG 0x33657767 |
# define CHUNK_ID_3EWG 0x33657767 |
39 |
# define CHUNK_ID_EWAV 0x65776176 |
# define CHUNK_ID_EWAV 0x65776176 |
40 |
# define CHUNK_ID_3GNM 0x33676E6D |
# define CHUNK_ID_3GNM 0x33676E6D |
41 |
|
# define CHUNK_ID_EINF 0x65696E66 |
42 |
|
# define CHUNK_ID_3CRC 0x33637263 |
43 |
#else // little endian |
#else // little endian |
44 |
# define LIST_TYPE_3PRG 0x67727033 |
# define LIST_TYPE_3PRG 0x67727033 |
45 |
# define LIST_TYPE_3EWL 0x6C776533 |
# define LIST_TYPE_3EWL 0x6C776533 |
52 |
# define CHUNK_ID_3EWG 0x67776533 |
# define CHUNK_ID_3EWG 0x67776533 |
53 |
# define CHUNK_ID_EWAV 0x76617765 |
# define CHUNK_ID_EWAV 0x76617765 |
54 |
# define CHUNK_ID_3GNM 0x6D6E6733 |
# define CHUNK_ID_3GNM 0x6D6E6733 |
55 |
|
# define CHUNK_ID_EINF 0x666E6965 |
56 |
|
# define CHUNK_ID_3CRC 0x63726333 |
57 |
#endif // WORDS_BIGENDIAN |
#endif // WORDS_BIGENDIAN |
58 |
|
|
59 |
/** Gigasampler specific classes and definitions */ |
/** Gigasampler specific classes and definitions */ |
323 |
progress_t(); |
progress_t(); |
324 |
}; |
}; |
325 |
|
|
326 |
|
/** @brief CRC-32 checksum implementation |
327 |
|
* |
328 |
|
* This class is used to calculate checksums of the sample data in |
329 |
|
* a gig file. The checksums are stored in the 3crc chunk of the |
330 |
|
* gig file and automatically updated when a sample is written |
331 |
|
* with Sample::Write(). |
332 |
|
*/ |
333 |
|
class CRC { |
334 |
|
private: |
335 |
|
uint32_t value; |
336 |
|
static const uint32_t* table; |
337 |
|
static uint32_t* initTable(); |
338 |
|
public: |
339 |
|
CRC() { |
340 |
|
reset(); |
341 |
|
} |
342 |
|
void reset() { |
343 |
|
value = 0xffffffff; |
344 |
|
} |
345 |
|
void update(unsigned char* buf, int len) { |
346 |
|
for (int i = 0 ; i < len ; i++) { |
347 |
|
value = table[(value ^ buf[i]) & 0xff] ^ (value >> 8); |
348 |
|
} |
349 |
|
} |
350 |
|
uint32_t getValue() { |
351 |
|
return value ^ 0xffffffff; |
352 |
|
} |
353 |
|
}; |
354 |
|
|
355 |
// just symbol prototyping |
// just symbol prototyping |
356 |
class File; |
class File; |
357 |
class Instrument; |
class Instrument; |
470 |
double GetVelocityAttenuation(uint8_t MIDIKeyVelocity); |
double GetVelocityAttenuation(uint8_t MIDIKeyVelocity); |
471 |
double GetVelocityRelease(uint8_t MIDIKeyVelocity); |
double GetVelocityRelease(uint8_t MIDIKeyVelocity); |
472 |
double GetVelocityCutoff(uint8_t MIDIKeyVelocity); |
double GetVelocityCutoff(uint8_t MIDIKeyVelocity); |
473 |
|
Region* GetParent() const; |
474 |
|
// derived methods |
475 |
|
DLS::Sampler::AddSampleLoop; |
476 |
|
DLS::Sampler::DeleteSampleLoop; |
477 |
// overridden methods |
// overridden methods |
478 |
virtual void UpdateChunks(); |
virtual void UpdateChunks(); |
479 |
protected: |
protected: |
480 |
uint8_t* VelocityTable; ///< For velocity dimensions with custom defined zone ranges only: used for fast converting from velocity MIDI value to dimension bit number. |
uint8_t* VelocityTable; ///< For velocity dimensions with custom defined zone ranges only: used for fast converting from velocity MIDI value to dimension bit number. |
481 |
DimensionRegion(RIFF::List* _3ewl); |
DimensionRegion(Region* pParent, RIFF::List* _3ewl); |
482 |
|
DimensionRegion(RIFF::List* _3ewl, const DimensionRegion& src); |
483 |
~DimensionRegion(); |
~DimensionRegion(); |
484 |
friend class Region; |
friend class Region; |
485 |
private: |
private: |
518 |
double* pVelocityAttenuationTable; ///< Points to the velocity table corresponding to the velocity parameters of this DimensionRegion. |
double* pVelocityAttenuationTable; ///< Points to the velocity table corresponding to the velocity parameters of this DimensionRegion. |
519 |
double* pVelocityReleaseTable; ///< Points to the velocity table corresponding to the release velocity parameters of this DimensionRegion |
double* pVelocityReleaseTable; ///< Points to the velocity table corresponding to the release velocity parameters of this DimensionRegion |
520 |
double* pVelocityCutoffTable; ///< Points to the velocity table corresponding to the filter velocity parameters of this DimensionRegion |
double* pVelocityCutoffTable; ///< Points to the velocity table corresponding to the filter velocity parameters of this DimensionRegion |
521 |
|
Region* pRegion; |
522 |
|
|
523 |
leverage_ctrl_t DecodeLeverageController(_lev_ctrl_t EncodedController); |
leverage_ctrl_t DecodeLeverageController(_lev_ctrl_t EncodedController); |
524 |
_lev_ctrl_t EncodeLeverageController(leverage_ctrl_t DecodedController); |
_lev_ctrl_t EncodeLeverageController(leverage_ctrl_t DecodedController); |
595 |
unsigned long FileNo; ///< File number (> 0 when sample is stored in an extension file, 0 when it's in the gig) |
unsigned long FileNo; ///< File number (> 0 when sample is stored in an extension file, 0 when it's in the gig) |
596 |
RIFF::Chunk* pCk3gix; |
RIFF::Chunk* pCk3gix; |
597 |
RIFF::Chunk* pCkSmpl; |
RIFF::Chunk* pCkSmpl; |
598 |
|
CRC crc; ///< CRC-32 checksum of the raw sample data |
599 |
|
|
600 |
Sample(File* pFile, RIFF::List* waveList, unsigned long WavePoolOffset, unsigned long fileNo = 0); |
Sample(File* pFile, RIFF::List* waveList, unsigned long WavePoolOffset, unsigned long fileNo = 0); |
601 |
~Sample(); |
~Sample(); |
638 |
DimensionRegion* pDimensionRegions[256]; ///< Pointer array to the 32 (gig2) or 256 (gig3) possible dimension regions (reflects NULL for dimension regions not in use). Avoid to access the array directly and better use GetDimensionRegionByValue() instead, but of course in some cases it makes sense to use the array (e.g. iterating through all DimensionRegions). Use AddDimension() and DeleteDimension() to create a new dimension or delete an existing one (which will create or delete the respective dimension region(s) automatically). |
DimensionRegion* pDimensionRegions[256]; ///< Pointer array to the 32 (gig2) or 256 (gig3) possible dimension regions (reflects NULL for dimension regions not in use). Avoid to access the array directly and better use GetDimensionRegionByValue() instead, but of course in some cases it makes sense to use the array (e.g. iterating through all DimensionRegions). Use AddDimension() and DeleteDimension() to create a new dimension or delete an existing one (which will create or delete the respective dimension region(s) automatically). |
639 |
unsigned int Layers; ///< Amount of defined layers (1 - 32). A value of 1 actually means no layering, a value > 1 means there is Layer dimension. The same information can of course also be obtained by accessing pDimensionDefinitions. Do not alter this value! |
unsigned int Layers; ///< Amount of defined layers (1 - 32). A value of 1 actually means no layering, a value > 1 means there is Layer dimension. The same information can of course also be obtained by accessing pDimensionDefinitions. Do not alter this value! |
640 |
|
|
641 |
|
// own methods |
642 |
DimensionRegion* GetDimensionRegionByValue(const uint DimValues[8]); |
DimensionRegion* GetDimensionRegionByValue(const uint DimValues[8]); |
643 |
DimensionRegion* GetDimensionRegionByBit(const uint8_t DimBits[8]); |
DimensionRegion* GetDimensionRegionByBit(const uint8_t DimBits[8]); |
644 |
Sample* GetSample(); |
Sample* GetSample(); |
645 |
void AddDimension(dimension_def_t* pDimDef); |
void AddDimension(dimension_def_t* pDimDef); |
646 |
void DeleteDimension(dimension_def_t* pDimDef); |
void DeleteDimension(dimension_def_t* pDimDef); |
647 |
|
// overridden methods |
648 |
|
virtual void SetKeyRange(uint16_t Low, uint16_t High); |
649 |
virtual void UpdateChunks(); |
virtual void UpdateChunks(); |
650 |
protected: |
protected: |
651 |
Region(Instrument* pInstrument, RIFF::List* rgnList); |
Region(Instrument* pInstrument, RIFF::List* rgnList); |
680 |
|
|
681 |
// derived methods from DLS::Resource |
// derived methods from DLS::Resource |
682 |
DLS::Resource::GetParent; |
DLS::Resource::GetParent; |
|
// derived methods from DLS::Instrument |
|
|
DLS::Instrument::MoveRegion; |
|
683 |
// overridden methods |
// overridden methods |
684 |
Region* GetFirstRegion(); |
Region* GetFirstRegion(); |
685 |
Region* GetNextRegion(); |
Region* GetNextRegion(); |
695 |
~Instrument(); |
~Instrument(); |
696 |
void UpdateRegionKeyTable(); |
void UpdateRegionKeyTable(); |
697 |
friend class File; |
friend class File; |
698 |
|
friend class Region; // so Region can call UpdateRegionKeyTable() |
699 |
}; |
}; |
700 |
|
|
701 |
/** @brief Group of Gigasampler objects |
/** @brief Group of Gigasampler objects |
734 |
/** Parses Gigasampler files and provides abstract access to the data. */ |
/** Parses Gigasampler files and provides abstract access to the data. */ |
735 |
class File : protected DLS::File { |
class File : protected DLS::File { |
736 |
public: |
public: |
737 |
|
static const DLS::version_t VERSION_2; |
738 |
|
static const DLS::version_t VERSION_3; |
739 |
|
|
740 |
// derived attributes from DLS::Resource |
// derived attributes from DLS::Resource |
741 |
DLS::Resource::pInfo; |
DLS::Resource::pInfo; |
742 |
DLS::Resource::pDLSID; |
DLS::Resource::pDLSID; |
776 |
// own protected methods |
// own protected methods |
777 |
virtual void LoadSamples(progress_t* pProgress); |
virtual void LoadSamples(progress_t* pProgress); |
778 |
virtual void LoadInstruments(progress_t* pProgress); |
virtual void LoadInstruments(progress_t* pProgress); |
779 |
|
void SetSampleChecksum(Sample* pSample, uint32_t crc); |
780 |
friend class Region; |
friend class Region; |
781 |
friend class Sample; |
friend class Sample; |
782 |
friend class Group; // so Group can access protected member pRIFF |
friend class Group; // so Group can access protected member pRIFF |
783 |
private: |
private: |
784 |
|
static const DLS::Info::FixedStringLength FixedStringLengths[]; |
785 |
std::list<Group*>* pGroups; |
std::list<Group*>* pGroups; |
786 |
std::list<Group*>::iterator GroupsIterator; |
std::list<Group*>::iterator GroupsIterator; |
787 |
}; |
}; |