#音乐符号 #音乐 #符号 #合成器 #正弦 #波形

bin+lib hum

用 Rust 编写的音乐符号语言和合成器

9 个版本 (5 个破坏性更新)

使用旧的 Rust 2015

0.6.0 2023 年 9 月 17 日
0.5.0 2020 年 12 月 27 日
0.4.0 2018 年 11 月 28 日
0.3.0 2018 年 11 月 25 日
0.1.2 2018 年 11 月 15 日

#360音频

GPL-3.0-or-later

39KB
423

Hum 合成器 0.6.0 👄

用 Rust 编写的音乐符号语言和合成器。

Hum 将标记文本文件转换为可播放的音乐,并保存为 WAV 文件。

该项目处于早期开发阶段,其公共 API 可能随时会进行破坏性更改。如果我知道进行了破坏性更改,我将更新语义版本控制方案中的 MINOR 版本,其中版本号是 MAJOR.MINOR.PATCH。

免责声明:此程序以 *.wav 文件的形式生成声音输出,尚未被认为是稳定的。在实验声音输出之前,请降低音量以保护您的耳朵和扬声器。

需求

构建项目

要构建项目,请在根目录中使用 cargo build

测试项目

要测试项目,请在根目录中使用 cargo run

Hum 有两个必需的、位置参数的命令行参数

  1. *.hum 输入文件的路径
  2. *.wav 输出文件的路径

要将包含的 *.hum 文件 "daisy.hum" 转换为名为 "daisy.wav" 的文件,请在根目录中使用以下命令

cargorun daisy.hum daisy.wav

安装最新版本

要作为 CLI 工具安装最新版本,首先请确保您已通过 安装 Rust 满足要求。

然后您可以在终端中运行以下命令

cargoinstall hum

现在您可以将hum当作其他任何CLI工具一样使用。例如,假设当前目录下存在名为 daisy.hum 的文件,您可以使用

hum daisy.hum daisy.wav

将Hum用作库

您还可以将Hum用作您自己的Rust程序中的库。目前,有一个方法实现了CLI工具的功能

extern crate hum;
...
hum::convert_to_wav(input, output);

Hum音乐符号语言的说明

Hum音乐符号语言旨在易于人类音乐家和计算机理解。它仍在早期开发阶段,可能会发生变化,但以下是对目前可用功能的简要说明。我鼓励您查看所包含的示例文件并修改它们,以帮助您理解该语言的工作方式。首先,这是该语言的外观

~ DAISY BELL by Harry Dacre
~ Based on an 1892 print in The Johns Hopkins University Lester S Levy Sheet Music Collection
~ Arranged by Connor Bulakites to demonstrate the Hum Synthesizer

[ 180_bpm ][ 3/4 ]

***********************************************************************

% square
| (Dn_5 1/2)+ -------------------- | (Bn_4 1/2)+ -------------------- ;
~ Dai-                             ~ sy!

% sine
| (Rest 1/4) (Bn_4 1/4) (Bn_4 1/4) | (Rest 1/4) (Gn_4 1/4) (Gn_4 1/4) ;
| (Rest 1/4) (Gn_4 1/4) (Gn_4 1/4) | (Rest 1/4) (Dn_4 1/4) (Dn_4 1/4) ;
| (Rest 1/4) (Dn_4 1/4) (Dn_4 1/4) | (Rest 1/4) (Bn_3 1/4) (Bn_3 1/4) ;
| (Dn_4 1/2)+ -------------------- | (Bn_3 1/2)+ -------------------- ;

% sawtooth
| (Gn_2 1/2)+ -------------------- | (Dn_2 1/2)+ -------------------- ;


***********************************************************************

% square
| (Gn_4 1/2)+ -------------------- | (Dn_4 1/2)+ -------------------- ;
~ Dai-                             ~ sy!

% sine
| (Rest 1/4) (Dn_4 1/4) (Dn_4 1/4) | (Rest 1/4) (Bn_3 1/4) (Bn_3 1/4) ;
| (Rest 1/4) (Gn_3 1/4) (Gn_3 1/4) | (Rest 1/4) (Gn_3 1/4) (Gn_3 1/4) ;
| (Gn_3 1/2)+ -------------------- | (Dn_3 1/2)+ -------------------- ;

% sawtooth
| (Bn_1 1/2)+ -------------------- | (Gn_1 1/2)+ -------------------- ;

现在,我们来解释一下您所看到的内容

  • 波浪线字符 ~ 表示单行注释。该符号之后该行上的所有内容都将被计算机忽略。我使用它来添加注释和歌词。

  • 节奏标签 [ 100_bpm ] 将歌曲的节奏设置为每分钟100 次节拍。您可以通过更改标签的数字部分来更改节奏,但必须保留 _bpm 后缀。您可以在歌曲的任何两个小节之间放置另一个节奏标签来更改歌曲的部分节奏。

  • 时间签名标签 [ 3/4 ] 设置音乐的节拍。分子对应于每小节的拍数,分母对应于一拍长度的倒数。因此,在3/4拍中,每小节有3个长度为“1/4”的拍。有关节拍的更深入解释,请参阅:https://en.wikipedia.org/wiki/Time_signature。您可以在歌曲的任何两个小节之间放置另一个时间签名标签来更改歌曲的部分节拍。

  • 星号行 * 表示写入检查点。您应该在第一个小节之前至少有一个这样的检查点。所有在小节之前写入的音乐行都被假定为同时发生。您允许每个检查点的小节数或横向音乐列的数量,以及您使用的总检查点数,都是风格问题,由您决定。在所包含的示例中,我将每个检查点设置为两个小节,因为它们非常适合80列的终端屏幕,但您没有义务遵循此约定。此外,检查点行中的星号数量也是风格问题(您只需至少有一个即可)。

  • 除号 % 用于切换音乐的声部或“乐器”。当您切换到特定的声部时,直到切换到新的声部,命令下的所有音乐行都将使用该声部播放。目前,支持三种声部:sinesquaresawtooth

  • 管道运算符 | 表示新小节的开始。为确保音乐播放正确,您必须在每个小节的开头使用管道运算符。此外,您还应注意确保小节中音符和休止符的总长度等于当前拍号的值。否则,一个小节的音乐可能会错误地延伸到另一个小节。

  • 分号 ; 用作重置字符。当遇到分号时,Hum 知道您已完成了一行音乐的编写,并希望从最后一个检查点开始编写另一行音乐。通常情况下,所有在检查点之后要同时播放的行音乐都应该以分号结束

  • Hum 忽略减号 -。实际上,它们被当作空白处理。这样做是为了使您更容易在检查点内垂直对齐同时的音乐行,使其更易于阅读。您如何选择使用此功能完全取决于您的风格选择。

  • 最后,我们必须为音符提供解释

    • 音符由括号内的两个值组成,并用空格分隔。第一个值是音符名称,第二个值是音符长度。音符长度除以当前拍号确定音符占小节的比例。在一行音乐中,音符按顺序从左到右依次添加到小节中。

    • 可以将 + 运算符附加到括号外的音符末尾,以增加音符长度为其原始长度值的一半。这相当于传统音乐记谱中的“点”。例如,音符 (An_4 1/2)+ 的总长度为 1/2 + 1/4 = 3/4。您可以将任意数量的加号附加到音符末尾,以不断增加长度值。

    • 目前有 96 种可能的音符名称,大致相当于大型钢琴上的键。音符名称格式如下:{pitch}_{octave}。如果您正在使用升音的调式编写,应使用以下音高

      ["Cn", "Cs", "Dn", "Ds", "En", "Fn", "Fs", "Gn", "Gs", "An", "As", "Bn"]

    • 如果您正在使用降音的调式编写,应使用以下音高

      ["Cn", "Df", "Dn", "Ef", "En", "Fn", "Gf", "Gn", "Af", "An", "Bf", "Bn"]

    • 在这种风格中,“n”代表“自然”,“s”代表“升”,“f”代表“降”。尽管不常见,但如果您愿意,您可以在同一首歌曲中混合使用升音和降音。

    • 此外,音符的八度部分可以从0到7变化,最低音符为Cn_0,最高音符为Bn_7。请注意,八度数在自然C音上回滚,因此这是音符序列按音高顺序的部分:An_4, As_4, Bn_4, Cn_5, Cs_5, Dn_5,等等...

    • 还有一个特殊的音符叫做Rest,它对应于单个声部中的静默。

    • 如果您使用了一个不被识别的音符值,当前的行为是不插入该音符,这将打乱您乐曲的节奏。我将在稍后的版本中修复这个问题。

为什么我会做这个?

我觉得这很有趣,而且我以前从未用Rust语言编写过大型项目,所以显然我是这个工作的合适人选 😎。此外,我喜欢开放音乐标记语言既易于人类阅读,也易于计算机读取的想法。我认为如果正确实现,可能会使数字格式中保存乐谱变得更加容易。到目前为止,这是一个很有趣的开始项目,我希望人们能用它创作出棒的音乐。

为什么选择这种许可协议?

关于您目前可以不可以使用此代码的更多见解,您可以在GNU网站上了解更多关于GPL条款的信息。如果有人实际上开始为此代码做出贡献或使用此代码,并想说服我将其发布在其他许可协议下,那么请与我联系,我对此事持开放态度。

依赖项

~1MB
~19K SLoC