Set the envelope free-running also when loopmode=one_shot

This commit is contained in:
Paul Fd 2020-04-01 09:57:59 +02:00
parent 75c27b0577
commit 5a10af74ed
3 changed files with 40 additions and 1 deletions

View file

@ -40,7 +40,11 @@ void ADSREnvelope<Type>::reset(const EGDescription& desc, const Region& region,
releaseDelay = 0;
shouldRelease = false;
freeRunning = ((region.trigger == SfzTrigger::release) || (region.trigger == SfzTrigger::release_key));
freeRunning = (
(region.trigger == SfzTrigger::release)
|| (region.trigger == SfzTrigger::release_key)
|| region.loopMode == SfzLoopMode::one_shot
);
currentValue = this->start;
currentState = State::Delay;
}

View file

@ -224,6 +224,29 @@ TEST_CASE("[Synth] Trigger=release_key and an envelope properly kills the voice
REQUIRE( synth.getVoiceView(0)->isFree() );
}
TEST_CASE("[Synth] loopmode=one_shot and an envelope properly kills the voice at the end of the envelope")
{
sfz::Synth synth;
synth.setSampleRate(48000);
synth.setSamplesPerBlock(480);
sfz::AudioBuffer<float> buffer(2, 480);
synth.setNumVoices(1);
synth.loadSfzFile(fs::current_path() / "tests/TestFiles/envelope_one_shot.sfz");
synth.noteOn(0, 60, 63);
synth.noteOff(0, 60, 63);
REQUIRE( !synth.getVoiceView(0)->isFree() );
synth.renderBlock(buffer); // Attack (0.02)
synth.renderBlock(buffer);
synth.renderBlock(buffer); // Decay (0.02)
synth.renderBlock(buffer);
synth.renderBlock(buffer); // Release (0.1)
REQUIRE( synth.getVoiceView(0)->canBeStolen() );
// Release is 0.1s
for (int i = 0; i < 10; ++i)
synth.renderBlock(buffer);
REQUIRE( synth.getVoiceView(0)->isFree() );
}
TEST_CASE("[Synth] Number of effect buses and resetting behavior")
{
sfz::Synth synth;

View file

@ -0,0 +1,12 @@
<group>
lovel=0
hivel=127
<region>
sample=*noise
loop_mode=one_shot
ampeg_attack=0.02
ampeg_decay=0.02
ampeg_release=0.1
ampeg_sustain=0