在JavaScript中播放MIDI

自计算机时代开始以来,机器就为音乐家提供了支持。 早在1951年,曼彻斯特大学就可以在Ferranti Mark 1上录制《 拯救上帝》 。 但是直到32年后的1983年MIDI标准诞生。 尽管有很多局限性和其他竞争技术(如OpenSound Control)的出现,但经过30多年的发展,它仍然是占主导地位的音乐创作工具。

深度迷笛

由于MIDI规范非常广泛,并且可以在音乐设备和数字音频工作站(DAW)之间实现非常精细的通信,因此我们将仅使用其功能的一小部分进行演奏。 使用MIDI和音频API,我们将生成简单的振荡器并将其连接到我们的设备。 如果您没有该设备,则仍然可以尝试该示例-最后一个片段中的我们的振荡器可以自己播放俄罗斯方块主题!

首先,您需要知道的是,当您在启用MIDI的设备上播放音符时,它会向接收方发送一条消息,其中包含键的标识符,力度(击键的强度)以及有关状态的信息(即按下,按下)。

连接到真实的MIDI设备

自2015年3月起,JavaScript正式支持MIDI标准。 它包括对输入和输出MIDI设备的访问,挂钩的可用性以及用于接收MIDI命令的EventEmiter。

为了找到可用的设备,我们需要调用navigator.requestMidiAccess() 。 该方法返回一个将解析为MIDIAc​​cess对象的Promise。 我们可以轻松访问其inputs属性。 MIDIAc​​cess还提供了onstatechange挂钩,每当新设备与我们的系统连接或断开连接时,该挂钩便会触发。 如果没有可用的MIDI设备,您仍然可以使用虚拟MIDI设备测试演示:我已经在MacOS上使用IAC设备对其进行了设置:

m是我们的MIDI编号,f是结果频率。

使用以下等式,我们可以使用JavaScript振荡器轻松生成声音:

我们的OscillatorNode具有type属性,可以将其设置为多种模式,包括自定义模式。 以下示例显示了简单振荡器类型之间的区别: