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 float oscillatorDetune { 0 };
constexpr Range<float> oscillatorDetuneRange { -9600, 9600 };
constexpr int oscillatorQuality { 1 };
constexpr Range<int> oscillatorQualityRange { 0, 3 };
// Instrument setting: voice lifecycle
constexpr uint32_t group { 0 };

View file

@ -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

View file

@ -276,6 +276,7 @@ struct Region {
bool oscillator = false;
int oscillatorMulti = Default::oscillatorMulti;
float oscillatorDetune = Default::oscillatorDetune;
absl::optional<int> oscillatorQuality;
// Instrument settings: voice lifecycle
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();
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 {