Web midi API 和多个同步笔记

Posted

技术标签:

【中文标题】Web midi API 和多个同步笔记【英文标题】:Web midi API and multiple simultaneous notes 【发布时间】:2018-09-24 21:05:29 【问题描述】:

我现在正在发现带有连接的 USB 钢琴的 web MIDI API。 关注this guide(并阅读the documentation)我知道您可以为事件“onmidimesage”分配一个函数。

我的问题是每个按下/释放的单个音符都会调用此函数,那么我应该如何处理同时按下的多个音符,以演奏和弦为目的?

【问题讨论】:

MIDI 是一种串行协议(也是一个非常古老的协议)。即使您实际上没有听到它,因为时间差是如此之小,一个和弦的音符仍然会触发一个接一个(串行,因此在原始 MIDI 电缆中,音符将由一...)... 您在演奏和弦时遇到的具体问题是什么?会发生什么? 我正在尝试使用复音合成器的 ToneJS 库。 triggerattack 方法接受一系列注释,只有在我添加一些分组逻辑和随之而来的延迟时我才能提供这些注释。 tonejs.github.io/docs/r12/PolySynth#triggerattack noteon 和 noteoff MIDI 事件为 MIDI 中的每个音符单独发送,即使它们是和弦的音符并且应该同时播放 所以从你的观点来看,我知道我无法为数组提供一个以上的音符......但这不会成为问题,因为同样的函数被调用得很快.我试试看。 【参考方案1】:

对于和弦,API 以零延迟一一发送音符。

立即启动声音,没有延迟。 参见https://surikov.github.io/webaudiofont/examples/midikey.html的示例

【讨论】:

【参考方案2】:

您需要查看MIDIMessageEventreceivedTime 属性,并按照适合您的应用程序的粒度对事件进行分组,以找出构成和弦的内容。此外,您将获得释放键的 MIDI 事件。

我说“适合您的应用程序的粒度”的原因是:

假设键盘手正在弹奏和弦;它可能看起来像这样。

    time -------------------->

C   #-----------------------#
E    #---------------------#
G   #-------------------------#

而弹奏和弦的吉他手(假设他们也会抑制琴弦)可能看起来像

    time -------------------->

C   #-----------------------#
E        #-----------------#
G               #-----------#

在同一时间尺度上。

【讨论】:

以上是关于Web midi API 和多个同步笔记的主要内容,如果未能解决你的问题,请参考以下文章

将动画与 midi 数据同步

使用 WPF 播放 MIDI 文件并与视觉效果同步时间

Arduino 16 步音序器 - 音符不同步

同步调用多个API并立即显示结果

web api接口同步和异步的问题

有道云笔记如何同步?