diff --git a/classes/CleanEvent.sc b/classes/CleanEvent.sc index bbd2146..a57e246 100644 --- a/classes/CleanEvent.sc +++ b/classes/CleanEvent.sc @@ -41,7 +41,52 @@ CleanEvent { if(~diversion.isNil) { ~notFound.value } } { // the stored sound event becomes the environment's proto slot, which partly can override its parent - currentEnvironment.proto = soundEvent + currentEnvironment.proto = soundEvent; + + + // legato/sustain/release overlap fix: + + // synth's envelope release time cut along with event if legato < 1 + ~legato = if(~legato ?? { 1 } >= 1) { + ~legato ?? { 1 } + (~dur ?? { 1 } * (~rel ?? { + if(~clean.soundLibrary.synthEvents[~snd].notNil) { + if(SynthDescLib.global.at(~clean.soundLibrary.synthEvents[~snd][0].[\instrument]).controlDict[\release].notNil) { + SynthDescLib.global.at(~clean.soundLibrary.synthEvents[~snd][0].[\instrument]).controlDict[\release].defaultValue + } { + if(SynthDescLib.global.at(~clean.soundLibrary.synthEvents[~snd][0].[\instrument]).controlDict[\rel].notNil) { + SynthDescLib.global.at(~clean.soundLibrary.synthEvents[~snd][0].[\instrument]).controlDict[\rel].defaultValue + } { 1 } } + } { if(SynthDescLib.global.at(~snd).notNil) { + if(SynthDescLib.global.at(~snd).controlDict[\release].notNil) { + SynthDescLib.global.at(~snd).controlDict[\release].defaultValue + } { + if(SynthDescLib.global.at(~snd).controlDict[\rel].notNil) { + SynthDescLib.global.at(~snd).controlDict[\rel].defaultValue + } { 1 } } + } { 1 } } })) + } { + ~legato + } + + // synth's envelope release time persists (still happens) even if legato < 1 + /* + ~legato = ~legato ?? { 1 } + (~dur ?? { 1 } * (~rel ?? { + if(~clean.soundLibrary.synthEvents[~snd].notNil) { + if(SynthDescLib.global.at(~clean.soundLibrary.synthEvents[~snd][0].[\instrument]).controlDict[\release].notNil) { + SynthDescLib.global.at(~clean.soundLibrary.synthEvents[~snd][0].[\instrument]).controlDict[\release].defaultValue + } { + if(SynthDescLib.global.at(~clean.soundLibrary.synthEvents[~snd][0].[\instrument]).controlDict[\rel].notNil) { + SynthDescLib.global.at(~clean.soundLibrary.synthEvents[~snd][0].[\instrument]).controlDict[\rel].defaultValue + } { 1 } } + } { if(SynthDescLib.global.at(~snd).notNil) { + if(SynthDescLib.global.at(~snd).controlDict[\release].notNil) { + SynthDescLib.global.at(~snd).controlDict[\release].defaultValue + } { + if(SynthDescLib.global.at(~snd).controlDict[\rel].notNil) { + SynthDescLib.global.at(~snd).controlDict[\rel].defaultValue + } { 1 } } + } { 1 } } })) + */ } }