7 个版本
0.1.105 | 2022 年 12 月 21 日 |
---|---|
0.1.104 | 2022 年 12 月 21 日 |
0.1.102 | 2022 年 11 月 6 日 |
#399 在 音频
每月 31 次下载
30KB
556 行
musical-note
表示通用音乐音符并允许将其转换,目前仅限于 MIDI 字节和反向转换。
基本上,这个crate在基于给定键和音阶的音高转换和解决中音表示方面做得非常好。
至少,它的性能优于内置的Reaper和MuseScore算法。
它使用荷兰语作为字符串表示,因为它是最一致且易于使用的(且难以出错)的音符表示。
基本上
- B 总是 B(没有 H)
- is — 降号
- isis — 重降号
- es(对于 E 和 A 分别是 Es 和 As)— 降音
- eses — 重降音
文档
示例
use musical_note::{midi_to_note, Accidental, Key, NoteName, Octave, ResolvedNote, Scale};
let as3 = ResolvedNote::new(NoteName::A, Accidental::Flat, Octave::new(5), 68);
assert_eq!(ResolvedNote::from_str("as3").unwrap(), as3);
assert_eq!(ResolvedNote::from_str("Aes3").unwrap(), as3);
let a_moll = Key::new(NoteName::A, Accidental::White, Scale::Minor);
// automatically unwraps
let a_dur = Key::from((&"a".to_string(), Scale::Major));
let d_moll = Key::from_str("d", Scale::Minor).unwrap();
let d_dur = Key::from_str("d", Scale::Major).unwrap();
let fis_moll = Key::from_str("fis", Scale::Minor).unwrap();
let fis_dur = Key::from_str("fis", Scale::Major).unwrap();
let ais_dur = Key::from_str("ais", Scale::Major).unwrap();
let des_moll = Key::from_str("des", Scale::Minor).unwrap();
// first test against idiot mistake:
assert_eq!(
midi_to_note(60, Key::from_str("c", Scale::Major).unwrap(), None),
ResolvedNote::new(NoteName::C, Accidental::White, Octave::new(60 / 12), 60)
);
// // test on Bb2
let midi = 58u8;
assert_eq!(
midi_to_note(midi, d_moll, None),
ResolvedNote::from_str("bes2").unwrap()
);
// // test against major alteration (VI♭)
assert_eq!(
midi_to_note(midi, d_dur, None),
ResolvedNote::from_str("bes2").unwrap()
);
// // test against minor alteration (II♭)
assert_eq!(
midi_to_note(midi, a_moll, None),
ResolvedNote::from_str("bes2").unwrap()
);
依赖关系
~2.5–4MB
~76K SLoC