From 3620316caf0b45265bc65945f989e50810f46c56 Mon Sep 17 00:00:00 2001 From: Paul Fd Date: Mon, 6 Apr 2020 01:40:17 +0200 Subject: [PATCH] Parse curve/step/smooth --- src/sfizz/Defaults.h | 3 ++ src/sfizz/Region.cpp | 112 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 115 insertions(+) diff --git a/src/sfizz/Defaults.h b/src/sfizz/Defaults.h index a0cae7a1..822e9cd3 100644 --- a/src/sfizz/Defaults.h +++ b/src/sfizz/Defaults.h @@ -81,6 +81,9 @@ namespace Default // Region logic: MIDI conditions constexpr Range channelRange { 1, 16 }; constexpr Range midiChannelRange { 0, 15 }; + constexpr Range stepCCRange { 0, 127 }; + constexpr Range smoothCCRange { 0, 127 }; + constexpr Range curveCCRange { 0, 255 }; constexpr Range ccNumberRange { 0, config::numCCs }; constexpr auto ccValueRange = normalizedRange; constexpr Range bendRange = { -8192, 8192 }; diff --git a/src/sfizz/Region.cpp b/src/sfizz/Region.cpp index 85b014d2..f150728d 100644 --- a/src/sfizz/Region.cpp +++ b/src/sfizz/Region.cpp @@ -297,6 +297,24 @@ bool sfz::Region::parseOpcode(const Opcode& opcode) case hash("volume"): setValueFromOpcode(opcode, volume, Default::volumeRange); break; + case hash("volume_curvecc&"): + if (opcode.parameters.back() > config::numCCs) + return false; + if (auto value = readOpcode(opcode.value, Default::curveCCRange)) + volumeCC[opcode.parameters.back()].curve = *value; + break; + case hash("volume_stepcc&"): + if (opcode.parameters.back() > config::numCCs) + return false; + if (auto value = readOpcode(opcode.value, Default::stepCCRange)) + volumeCC[opcode.parameters.back()].steps = *value; + break; + case hash("volume_smoothcc&"): + if (opcode.parameters.back() > config::numCCs) + return false; + if (auto value = readOpcode(opcode.value, Default::smoothCCRange)) + volumeCC[opcode.parameters.back()].smooth = *value; + break; case hash("gain_cc&"): case hash("gain_oncc&"): // fallthrough case hash("volume_oncc&"): @@ -309,6 +327,24 @@ bool sfz::Region::parseOpcode(const Opcode& opcode) if (auto value = readOpcode(opcode.value, Default::amplitudeRange)) amplitude = normalizePercents(*value); break; + case hash("amplitude_curvecc&"): + if (opcode.parameters.back() > config::numCCs) + return false; + if (auto value = readOpcode(opcode.value, Default::curveCCRange)) + amplitudeCC[opcode.parameters.back()].curve = *value; + break; + case hash("amplitude_stepcc&"): + if (opcode.parameters.back() > config::numCCs) + return false; + if (auto value = readOpcode(opcode.value, Default::stepCCRange)) + amplitudeCC[opcode.parameters.back()].steps = *value; + break; + case hash("amplitude_smoothcc&"): + if (opcode.parameters.back() > config::numCCs) + return false; + if (auto value = readOpcode(opcode.value, Default::smoothCCRange)) + amplitudeCC[opcode.parameters.back()].smooth = *value; + break; case hash("amplitude_cc&"): // fallthrough case hash("amplitude_oncc&"): if (opcode.parameters.back() > config::numCCs) @@ -320,6 +356,24 @@ bool sfz::Region::parseOpcode(const Opcode& opcode) if (auto value = readOpcode(opcode.value, Default::panRange)) pan = normalizePercents(*value); break; + case hash("pan_curvecc&"): + if (opcode.parameters.back() > config::numCCs) + return false; + if (auto value = readOpcode(opcode.value, Default::curveCCRange)) + panCC[opcode.parameters.back()].curve = *value; + break; + case hash("pan_stepcc&"): + if (opcode.parameters.back() > config::numCCs) + return false; + if (auto value = readOpcode(opcode.value, Default::stepCCRange)) + panCC[opcode.parameters.back()].steps = *value; + break; + case hash("pan_smoothcc&"): + if (opcode.parameters.back() > config::numCCs) + return false; + if (auto value = readOpcode(opcode.value, Default::smoothCCRange)) + panCC[opcode.parameters.back()].smooth = *value; + break; case hash("pan_cc&"): case hash("pan_oncc&"): if (opcode.parameters.back() > config::numCCs) @@ -331,6 +385,25 @@ bool sfz::Region::parseOpcode(const Opcode& opcode) if (auto value = readOpcode(opcode.value, Default::positionRange)) position = normalizePercents(*value); break; + case hash("position_curvecc&"): + if (opcode.parameters.back() > config::numCCs) + return false; + if (auto value = readOpcode(opcode.value, Default::curveCCRange)) + positionCC[opcode.parameters.back()].curve = *value; + break; + case hash("position_stepcc&"): + if (opcode.parameters.back() > config::numCCs) + return false; + if (auto value = readOpcode(opcode.value, Default::stepCCRange)) + positionCC[opcode.parameters.back()].steps = *value; + break; + case hash("position_smoothcc&"): + if (opcode.parameters.back() > config::numCCs) + return false; + if (auto value = readOpcode(opcode.value, Default::smoothCCRange)) + positionCC[opcode.parameters.back()].smooth = *value; + break; + case hash("position_cc&"): // fallthrough case hash("position_oncc&"): if (opcode.parameters.back() > config::numCCs) return false; @@ -341,6 +414,24 @@ bool sfz::Region::parseOpcode(const Opcode& opcode) if (auto value = readOpcode(opcode.value, Default::widthRange)) width = normalizePercents(*value); break; + case hash("width_curvecc&"): + if (opcode.parameters.back() > config::numCCs) + return false; + if (auto value = readOpcode(opcode.value, Default::curveCCRange)) + widthCC[opcode.parameters.back()].curve = *value; + break; + case hash("width_stepcc&"): + if (opcode.parameters.back() > config::numCCs) + return false; + if (auto value = readOpcode(opcode.value, Default::stepCCRange)) + widthCC[opcode.parameters.back()].steps = *value; + break; + case hash("width_smoothcc&"): + if (opcode.parameters.back() > config::numCCs) + return false; + if (auto value = readOpcode(opcode.value, Default::smoothCCRange)) + widthCC[opcode.parameters.back()].smooth = *value; + break; case hash("width_oncc&"): if (opcode.parameters.back() > config::numCCs) return false; @@ -726,6 +817,27 @@ bool sfz::Region::parseOpcode(const Opcode& opcode) case hash("pitch"): setValueFromOpcode(opcode, tune, Default::tuneRange); break; + case hash("pitch_curvecc&"): // fallthrough + case hash("tune_curvecc&"): + if (opcode.parameters.back() > config::numCCs) + return false; + if (auto value = readOpcode(opcode.value, Default::curveCCRange)) + tuneCC[opcode.parameters.back()].curve = *value; + break; + case hash("pitch_stepcc&"): // fallthrough + case hash("tune_stepcc&"): + if (opcode.parameters.back() > config::numCCs) + return false; + if (auto value = readOpcode(opcode.value, Default::stepCCRange)) + tuneCC[opcode.parameters.back()].steps = *value; + break; + case hash("pitch_smoothcc&"): // fallthrough + case hash("tune_smoothcc&"): + if (opcode.parameters.back() > config::numCCs) + return false; + if (auto value = readOpcode(opcode.value, Default::smoothCCRange)) + tuneCC[opcode.parameters.back()].smooth = *value; + break; case hash("tune_cc&"): case hash("tune_oncc&"): case hash("pitch_cc&"):