simplified the quantizer and wrote more tests

This commit is contained in:
Weird Constructor 2021-08-28 16:28:03 +02:00
parent b22c084b08
commit 204c415c06
2 changed files with 44 additions and 37 deletions

View file

@ -2137,16 +2137,14 @@ impl<F: Flt> TriSawLFO<F> {
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct Quantizer { pub struct Quantizer {
old_mask: i64, old_mask: i64,
keys: [f32; 12], lkup_tbl: [f32; 24],
lkup_tbl: [(i8, i8); 24],
} }
impl Quantizer { impl Quantizer {
pub fn new() -> Self { pub fn new() -> Self {
Self { Self {
old_mask: 0xFFFF_FFFF, old_mask: 0xFFFF_FFFF,
keys: [0.0; 12], lkup_tbl: [0.0; 24]
lkup_tbl: [(0, 0); 24]
} }
} }
@ -2157,10 +2155,6 @@ impl Quantizer {
} }
self.old_mask = keys_mask; self.old_mask = keys_mask;
for i in 0..12 {
self.keys[i] = (i as f32 / 12.0) * 0.1;
}
self.setup_lookup_table(); self.setup_lookup_table();
} }
@ -2222,7 +2216,6 @@ impl Quantizer {
dist); dist);
if dist < min_dist { if dist < min_dist {
// min_d_note_idx = note_idx;
min_d_note_idx = note; min_d_note_idx = note;
min_dist = dist; min_dist = dist;
} else { } else {
@ -2230,16 +2223,13 @@ impl Quantizer {
} }
} }
self.lkup_tbl[i as usize] = ( self.lkup_tbl[i as usize] =
if min_d_note_idx < 0 { -1 } min_d_note_idx.rem_euclid(12) as f32 * (0.1 / 12.0)
else if min_d_note_idx > 11 { 1 } + ( if min_d_note_idx < 0 { -0.1 }
else { 0 }, else if min_d_note_idx > 11 { 0.1 }
min_d_note_idx.rem_euclid(12) as i8 else { 0.0 });
);
} }
//d// println!("TBL: {:?}", self.lkup_tbl);
println!("KEYS: {:?}", self.keys);
println!("TBL: {:?}", self.lkup_tbl);
} }
//# float pitch = inputs[PITCH_INPUT].getVoltage(c); //# float pitch = inputs[PITCH_INPUT].getVoltage(c);
@ -2261,14 +2251,10 @@ impl Quantizer {
// println!( // println!(
// "INP {:7.4} => octave={:3}, note_idx={:3} note_num={:3} inp={:9.6}", // "INP {:7.4} => octave={:3}, note_idx={:3} note_num={:3} inp={:9.6}",
// inp, octave, note_idx, note_num, inp * 240.0); // inp, octave, note_idx, note_num, inp * 240.0);
//d// println!("KEYS: {:?}", self.keys);
//d// println!("TBL: {:?}", self.lkup_tbl); //d// println!("TBL: {:?}", self.lkup_tbl);
let (oct_offs, note_idx) = let note_pitch = self.lkup_tbl[note_idx as usize % 24];
self.lkup_tbl[note_idx as usize % 24]; note_pitch + octave as f32 * 0.1
let pitch = self.keys[note_idx as usize];
pitch + (oct_offs as i64 + octave) as f32 * 0.1
} }
} }

View file

@ -130,18 +130,39 @@ fn check_quant_edge_oct_offs() {
}).collect::<Vec<f32>>(); }).collect::<Vec<f32>>();
assert_vec_feq!(v, vec![ assert_vec_feq!(v, vec![
311.12698, 311.12698, 415.3047,
329.62756, 329.62756, 329.62756, 329.62756, 493.8833, 493.8833, 493.8833, 493.8833, 493.8833,
349.22824, 349.22824, 349.22824, 349.22824, 493.8833, 493.8833, 493.8833, 493.8833, 493.8833,
369.99442, 369.99442, 369.99442, 369.99442, 493.8833, 493.8833,
391.99542, 391.99542, 391.99542, 391.99542, 830.6094, 830.6094, 830.6094, 830.6094, 830.6094,
415.3047, 415.3047, 415.3047, 415.3047, 830.6094, 830.6094, 830.6094, 830.6094, 830.6094,
440.0, 440.0, 440.0, 830.6094, 830.6094
466.1638, 466.1638, 466.1638, 466.1638, ]);
493.8833, 493.8833, 493.8833, 493.8833, }
523.2511, 523.2511, 523.2511, 523.2511,
554.3653, 554.3653, 554.3653, 554.3653,
587.3295, 587.3295, 587.3295, 587.3295, #[test]
622.25397, 622.25397, 622.25397, 622.25397 fn check_quant_one_key() {
let mut q = Quantizer::new();
q.set_keys(0b0010_0000_0000);
let v =
(0..=48).map(|i| {
let i = i - 24;
d_pit!(
q.process(
i as f32 * ((0.1 * 0.5) / 12.0)))
}).collect::<Vec<f32>>();
assert_vec_feq!(v, vec![
220.0, 220.0, 220.0, 220.0, 220.0, 220.0,
220.0, 220.0, 220.0, 220.0, 220.0, 220.0,
220.0,
440.0, 440.0, 440.0, 440.0, 440.0, 440.0,
440.0, 440.0, 440.0, 440.0, 440.0, 440.0,
440.0, 440.0, 440.0, 440.0, 440.0, 440.0,
440.0, 440.0, 440.0, 440.0, 440.0, 440.0,
880.0, 880.0, 880.0, 880.0, 880.0, 880.0,
880.0, 880.0, 880.0, 880.0, 880.0, 880.0
]); ]);
} }