2个版本 (1个稳定版)
新 1.0.0 | 2024年8月16日 |
---|---|
0.1.0 | 2024年8月16日 |
#350 在 音频
每月 145 次下载
23KB
325 行
Muzik
生成MIDI格式的和弦进行库
概述
muzik是一个生成MIDI文件和弦进行的库。
它允许您从包含和弦和节奏的字符串输入生成进行。
使用此库,您可以
使用几乎所有和弦:几乎可以使用现代音乐中使用的任何和弦类型。
实现声部进行:该库构建的进行考虑了主声部,确保和弦之间的平滑过渡和自然流畅。
自定义节奏:定义简单的节奏模式。
库的主要目的是从相对简单的输入字符串生成进行。因此,与传统的乐谱写作软件相比,它有一定的局限性,并不打算取代它。
工作原理
节奏定义如下
O
= 全音符_
= 全休止符L
= 半音符~
= 半休止符l
= 四分音符}
= 四分休止符,
= 八分音符.
= 八分休止符|
代表小节分隔符,它被支持以提高可读性,但可以省略。
输入从左到右读取。当找到和弦时,它被设置为当前节奏的上下文。
例如(请注意,空格不是必需的,它们用于提高可读性)
|Fm l l ~ |
一个小节,以两个四分音符和一个半休止符演奏Fm。|Fm l l Bbm l .,|
一个小节,以两个四分音符演奏Fm,以一个四分音符和一个八分休止符演奏Bbm。
从这些例子中可以看出,当一个和弦被放置在乐句中时,所有后续的音符都将按照这个和弦演奏,直到发现另一个和弦。
请注意,由于乐句分隔符不是强制的,您可以构建超出乐句的节奏,例如,假设我们处于4/4拍。
|DbMaj7 l } } L } l l |
这个模板超出了第一个乐句,表示两个四分音符之间的连音。
实际上,解析器对拍号是盲目的,因此您可以编写没有乐句分隔符的和弦和节奏。
一旦定义了字符串输入,就实例化ChordCompingGenerator并调用它的from_string
方法。
使用通配符
另一种定义输入的方法是使用和弦通配符,因此您可以使用此模板
|*l l~ |*O|*L*L|*l } l }|
然后,定义一个包含5个和弦字符串的向量(每个通配符*
一个),并用输入字符串和和弦向量调用from_wildcards
方法。
我们发现这个方法在处理复杂节奏和大型和弦(如AbMaj7#11add9)时非常有用。
示例
use muzik::comping_generator::ChordCompingGenerator;
use std::path::Path;
// Instantiate the generator with a bpm=65 and a lead note of 70 (a Bb3 MIDI code).
// A note around 68-74 should be a good choice.
let generator = ChordCompingGenerator::new(65, 70);
// First A section of `Ruby, My Dear`,
// from the amazing composer Thelonious Monk (October 10, 1917 – February 17, 1982 ❤️).
let rmd = "|Fm9 L Bb13b9 L|Ebmaj7l.Fm7,F#m7,Gm7,Abm7,Ab6,|Gm9L C13b9L|Fmaj7l Gm7l
Abm7l Am7l|Bbm7L Eb13b9L|Abmaj7lBbm7,Bm7,Cm7L|Bbmadd11LAadd9L|E7susLBb7b5L|";
let smf = generator.from_string(rmd, false);
match smf {
Ok(smf) => {
let path = Path::new("ruby_my_dear").with_extension("mid");
let mut file = std::fs::File::create(path).unwrap();
// Export the MIDI file fo disk
smf.write_std(&mut file).unwrap();
}
Err(e) => {
dbg!(e);
}
}
局限性
- 为了简化,节奏板面被缩小。没有十六分音符/休止符,没有三连音,也没有点。这对于我们的用例来说是不错的,但也许在未来,我们至少会添加十六分音符和点。
- 没有摇摆感。由于MIDI文件可以被导入任何支持MIDI导入的软件,我们留出了摇摆功能的添加给这些程序,这些程序通常提供将MIDI量化为摇摆感的选项。
依赖关系
~3–5MB
~93K SLoC