libgig
4.3.0
|
Defines Region information of a Gigasampler/GigaStudio instrument. More...
#include <gig.h>
Public Member Functions | |
DimensionRegion * | GetDimensionRegionByValue (const uint DimValues[8]) |
Use this method in your audio engine to get the appropriate dimension region with it's articulation data for the current situation. More... | |
DimensionRegion * | GetDimensionRegionByBit (const uint8_t DimBits[8]) |
Returns the appropriate DimensionRegion for the given dimension bit numbers (zone index). More... | |
int | GetDimensionRegionIndexByValue (const uint DimValues[8]) |
Sample * | GetSample () |
Returns pointer address to the Sample referenced with this region. More... | |
void | AddDimension (dimension_def_t *pDimDef) |
Einstein would have dreamed of it - create a new dimension. More... | |
void | DeleteDimension (dimension_def_t *pDimDef) |
Delete an existing dimension. More... | |
dimension_def_t * | GetDimensionDefinition (dimension_t type) |
Searches in the current Region for a dimension of the given dimension type and returns the precise configuration of that dimension in this Region. More... | |
void | DeleteDimensionZone (dimension_t type, int zone) |
Delete one split zone of a dimension (decrement zone amount). More... | |
void | SplitDimensionZone (dimension_t type, int zone) |
Divide split zone of a dimension in two (increment zone amount). More... | |
void | SetDimensionType (dimension_t oldType, dimension_t newType) |
Change type of an existing dimension. More... | |
virtual void | SetKeyRange (uint16_t Low, uint16_t High) |
Modifies the key range of this Region and makes sure the respective chunks are in correct order. More... | |
virtual void | UpdateChunks (progress_t *pProgress) |
Apply Region settings and all its DimensionRegions to the respective RIFF chunks. More... | |
virtual void | CopyAssign (const Region *orig) |
Make a (semi) deep copy of the Region object given by orig and assign it to this object. More... | |
void | SetSample (Sample *pSample) |
Assign another sample to this Region. More... | |
virtual void | DeleteChunks () |
Remove all RIFF chunks associated with this Region object. More... | |
virtual void | CopyAssign (const Region *orig) |
Make a (semi) deep copy of the Region object given by orig and assign it to this object. More... | |
virtual void | CopyAssign (const Resource *orig) |
Make a deep copy of the Resource object given by orig and assign it to this object. More... | |
virtual void | CopyAssign (const Articulator *orig) |
Not yet implemented in this version, since the .gig format does not need to copy DLS articulators and so far nobody used pure DLS instrument AFAIK. | |
virtual void | CopyAssign (const Sampler *orig) |
Make a deep copy of the Sampler object given by orig and assign it to this object. More... | |
Resource * | GetParent () |
const Resource * | GetParent () const |
void | GenerateDLSID () |
Generates a new DLSID for the resource. | |
Articulation * | GetFirstArticulation () |
Articulation * | GetNextArticulation () |
void | AddSampleLoop (sample_loop_t *pLoopDef) |
Adds a new sample loop with the provided loop definition. More... | |
void | DeleteSampleLoop (sample_loop_t *pLoopDef) |
Deletes an existing sample loop. More... | |
virtual void | SetGain (int32_t gain) |
Static Public Member Functions | |
static void | GenerateDLSID (dlsid_t *pDLSID) |
Public Attributes | |
unsigned int | Dimensions |
Number of defined dimensions, do not alter! | |
dimension_def_t | pDimensionDefinitions [8] |
Defines the five (gig2) or eight (gig3) possible dimensions (the dimension's controller and number of bits/splits). Use AddDimension() and DeleteDimension() to create a new dimension or delete an existing one. | |
uint32_t | DimensionRegions |
Total number of DimensionRegions this Region contains, do not alter! | |
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). | |
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! | |
range_t | KeyRange |
range_t | VelocityRange |
uint16_t | KeyGroup |
uint16_t | Layer |
bool | SelfNonExclusive |
bool | PhaseMaster |
uint16_t | PhaseGroup |
bool | MultiChannel |
uint32_t | Channel |
Info * | pInfo |
Points (in any case) to an Info object, providing additional, optional infos and comments. | |
dlsid_t * | pDLSID |
Points to a dlsid_t structure if the file provided a DLS ID else is NULL. | |
uint8_t | UnityNote |
int16_t | FineTune |
int32_t | Gain |
bool | NoSampleDepthTruncation |
bool | NoSampleCompression |
uint32_t | SampleLoops |
Reflects the number of sample loops. | |
sample_loop_t * | pSampleLoops |
Points to the beginning of a sample loop array, or is NULL if there are no loops defined. | |
Protected Types | |
typedef std::list< Articulation * > | ArticulationList |
Protected Member Functions | |
Region (Instrument *pInstrument, RIFF::List *rgnList) | |
void | LoadDimensionRegions (RIFF::List *rgn) |
void | UpdateVelocityTable () |
Sample * | GetSampleFromWavePool (unsigned int WavePoolTableIndex, progress_t *pProgress=NULL) |
void | CopyAssign (const Region *orig, const std::map< Sample *, Sample * > *mSamples) |
Make a (semi) deep copy of the Region object given by orig and assign it to this object. More... | |
DimensionRegion * | GetDimensionRegionByBit (const std::map< dimension_t, int > &DimCase) |
~Region () | |
Destructor. More... | |
void | LoadArticulations () |
Protected Attributes | |
RIFF::List * | pCkRegion |
uint32_t | WavePoolTableIndex |
Sample * | pSample |
uint16_t | FormatOptionFlags |
uint16_t | WaveLinkOptionFlags |
Resource * | pParent |
RIFF::List * | pResourceList |
RIFF::List * | pParentList |
RIFF::List * | pParentList |
ArticulationList * | pArticulations |
ArticulationList::iterator | ArticulationsIterator |
uint32_t | uiHeaderSize |
uint32_t | SamplerOptions |
Defines Region information of a Gigasampler/GigaStudio instrument.
A Region reflects a consecutive area (key range) on the keyboard. The individual regions in the gig format may not overlap with other regions (of the same instrument that is). Further, in the gig format a Region is merely a container for DimensionRegions (a.k.a. "Cases"). The Region itself does not provide the sample mapping or articulation informations used, even though the data structures of regions indeed provide such informations. The latter is however just of historical nature, because the gig file format was derived from the DLS file format.
Each Region consists of at least one or more DimensionRegions. The actual amount of DimensionRegions depends on which kind of "dimensions" are defined for this region, and on the split / zone amount for each of those dimensions.
Since the gig format was designed as extension to the DLS file format, this class is derived from the DLS::Region class. So also refer to DLS::Region for additional informations, class attributes and methods.
|
protectedvirtual |
Destructor.
Intended to free up all memory occupied by this Region object. ATM this destructor implementation does nothing though.
Reimplemented from DLS::Region.
Definition at line 4149 of file gig.cpp.
References pDimensionRegions.
void gig::Region::AddDimension | ( | dimension_def_t * | pDimDef | ) |
Einstein would have dreamed of it - create a new dimension.
Creates a new dimension with the dimension definition given by pDimDef. The appropriate amount of DimensionRegions will be created. There is a hard limit of dimensions and total amount of "bits" all dimensions can have. This limit is dependant to what gig file format version this file refers to. The gig v2 (and lower) format has a dimension limit and total amount of bits limit of 5, whereas the gig v3 format has a limit of 8.
pDimDef | - defintion of the new dimension |
gig::Exception | if dimension of the same type exists already |
gig::Exception | if amount of dimensions or total amount of dimension bits limit is violated |
Definition at line 3607 of file gig.cpp.
References RIFF::List::AddSubList(), gig::dimension_def_t::bits, gig::dimension_def_t::dimension, gig::dimension_layer, gig::dimension_samplechannel, DimensionRegions, Dimensions, gig::DimensionRegion::DimensionUpperLimits, RIFF::List::GetSubList(), Layers, RIFF::List::MoveSubChunk(), pDimensionDefinitions, pDimensionRegions, DLS::File::pVersion, gig::dimension_def_t::split_type, gig::dimension_def_t::zone_size, and gig::dimension_def_t::zones.
Referenced by CopyAssign(), DeleteDimensionZone(), and SplitDimensionZone().
|
inherited |
Adds a new sample loop with the provided loop definition.
pLoopDef | - points to a loop definition that is to be copied |
Definition at line 706 of file DLS.cpp.
References DLS::Sampler::pSampleLoops, DLS::Sampler::SampleLoops, and DLS::sample_loop_t::Size.
|
virtualinherited |
Make a (semi) deep copy of the Region object given by orig and assign it to this object.
Note that the sample pointer referenced by orig is simply copied as memory address. Thus the respective sample is shared, not duplicated!
orig | - original Region object to be copied from |
Definition at line 1288 of file DLS.cpp.
References DLS::Articulator::CopyAssign(), DLS::Resource::CopyAssign(), DLS::Sampler::CopyAssign(), DLS::range_t::high, DLS::Region::KeyRange, DLS::range_t::low, and DLS::Region::SetKeyRange().
Referenced by DLS::Instrument::CopyAssign(), and CopyAssign().
|
virtual |
Make a (semi) deep copy of the Region object given by orig and assign it to this object.
Note that all sample pointers referenced by orig are simply copied as memory address. Thus the respective samples are shared, not duplicated!
orig | - original Region object to be copied from |
Definition at line 4346 of file gig.cpp.
Referenced by gig::Instrument::CopyAssign().
|
protected |
Make a (semi) deep copy of the Region object given by orig and assign it to this object.
mSamples | - crosslink map between the foreign file's samples and this file's samples |
Definition at line 4357 of file gig.cpp.
References AddDimension(), gig::DimensionRegion::CopyAssign(), DLS::Region::CopyAssign(), DeleteDimension(), Dimensions, Layers, pDimensionDefinitions, and pDimensionRegions.
|
virtualinherited |
Make a deep copy of the Resource object given by orig and assign it to this object.
orig | - original Resource object to be copied from |
Definition at line 601 of file DLS.cpp.
References DLS::Info::CopyAssign(), and DLS::Resource::pInfo.
Referenced by DLS::Region::CopyAssign(), and DLS::Sample::CopyAssignCore().
|
virtualinherited |
Make a deep copy of the Sampler object given by orig and assign it to this object.
orig | - original Sampler object to be copied from |
Definition at line 752 of file DLS.cpp.
References DLS::Sampler::Gain, DLS::Sampler::pSampleLoops, and DLS::Sampler::SampleLoops.
Referenced by DLS::Region::CopyAssign().
|
virtualinherited |
Remove all RIFF chunks associated with this Region object.
See Storage::DeleteChunks() for details.
Reimplemented from DLS::Articulator.
Definition at line 1148 of file DLS.cpp.
References DLS::Articulator::DeleteChunks(), DLS::Resource::DeleteChunks(), DLS::Sampler::DeleteChunks(), RIFF::List::DeleteSubChunk(), and RIFF::Chunk::GetParent().
Referenced by DeleteDimensionZone(), and SplitDimensionZone().
void gig::Region::DeleteDimension | ( | dimension_def_t * | pDimDef | ) |
Delete an existing dimension.
Deletes the dimension given by pDimDef and deletes all respective dimension regions, that is all dimension regions where the dimension's bit(s) part is greater than 0. In case of a 'sustain pedal' dimension for example this would delete all dimension regions for the case(s) where the sustain pedal is pressed down.
pDimDef | - dimension to delete |
gig::Exception | if given dimension cannot be found |
Definition at line 3719 of file gig.cpp.
References gig::dimension_def_t::bits, RIFF::List::DeleteSubChunk(), gig::dimension_def_t::dimension, gig::dimension_layer, gig::dimension_none, DimensionRegions, Dimensions, gig::DimensionRegion::DimensionUpperLimits, RIFF::List::GetSubList(), Layers, pDimensionDefinitions, pDimensionRegions, and gig::dimension_def_t::zones.
Referenced by CopyAssign(), DeleteDimensionZone(), and SplitDimensionZone().
void gig::Region::DeleteDimensionZone | ( | dimension_t | type, |
int | zone | ||
) |
Delete one split zone of a dimension (decrement zone amount).
Instead of deleting an entire dimensions, this method will only delete one particular split zone given by zone of the Region's dimension given by type. So this method will simply decrement the amount of zones by one of the dimension in question. To be able to do that, the respective dimension must exist on this Region and it must have at least 3 zones. All DimensionRegion objects associated with the zone will be deleted.
type | - identifies the dimension where a zone shall be deleted |
zone | - index of the dimension split zone that shall be deleted |
gig::Exception | if requested zone could not be deleted |
Definition at line 3809 of file gig.cpp.
References AddDimension(), RIFF::List::AddSubList(), gig::dimension_def_t::bits, gig::DimensionRegion::CopyAssign(), DLS::Region::DeleteChunks(), DeleteDimension(), gig::dimension_def_t::dimension, Dimensions, gig::DimensionRegion::DimensionUpperLimits, GetDimensionDefinition(), GetDimensionRegionByBit(), RIFF::List::GetSubList(), pDimensionDefinitions, pDimensionRegions, gig::dimension_def_t::split_type, gig::split_type_normal, and gig::dimension_def_t::zones.
|
inherited |
Deletes an existing sample loop.
pLoopDef | - pointer to existing loop definition |
Exception | - if given loop definition does not exist |
Definition at line 728 of file DLS.cpp.
References DLS::Sampler::pSampleLoops, and DLS::Sampler::SampleLoops.
dimension_def_t * gig::Region::GetDimensionDefinition | ( | dimension_t | type | ) |
Searches in the current Region for a dimension of the given dimension type and returns the precise configuration of that dimension in this Region.
type | - dimension type of the sought dimension |
Definition at line 4142 of file gig.cpp.
References Dimensions, and pDimensionDefinitions.
Referenced by DeleteDimensionZone(), SetDimensionType(), and SplitDimensionZone().
DimensionRegion * gig::Region::GetDimensionRegionByBit | ( | const uint8_t | DimBits[8] | ) |
Returns the appropriate DimensionRegion for the given dimension bit numbers (zone index).
You usually use GetDimensionRegionByValue instead of calling this method directly!
DimBits | Bit numbers for dimension 0 to 7 |
Definition at line 4282 of file gig.cpp.
References gig::dimension_def_t::bits, pDimensionDefinitions, and pDimensionRegions.
Referenced by DeleteDimensionZone(), and SplitDimensionZone().
DimensionRegion * gig::Region::GetDimensionRegionByValue | ( | const uint | DimValues[8] | ) |
Use this method in your audio engine to get the appropriate dimension region with it's articulation data for the current situation.
Just call the method with the current MIDI controller values and you'll get the DimensionRegion with the appropriate articulation data for the current situation (for this Region of course only). To do that you'll first have to look which dimensions with which controllers and in which order are defined for this Region when you load the .gig file. Special cases are e.g. layer or channel dimensions where you just put in the index numbers instead of a MIDI controller value (means 0 for left channel, 1 for right channel or 0 for layer 0, 1 for layer 1, etc.).
DimValues | MIDI controller values (0-127) for dimension 0 to 7 |
Definition at line 4173 of file gig.cpp.
References gig::dimension_def_t::bits, gig::dimension_velocity, Dimensions, pDimensionDefinitions, pDimensionRegions, gig::split_type_bit, gig::split_type_normal, gig::DimensionRegion::VelocityTable, and gig::dimension_def_t::zones.
Sample * gig::Region::GetSample | ( | ) |
Returns pointer address to the Sample referenced with this region.
This is the global Sample for the entire Region (not sure if this is actually used by the Gigasampler engine - I would only use the Sample referenced by the appropriate DimensionRegion instead of this sample).
void gig::Region::SetDimensionType | ( | dimension_t | oldType, |
dimension_t | newType | ||
) |
Change type of an existing dimension.
Alters the dimension type of a dimension already existing on this region. If there is currently no dimension on this Region with type oldType, then this call with throw an Exception. Likewise there are cases where the requested dimension type cannot be performed. For example if the new dimension type shall be gig::dimension_samplechannel, and the current dimension has more than 2 zones. In such cases an Exception is thrown as well.
oldType | - identifies the existing dimension to be changed |
newType | - to which dimension type it should be changed to |
gig::Exception | if requested change cannot be performed |
Definition at line 4102 of file gig.cpp.
References gig::dimension_def_t::dimension, gig::dimension_samplechannel, GetDimensionDefinition(), gig::dimension_def_t::split_type, and gig::dimension_def_t::zones.
|
virtual |
Modifies the key range of this Region and makes sure the respective chunks are in correct order.
Low | - lower end of key range |
High | - upper end of key range |
Reimplemented from DLS::Region.
Definition at line 3513 of file gig.cpp.
References DLS::Region::SetKeyRange().
|
inherited |
void gig::Region::SplitDimensionZone | ( | dimension_t | type, |
int | zone | ||
) |
Divide split zone of a dimension in two (increment zone amount).
This will increment the amount of zones for the dimension (given by type) by one. It will do so by dividing the zone (given by zone) in the middle of its zone range in two. So the two zones resulting from the zone being splitted, will be an equivalent copy regarding all their articulation informations and sample reference. The two zones will only differ in their zone's upper limit (DimensionRegion::DimensionUpperLimits).
type | - identifies the dimension where a zone shall be splitted |
zone | - index of the dimension split zone that shall be splitted |
gig::Exception | if requested zone could not be splitted |
Definition at line 3948 of file gig.cpp.
References AddDimension(), RIFF::List::AddSubList(), gig::dimension_def_t::bits, gig::DimensionRegion::CopyAssign(), DLS::Region::DeleteChunks(), DeleteDimension(), gig::dimension_def_t::dimension, Dimensions, gig::DimensionRegion::DimensionUpperLimits, GetDimensionDefinition(), GetDimensionRegionByBit(), RIFF::List::GetSubList(), pDimensionDefinitions, pDimensionRegions, gig::dimension_def_t::split_type, gig::split_type_normal, and gig::dimension_def_t::zones.
|
virtual |
Apply Region settings and all its DimensionRegions to the respective RIFF chunks.
You have to call File::Save() to make changes persistent.
Usually there is absolutely no need to call this method explicitly. It will be called automatically when File::Save() was called.
pProgress | - callback function for progress notification |
gig::Exception | if samples cannot be dereferenced |
Reimplemented from DLS::Region.
Definition at line 3399 of file gig.cpp.
References RIFF::List::AddSubChunk(), RIFF::List::AddSubList(), gig::dimension_def_t::bits, RIFF::List::DeleteSubChunk(), gig::dimension_def_t::dimension, gig::dimension_none, DimensionRegions, RIFF::List::GetSubChunk(), RIFF::List::GetSubList(), RIFF::Chunk::LoadChunkData(), RIFF::List::MoveSubChunk(), pDimensionDefinitions, pDimensionRegions, gig::DimensionRegion::pSample, DLS::File::pVersion, DLS::Region::UpdateChunks(), gig::DimensionRegion::UpdateChunks(), and gig::dimension_def_t::zones.
|
inherited |
Definition at line 428 of file DLS.h.
Referenced by DLS::Sampler::CopyAssign(), gig::DimensionRegion::SetGain(), and DLS::Sampler::UpdateChunks().
|
inherited |
Definition at line 494 of file DLS.h.
Referenced by DLS::Region::CopyAssign(), DLS::Region::SetKeyRange(), and DLS::Region::UpdateChunks().