1234 |
} |
} |
1235 |
case 7: { // volume |
case 7: { // volume |
1236 |
//TODO: not sample accurate yet |
//TODO: not sample accurate yet |
1237 |
pEngineChannel->GlobalVolume = (float) itControlChangeEvent->Param.CC.Value / 127.0f * CONFIG_GLOBAL_ATTENUATION; |
pEngineChannel->GlobalVolume = VolumeCurve[itControlChangeEvent->Param.CC.Value] * CONFIG_GLOBAL_ATTENUATION; |
1238 |
pEngineChannel->bStatusChanged = true; // engine channel status has changed, so set notify flag |
pEngineChannel->bStatusChanged = true; // engine channel status has changed, so set notify flag |
1239 |
break; |
break; |
1240 |
} |
} |
1241 |
case 10: { // panpot |
case 10: { // panpot |
1242 |
//TODO: not sample accurate yet |
//TODO: not sample accurate yet |
1243 |
const int pan = (int) itControlChangeEvent->Param.CC.Value - 64; |
pEngineChannel->GlobalPanLeft = PanCurve[128 - itControlChangeEvent->Param.CC.Value]; |
1244 |
pEngineChannel->GlobalPanLeft = 1.0f - float(RTMath::Max(pan, 0)) / 63.0f; |
pEngineChannel->GlobalPanRight = PanCurve[itControlChangeEvent->Param.CC.Value]; |
|
pEngineChannel->GlobalPanRight = 1.0f - float(RTMath::Min(pan, 0)) / -64.0f; |
|
1245 |
break; |
break; |
1246 |
} |
} |
1247 |
case 64: { // sustain |
case 64: { // sustain |
1557 |
} |
} |
1558 |
|
|
1559 |
String Engine::Version() { |
String Engine::Version() { |
1560 |
String s = "$Revision: 1.57 $"; |
String s = "$Revision: 1.58 $"; |
1561 |
return s.substr(11, s.size() - 13); // cut dollar signs, spaces and CVS macro keyword |
return s.substr(11, s.size() - 13); // cut dollar signs, spaces and CVS macro keyword |
1562 |
} |
} |
1563 |
|
|
1564 |
|
// static constant initializers |
1565 |
|
const float* Engine::VolumeCurve(InitVolumeCurve()); |
1566 |
|
const float* Engine::PanCurve(InitPanCurve()); |
1567 |
|
|
1568 |
|
float* Engine::InitVolumeCurve() { |
1569 |
|
// line-segment approximation |
1570 |
|
const float segments[] = { |
1571 |
|
0, 0, 2, 0.0046, 16, 0.016, 31, 0.051, 45, 0.115, 54.5, 0.2, |
1572 |
|
64.5, 0.39, 74, 0.74, 92, 1.03, 114, 1.94, 119.2, 2.2, 127, 2.2 |
1573 |
|
}; |
1574 |
|
return InitCurve(segments); |
1575 |
|
} |
1576 |
|
|
1577 |
|
float* Engine::InitPanCurve() { |
1578 |
|
// line-segment approximation |
1579 |
|
const float segments[] = { |
1580 |
|
0, 0, 1, 0, |
1581 |
|
2, 0.05, 31.5, 0.7, 51, 0.851, 74.5, 1.12, |
1582 |
|
127, 1.41, 128, 1.41 |
1583 |
|
}; |
1584 |
|
return InitCurve(segments, 129); |
1585 |
|
} |
1586 |
|
|
1587 |
|
float* Engine::InitCurve(const float* segments, int size) { |
1588 |
|
float* y = new float[size]; |
1589 |
|
for (int x = 0 ; x < size ; x++) { |
1590 |
|
if (x > segments[2]) segments += 2; |
1591 |
|
y[x] = segments[1] + (x - segments[0]) * |
1592 |
|
(segments[3] - segments[1]) / (segments[2] - segments[0]); |
1593 |
|
} |
1594 |
|
return y; |
1595 |
|
} |
1596 |
|
|
1597 |
}} // namespace LinuxSampler::gig |
}} // namespace LinuxSampler::gig |