Loop word
This commit is contained in:
@@ -80,4 +80,5 @@ pub enum Op {
|
||||
Range,
|
||||
Noise,
|
||||
Chain,
|
||||
Loop,
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user