Note polyphony tests and bugs
This commit is contained in:
parent
fa37669e08
commit
bb621282c9
2 changed files with 71 additions and 8 deletions
|
|
@ -128,14 +128,6 @@ struct SisterVoiceRing {
|
||||||
*/
|
*/
|
||||||
class SisterVoiceRingBuilder {
|
class SisterVoiceRingBuilder {
|
||||||
public:
|
public:
|
||||||
~SisterVoiceRingBuilder() noexcept {
|
|
||||||
if (lastStartedVoice != nullptr) {
|
|
||||||
ASSERT(firstStartedVoice);
|
|
||||||
lastStartedVoice->setNextSisterVoice(firstStartedVoice);
|
|
||||||
firstStartedVoice->setPreviousSisterVoice(lastStartedVoice);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Add a voice to the sister ring
|
* @brief Add a voice to the sister ring
|
||||||
*
|
*
|
||||||
|
|
@ -145,6 +137,9 @@ public:
|
||||||
if (firstStartedVoice == nullptr)
|
if (firstStartedVoice == nullptr)
|
||||||
firstStartedVoice = voice;
|
firstStartedVoice = voice;
|
||||||
|
|
||||||
|
firstStartedVoice->setPreviousSisterVoice(voice);
|
||||||
|
voice->setNextSisterVoice(firstStartedVoice);
|
||||||
|
|
||||||
if (lastStartedVoice != nullptr) {
|
if (lastStartedVoice != nullptr) {
|
||||||
voice->setPreviousSisterVoice(lastStartedVoice);
|
voice->setPreviousSisterVoice(lastStartedVoice);
|
||||||
lastStartedVoice->setNextSisterVoice(voice);
|
lastStartedVoice->setNextSisterVoice(voice);
|
||||||
|
|
|
||||||
|
|
@ -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)->getTriggerEvent().value == 61_norm);
|
||||||
REQUIRE(!synth.getVoiceView(1)->releasedOrFree());
|
REQUIRE(!synth.getVoiceView(1)->releasedOrFree());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("[Polyphony] Note polyphony operates on release voices and sustain pedal")
|
||||||
|
{
|
||||||
|
sfz::Synth synth;
|
||||||
|
sfz::AudioBuffer<float> buffer { 2, blockSize };
|
||||||
|
synth.loadSfzString(fs::current_path() / "tests/TestFiles/polyphony.sfz", R"(
|
||||||
|
<region> key=48 sample=*silence
|
||||||
|
<region> 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<float> buffer { 2, blockSize };
|
||||||
|
synth.loadSfzString(fs::current_path() / "tests/TestFiles/polyphony.sfz", R"(
|
||||||
|
<region> key=48 sample=*silence
|
||||||
|
<region> 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());
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue