diff --git a/crates/forth/src/vm.rs b/crates/forth/src/vm.rs index 058dd50..a41a445 100644 --- a/crates/forth/src/vm.rs +++ b/crates/forth/src/vm.rs @@ -1750,6 +1750,7 @@ fn emit_output( out.push('/'); let has_dur = params.iter().any(|(k, _)| *k == "dur"); + let has_release = params.iter().any(|(k, _)| *k == "release"); let delaytime_idx = params.iter().position(|(k, _)| *k == "delaytime"); if let Some(s) = sound { @@ -1789,6 +1790,13 @@ fn emit_output( let _ = write!(&mut out, "dur/{}", step_duration * 4.0); } + if !has_release { + if !out.ends_with('/') { + out.push('/'); + } + let _ = write!(&mut out, "release/{}", 12.0 * step_duration); + } + if sound.is_some() && delaytime_idx.is_none() { if !out.ends_with('/') { out.push('/'); diff --git a/crates/forth/src/words/sound.rs b/crates/forth/src/words/sound.rs index 86679a2..16484f6 100644 --- a/crates/forth/src/words/sound.rs +++ b/crates/forth/src/words/sound.rs @@ -166,6 +166,16 @@ pub(super) const WORDS: &[Word] = &[ compile: Param, varargs: true, }, + Word { + name: "stretch", + aliases: &[], + category: "Sample", + stack: "(v.. --)", + desc: "Time stretch factor (pitch-independent)", + example: "2 stretch", + compile: Param, + varargs: true, + }, Word { name: "begin", aliases: &[],