如何将事件侦听器添加到以音调.js播放的音符



我正在构建一个由Tone提供支持的小型网络应用程序.js来训练自己弹奏钢琴(也许还有其他一些练习(。到目前为止,您可以选择根音符和音阶类型,然后单击播放,它将循环播放该音阶。还有一个键盘/合成器,我从其中一个音调中获取.js示例,您可以单击钢琴键,使用Querty键盘上的键,或选择连接到计算机的MIDI键盘来使用和播放声音。

我要做的下一步是创建一个条形图,当演奏音阶中的音符时,它会亮起绿色,在演奏音阶外的音符时会亮起红色,也许可以记录连续播放了多少个音符被正确演奏或类似的东西。我遇到的问题是,似乎没有办法直接从 tone.js 中获取用户正在播放的音符。我可以将键盘上的按键转换为音符,但仅此而已。我无法从单击键盘的人捕获任何事件。我也无法从音调中获取选定的 midi 输入设备.js以便能够解释与音调.js合成器一起演奏的钢琴键。

我尝试使用 jquery 附加事件侦听器,因为虚拟钢琴键只是按钮,但在影子 DOM 中无法访问它们。

有没有人使用 tone.js 和 tonejs/ui 并且知道这是否可行,或者我是否必须在代码之外进行编码.js以某种方式?有什么解决方法吗?

编辑:我已经完成了我的v1.0.0。我能够与 Tone 一起收听 midi 设备.js并将它们转换为正在播放的音符。这是一个不错的解决方案,但正如我所提到的,最好直接从 Tone.js 合成器中播放音符以简化代码,允许训练器栏处理用鼠标单击的音符,以便正在播放的音符可以在训练器栏上显示其八度数字。

git 存储库:https://github.com/erikstagg/music-theory

例如,您可以在主文档上收听mousedown事件。

然后签入Event.path数组属性(它公开目标元素的路径(以检查它是否是键盘注释内的单击(应该在索引3处(。您也可以在索引7中找到八度音阶。

document.addEventListener( 'mousedown', ev => {
if ( ev.path[3].localName == 'tone-keyboard-note' ) {
console.log( 'note #' + ev.path[3].getAttribute( 'note' ) )
console.log( 'octave ', ev.path[7].getAttribute( 'octave' ) )
}
} )

注意:在Firefox上,您应该使用composedPath而不是path

最新更新