This commit is contained in:
2026-01-25 20:43:12 +01:00
parent cf5994e604
commit 250e359fc5
6 changed files with 176 additions and 23 deletions

View File

@@ -315,16 +315,20 @@ impl Forth {
}
Op::Rand => {
let max = stack.pop().ok_or("stack underflow")?.as_float()?;
let min = stack.pop().ok_or("stack underflow")?.as_float()?;
let val = self.rng.lock().unwrap().gen_range(min..max);
stack.push(Value::Float(val, None));
}
Op::Rrand => {
let max = stack.pop().ok_or("stack underflow")?.as_int()?;
let min = stack.pop().ok_or("stack underflow")?.as_int()?;
let val = self.rng.lock().unwrap().gen_range(min..=max);
stack.push(Value::Int(val, None));
let max = stack.pop().ok_or("stack underflow")?;
let min = stack.pop().ok_or("stack underflow")?;
match (&min, &max) {
(Value::Int(min_i, _), Value::Int(max_i, _)) => {
let val = self.rng.lock().unwrap().gen_range(*min_i..=*max_i);
stack.push(Value::Int(val, None));
}
_ => {
let min_f = min.as_float()?;
let max_f = max.as_float()?;
let val = self.rng.lock().unwrap().gen_range(min_f..max_f);
stack.push(Value::Float(val, None));
}
}
}
Op::Seed => {
let s = stack.pop().ok_or("stack underflow")?.as_int()?;
@@ -536,6 +540,21 @@ impl Forth {
stack.push(Value::Float(note, None));
}
Op::Degree(pattern) => {
let degree = stack.pop().ok_or("stack underflow")?.as_int()?;
let len = pattern.len() as i64;
let octave_offset = degree.div_euclid(len);
let idx = degree.rem_euclid(len) as usize;
let midi = 60 + octave_offset * 12 + pattern[idx];
stack.push(Value::Int(midi, None));
}
Op::Oct => {
let shift = stack.pop().ok_or("stack underflow")?.as_int()?;
let note = stack.pop().ok_or("stack underflow")?.as_int()?;
stack.push(Value::Int(note + shift * 12, None));
}
Op::At => {
let pos = stack.pop().ok_or("stack underflow")?.as_float()?;
let parent = time_stack.last().ok_or("time stack underflow")?;