From bb621282c9b13e4316fa4a2514a49b0fc23f6be6 Mon Sep 17 00:00:00 2001 From: Paul Ferrand Date: Wed, 26 Aug 2020 01:27:57 +0200 Subject: [PATCH] Note polyphony tests and bugs --- src/sfizz/SisterVoiceRing.h | 11 ++---- tests/PolyphonyT.cpp | 68 +++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 8 deletions(-) diff --git a/src/sfizz/SisterVoiceRing.h b/src/sfizz/SisterVoiceRing.h index 93dbc515..4e7cc743 100644 --- a/src/sfizz/SisterVoiceRing.h +++ b/src/sfizz/SisterVoiceRing.h @@ -128,14 +128,6 @@ struct SisterVoiceRing { */ class SisterVoiceRingBuilder { public: - ~SisterVoiceRingBuilder() noexcept { - if (lastStartedVoice != nullptr) { - ASSERT(firstStartedVoice); - lastStartedVoice->setNextSisterVoice(firstStartedVoice); - firstStartedVoice->setPreviousSisterVoice(lastStartedVoice); - } - } - /** * @brief Add a voice to the sister ring * @@ -145,6 +137,9 @@ public: if (firstStartedVoice == nullptr) firstStartedVoice = voice; + firstStartedVoice->setPreviousSisterVoice(voice); + voice->setNextSisterVoice(firstStartedVoice); + if (lastStartedVoice != nullptr) { voice->setPreviousSisterVoice(lastStartedVoice); lastStartedVoice->setNextSisterVoice(voice); diff --git a/tests/PolyphonyT.cpp b/tests/PolyphonyT.cpp index 1ff525cf..b7de5c7a 100644 --- a/tests/PolyphonyT.cpp +++ b/tests/PolyphonyT.cpp @@ -429,3 +429,71 @@ TEST_CASE("[Polyphony] Note polyphony operates on release voices (masking works REQUIRE( synth.getVoiceView(1)->getTriggerEvent().value == 61_norm); REQUIRE(!synth.getVoiceView(1)->releasedOrFree()); } + +TEST_CASE("[Polyphony] Note polyphony operates on release voices and sustain pedal") +{ + sfz::Synth synth; + sfz::AudioBuffer buffer { 2, blockSize }; + synth.loadSfzString(fs::current_path() / "tests/TestFiles/polyphony.sfz", R"( + key=48 sample=*silence + key=48 note_polyphony=1 sample=*saw trigger=release ampeg_attack=1 ampeg_decay=1 + )"); + synth.cc(0, 64, 127); + synth.noteOn(0, 48, 61 ); + synth.noteOff(1, 48, 0 ); + synth.noteOn(2, 48, 62 ); + synth.noteOff(3, 48, 0 ); + synth.noteOn(4, 48, 63 ); + synth.noteOff(5, 48, 0 ); + REQUIRE( synth.getNumActiveVoices(true) == 3); + REQUIRE( numPlayingVoices(synth) == 3 ); + synth.cc(20, 64, 0); + REQUIRE( synth.getNumActiveVoices(true) == 6 ); + REQUIRE( numPlayingVoices(synth) == 1 ); + REQUIRE( synth.getVoiceView(0)->getTriggerEvent().value == 61_norm); + REQUIRE( synth.getVoiceView(0)->releasedOrFree()); + REQUIRE( synth.getVoiceView(1)->getTriggerEvent().value == 62_norm); + REQUIRE( synth.getVoiceView(1)->releasedOrFree()); + REQUIRE( synth.getVoiceView(2)->getTriggerEvent().value == 63_norm); + REQUIRE( synth.getVoiceView(2)->releasedOrFree()); + REQUIRE( synth.getVoiceView(3)->getTriggerEvent().value == 61_norm); + REQUIRE( synth.getVoiceView(3)->releasedOrFree()); + REQUIRE( synth.getVoiceView(4)->getTriggerEvent().value == 62_norm); + REQUIRE( synth.getVoiceView(4)->releasedOrFree()); + REQUIRE( synth.getVoiceView(5)->getTriggerEvent().value == 63_norm); + REQUIRE(!synth.getVoiceView(5)->releasedOrFree()); +} + +TEST_CASE("[Polyphony] Note polyphony operates on release voices and sustain pedal (masking)") +{ + sfz::Synth synth; + sfz::AudioBuffer buffer { 2, blockSize }; + synth.loadSfzString(fs::current_path() / "tests/TestFiles/polyphony.sfz", R"( + key=48 sample=*silence + key=48 note_polyphony=1 sample=*saw trigger=release ampeg_attack=1 ampeg_decay=1 + )"); + synth.cc(0, 64, 127); + synth.noteOn(0, 48, 63 ); + synth.noteOff(1, 48, 0 ); + synth.noteOn(2, 48, 62 ); + synth.noteOff(3, 48, 0 ); + synth.noteOn(4, 48, 61 ); + synth.noteOff(5, 48, 0 ); + REQUIRE( synth.getNumActiveVoices(true) == 3); + REQUIRE( numPlayingVoices(synth) == 3 ); + synth.cc(20, 64, 0); + REQUIRE( synth.getNumActiveVoices(true) == 6 ); + REQUIRE( numPlayingVoices(synth) == 3 ); + REQUIRE( synth.getVoiceView(0)->getTriggerEvent().value == 63_norm); + REQUIRE( synth.getVoiceView(0)->releasedOrFree()); + REQUIRE( synth.getVoiceView(1)->getTriggerEvent().value == 62_norm); + REQUIRE( synth.getVoiceView(1)->releasedOrFree()); + REQUIRE( synth.getVoiceView(2)->getTriggerEvent().value == 61_norm); + REQUIRE( synth.getVoiceView(2)->releasedOrFree()); + REQUIRE( synth.getVoiceView(3)->getTriggerEvent().value == 63_norm); + REQUIRE(!synth.getVoiceView(3)->releasedOrFree()); + REQUIRE( synth.getVoiceView(4)->getTriggerEvent().value == 62_norm); + REQUIRE(!synth.getVoiceView(4)->releasedOrFree()); + REQUIRE( synth.getVoiceView(5)->getTriggerEvent().value == 61_norm); + REQUIRE(!synth.getVoiceView(5)->releasedOrFree()); +}