From 9cc17d14de3ffde84cbe6af79d4d7c2e42e1dac0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Forment?= Date: Thu, 12 Mar 2026 17:33:50 +0100 Subject: [PATCH] Feat: add new words for new audio rate modulations --- crates/forth/src/vm.rs | 2 +- crates/forth/src/words/compile.rs | 3 +++ crates/forth/src/words/sound.rs | 30 ++++++++++++++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/crates/forth/src/vm.rs b/crates/forth/src/vm.rs index 02ceaed..9ecf82f 100644 --- a/crates/forth/src/vm.rs +++ b/crates/forth/src/vm.rs @@ -1433,7 +1433,7 @@ impl Forth { let dur = pop_float(stack)? * ctx.step_duration(); let end = pop_float(stack)?; let start = pop_float(stack)?; - let suffix = match curve { 1 => "e", 2 => "s", _ => "" }; + let suffix = match curve { 1 => "e", 2 => "s", 3 => "i", 4 => "o", 5 => "p", _ => "" }; let s = format!("{start}>{end}:{dur}{suffix}"); stack.push(Value::Str(s.into(), None)); } diff --git a/crates/forth/src/words/compile.rs b/crates/forth/src/words/compile.rs index 7a49c08..c1e1249 100644 --- a/crates/forth/src/words/compile.rs +++ b/crates/forth/src/words/compile.rs @@ -136,6 +136,9 @@ pub(super) fn simple_op(name: &str) -> Option { "slide" => Op::ModSlide(0), "expslide" => Op::ModSlide(1), "sslide" => Op::ModSlide(2), + "islide" => Op::ModSlide(3), + "oslide" => Op::ModSlide(4), + "pslide" => Op::ModSlide(5), "jit" => Op::ModRnd(0), "sjit" => Op::ModRnd(1), "drunk" => Op::ModRnd(2), diff --git a/crates/forth/src/words/sound.rs b/crates/forth/src/words/sound.rs index f4aa46a..ca18758 100644 --- a/crates/forth/src/words/sound.rs +++ b/crates/forth/src/words/sound.rs @@ -862,6 +862,36 @@ pub(super) const WORDS: &[Word] = &[ compile: Simple, varargs: false, }, + Word { + name: "islide", + aliases: &[], + category: "Audio Modulation", + stack: "(start end dur -- str)", + desc: "Swell transition (slow start, fast finish): start>end:duri", + example: "200 4000 1 islide lpf", + compile: Simple, + varargs: false, + }, + Word { + name: "oslide", + aliases: &[], + category: "Audio Modulation", + stack: "(start end dur -- str)", + desc: "Pluck transition (fast attack, slow settle): start>end:duro", + example: "0 1 0.5 oslide gain", + compile: Simple, + varargs: false, + }, + Word { + name: "pslide", + aliases: &[], + category: "Audio Modulation", + stack: "(start end dur -- str)", + desc: "Stair transition (8 discrete steps): start>end:durp", + example: "0 1 2 pslide gain", + compile: Simple, + varargs: false, + }, Word { name: "jit", aliases: &[],