From aeb17c1fcac3a35ccb857a3f3ac91b67db9c972f Mon Sep 17 00:00:00 2001 From: Paul Fd Date: Tue, 20 Jul 2021 12:25:03 +0200 Subject: [PATCH] Parse oscillator=auto and only have implicit wavetables if the file is short AND wavetable tags are in --- src/sfizz/Opcode.cpp | 3 +++ src/sfizz/Synth.cpp | 2 +- tests/FilesT.cpp | 21 +++++++++++++++++---- tests/TestFiles/channels_multi.sfz | 4 +++- tests/TestFiles/short_non_wavetable.wav | Bin 0 -> 5860 bytes 5 files changed, 24 insertions(+), 6 deletions(-) create mode 100644 tests/TestFiles/short_non_wavetable.wav 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 0000000000000000000000000000000000000000..e71973d35e1a76f2776711c29abe809e6e2bb4fd GIT binary patch literal 5860 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 J@KSgg{D0Wnvl0LR literal 0 HcmV?d00001