use crate::chord::note::Note;
use crate::chord::note::NoteLiteral::*;
use crate::chord::note::NoteModifier;
#[derive(Copy, Clone)]
pub(crate) struct NoteEntry {
pub notes: [Note; 2],
pub len: usize,
}
pub(crate) static MIDI_NOTE_TABLE: [NoteEntry; 12] = [
NoteEntry {
notes: [
Note {
literal: C,
modifier: None,
},
Note {
literal: C,
modifier: None,
},
],
len: 1,
},
NoteEntry {
notes: [
Note {
literal: C,
modifier: Some(NoteModifier(1)),
},
Note {
literal: D,
modifier: Some(NoteModifier(-1)),
},
],
len: 2,
},
NoteEntry {
notes: [
Note {
literal: D,
modifier: None,
},
Note {
literal: D,
modifier: None,
},
],
len: 1,
},
NoteEntry {
notes: [
Note {
literal: D,
modifier: Some(NoteModifier(1)),
},
Note {
literal: E,
modifier: Some(NoteModifier(-1)),
},
],
len: 2,
},
NoteEntry {
notes: [
Note {
literal: E,
modifier: None,
},
Note {
literal: E,
modifier: None,
},
],
len: 1,
},
NoteEntry {
notes: [
Note {
literal: F,
modifier: None,
},
Note {
literal: F,
modifier: None,
},
],
len: 1,
},
NoteEntry {
notes: [
Note {
literal: F,
modifier: Some(NoteModifier(1)),
},
Note {
literal: G,
modifier: Some(NoteModifier(-1)),
},
],
len: 2,
},
NoteEntry {
notes: [
Note {
literal: G,
modifier: None,
},
Note {
literal: G,
modifier: None,
},
],
len: 1,
},
NoteEntry {
notes: [
Note {
literal: G,
modifier: Some(NoteModifier(1)),
},
Note {
literal: A,
modifier: Some(NoteModifier(-1)),
},
],
len: 2,
},
NoteEntry {
notes: [
Note {
literal: A,
modifier: None,
},
Note {
literal: A,
modifier: None,
},
],
len: 1,
},
NoteEntry {
notes: [
Note {
literal: A,
modifier: Some(NoteModifier(1)),
},
Note {
literal: B,
modifier: Some(NoteModifier(-1)),
},
],
len: 2,
},
NoteEntry {
notes: [
Note {
literal: B,
modifier: None,
},
Note {
literal: B,
modifier: None,
},
],
len: 1,
},
];
pub(crate) fn notes_from_midi(midi: u8) -> &'static [Note] {
let entry = &MIDI_NOTE_TABLE[(midi % 12) as usize];
&entry.notes[..entry.len]
}