mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-06 11:46:41 +01:00
35 lines
1.2 KiB
Rust
35 lines
1.2 KiB
Rust
pub struct NoteDuration;
|
|
|
|
/// (pulses, name), assuming 96 PPQ
|
|
pub const NOTE_DURATIONS: [(usize, &str);26] = [
|
|
(1, "1/384"), (2, "1/192"),
|
|
(3, "1/128"), (4, "1/96"),
|
|
(6, "1/64"), (8, "1/48"),
|
|
(12, "1/32"), (16, "1/24"),
|
|
(24, "1/16"), (32, "1/12"),
|
|
(48, "1/8"), (64, "1/6"),
|
|
(96, "1/4"), (128, "1/3"),
|
|
(192, "1/2"), (256, "2/3"),
|
|
(384, "1/1"), (512, "4/3"),
|
|
(576, "3/2"), (768, "2/1"),
|
|
(1152, "3/1"), (1536, "4/1"),
|
|
(2304, "6/1"), (3072, "8/1"),
|
|
(3456, "9/1"), (6144, "16/1"),
|
|
];
|
|
|
|
impl NoteDuration {
|
|
/// Returns the next shorter length
|
|
pub fn prev (pulses: usize) -> usize {
|
|
for (length, _) in NOTE_DURATIONS.iter().rev() { if *length < pulses { return *length } }
|
|
pulses
|
|
}
|
|
/// Returns the next longer length
|
|
pub fn next (pulses: usize) -> usize {
|
|
for (length, _) in NOTE_DURATIONS.iter() { if *length > pulses { return *length } }
|
|
pulses
|
|
}
|
|
pub fn pulses_to_name (pulses: usize) -> &'static str {
|
|
for (length, name) in NOTE_DURATIONS.iter() { if *length == pulses { return name } }
|
|
""
|
|
}
|
|
}
|