3

我一直在阅读有关 Web Midi API 的文档,并尝试查看有关该主题的不同网站。有没有办法在不使用花哨的库和东西的情况下播放 MIDI 声音?假设我只想生成一个注释:如何访问本地计算机上的 midi 模块?任何人都可以编写一小段代码来播放单个音符并且我可以简单地嵌入到元素中吗?

4

3 回答 3

3

Web Audio API 不直接与 MIDI 设备交互,包括计算机上的软件 MIDI 合成器。为此,您需要使用(不太受支持的)Web MIDI API

但是,如果您只想根据单个 MIDI 音符的参数演奏一个简单的单音音符,您可以将这些参数转换为与振荡器源一起使用:

audio = new (window.AudioContext || window.webkitAudioContext)()

function playNote(frequency, volume, duration)
{
    var halfPeriod = 1/frequency/2
    if(duration > halfPeriod) duration -= duration % halfPeriod
    else duration = halfPeriod

    var g = audio.createGain()
    var o = audio.createOscillator()
    o.connect(g)
    g.connect(audio.destination) // so you actually hear the output

    o.frequency.value = frequency
    g.gain.value = volume
    o.start(0)
    o.stop(audio.currentTime + duration)
}

该函数的前三行用于调整持续时间以避免在波不为零时切断振荡器,因为这会导致令人不快的爆音。

更新了最新的(2015 年 12 月草案)WebAudio 规范

于 2015-02-28T10:59:07.990 回答
0

MIDI 是一种技术标准,描述了连接各种电子音乐硬件的通信协议。

MIDI 根本不描述音频和声音。您不能通过 MIDI 通道演奏乐器。而不是这个,您可以向 MIDI 键盘或 MIDI 合成器发送命令。

如果你想从浏览器播放声音,你需要一些库。例如具有 1500 种乐器的钢琴键用于 MIDI 文件的复杂播放器

于 2018-08-01T14:06:19.960 回答
0

Web MIDI API 的 W3C 工作草案包括一个简单合成器的代码:https ://www.w3.org/TR/webmidi/#a-simple-monophonic-sine-wave-midi-synthesizer

此实现在 GitHub 上可用:https ://github.com/cwilso/monosynth

运行代码的演示:http ://webaudiodemos.appspot.com/monosynth/

加载演示脚本后,您可以在没有物理 MIDI 设备的情况下演奏音符。播放 C4(MIDI 中的#60)大约 1 秒:

noteOn(60);
await new Promise(resolve => setTimeout(noteOff, 1000, 60));
于 2020-05-13T17:06:48.630 回答