一次单击即可在tone.js中演奏两个音符

时间:2018-07-16 14:23:09

标签: javascript tone.js

我正在开发一个网络游戏,单击一个按钮应连续播放两个音符。我可以使用上传的音频文件和audio.onended回调来做到这一点。

function playMusic(){
    audio.src = music_array[music_counter++];
    audio.play();
    audio.onended = function(){
        playMusic();
    };
}

我可以使用上面的代码块来播放整首歌曲。但是,使用这种方法,我需要事先将所有音频文件上传到html,我认为这不是一个好方法。因此,出于相同的目的,我一直在研究tone.js,但我无法一个接一个地演奏音符。我已经尝试过使用for循环:

music = ["C4;4n", "D4;4n", ...... , "G5;8n"];
for(var i=0; i<range; i++){
    parts = music[music_counter++].split(';');
    synth.triggerAttackRelease(parts[0], parts[1]);
}

for(var i=0; i<range; i++){
    playNote();
}

playNote(){
    parts = music[music_counter++].split(';');
    synth.triggerAttackRelease(parts[0], parts[1]);
}

没有运气。我也研究了他们的文档和其他stackoverflow帖子。我还无法找出解决方案。有没有人知道如何实现这一目标?

1 个答案:

答案 0 :(得分:0)

我终于找到了解决方法。

var synth = new Tone.Synth().toMaster();

var music = [{"time": 0, "note": "A4", "duration": "16n"},
         ......
         {"time": 23.5, "note": "A4", "duration": "8n"},
         {"time": 24, "note": "G4", "duration": "4n"}];

function playMusic(){
    var part = new Tone.Part(function(time, note){
        //the notes given as the second element in the array
        //will be passed in as the second argument
        console.log(note);
        synth.triggerAttackRelease(note.note, note.duration, time);
    }, music).start(0);

    Tone.Transport.start();
}