1 |
/*************************************************************************** |
/*************************************************************************** |
2 |
* * |
* * |
3 |
* libgig - C++ cross-platform Gigasampler format file loader library * |
* libgig - C++ cross-platform Gigasampler format file access library * |
4 |
* * |
* * |
5 |
* Copyright (C) 2003-2006 by Christian Schoenebeck * |
* Copyright (C) 2003-2006 by Christian Schoenebeck * |
6 |
* <cuse@users.sourceforge.net> * |
* <cuse@users.sourceforge.net> * |
338 |
*/ |
*/ |
339 |
class DimensionRegion : protected DLS::Sampler { |
class DimensionRegion : protected DLS::Sampler { |
340 |
public: |
public: |
341 |
uint8_t VelocityUpperLimit; ///< Defines the upper velocity value limit of a velocity split (only if an user defined limit was set, thus a value not equal to 128/NumberOfSplits, else this value is 0). |
uint8_t VelocityUpperLimit; ///< Defines the upper velocity value limit of a velocity split (only if an user defined limit was set, thus a value not equal to 128/NumberOfSplits, else this value is 0). Only for gig2, otherwise the DimensionUpperLimts are used instead. |
342 |
Sample* pSample; ///< Points to the Sample which is assigned to the dimension region. |
Sample* pSample; ///< Points to the Sample which is assigned to the dimension region. |
343 |
// Sample Amplitude EG/LFO |
// Sample Amplitude EG/LFO |
344 |
uint16_t EG1PreAttack; ///< Preattack value of the sample amplitude EG (0 - 1000 permille). |
uint16_t EG1PreAttack; ///< Preattack value of the sample amplitude EG (0 - 1000 permille). |
422 |
bool MSDecode; ///< Gigastudio flag: defines if Mid Side Recordings should be decoded. |
bool MSDecode; ///< Gigastudio flag: defines if Mid Side Recordings should be decoded. |
423 |
uint16_t SampleStartOffset; ///< Number of samples the sample start should be moved (0 - 2000). |
uint16_t SampleStartOffset; ///< Number of samples the sample start should be moved (0 - 2000). |
424 |
double SampleAttenuation; ///< Sample volume (calculated from DLS::Sampler::Gain) |
double SampleAttenuation; ///< Sample volume (calculated from DLS::Sampler::Gain) |
425 |
|
uint8_t DimensionUpperLimits[8]; ///< gig3: defines the upper limit of the dimension values for this dimension region |
426 |
|
|
427 |
// derived attributes from DLS::Sampler |
// derived attributes from DLS::Sampler |
428 |
DLS::Sampler::UnityNote; |
DLS::Sampler::UnityNote; |
497 |
*/ |
*/ |
498 |
class Sample : public DLS::Sample { |
class Sample : public DLS::Sample { |
499 |
public: |
public: |
|
Group* pGroup; ///< pointer to the Group this sample belongs to, NULL otherwise |
|
500 |
uint32_t Manufacturer; ///< Specifies the MIDI Manufacturer's Association (MMA) Manufacturer code for the sampler intended to receive this file's waveform. If no particular manufacturer is to be specified, a value of 0 should be used. |
uint32_t Manufacturer; ///< Specifies the MIDI Manufacturer's Association (MMA) Manufacturer code for the sampler intended to receive this file's waveform. If no particular manufacturer is to be specified, a value of 0 should be used. |
501 |
uint32_t Product; ///< Specifies the MIDI model ID defined by the manufacturer corresponding to the Manufacturer field. If no particular manufacturer's product is to be specified, a value of 0 should be used. |
uint32_t Product; ///< Specifies the MIDI model ID defined by the manufacturer corresponding to the Manufacturer field. If no particular manufacturer's product is to be specified, a value of 0 should be used. |
502 |
uint32_t SamplePeriod; ///< Specifies the duration of time that passes during the playback of one sample in nanoseconds (normally equal to 1 / Samples Per Second, where Samples Per Second is the value found in the format chunk), don't bother to update this attribute, it won't be saved. |
uint32_t SamplePeriod; ///< Specifies the duration of time that passes during the playback of one sample in nanoseconds (normally equal to 1 / Samples Per Second, where Samples Per Second is the value found in the format chunk), don't bother to update this attribute, it won't be saved. |
533 |
unsigned long Read(void* pBuffer, unsigned long SampleCount, buffer_t* pExternalDecompressionBuffer = NULL); |
unsigned long Read(void* pBuffer, unsigned long SampleCount, buffer_t* pExternalDecompressionBuffer = NULL); |
534 |
unsigned long ReadAndLoop(void* pBuffer, unsigned long SampleCount, playback_state_t* pPlaybackState, DimensionRegion* pDimRgn, buffer_t* pExternalDecompressionBuffer = NULL); |
unsigned long ReadAndLoop(void* pBuffer, unsigned long SampleCount, playback_state_t* pPlaybackState, DimensionRegion* pDimRgn, buffer_t* pExternalDecompressionBuffer = NULL); |
535 |
unsigned long Write(void* pBuffer, unsigned long SampleCount); |
unsigned long Write(void* pBuffer, unsigned long SampleCount); |
536 |
|
Group* GetGroup() const; |
537 |
virtual void UpdateChunks(); |
virtual void UpdateChunks(); |
538 |
protected: |
protected: |
539 |
static unsigned int Instances; ///< Number of instances of class Sample. |
static unsigned int Instances; ///< Number of instances of class Sample. |
540 |
static buffer_t InternalDecompressionBuffer; ///< Buffer used for decompression as well as for truncation of 24 Bit -> 16 Bit samples. |
static buffer_t InternalDecompressionBuffer; ///< Buffer used for decompression as well as for truncation of 24 Bit -> 16 Bit samples. |
541 |
|
Group* pGroup; ///< pointer to the Group this sample belongs to (always not-NULL) |
542 |
unsigned long FrameOffset; ///< Current offset (sample points) in current sample frame (for decompression only). |
unsigned long FrameOffset; ///< Current offset (sample points) in current sample frame (for decompression only). |
543 |
unsigned long* FrameTable; ///< For positioning within compressed samples only: stores the offset values for each frame. |
unsigned long* FrameTable; ///< For positioning within compressed samples only: stores the offset values for each frame. |
544 |
unsigned long SamplePos; ///< For compressed samples only: stores the current position (in sample points). |
unsigned long SamplePos; ///< For compressed samples only: stores the current position (in sample points). |
578 |
void ScanCompressedSample(); |
void ScanCompressedSample(); |
579 |
friend class File; |
friend class File; |
580 |
friend class Region; |
friend class Region; |
581 |
|
friend class Group; // allow to modify protected member pGroup |
582 |
}; |
}; |
583 |
|
|
584 |
// TODO: <3dnl> list not used yet - not important though (just contains optional descriptions for the dimensions) |
// TODO: <3dnl> list not used yet - not important though (just contains optional descriptions for the dimensions) |
657 |
* At the moment, it seems as only samples can be grouped together in |
* At the moment, it seems as only samples can be grouped together in |
658 |
* the Gigasampler format yet. If this is false in the meantime, please |
* the Gigasampler format yet. If this is false in the meantime, please |
659 |
* tell us ! |
* tell us ! |
660 |
|
* |
661 |
|
* A sample is always assigned to exactly one Group. This also means |
662 |
|
* there is always at least one Group in a .gig file, no matter if you |
663 |
|
* created one yet or not. |
664 |
*/ |
*/ |
665 |
class Group { |
class Group { |
666 |
public: |
public: |
667 |
String Name; ///< Stores the name of this Group. |
String Name; ///< Stores the name of this Group. |
668 |
|
|
669 |
|
Sample* GetFirstSample(); |
670 |
|
Sample* GetNextSample(); |
671 |
|
void AddSample(Sample* pSample); |
672 |
protected: |
protected: |
673 |
Group(RIFF::File* file, RIFF::Chunk* ck3gnm); |
Group(File* file, RIFF::Chunk* ck3gnm); |
674 |
virtual ~Group(); |
virtual ~Group(); |
675 |
virtual void UpdateChunks(); |
virtual void UpdateChunks(); |
676 |
|
void MoveAll(); |
677 |
friend class File; |
friend class File; |
678 |
private: |
private: |
679 |
RIFF::File* pFile; |
File* pFile; |
680 |
RIFF::Chunk* pNameChunk; |
RIFF::Chunk* pNameChunk; |
681 |
}; |
}; |
682 |
|
|
722 |
virtual void LoadInstruments(progress_t* pProgress); |
virtual void LoadInstruments(progress_t* pProgress); |
723 |
friend class Region; |
friend class Region; |
724 |
friend class Sample; |
friend class Sample; |
725 |
|
friend class Group; // so Group can access protected member pRIFF |
726 |
private: |
private: |
727 |
std::list<Group*>* pGroups; |
std::list<Group*>* pGroups; |
728 |
std::list<Group*>::iterator GroupsIterator; |
std::list<Group*>::iterator GroupsIterator; |