Simplify region opcode handling after normalizing

This commit is contained in:
Jean Pierre Cimalando 2020-05-05 04:02:51 +02:00
parent b02236328d
commit 4460114b3b

View file

@ -67,8 +67,7 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode)
case hash("offset_random"): case hash("offset_random"):
setValueFromOpcode(opcode, offsetRandom, Default::offsetRange); setValueFromOpcode(opcode, offsetRandom, Default::offsetRange);
break; break;
case hash("offset_cc&"): case hash("offset_oncc&"): // also offset_cc&
case hash("offset_oncc&"):
if (opcode.parameters.back() > config::numCCs) if (opcode.parameters.back() > config::numCCs)
return false; return false;
if (auto value = readOpcode(opcode.value, Default::offsetCCRange)) if (auto value = readOpcode(opcode.value, Default::offsetCCRange))
@ -80,8 +79,7 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode)
case hash("count"): case hash("count"):
setValueFromOpcode(opcode, sampleCount, Default::sampleCountRange); setValueFromOpcode(opcode, sampleCount, Default::sampleCountRange);
break; break;
case hash("loopmode"): // fallthrough case hash("loop_mode"): // also loopmode
case hash("loop_mode"):
switch (hash(opcode.value)) { switch (hash(opcode.value)) {
case hash("no_loop"): case hash("no_loop"):
loopMode = SfzLoopMode::no_loop; loopMode = SfzLoopMode::no_loop;
@ -99,12 +97,10 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode)
DBG("Unkown loop mode:" << std::string(opcode.value)); DBG("Unkown loop mode:" << std::string(opcode.value));
} }
break; break;
case hash("loopend"): // fallthrough case hash("loop_end"): // also loopend
case hash("loop_end"):
setRangeEndFromOpcode(opcode, loopRange, Default::loopRange); setRangeEndFromOpcode(opcode, loopRange, Default::loopRange);
break; break;
case hash("loopstart"): // fallthrough case hash("loop_start"): // also loopstart
case hash("loop_start"):
setRangeStartFromOpcode(opcode, loopRange, Default::loopRange); setRangeStartFromOpcode(opcode, loopRange, Default::loopRange);
break; break;
@ -124,15 +120,13 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode)
break; break;
// Instrument settings: voice lifecycle // Instrument settings: voice lifecycle
case hash("group"): // fallthrough case hash("group"): // also polyphony_group
case hash("polyphony_group"):
setValueFromOpcode(opcode, group, Default::groupRange); setValueFromOpcode(opcode, group, Default::groupRange);
break; break;
case hash("offby"): // fallthrough case hash("off_by"): // also offby
case hash("off_by"):
setValueFromOpcode(opcode, offBy, Default::groupRange); setValueFromOpcode(opcode, offBy, Default::groupRange);
break; break;
case hash("off_mode"): case hash("off_mode"): // also offmode
switch (hash(opcode.value)) { switch (hash(opcode.value)) {
case hash("fast"): case hash("fast"):
offMode = SfzOffMode::fast; offMode = SfzOffMode::fast;
@ -295,15 +289,13 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode)
DBG("Unknown trigger mode: " << std::string(opcode.value)); DBG("Unknown trigger mode: " << std::string(opcode.value));
} }
break; break;
case hash("on_locc&"): // fallthrough case hash("start_locc&"): // also on_locc&
case hash("start_locc&"):
if (opcode.parameters.back() >= config::numCCs) if (opcode.parameters.back() >= config::numCCs)
return false; return false;
if (auto value = readOpcode(opcode.value, Default::midi7Range)) if (auto value = readOpcode(opcode.value, Default::midi7Range))
ccTriggers[opcode.parameters.back()].setStart(normalizeCC(*value)); ccTriggers[opcode.parameters.back()].setStart(normalizeCC(*value));
break; break;
case hash("on_hicc&"): // fallthrough case hash("start_hicc&"): // also on_hicc&
case hash("start_hicc&"):
if (opcode.parameters.back() >= config::numCCs) if (opcode.parameters.back() >= config::numCCs)
return false; return false;
if (auto value = readOpcode(opcode.value, Default::midi7Range)) if (auto value = readOpcode(opcode.value, Default::midi7Range))
@ -311,30 +303,28 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode)
break; break;
// Performance parameters: amplifier // Performance parameters: amplifier
case hash("volume"): case hash("volume"): // also gain
setValueFromOpcode(opcode, volume, Default::volumeRange); setValueFromOpcode(opcode, volume, Default::volumeRange);
break; break;
case hash("volume_curvecc&"): case hash("volume_curvecc&"): // also gain_curvecc&
if (opcode.parameters.back() >= config::numCCs) if (opcode.parameters.back() >= config::numCCs)
return false; return false;
if (auto value = readOpcode(opcode.value, Default::curveCCRange)) if (auto value = readOpcode(opcode.value, Default::curveCCRange))
volumeCC[opcode.parameters.back()].curve = *value; volumeCC[opcode.parameters.back()].curve = *value;
break; break;
case hash("volume_stepcc&"): case hash("volume_stepcc&"): // also gain_stepcc&
if (opcode.parameters.back() >= config::numCCs) if (opcode.parameters.back() >= config::numCCs)
return false; return false;
if (auto value = readOpcode(opcode.value, Default::volumeStepRange)) if (auto value = readOpcode(opcode.value, Default::volumeStepRange))
volumeCC[opcode.parameters.back()].step = *value; volumeCC[opcode.parameters.back()].step = *value;
break; break;
case hash("volume_smoothcc&"): case hash("volume_smoothcc&"): // also gain_smoothcc&
if (opcode.parameters.back() >= config::numCCs) if (opcode.parameters.back() >= config::numCCs)
return false; return false;
if (auto value = readOpcode(opcode.value, Default::smoothCCRange)) if (auto value = readOpcode(opcode.value, Default::smoothCCRange))
volumeCC[opcode.parameters.back()].smooth = *value; volumeCC[opcode.parameters.back()].smooth = *value;
break; break;
case hash("gain_cc&"): case hash("volume_oncc&"): // also gain_oncc&
case hash("gain_oncc&"): // fallthrough
case hash("volume_oncc&"):
if (opcode.parameters.back() >= config::numCCs) if (opcode.parameters.back() >= config::numCCs)
return false; return false;
if (auto value = readOpcode(opcode.value, Default::volumeCCRange)) if (auto value = readOpcode(opcode.value, Default::volumeCCRange))
@ -362,8 +352,7 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode)
if (auto value = readOpcode(opcode.value, Default::smoothCCRange)) if (auto value = readOpcode(opcode.value, Default::smoothCCRange))
amplitudeCC[opcode.parameters.back()].smooth = *value; amplitudeCC[opcode.parameters.back()].smooth = *value;
break; break;
case hash("amplitude_cc&"): // fallthrough case hash("amplitude_oncc&"): // also amplitude_cc&
case hash("amplitude_oncc&"):
if (opcode.parameters.back() >= config::numCCs) if (opcode.parameters.back() >= config::numCCs)
return false; return false;
if (auto value = readOpcode(opcode.value, Default::amplitudeRange)) if (auto value = readOpcode(opcode.value, Default::amplitudeRange))
@ -391,8 +380,7 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode)
if (auto value = readOpcode(opcode.value, Default::smoothCCRange)) if (auto value = readOpcode(opcode.value, Default::smoothCCRange))
panCC[opcode.parameters.back()].smooth = *value; panCC[opcode.parameters.back()].smooth = *value;
break; break;
case hash("pan_cc&"): case hash("pan_oncc&"): // also pan_cc&
case hash("pan_oncc&"):
if (opcode.parameters.back() >= config::numCCs) if (opcode.parameters.back() >= config::numCCs)
return false; return false;
if (auto value = readOpcode(opcode.value, Default::panCCRange)) if (auto value = readOpcode(opcode.value, Default::panCCRange))
@ -420,8 +408,7 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode)
if (auto value = readOpcode(opcode.value, Default::smoothCCRange)) if (auto value = readOpcode(opcode.value, Default::smoothCCRange))
positionCC[opcode.parameters.back()].smooth = *value; positionCC[opcode.parameters.back()].smooth = *value;
break; break;
case hash("position_cc&"): // fallthrough case hash("position_oncc&"): // also position_cc&
case hash("position_oncc&"):
if (opcode.parameters.back() >= config::numCCs) if (opcode.parameters.back() >= config::numCCs)
return false; return false;
if (auto value = readOpcode(opcode.value, Default::positionCCRange)) if (auto value = readOpcode(opcode.value, Default::positionCCRange))
@ -570,8 +557,7 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode)
break; break;
// Performance parameters: filters // Performance parameters: filters
case hash("cutoff"): // fallthrough case hash("cutoff&"): // also cutoff
case hash("cutoff&"):
{ {
const auto filterIndex = opcode.parameters.empty() ? 0 : (opcode.parameters.back() - 1); const auto filterIndex = opcode.parameters.empty() ? 0 : (opcode.parameters.back() - 1);
if (!extendIfNecessary(filters, filterIndex + 1, Default::numFilters)) if (!extendIfNecessary(filters, filterIndex + 1, Default::numFilters))
@ -579,8 +565,7 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode)
setValueFromOpcode(opcode, filters[filterIndex].cutoff, Default::filterCutoffRange); setValueFromOpcode(opcode, filters[filterIndex].cutoff, Default::filterCutoffRange);
} }
break; break;
case hash("resonance"): // fallthrough case hash("resonance&"): // also resonance
case hash("resonance&"):
{ {
const auto filterIndex = opcode.parameters.empty() ? 0 : (opcode.parameters.back() - 1); const auto filterIndex = opcode.parameters.empty() ? 0 : (opcode.parameters.back() - 1);
if (!extendIfNecessary(filters, filterIndex + 1, Default::numFilters)) if (!extendIfNecessary(filters, filterIndex + 1, Default::numFilters))
@ -588,12 +573,9 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode)
setValueFromOpcode(opcode, filters[filterIndex].resonance, Default::filterResonanceRange); setValueFromOpcode(opcode, filters[filterIndex].resonance, Default::filterResonanceRange);
} }
break; break;
case hash("cutoff_oncc&"): case hash("cutoff&_oncc&"): // also cutoff_oncc&, cutoff_cc&, cutoff&_cc&
case hash("cutoff_cc&"):
case hash("cutoff&_oncc&"): // fallthrough
case hash("cutoff&_cc&"):
{ {
const auto filterIndex = opcode.parameters.size() == 1 ? 0 : (opcode.parameters.front() - 1); const auto filterIndex = opcode.parameters.front() - 1;
if (!extendIfNecessary(filters, filterIndex + 1, Default::numFilters)) if (!extendIfNecessary(filters, filterIndex + 1, Default::numFilters))
return false; return false;
@ -604,12 +586,9 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode)
); );
} }
break; break;
case hash("resonance&_oncc&"): case hash("resonance&_oncc&"): // also resonance_oncc&, resonance_cc&, resonance&_cc&
case hash("resonance&_cc&"):
case hash("resonance_oncc&"): // fallthrough
case hash("resonance_cc&"):
{ {
const auto filterIndex = opcode.parameters.size() == 1 ? 0 : (opcode.parameters.front() - 1); const auto filterIndex = opcode.parameters.front() - 1;
if (!extendIfNecessary(filters, filterIndex + 1, Default::numFilters)) if (!extendIfNecessary(filters, filterIndex + 1, Default::numFilters))
return false; return false;
@ -620,60 +599,54 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode)
); );
} }
break; break;
case hash("fil_keytrack"): // fallthrough case hash("fil&_keytrack"): // also fil_keytrack
case hash("fil&_keytrack"):
{ {
const auto filterIndex = opcode.parameters.empty() ? 0 : (opcode.parameters.front() - 1); const auto filterIndex = opcode.parameters.front() - 1;
if (!extendIfNecessary(filters, filterIndex + 1, Default::numFilters)) if (!extendIfNecessary(filters, filterIndex + 1, Default::numFilters))
return false; return false;
setValueFromOpcode(opcode, filters[filterIndex].keytrack, Default::filterKeytrackRange); setValueFromOpcode(opcode, filters[filterIndex].keytrack, Default::filterKeytrackRange);
} }
break; break;
case hash("fil_keycenter"): // fallthrough case hash("fil&_keycenter"): // also fil_keycenter
case hash("fil&_keycenter"):
{ {
const auto filterIndex = opcode.parameters.empty() ? 0 : (opcode.parameters.front() - 1); const auto filterIndex = opcode.parameters.front() - 1;
if (!extendIfNecessary(filters, filterIndex + 1, Default::numFilters)) if (!extendIfNecessary(filters, filterIndex + 1, Default::numFilters))
return false; return false;
setValueFromOpcode(opcode, filters[filterIndex].keycenter, Default::keyRange); setValueFromOpcode(opcode, filters[filterIndex].keycenter, Default::keyRange);
} }
break; break;
case hash("fil_veltrack"): // fallthrough case hash("fil&_veltrack"): // also fil_veltrack
case hash("fil&_veltrack"):
{ {
const auto filterIndex = opcode.parameters.empty() ? 0 : (opcode.parameters.front() - 1); const auto filterIndex = opcode.parameters.front() - 1;
if (!extendIfNecessary(filters, filterIndex + 1, Default::numFilters)) if (!extendIfNecessary(filters, filterIndex + 1, Default::numFilters))
return false; return false;
setValueFromOpcode(opcode, filters[filterIndex].veltrack, Default::filterVeltrackRange); setValueFromOpcode(opcode, filters[filterIndex].veltrack, Default::filterVeltrackRange);
} }
break; break;
case hash("fil_random"): // fallthrough case hash("fil&_random"): // also fil_random
case hash("fil&_random"):
{ {
const auto filterIndex = opcode.parameters.empty() ? 0 : (opcode.parameters.front() - 1); const auto filterIndex = opcode.parameters.front() - 1;
if (!extendIfNecessary(filters, filterIndex + 1, Default::numFilters)) if (!extendIfNecessary(filters, filterIndex + 1, Default::numFilters))
return false; return false;
setValueFromOpcode(opcode, filters[filterIndex].random, Default::filterRandomRange); setValueFromOpcode(opcode, filters[filterIndex].random, Default::filterRandomRange);
} }
break; break;
case hash("fil_gain"): // fallthrough case hash("fil&_gain"): // also fil_gain
case hash("fil&_gain"):
{ {
const auto filterIndex = opcode.parameters.empty() ? 0 : (opcode.parameters.front() - 1); const auto filterIndex = opcode.parameters.front() - 1;
if (!extendIfNecessary(filters, filterIndex + 1, Default::numFilters)) if (!extendIfNecessary(filters, filterIndex + 1, Default::numFilters))
return false; return false;
setValueFromOpcode(opcode, filters[filterIndex].gain, Default::filterGainRange); setValueFromOpcode(opcode, filters[filterIndex].gain, Default::filterGainRange);
} }
break; break;
case hash("fil_gaincc&"): // fallthrough case hash("fil&_gain_oncc&"): // also fil_gain_oncc&
case hash("fil&_gaincc&"):
{ {
const auto filterIndex = opcode.parameters.size() == 1 ? 0 : (opcode.parameters.front() - 1); const auto filterIndex = opcode.parameters.front() - 1;
if (!extendIfNecessary(filters, filterIndex + 1, Default::numFilters)) if (!extendIfNecessary(filters, filterIndex + 1, Default::numFilters))
return false; return false;
@ -684,10 +657,9 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode)
); );
} }
break; break;
case hash("fil_type"): // fallthrough case hash("fil&_type"): // also fil_type, filtype
case hash("fil&_type"):
{ {
const auto filterIndex = opcode.parameters.empty() ? 0 : (opcode.parameters.front() - 1); const auto filterIndex = opcode.parameters.front() - 1;
if (!extendIfNecessary(filters, filterIndex + 1, Default::numFilters)) if (!extendIfNecessary(filters, filterIndex + 1, Default::numFilters))
return false; return false;
@ -713,8 +685,7 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode)
setValueFromOpcode(opcode, equalizers[eqNumber - 1].bandwidth, Default::eqBandwidthRange); setValueFromOpcode(opcode, equalizers[eqNumber - 1].bandwidth, Default::eqBandwidthRange);
} }
break; break;
case hash("eq&_bw_oncc&"): // fallthrough case hash("eq&_bw_oncc&"): // also eq&_bwcc&
case hash("eq&_bwcc&"):
{ {
const auto eqNumber = opcode.parameters.front(); const auto eqNumber = opcode.parameters.front();
if (eqNumber == 0) if (eqNumber == 0)
@ -735,8 +706,7 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode)
setValueFromOpcode(opcode, equalizers[eqNumber - 1].frequency, Default::eqFrequencyRange); setValueFromOpcode(opcode, equalizers[eqNumber - 1].frequency, Default::eqFrequencyRange);
} }
break; break;
case hash("eq&_freq_oncc&"): // fallthrough case hash("eq&_freq_oncc&"): // also eq&_freqcc&
case hash("eq&_freqcc&"):
{ {
const auto eqNumber = opcode.parameters.front(); const auto eqNumber = opcode.parameters.front();
if (eqNumber == 0) if (eqNumber == 0)
@ -770,8 +740,7 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode)
setValueFromOpcode(opcode, equalizers[eqNumber - 1].gain, Default::eqGainRange); setValueFromOpcode(opcode, equalizers[eqNumber - 1].gain, Default::eqGainRange);
} }
break; break;
case hash("eq&_gain_oncc&"): // fallthrough case hash("eq&_gain_oncc&"): // also eq&_gaincc&
case hash("eq&_gaincc&"):
{ {
const auto eqNumber = opcode.parameters.front(); const auto eqNumber = opcode.parameters.front();
if (eqNumber == 0) if (eqNumber == 0)
@ -830,44 +799,37 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode)
case hash("transpose"): case hash("transpose"):
setValueFromOpcode(opcode, transpose, Default::transposeRange); setValueFromOpcode(opcode, transpose, Default::transposeRange);
break; break;
case hash("tune"): // fallthrough case hash("pitch"): // also tune
case hash("pitch"):
setValueFromOpcode(opcode, tune, Default::tuneRange); setValueFromOpcode(opcode, tune, Default::tuneRange);
break; break;
case hash("pitch_curvecc&"): // fallthrough case hash("pitch_curvecc&"): // also tune_curvecc&
case hash("tune_curvecc&"):
if (opcode.parameters.back() >= config::numCCs) if (opcode.parameters.back() >= config::numCCs)
return false; return false;
if (auto value = readOpcode(opcode.value, Default::curveCCRange)) if (auto value = readOpcode(opcode.value, Default::curveCCRange))
tuneCC[opcode.parameters.back()].curve = *value; tuneCC[opcode.parameters.back()].curve = *value;
break; break;
case hash("pitch_stepcc&"): // fallthrough case hash("pitch_stepcc&"): // also tune_stepcc&
case hash("tune_stepcc&"):
if (opcode.parameters.back() >= config::numCCs) if (opcode.parameters.back() >= config::numCCs)
return false; return false;
if (auto value = readOpcode(opcode.value, Default::tuneStepRange)) if (auto value = readOpcode(opcode.value, Default::tuneStepRange))
tuneCC[opcode.parameters.back()].step = *value; tuneCC[opcode.parameters.back()].step = *value;
break; break;
case hash("pitch_smoothcc&"): // fallthrough case hash("pitch_smoothcc&"): // also tune_smoothcc&
case hash("tune_smoothcc&"):
if (opcode.parameters.back() >= config::numCCs) if (opcode.parameters.back() >= config::numCCs)
return false; return false;
if (auto value = readOpcode(opcode.value, Default::smoothCCRange)) if (auto value = readOpcode(opcode.value, Default::smoothCCRange))
tuneCC[opcode.parameters.back()].smooth = *value; tuneCC[opcode.parameters.back()].smooth = *value;
break; break;
case hash("tune_cc&"): case hash("pitch_oncc&"): // also pitch_cc&, tune_cc&, tune_oncc&
case hash("tune_oncc&"):
case hash("pitch_cc&"):
case hash("pitch_oncc&"):
if (opcode.parameters.back() >= config::numCCs) if (opcode.parameters.back() >= config::numCCs)
return false; return false;
if (auto value = readOpcode(opcode.value, Default::tuneCCRange)) if (auto value = readOpcode(opcode.value, Default::tuneCCRange))
tuneCC[opcode.parameters.back()].value = *value; tuneCC[opcode.parameters.back()].value = *value;
break; break;
case hash("bend_up"): case hash("bend_up"): // also bendup
setValueFromOpcode(opcode, bendUp, Default::bendBoundRange); setValueFromOpcode(opcode, bendUp, Default::bendBoundRange);
break; break;
case hash("bend_down"): case hash("bend_down"): // also benddown
setValueFromOpcode(opcode, bendDown, Default::bendBoundRange); setValueFromOpcode(opcode, bendDown, Default::bendBoundRange);
break; break;
case hash("bend_step"): case hash("bend_step"):
@ -926,32 +888,25 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode)
return false; // Was not vel2... return false; // Was not vel2...
setValueFromOpcode(opcode, amplitudeEG.vel2sustain, Default::egOnCCPercentRange); setValueFromOpcode(opcode, amplitudeEG.vel2sustain, Default::egOnCCPercentRange);
break; break;
case hash("ampeg_attackcc&"): // fallthrough case hash("ampeg_attack_oncc&"): // also ampeg_attackcc&
case hash("ampeg_attack_oncc&"):
setCCPairFromOpcode(opcode, amplitudeEG.ccAttack, Default::egOnCCTimeRange); setCCPairFromOpcode(opcode, amplitudeEG.ccAttack, Default::egOnCCTimeRange);
break; break;
case hash("ampeg_decaycc&"): // fallthrough case hash("ampeg_decay_oncc&"): // also ampeg_decaycc&
case hash("ampeg_decay_oncc&"):
setCCPairFromOpcode(opcode, amplitudeEG.ccDecay, Default::egOnCCTimeRange); setCCPairFromOpcode(opcode, amplitudeEG.ccDecay, Default::egOnCCTimeRange);
break; break;
case hash("ampeg_delaycc&"): // fallthrough case hash("ampeg_delay_oncc&"): // also ampeg_delaycc&
case hash("ampeg_delay_oncc&"):
setCCPairFromOpcode(opcode, amplitudeEG.ccDelay, Default::egOnCCTimeRange); setCCPairFromOpcode(opcode, amplitudeEG.ccDelay, Default::egOnCCTimeRange);
break; break;
case hash("ampeg_holdcc&"): // fallthrough case hash("ampeg_hold_oncc&"): // also ampeg_holdcc&
case hash("ampeg_hold_oncc&"):
setCCPairFromOpcode(opcode, amplitudeEG.ccHold, Default::egOnCCTimeRange); setCCPairFromOpcode(opcode, amplitudeEG.ccHold, Default::egOnCCTimeRange);
break; break;
case hash("ampeg_releasecc&"): // fallthrough case hash("ampeg_release_oncc&"): // also ampeg_releasecc&
case hash("ampeg_release_oncc&"):
setCCPairFromOpcode(opcode, amplitudeEG.ccRelease, Default::egOnCCTimeRange); setCCPairFromOpcode(opcode, amplitudeEG.ccRelease, Default::egOnCCTimeRange);
break; break;
case hash("ampeg_startcc&"): // fallthrough case hash("ampeg_start_oncc&"): // also ampeg_startcc&
case hash("ampeg_start_oncc&"):
setCCPairFromOpcode(opcode, amplitudeEG.ccStart, Default::egOnCCPercentRange); setCCPairFromOpcode(opcode, amplitudeEG.ccStart, Default::egOnCCPercentRange);
break; break;
case hash("ampeg_sustaincc&"): // fallthrough case hash("ampeg_sustain_oncc&"): // also ampeg_sustaincc&
case hash("ampeg_sustain_oncc&"):
setCCPairFromOpcode(opcode, amplitudeEG.ccSustain, Default::egOnCCPercentRange); setCCPairFromOpcode(opcode, amplitudeEG.ccSustain, Default::egOnCCPercentRange);
break; break;