一个基于 Midi 的,用类似代码方式进行乐曲制作的玩具

是一个简单的编辑器,同时也是 Midi 播放器,可用一种由我们原创的“音乐语言”编写类似简谱的乐谱,并转换成 Midi 文件播放。用本项目可以实现简单的作曲、音乐播放,或者只是瞎写点音乐片段打发时间为了好玩。基本原理为编译原理的运用,即词法分析、语法分析与语义分析的使用,源语言为原创的“音乐语言”,翻译的目标语言为 Midi 格式的十六进制文件。

Alt

示例

在本项目内运行如下代码(?)

paragraph soprano
instrument= 0
volume= 127
speed= 140
1= D
3345 5432 <4444 4444>
1123 322 <4444 4*82>
3345 5432 <4444 4444>
1123 211 <4444 4*82>
2231 23431 <4444 4{88}44>
23432 12(5) <4{88}44 {44}4>
33345 54342 <{44}444 44{48}8>
1123 211 <4444 4*82>
end

paragraph alto
instrument= 0
volume= 110
speed= 140
1= D
1123 321(5) <4444 4444>
(3555) 1(77) <4444 4*82>
1123 321(5) <4444 4444>
(3555) (533) <4444 4*82>
(77)1(5) (77)1(5) <4444 4444>
(7#5#5#56#45) <4444 {44}4>
11123 3211(5) <{44}444 44{48}8>
(3555 533) <4444 4*82>
end

play(soprano&alto)

即可得到
demo.mid (欢乐颂简易版)

功能

  • 用类似简谱的音乐语言进行谱曲,并可导出 .mid 文件
  • 支持 Midi 的主要核心功能,包括音量、速度、乐器等
  • 载入 SoundFont 音源,用本软件的 Midi 播放器进行播放
  • 设置按键映射,以便于输入各种升降半音

用法

对于在 < > 内的数字:
1 为全音符
2 为二分音符
4 为四分音符
8 为八分音符
g 为十六分音符
w 为三十二分音符
* 为附点
"{ }" 为连音线

对于不在 < > 内的数字:
1-7 为音符,即哆啦咪发等
0 为休止符
# 为升半音,用于数字之前
b 为降半音,同上
"( )" 为低八度,可叠加
"[ ]" 为高八度,同上
"| |" 内为同一时刻播放的音符

对于 play() 函数
"," 用于第二段在第一段之后播放
"&" 用于这两段同时播放

安装

需求: Java 运行环境8(即Jre8)

本项目在以下平台上构建并测试通过:

  • Microsoft Windows 10
  • Linux (Ubuntu 18.04)

可直接执行的 jar 文件:
点此下载

项目源码地址:
Github地址

对于源码,只需要下载之后解压在任意位置,添加 lib 文件夹中的三个依赖即可运行。如使用 IDEA ,点击 "File - Project Structure - Libraries - Add" 来分别添加这三个 jar 包依赖.

作者

其他

  • 以下都是废话或者自言自语,建议跳过(

Euterpu,即欧忒耳佩(古希腊语:Εὐτέρπη),是希腊神话中司管抒情诗与音乐的九缪斯之一。她的名字来自希腊语词根Εὐ(“好”)和τέρπ-εω(“使高兴”),合起来就是“令人快乐”的意思。

本文内容主要来自于本项目 Github 上的 README.md 文档,因为懒得修改太多内容直接就扔上来了(

最初这个项目其实是大三上学期的解释器课程实验,即设计一种语言,用编译原理的方法制作一个解释器。

当时大多数同学选择的都是编程语言,例如 C-- 或者 Mini Java 等常见编程语言的子集,虽然也有大神组做出了 Modern C 这样的高级玩意,但是我感觉普通的编程语言略没意思。

刚好大二的暑期实训我在使用 Arduino 制作平衡车的时期尝试摸鱼用配合蜂鸣器实现简单的音乐播放,但是用过 Arduino 写乐谱的应该会明白那是多难受的体验。在当时曾用 C# 制作了一个简单的自动机将目前使用的“音乐语言”的雏形转换成 Arduino 能使用的代码。

于是最初立项的时候,Midi 还只是一个选项,主要是面向于将这种“音乐语言”翻译成 Arduino 代码。有了这个想法之后,刚好 yyzih 和 AsrielMao 两位同学有类似的想法,于是一拍即合,分工完成了这个项目。

但是只用于 Arduino 局限性就太大了,不仅需要软件,还需要硬件设施。随着项目进度的提前完成,Midi 版本也逐渐开始制作。经过一个学期+寒假的完善,最终才有了目前这个版本。

通过这次的项目,我不仅对于编译原理的理解更加深刻了,同时还理解了 Midi 的格式组成,并提高了协作编程完成项目的能力。小学作文式结尾