fixed the note offset of the quantizer
This commit is contained in:
parent
d24809112f
commit
a24ae750d6
2 changed files with 59 additions and 29 deletions
|
@ -2158,8 +2158,7 @@ impl Quantizer {
|
||||||
self.old_mask = keys_mask;
|
self.old_mask = keys_mask;
|
||||||
|
|
||||||
for i in 0..12 {
|
for i in 0..12 {
|
||||||
self.keys[i] =
|
self.keys[i] = (i as f32 / 12.0) * 0.1;
|
||||||
((i as f32 / 12.0) * 0.1) - QUANT_TUNE_TO_A4;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
self.setup_lookup_table();
|
self.setup_lookup_table();
|
||||||
|
@ -2201,26 +2200,31 @@ impl Quantizer {
|
||||||
let any_enabled = mask > 0x0;
|
let any_enabled = mask > 0x0;
|
||||||
|
|
||||||
for i in 0..24 {
|
for i in 0..24 {
|
||||||
let mut min_dist_note = 0;
|
let mut min_d_note_idx = 0;
|
||||||
let mut min_dist = 1000000000;
|
let mut min_dist = 1000000000;
|
||||||
|
|
||||||
for note in -12..=24 {
|
for note in -12..=24 {
|
||||||
let dist = ((i + 1_i64) / 2 - note).abs();
|
let dist = ((i + 1_i64) / 2 - note).abs();
|
||||||
|
|
||||||
let note_idx = note.rem_euclid(12);
|
let note_idx = note.rem_euclid(12);
|
||||||
if any_enabled && (mask & (0x1 << note_idx)) == 0x0 {
|
|
||||||
|
// XXX: We add 9 here for the mask lookup,
|
||||||
|
// to shift the keyboard, which starts at C!
|
||||||
|
// And first bit in the mask is the C note. 10th is the A note.
|
||||||
|
if any_enabled
|
||||||
|
&& (mask & (0x1 << ((note_idx + 9) % 12))) == 0x0
|
||||||
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if dist < min_dist {
|
if dist < min_dist {
|
||||||
min_dist_note = note_idx;
|
min_d_note_idx = note_idx;
|
||||||
min_dist = dist;
|
min_dist = dist;
|
||||||
} else {
|
} else {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.lkup_tbl[i as usize] = min_dist_note as u8;
|
self.lkup_tbl[i as usize] = min_d_note_idx as u8;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2236,17 +2240,19 @@ impl Quantizer {
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn process(&self, inp: f32) -> f32 {
|
pub fn process(&self, inp: f32) -> f32 {
|
||||||
let note_num = (inp * 240.0).floor() as i64;
|
let note_num = (inp * 240.0).round() as i64;
|
||||||
let octave = note_num.div_euclid(240);
|
let octave = note_num.div_euclid(24);
|
||||||
let note_idx = note_num - octave * 240;
|
let note_idx = note_num - octave * 24;
|
||||||
|
|
||||||
println!("INP {:6.4} => octave={:2}, note_idx={:2}", inp, octave, note_idx);
|
println!(
|
||||||
println!("KEYS: {:?}", self.keys);
|
"INP {:7.4} => octave={:3}, note_idx={:3} note_num={:3} inp={:9.6}",
|
||||||
|
inp, octave, note_idx, note_num, inp * 240.0);
|
||||||
|
//d// println!("KEYS: {:?}", self.keys);
|
||||||
|
|
||||||
let note_idx = self.lkup_tbl[note_idx as usize % 24]; // + octave * 12;
|
let note_idx = self.lkup_tbl[note_idx as usize % 24];
|
||||||
let pitch = self.keys[note_idx as usize];
|
let pitch = self.keys[note_idx as usize];
|
||||||
|
|
||||||
pitch
|
pitch + octave as f32 * 0.1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,21 +15,45 @@ fn check_quant_1() {
|
||||||
|
|
||||||
let v =
|
let v =
|
||||||
(0..=12).map(|i|
|
(0..=12).map(|i|
|
||||||
d_pit!(q.process(i as f32 * (0.1 / 12.0)))
|
d_pit!(
|
||||||
|
q.process(
|
||||||
|
i as f32 * (0.1 / 12.0)))
|
||||||
).collect::<Vec<f32>>();
|
).collect::<Vec<f32>>();
|
||||||
|
|
||||||
assert_vec_feq!(v, vec![
|
assert_vec_feq!(v, vec![
|
||||||
440.0,
|
440.0,
|
||||||
0.0,
|
466.1638,
|
||||||
0.0,
|
493.8833,
|
||||||
0.0,
|
523.2511,
|
||||||
0.0,
|
554.3653,
|
||||||
0.0,
|
587.3295,
|
||||||
0.0,
|
622.25397,
|
||||||
0.0,
|
659.2551,
|
||||||
0.0,
|
698.4565,
|
||||||
0.0,
|
739.98883,
|
||||||
0.0,
|
783.9909,
|
||||||
0.0,
|
830.6094,
|
||||||
|
880.0
|
||||||
|
]);
|
||||||
|
|
||||||
|
let v =
|
||||||
|
(0..=12).map(|i|
|
||||||
|
d_pit!(q.process(i as f32 * (-0.1 / 12.0)))
|
||||||
|
).collect::<Vec<f32>>();
|
||||||
|
|
||||||
|
assert_vec_feq!(v, vec![
|
||||||
|
440.0,
|
||||||
|
415.3047,
|
||||||
|
391.99542,
|
||||||
|
369.99442,
|
||||||
|
349.22824,
|
||||||
|
329.62756,
|
||||||
|
311.12698,
|
||||||
|
293.66476,
|
||||||
|
277.18265,
|
||||||
|
261.62555,
|
||||||
|
246.94165,
|
||||||
|
233.08186,
|
||||||
|
220.0
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue