#musical #note #midi #representation #notes #byte #convert

musical-note

表示通用音乐音符,并允许将其转换,目前仅限于 MIDI 字节和反向转换

7 个版本

0.1.105 2022 年 12 月 21 日
0.1.104 2022 年 12 月 21 日
0.1.102 2022 年 11 月 6 日

#399音频

每月 31 次下载

MIT 许可证

30KB
556

musical-note

表示通用音乐音符并允许将其转换,目前仅限于 MIDI 字节和反向转换。

基本上,这个crate在基于给定键和音阶的音高转换和解决中音表示方面做得非常好。

至少,它的性能优于内置的Reaper和MuseScore算法。

它使用荷兰语作为字符串表示,因为它是最一致且易于使用的(且难以出错)的音符表示。

基本上

  • B 总是 B(没有 H)
  • is — 降号
  • isis — 重降号
  • es(对于 E 和 A 分别是 Es 和 As)— 降音
  • eses — 重降音

文档

https://docs.rs/musical-note/

示例

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