辉夜音游论——使用midi当音游谱面的可行性

辉夜音游论——使用midi当音游谱面的可行性

八月 18, 2024

写在前面

我是辉夜星瞳,是一个TensorFlow学员,同时也是midi谱师、Arc,Phi音游人等等等等…

做这篇文章毫无疑问是我在经过研究时发现的,当然可能包括一本正经的胡说八道;毕竟General MIDI是一个标准,所以我们可以拿来进行音游创作。

是这样的

我在逛音游群的时候偶然发现了一位midi创作者,在打Arc的时候问midi转谱面的可行性,于是就有了这篇文章

Step1.分析谱面都需要什么?

这里以我们最熟悉的音游——Phigros来进行讲解。

如未声明,本实例的所指的音游及谱面均为Phigros

众所周知,音游一共有四个note类型:

1.tap:在到达判定线时点一下即可。
2.Hold:一种长音符,在到达判定线时需要按住,消失于判定线时松手。
3.drag:俗称黄键,你不需要经常点它,只需要保持你的手指按在那里就行了。
4.flick:俗称粉键,到达判定线时划一下就好了

之后就是判定线:为方便起见,这里我们将判定线进行固定处理。

还有note的下落时间、下落速度,位置等;只有这些完备了,一个谱面的创作才能正式开始。

Step2.midi又包括哪些内容?

一个标准的MIDI文件往往以二进制代码的形式包含了多层次的信息,通常以“事件(消息)”来刻画这些信息。如音符开启事件(Note On),音符力度(Velocity),音符结束事件(Note Off),触后(Aftertouch),还有弯音(Pitch Wheel)、调制(Modulation)、主音量(Main Volume)、表情(Expression)等。

因此midi能拿出来的参数简直太多了

Step3.midi与谱面的对应关系

这里以一个json化的midi音符举例,这样你就能明白我为什么说midi可以做谱面了。

1
2
3
4
5
6
7
8
9

{ //单个音符的内容
"name": "B5", //音高
"midi": 83, //
"time": 3.20625, //开始时间
"velocity": 1, //音符速度
"duration": 0.23958333333333348 //持续时间
},

name的音高决定了音符的位置,但是很显然音游的屏幕有限,所以我们可以基于Minecraft的音符盒音高进行框定,再选出中间的那个键作为中心即可。

duration对应持续时间,这个在Hold音符里非常有用,如果是其他音符和进行置空处理。

接下来是定义通道和乐器部分,这个部分可以对应谱面的键的类型。

1
2
3
4
5
6
7
8
9

"id": 0,
"name": "Modern Upright - Modern Upright (2)",
"instrumentNumber": 0,
"instrument": "acoustic grand piano", //定义乐器
"instrumentFamily": "piano",
"channelNumber": 0,//定义通道
"isPercussion": false

MIDI标准的内容分为五个部分:

16个声部(通道)
最大复音数为24或更多
GS格式的乐器音色排列(包含有各种不同风格的音乐所使用的乐器音色和打击乐音色)
鼓音色可以通过音色改变信息进行选择
两种可以调节的效果,包括混响和合唱

所以我们拿出前四个通道分别对应四种键,之后再在框定的区域内做音符即可。

后记

这里没有后记,既然理论存在,那么代码就能实现。希望有朝一日midi能够成为音游谱面通用标准吧。