Loop word

This commit is contained in:
2026-01-24 12:47:19 +01:00
parent e1aff189cd
commit cf5994e604
3 changed files with 16 additions and 0 deletions

View File

@@ -80,4 +80,5 @@ pub enum Op {
Range, Range,
Noise, Noise,
Chain, Chain,
Loop,
} }

View File

@@ -647,6 +647,13 @@ impl Forth {
} }
} }
Op::Loop => {
let beats = stack.pop().ok_or("stack underflow")?.as_float()?;
let dur = beats * 60.0 / ctx.tempo / ctx.speed;
cmd.set_param("fit".into(), dur.to_string());
cmd.set_param("dur".into(), dur.to_string());
}
Op::ListStart => { Op::ListStart => {
stack.push(Value::Marker); stack.push(Value::Marker);
} }

View File

@@ -614,6 +614,13 @@ pub const WORDS: &[Word] = &[
example: "{ emit } 3 div for", example: "{ emit } 3 div for",
compile: Simple, compile: Simple,
}, },
Word {
name: "loop",
stack: "(n --)",
desc: "Fit sample to n beats",
example: "\"break\" s 4 loop emit",
compile: Simple,
},
Word { Word {
name: "|", name: "|",
stack: "(-- marker)", stack: "(-- marker)",
@@ -1565,6 +1572,7 @@ pub(super) fn simple_op(name: &str) -> Option<Op> {
"range" => Op::Range, "range" => Op::Range,
"noise" => Op::Noise, "noise" => Op::Noise,
"chain" => Op::Chain, "chain" => Op::Chain,
"loop" => Op::Loop,
_ => return None, _ => return None,
}) })
} }