From 80736aec991fe6af7fa43e71bdda5e5d2580e978 Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Mon, 22 Jun 2020 06:35:31 +0200 Subject: [PATCH] Support the opcode oscillator_quality --- src/sfizz/Defaults.h | 2 ++ src/sfizz/Region.cpp | 6 ++++++ src/sfizz/Region.h | 1 + src/sfizz/Voice.cpp | 4 ++++ 4 files changed, 13 insertions(+) diff --git a/src/sfizz/Defaults.h b/src/sfizz/Defaults.h index 78410f8a..f5edae7f 100644 --- a/src/sfizz/Defaults.h +++ b/src/sfizz/Defaults.h @@ -67,6 +67,8 @@ namespace Default constexpr Range oscillatorMultiRange { 1, config::oscillatorsPerVoice }; constexpr float oscillatorDetune { 0 }; constexpr Range oscillatorDetuneRange { -9600, 9600 }; + constexpr int oscillatorQuality { 1 }; + constexpr Range oscillatorQualityRange { 0, 3 }; // Instrument setting: voice lifecycle constexpr uint32_t group { 0 }; diff --git a/src/sfizz/Region.cpp b/src/sfizz/Region.cpp index 47cf33bd..287fc7ad 100644 --- a/src/sfizz/Region.cpp +++ b/src/sfizz/Region.cpp @@ -135,6 +135,12 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode) case hash("oscillator_detune"): setValueFromOpcode(opcode, oscillatorDetune, Default::oscillatorDetuneRange); break; + case hash("oscillator_quality"): + if (opcode.value == "-1") + oscillatorQuality.reset(); + else + setValueFromOpcode(opcode, oscillatorQuality, Default::oscillatorQualityRange); + break; // Instrument settings: voice lifecycle case hash("group"): // also polyphony_group diff --git a/src/sfizz/Region.h b/src/sfizz/Region.h index c346949e..de80f53e 100644 --- a/src/sfizz/Region.h +++ b/src/sfizz/Region.h @@ -276,6 +276,7 @@ struct Region { bool oscillator = false; int oscillatorMulti = Default::oscillatorMulti; float oscillatorDetune = Default::oscillatorDetune; + absl::optional oscillatorQuality; // Instrument settings: voice lifecycle uint32_t group { Default::group }; // group diff --git a/src/sfizz/Voice.cpp b/src/sfizz/Voice.cpp index 7e384345..53066593 100644 --- a/src/sfizz/Voice.cpp +++ b/src/sfizz/Voice.cpp @@ -65,16 +65,20 @@ void sfz::Voice::startVoice(Region* region, int delay, int number, float value, wave = resources.wavePool.getWaveSaw(); break; } + const int quality = region->oscillatorQuality ? *region->oscillatorQuality : Default::oscillatorQuality; for (WavetableOscillator& osc : waveOscillators) { osc.setWavetable(wave); osc.setPhase(region->getPhase()); + osc.setQuality(quality); } setupOscillatorUnison(); } else if (region->oscillator) { const WavetableMulti* wave = resources.wavePool.getFileWave(region->sampleId.filename()); + const int quality = region->oscillatorQuality ? *region->oscillatorQuality : Default::oscillatorQuality; for (WavetableOscillator& osc : waveOscillators) { osc.setWavetable(wave); osc.setPhase(region->getPhase()); + osc.setQuality(quality); } setupOscillatorUnison(); } else {