diff --git a/src/sfizz/Opcode.cpp b/src/sfizz/Opcode.cpp index e860c536..f27a6685 100644 --- a/src/sfizz/Opcode.cpp +++ b/src/sfizz/Opcode.cpp @@ -327,6 +327,9 @@ absl::optional readBoolean(absl::string_view value) template <> absl::optional Opcode::readOptional(OpcodeSpec, absl::string_view value) { + if (value == "auto") + return OscillatorEnabled::Auto; + auto v = readBoolean(value); if (!v) return absl::nullopt; diff --git a/src/sfizz/Synth.cpp b/src/sfizz/Synth.cpp index fcc11f51..468623b2 100644 --- a/src/sfizz/Synth.cpp +++ b/src/sfizz/Synth.cpp @@ -638,7 +638,7 @@ void Synth::Impl::finalizeSfzLoad() region.sampleId.reset(new FileId("*silence")); region.hasWavetableSample = false; } else { - region.hasWavetableSample |= true; + region.hasWavetableSample &= true; } } } diff --git a/tests/FilesT.cpp b/tests/FilesT.cpp index 196f5bcf..b65b9d8b 100644 --- a/tests/FilesT.cpp +++ b/tests/FilesT.cpp @@ -274,7 +274,7 @@ TEST_CASE("[Files] Channels (channels_multi.sfz)") { Synth synth; synth.loadSfzFile(fs::current_path() / "tests/TestFiles/channels_multi.sfz"); - REQUIRE(synth.getNumRegions() == 10); + REQUIRE(synth.getNumRegions() == 12); int regionNumber = 0; const Region* region = nullptr; @@ -327,14 +327,27 @@ TEST_CASE("[Files] Channels (channels_multi.sfz)") REQUIRE(!region->isOscillator()); REQUIRE(region->oscillatorEnabled == OscillatorEnabled::Off); - // implicit wavetable (sound file < 3000 frames) + // implicit wavetable (sound file < 3000 frames and wavetable tags) region = synth.getRegionView(regionNumber++); - REQUIRE(region->sampleId->filename() == "ramp_wave.wav"); - REQUIRE(!region->isStereo()); + REQUIRE(region->sampleId->filename() == "wavetables/surge.wav"); REQUIRE(!region->isGenerator()); REQUIRE(region->isOscillator()); REQUIRE(region->oscillatorEnabled == OscillatorEnabled::Auto); + // Parse oscillator=auto and same as above + region = synth.getRegionView(regionNumber++); + REQUIRE(region->sampleId->filename() == "wavetables/surge.wav"); + REQUIRE(!region->isGenerator()); + REQUIRE(region->isOscillator()); + REQUIRE(region->oscillatorEnabled == OscillatorEnabled::Auto); + + // implicit non wavetable (sound file < 3000 frames but no wavetable tags) + region = synth.getRegionView(regionNumber++); + REQUIRE(region->sampleId->filename() == "short_non_wavetable.wav"); + REQUIRE(!region->isGenerator()); + REQUIRE(!region->isOscillator()); + REQUIRE(region->oscillatorEnabled == OscillatorEnabled::Auto); + // implicit non-wavetable (sound file >= 3000 frames) region = synth.getRegionView(regionNumber++); REQUIRE(region->sampleId->filename() == "snare.wav"); diff --git a/tests/TestFiles/channels_multi.sfz b/tests/TestFiles/channels_multi.sfz index ee6d6acf..9921b152 100644 --- a/tests/TestFiles/channels_multi.sfz +++ b/tests/TestFiles/channels_multi.sfz @@ -4,7 +4,9 @@ sample=ramp_wave.wav oscillator=on oscillator_multi=3 sample=ramp_wave.wav oscillator=off sample=ramp_wave.wav oscillator=off oscillator_multi=3 - sample=ramp_wave.wav + sample=wavetables/surge.wav + oscillator=auto sample=wavetables/surge.wav + sample=short_non_wavetable.wav sample=snare.wav sample=*sine oscillator_multi=1 sample=*sine oscillator_multi=2 diff --git a/tests/TestFiles/short_non_wavetable.wav b/tests/TestFiles/short_non_wavetable.wav new file mode 100644 index 00000000..e71973d3 Binary files /dev/null and b/tests/TestFiles/short_non_wavetable.wav differ