Support the opcode oscillator_quality

This commit is contained in:
Jean Pierre Cimalando 2020-06-22 06:35:31 +02:00
parent c9b4687661
commit 80736aec99
4 changed files with 13 additions and 0 deletions

View file

@ -67,6 +67,8 @@ namespace Default
constexpr Range<int> oscillatorMultiRange { 1, config::oscillatorsPerVoice }; constexpr Range<int> oscillatorMultiRange { 1, config::oscillatorsPerVoice };
constexpr float oscillatorDetune { 0 }; constexpr float oscillatorDetune { 0 };
constexpr Range<float> oscillatorDetuneRange { -9600, 9600 }; constexpr Range<float> oscillatorDetuneRange { -9600, 9600 };
constexpr int oscillatorQuality { 1 };
constexpr Range<int> oscillatorQualityRange { 0, 3 };
// Instrument setting: voice lifecycle // Instrument setting: voice lifecycle
constexpr uint32_t group { 0 }; constexpr uint32_t group { 0 };

View file

@ -135,6 +135,12 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode)
case hash("oscillator_detune"): case hash("oscillator_detune"):
setValueFromOpcode(opcode, oscillatorDetune, Default::oscillatorDetuneRange); setValueFromOpcode(opcode, oscillatorDetune, Default::oscillatorDetuneRange);
break; break;
case hash("oscillator_quality"):
if (opcode.value == "-1")
oscillatorQuality.reset();
else
setValueFromOpcode(opcode, oscillatorQuality, Default::oscillatorQualityRange);
break;
// Instrument settings: voice lifecycle // Instrument settings: voice lifecycle
case hash("group"): // also polyphony_group case hash("group"): // also polyphony_group

View file

@ -276,6 +276,7 @@ struct Region {
bool oscillator = false; bool oscillator = false;
int oscillatorMulti = Default::oscillatorMulti; int oscillatorMulti = Default::oscillatorMulti;
float oscillatorDetune = Default::oscillatorDetune; float oscillatorDetune = Default::oscillatorDetune;
absl::optional<int> oscillatorQuality;
// Instrument settings: voice lifecycle // Instrument settings: voice lifecycle
uint32_t group { Default::group }; // group uint32_t group { Default::group }; // group

View file

@ -65,16 +65,20 @@ void sfz::Voice::startVoice(Region* region, int delay, int number, float value,
wave = resources.wavePool.getWaveSaw(); wave = resources.wavePool.getWaveSaw();
break; break;
} }
const int quality = region->oscillatorQuality ? *region->oscillatorQuality : Default::oscillatorQuality;
for (WavetableOscillator& osc : waveOscillators) { for (WavetableOscillator& osc : waveOscillators) {
osc.setWavetable(wave); osc.setWavetable(wave);
osc.setPhase(region->getPhase()); osc.setPhase(region->getPhase());
osc.setQuality(quality);
} }
setupOscillatorUnison(); setupOscillatorUnison();
} else if (region->oscillator) { } else if (region->oscillator) {
const WavetableMulti* wave = resources.wavePool.getFileWave(region->sampleId.filename()); const WavetableMulti* wave = resources.wavePool.getFileWave(region->sampleId.filename());
const int quality = region->oscillatorQuality ? *region->oscillatorQuality : Default::oscillatorQuality;
for (WavetableOscillator& osc : waveOscillators) { for (WavetableOscillator& osc : waveOscillators) {
osc.setWavetable(wave); osc.setWavetable(wave);
osc.setPhase(region->getPhase()); osc.setPhase(region->getPhase());
osc.setQuality(quality);
} }
setupOscillatorUnison(); setupOscillatorUnison();
} else { } else {