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,
Noise,
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 => {
stack.push(Value::Marker);
}

View File

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