From 0549b983af6dd9ac0268ef0521b67178ed9c637d Mon Sep 17 00:00:00 2001 From: alex Date: Wed, 20 Jan 2021 15:31:49 +0100 Subject: [PATCH] Remove unused phase in ADSR --- ADSR.h | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/ADSR.h b/ADSR.h index 17607d47c..df3e05990 100644 --- a/ADSR.h +++ b/ADSR.h @@ -131,19 +131,25 @@ class ADSR */ void update(){ // control rate - switch(current_phase->phase_type) { + switch(current_phase->phase_type) { case ATTACK: - checkForAndSetNextPhase(&decay); - break; + if (decay.lerp_steps > 0) { + checkForAndSetNextPhase(&decay); + break; + } case DECAY: - checkForAndSetNextPhase(&sustain); - break; + if (sustain.lerp_steps > 0) { + checkForAndSetNextPhase(&sustain); + break; + } case SUSTAIN: - checkForAndSetNextPhase(&release); - break; + if (release.lerp_steps > 0) { + checkForAndSetNextPhase(&release); + break; + } case RELEASE: checkForAndSetNextPhase(&idle); @@ -152,7 +158,7 @@ class ADSR case IDLE: adsr_playing = false; break; - } + } } @@ -180,6 +186,16 @@ class ADSR void noteOn(bool reset=false){ if (reset) transition.set(0); setPhase(&attack); + if (attack.lerp_steps == 0) { + if (decay.lerp_steps > 0) + setPhase(&decay); + else if (sustain.lerp_steps > 0) + setPhase(&sustain); + else if (release.lerp_steps > 0) + setPhase(&release); + else + setPhase(&idle); + } adsr_playing = true; }