#和弦 #MIDI #音乐 #音乐理论 #爵士

muzik

从字符串模板生成和弦进行到MIDI文件的库

2个版本 (1个稳定版)

1.0.0 2024年8月16日
0.1.0 2024年8月16日

#350音频

Download history 145/week @ 2024-08-10

每月 145 次下载

MIT 许可证

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