2 |
* * |
* * |
3 |
* libgig - C++ cross-platform Gigasampler format file loader library * |
* libgig - C++ cross-platform Gigasampler format file loader library * |
4 |
* * |
* * |
5 |
* Copyright (C) 2003 by Christian Schoenebeck * |
* Copyright (C) 2003, 2004 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 * |
9 |
* it under the terms of the GNU General Public License as published by * |
* it under the terms of the GNU General Public License as published by * |
680 |
if (!pVelocityTables) pVelocityTables = new VelocityTableMap; |
if (!pVelocityTables) pVelocityTables = new VelocityTableMap; |
681 |
|
|
682 |
RIFF::Chunk* _3ewa = _3ewl->GetSubChunk(CHUNK_ID_3EWA); |
RIFF::Chunk* _3ewa = _3ewl->GetSubChunk(CHUNK_ID_3EWA); |
683 |
_3ewa->ReadInt32(); // unknown, allways 0x0000008C ? |
_3ewa->ReadInt32(); // unknown, always 0x0000008C ? |
684 |
LFO3Frequency = (double) GIG_EXP_DECODE(_3ewa->ReadInt32()); |
LFO3Frequency = (double) GIG_EXP_DECODE(_3ewa->ReadInt32()); |
685 |
EG3Attack = (double) GIG_EXP_DECODE(_3ewa->ReadInt32()); |
EG3Attack = (double) GIG_EXP_DECODE(_3ewa->ReadInt32()); |
686 |
_3ewa->ReadInt16(); // unknown |
_3ewa->ReadInt16(); // unknown |
774 |
else if (pitchTrackDimensionBypass & 0x20) DimensionBypass = dim_bypass_ctrl_95; |
else if (pitchTrackDimensionBypass & 0x20) DimensionBypass = dim_bypass_ctrl_95; |
775 |
else DimensionBypass = dim_bypass_ctrl_none; |
else DimensionBypass = dim_bypass_ctrl_none; |
776 |
uint8_t pan = _3ewa->ReadUint8(); |
uint8_t pan = _3ewa->ReadUint8(); |
777 |
Pan = (pan < 64) ? pan : (-1) * (int8_t)pan - 63; |
Pan = (pan < 64) ? pan : -((int)pan - 63); // signed 7 bit -> signed 8 bit |
778 |
SelfMask = _3ewa->ReadInt8() & 0x01; |
SelfMask = _3ewa->ReadInt8() & 0x01; |
779 |
_3ewa->ReadInt8(); // unknown |
_3ewa->ReadInt8(); // unknown |
780 |
uint8_t lfo3ctrl = _3ewa->ReadUint8(); |
uint8_t lfo3ctrl = _3ewa->ReadUint8(); |
841 |
case curve_type_nonlinear: |
case curve_type_nonlinear: |
842 |
for (int velocity = 0; velocity < 128; velocity++) { |
for (int velocity = 0; velocity < 128; velocity++) { |
843 |
pVelocityAttenuationTable[velocity] = |
pVelocityAttenuationTable[velocity] = |
844 |
GIG_VELOCITY_TRANSFORM_NONLINEAR((double)(velocity+1),(double)(VelocityResponseDepth+1),(double)VelocityResponseCurveScaling); |
GIG_VELOCITY_TRANSFORM_NONLINEAR(((double)velocity),((double)VelocityResponseDepth),((double)VelocityResponseCurveScaling)); |
845 |
if (pVelocityAttenuationTable[velocity] > 1.0) pVelocityAttenuationTable[velocity] = 1.0; |
if (pVelocityAttenuationTable[velocity] > 1.0) pVelocityAttenuationTable[velocity] = 1.0; |
846 |
else if (pVelocityAttenuationTable[velocity] < 0.0) pVelocityAttenuationTable[velocity] = 0.0; |
else if (pVelocityAttenuationTable[velocity] < 1e-15) pVelocityAttenuationTable[velocity] = 0.0; |
847 |
} |
} |
848 |
break; |
break; |
849 |
case curve_type_linear: |
case curve_type_linear: |
850 |
for (int velocity = 0; velocity < 128; velocity++) { |
for (int velocity = 0; velocity < 128; velocity++) { |
851 |
pVelocityAttenuationTable[velocity] = |
pVelocityAttenuationTable[velocity] = |
852 |
GIG_VELOCITY_TRANSFORM_LINEAR((double)velocity,(double)(VelocityResponseDepth+1),(double)VelocityResponseCurveScaling); |
GIG_VELOCITY_TRANSFORM_LINEAR(((double)velocity),((double)VelocityResponseDepth),((double)VelocityResponseCurveScaling)); |
853 |
if (pVelocityAttenuationTable[velocity] > 1.0) pVelocityAttenuationTable[velocity] = 1.0; |
if (pVelocityAttenuationTable[velocity] > 1.0) pVelocityAttenuationTable[velocity] = 1.0; |
854 |
else if (pVelocityAttenuationTable[velocity] < 0.0) pVelocityAttenuationTable[velocity] = 0.0; |
else if (pVelocityAttenuationTable[velocity] < 1e-15) pVelocityAttenuationTable[velocity] = 0.0; |
855 |
} |
} |
856 |
break; |
break; |
857 |
case curve_type_special: |
case curve_type_special: |
858 |
for (int velocity = 0; velocity < 128; velocity++) { |
for (int velocity = 0; velocity < 128; velocity++) { |
859 |
pVelocityAttenuationTable[velocity] = |
pVelocityAttenuationTable[velocity] = |
860 |
GIG_VELOCITY_TRANSFORM_SPECIAL((double)(velocity+1),(double)(VelocityResponseDepth+1),(double)VelocityResponseCurveScaling); |
GIG_VELOCITY_TRANSFORM_SPECIAL(((double)velocity),((double)VelocityResponseDepth),((double)VelocityResponseCurveScaling)); |
861 |
if (pVelocityAttenuationTable[velocity] > 1.0) pVelocityAttenuationTable[velocity] = 1.0; |
if (pVelocityAttenuationTable[velocity] > 1.0) pVelocityAttenuationTable[velocity] = 1.0; |
862 |
else if (pVelocityAttenuationTable[velocity] < 0.0) pVelocityAttenuationTable[velocity] = 0.0; |
else if (pVelocityAttenuationTable[velocity] < 1e-15) pVelocityAttenuationTable[velocity] = 0.0; |
863 |
} |
} |
864 |
break; |
break; |
865 |
case curve_type_unknown: |
case curve_type_unknown: |
869 |
(*pVelocityTables)[tableKey] = pVelocityAttenuationTable; // put the new table into the tables map |
(*pVelocityTables)[tableKey] = pVelocityAttenuationTable; // put the new table into the tables map |
870 |
} |
} |
871 |
} |
} |
872 |
|
|
873 |
leverage_ctrl_t DimensionRegion::DecodeLeverageController(_lev_ctrl_t EncodedController) { |
leverage_ctrl_t DimensionRegion::DecodeLeverageController(_lev_ctrl_t EncodedController) { |
874 |
leverage_ctrl_t decodedcontroller; |
leverage_ctrl_t decodedcontroller; |
875 |
switch (EncodedController) { |
switch (EncodedController) { |
886 |
decodedcontroller.type = leverage_ctrl_t::type_channelaftertouch; |
decodedcontroller.type = leverage_ctrl_t::type_channelaftertouch; |
887 |
decodedcontroller.controller_number = 0; |
decodedcontroller.controller_number = 0; |
888 |
break; |
break; |
889 |
|
|
890 |
// ordinary MIDI control change controller |
// ordinary MIDI control change controller |
891 |
case _lev_ctrl_modwheel: |
case _lev_ctrl_modwheel: |
892 |
decodedcontroller.type = leverage_ctrl_t::type_controlchange; |
decodedcontroller.type = leverage_ctrl_t::type_controlchange; |
980 |
decodedcontroller.type = leverage_ctrl_t::type_controlchange; |
decodedcontroller.type = leverage_ctrl_t::type_controlchange; |
981 |
decodedcontroller.controller_number = 95; |
decodedcontroller.controller_number = 95; |
982 |
break; |
break; |
983 |
|
|
984 |
// unknown controller type |
// unknown controller type |
985 |
default: |
default: |
986 |
throw gig::Exception("Unknown leverage controller type."); |
throw gig::Exception("Unknown leverage controller type."); |
1053 |
pDimensionDefinitions[i].bits = bits; |
pDimensionDefinitions[i].bits = bits; |
1054 |
pDimensionDefinitions[i].zones = 0x01 << bits; // = pow(2,bits) |
pDimensionDefinitions[i].zones = 0x01 << bits; // = pow(2,bits) |
1055 |
pDimensionDefinitions[i].split_type = (dimension == dimension_layer || |
pDimensionDefinitions[i].split_type = (dimension == dimension_layer || |
1056 |
dimension == dimension_samplechannel) ? split_type_bit |
dimension == dimension_samplechannel || |
1057 |
: split_type_normal; |
dimension == dimension_releasetrigger) ? split_type_bit |
1058 |
|
: split_type_normal; |
1059 |
pDimensionDefinitions[i].ranges = NULL; // it's not possible to check velocity dimensions for custom defined ranges at this point |
pDimensionDefinitions[i].ranges = NULL; // it's not possible to check velocity dimensions for custom defined ranges at this point |
1060 |
pDimensionDefinitions[i].zone_size = |
pDimensionDefinitions[i].zone_size = |
1061 |
(pDimensionDefinitions[i].split_type == split_type_normal) ? 128 / pDimensionDefinitions[i].zones |
(pDimensionDefinitions[i].split_type == split_type_normal) ? 128 / pDimensionDefinitions[i].zones |
1153 |
* @see Dimensions |
* @see Dimensions |
1154 |
*/ |
*/ |
1155 |
DimensionRegion* Region::GetDimensionRegionByValue(uint Dim4Val, uint Dim3Val, uint Dim2Val, uint Dim1Val, uint Dim0Val) { |
DimensionRegion* Region::GetDimensionRegionByValue(uint Dim4Val, uint Dim3Val, uint Dim2Val, uint Dim1Val, uint Dim0Val) { |
1156 |
unsigned int bits[5] = {Dim0Val,Dim1Val,Dim2Val,Dim3Val,Dim4Val}; |
uint8_t bits[5] = {Dim0Val,Dim1Val,Dim2Val,Dim3Val,Dim4Val}; |
1157 |
for (uint i = 0; i < Dimensions; i++) { |
for (uint i = 0; i < Dimensions; i++) { |
1158 |
switch (pDimensionDefinitions[i].split_type) { |
switch (pDimensionDefinitions[i].split_type) { |
1159 |
case split_type_normal: |
case split_type_normal: |
1162 |
case split_type_customvelocity: |
case split_type_customvelocity: |
1163 |
bits[i] = VelocityTable[bits[i]]; |
bits[i] = VelocityTable[bits[i]]; |
1164 |
break; |
break; |
1165 |
// else the value is already the sought dimension bit number |
case split_type_bit: // the value is already the sought dimension bit number |
1166 |
|
const uint8_t limiter_mask = (0xff << pDimensionDefinitions[i].bits) ^ 0xff; |
1167 |
|
bits[i] = bits[i] & limiter_mask; // just make sure the value don't uses more bits than allowed |
1168 |
|
break; |
1169 |
} |
} |
1170 |
} |
} |
1171 |
return GetDimensionRegionByBit(bits[4],bits[3],bits[2],bits[1],bits[0]); |
return GetDimensionRegionByBit(bits[4],bits[3],bits[2],bits[1],bits[0]); |