モバイルで Web オーディオを開始するには、ユーザーの操作が必要であることを認識しています。ただし、ユーザー アクションで再開するという推奨事項に従いました (Tone.js の場合は Tone.start() を呼び出します) が、それでも機能しません。私のコードの関連部分は次のとおりです。
keyElement.addEventListener("touchstart", notePressed, false);
keyElement.addEventListener("touchend", noteReleased, false);
function notePressed(event) {
let dataset = event.target.dataset;
if (!dataset["pressed"]) {
let octave = +dataset["octave"];
oscList[octave][dataset["note"]] = playTone(dataset["frequency"]);
dataset["pressed"] = "yes";
}
event.preventDefault(); event.stopPropagation();
}
function noteReleased(event) {
let dataset = event.target.dataset;
if (dataset && dataset["pressed"]) {
let octave = +dataset["octave"];
oscList[octave][dataset["note"]].triggerRelease();
delete oscList[octave][dataset["note"]];
delete dataset["pressed"];
}
}
function playTone(freq) {
let synth = new Tone.Synth().toDestination();
let now = Tone.now();
Tone.start();
synth.triggerAttack(freq, now);
return synth;
}
2 回目のタッチでは正常に動作しますが、最初のタッチの後、ユーザー アクションによって start() が呼び出されたときに再開されるという標準であるにもかかわらず、オーディオ コンテキストが中断されているという警告が表示されます。私はここで困惑しています。