Skip to content

Commit 24b22e3

Browse files
committed
fretboard: NonZeroU8
1 parent d40aee9 commit 24b22e3

File tree

4 files changed

+22
-15
lines changed

4 files changed

+22
-15
lines changed

src/backend/errors/backend_error_kind.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ impl BackendErrorKind {
3232
BackendErrorKind::Parse3InvalidCharacter(c) => {
3333
("Invalid character".into(), match c {
3434
Some(c) => format!("The character {c} is not valid here."),
35-
None => format!("This character is not valid here."),
35+
None => "This character is not valid here.".to_string(),
3636
})
3737
}
3838
BackendErrorKind::FixupFailed => (

src/backend/muxml/fretboard.rs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::backend::errors::backend_error::BackendError;
1+
use std::num::NonZeroU8;
22

33
const NOTE2_STEPS: [(char, bool); 12] = [
44
('C', false),
@@ -36,18 +36,14 @@ impl MuxmlNote2 {
3636
}
3737

3838
// TODO: make this panic an error
39-
pub fn get_fretboard_note2(string: char, fret: u8) -> Result<MuxmlNote2, BackendError> {
40-
Ok(MuxmlNote2 {
41-
step: STRING_BASE_NOTES[string as usize]
42-
.unwrap_or_else(|| panic!("Don't know base note for string {string}"))
43-
+ fret,
44-
dead: false,
45-
})
39+
pub fn get_fretboard_note2(string: char, fret: u8) -> Option<MuxmlNote2> {
40+
let base = (*STRING_BASE_NOTES.get(string as usize)?)?;
41+
Some(MuxmlNote2 { step: base.get() + fret, dead: false })
4642
}
4743

4844
/// TODO: benchmark this against a match and a hashmap, a hashmap will be probably faster as it can
4945
/// stay in cache (we need a total of max 16 base notes*1 byte => 16bytes which is less than a
5046
/// cache line
5147
/// Generated by tools/gen_note_lookup.rs
5248
#[rustfmt::skip]
53-
const STRING_BASE_NOTES: [Option<u8>;256]= [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, Some(45), Some(59), None, Some(50), Some(40), None, Some(55), None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, Some(64), None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None];
49+
const STRING_BASE_NOTES: [Option<NonZeroU8>;256] = [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, Some(NonZeroU8::new(45).unwrap()), Some(NonZeroU8::new(49).unwrap()), None, Some(NonZeroU8::new(50).unwrap()), Some(NonZeroU8::new(40).unwrap()), None, Some(NonZeroU8::new(55).unwrap()), None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, Some(NonZeroU8::new(62).unwrap()), Some(NonZeroU8::new(64).unwrap()), None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None];

src/backend/muxml/mod.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,10 @@ impl Muxml2TabElement {
9999
}) else {
100100
continue;
101101
};
102-
let note = get_fretboard_note2(parsed.base_notes[elem_idx % 6], fret).unwrap();
102+
let string_name = parsed.base_notes[elem_idx % 6];
103+
let note = get_fretboard_note2(string_name, fret).unwrap_or_else(|| {
104+
panic!("Don't know base note for string name {string_name}",)
105+
});
103106
let (step, octave, sharp) = note.step_octave_sharp();
104107
let properties = note_properties.get(&(elem_idx as u32));
105108
write_muxml2_note(buf, step, octave, sharp, need_chord, dead, properties)?;

tools/gen_note_lookup.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1+
use std::num::NonZeroU8;
12
fn main() {
2-
let mut lookup = [None; 256];
3+
let mut lookup = vec![String::from("None"); 256];
34
let mut set_lookup = |c: char, value: u8| {
4-
lookup[c as usize] = Some(value);
5+
lookup[c as usize] = format!("Some(NonZeroU8::new({value}).unwrap())");
56
};
67

78
set_lookup('E', 3 * 12 + 4);
@@ -11,9 +12,16 @@ fn main() {
1112
set_lookup('B', 4 * 12 + 1);
1213
set_lookup('d', 5 * 12 + 2);
1314
set_lookup('e', 5 * 12 + 4);
14-
15+
let mut b = String::from("[");
16+
for x in &lookup {
17+
b.push_str(&x.to_string());
18+
b.push_str(", ");
19+
}
20+
b.pop();
21+
b.pop();
22+
b.push(']');
1523
println!(
16-
"#[rustfmt::skip]\nconst STRING_BASE_NOTES: [Option<u8>;{}] ={lookup:?};",
24+
"#[rustfmt::skip]\nconst STRING_BASE_NOTES: [Option<NonZeroU8>;{}] = {b};",
1725
lookup.len()
1826
);
1927
}

0 commit comments

Comments
 (0)