javascript - ToneJS : Multi-pitch keyboard entry

标签 javascript web-audio-api

This pen使用 ToneJS 库在电脑键盘上演奏音高。但是,它一次只能播放一个音符。我如何编写代码以同时播放多个音符?

代码:

var keyToPitch = { "z":"C3", "s":"C#3", "x":"D3", "d":"D#3", "c":"E3", "v":"F3", "g":"F#3", "b":"G3", "h":"G#3", "n":"A3", "j":"A#3", "m":"B3", ",":"C4" }

var synth = new Tone.Synth()
synth.oscillator.type = "sawtooth"
synth.toMaster()

window.addEventListener('keydown', this.onkeydown) 
window.addEventListener('keyup', this.onkeyup)

function onkeydown(e){
synth.triggerAttack(keyToPitch[e.key], Tone.context.currentTime)        
}
function onkeyup(e){
    synth.triggerRelease()
}

最佳答案

ToneJS 中的振荡器是音频源,Master 是播放与其连接的所有输入的输出。因此,要播放多个重叠的声音,您只需创建多个振荡器并将它们全部连接到 Master。

对于您链接到的那种演示,典型的做法可能是制作固定数量(比如 5 个)的振荡器,并在您想要触发声音时轮流通过它们:

var synthIndex = 0
function startSound(){
    synthIndex = (synthIndex + 1) % voices
    var synth = synths[synthIndex]
    synth.triggerAttack(/* ... */)        
}

或类似的。原则上,您可以为每个音高制作一个单独的振荡器,但这可能会影响不那么琐碎的演示中的性能。

关于javascript - ToneJS : Multi-pitch keyboard entry,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49952128/

相关文章:

javascript - JS : Performing another keypress event

javascript - 暂停后howler.js Sprite 声音恢复

javascript - 使用 AudioContext(Web 音频 API)断开节点连接时出现问题

javascript - 如何将两条不同的路由映射到同一个路由器

javascript - 在另一个服务调用中使用一个服务调用的结果(Angular)

javascript - 使用 jQuery 确定 'Revealing Module Pattern' 模块的范围

javascript - 防止滚动 jquery 脚本运行两次

javascript - Tone.js 附加到合成器的增益不一致

dart - 如何使用 ScriptProcessorNode

javascript - 更高效的 decodeAudioData()?