scales
This commit is contained in:
@@ -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")?;
|
||||
|
||||
Reference in New Issue
Block a user