Web オーディオ API とさまざまな長さのさまざまな音楽ループを利用するループ シーケンサーを構築しようとしています。一般的な考え方は、ループが (ある程度) ランダムに選択され、最初、中間、および最後のセクションの特定の順序で再生されるというものです。ベース、ドラム、リード、FX の 4 つのチャンネルがあります。最後のセクションが終了する直前に、新しいサンプル セットが選択され、同じ式を使用して再生されます。
次に、ビジュアライザーとオートメーションを追加する予定です。つまり、最後の数小節のリバーブです。
私は「Tale of Two Clocks」の方法に従わなければなりませんが、私はプログラミングや JavaScript に比較的慣れていないため、それを実装するのに苦労しています。これを完了するには、必要以上に複雑になる可能性があると思います。
私の最初のアイデアは、ループを再生する回数を指定する内部の play メソッドを使用して for ループを作成することでしたが、代わりにサンプルが一度にすべて再生されることがわかりました。「Tale of Two Clocks」に従って、setTimeout() と setInterval() の使用は可能な限り避けています。これは遅延につながるだけだからです。
私の 2 番目のアイデアは、すべての play メソッドを一度に呼び出すことでした。
START SECTION
playlead(time, buffer);
playdrums(time + length*2, buffer);
MIDDLE SECTION
playlead(time + length*10, buffer);
playdrums(time + length*10, buffer);
playlead2(time + length*10, buffer);
playbass(time + length*10, buffer);
等々。ただし、これは一連の問題を引き起こし、かなり非効率的な方法のように思えます。
明らかな解決策が欠けているように感じますが、かなりの調査の結果、まだ解決できていません。サンプルが終了するまで for ループで playSound 関数を待機させてから再度繰り返すようにするのが最も簡単なように思えますが、これは見た目よりもはるかに困難です。誰かアドバイスをいただければ幸いです。私はこれで終わりです。前もって感謝します!
//追加するために、2 番目の方法で抱えている問題は、開始セクションだけでも現実的に再生するには、コードを次のようにして約 30 秒間再生する必要があることです。
///START SECTION ( for 30 seconds or so)
playlead(time, buffer);
playlead(time + length, buffer);
playlead(time + length*2, buffer);
playlead(time, + length*3, buffer);
playbass(time, buffer);
playbass(time + length, buffer);
playbass(time + length*2, buffer);
playbass(time, + length*3, buffer);
playlead1(time, buffer);
playlead1(time + length, buffer);
playlead1(time + length*2, buffer);
playlead1(time, + length*3, buffer);
playdrums(time, buffer);
playdrums(time + length, buffer);
playdrums(time + length*2, buffer);
playdrums(time, + length*3, buffer);
これは、一度に play() メソッドへの 16 回の呼び出しです。曲全体を再生するには、再バッファリングされて再度再生するように求められる前に、4 つのセクションが必要になる可能性があります。これは、ロード直後に同時に少なくとも 16*4 (64) の呼び出しです。スペクトグラフ、自動化された audioParam およびボリューム/エフェクトのスライダーが含まれていると、これにより問題が発生する可能性があると思いますか?ありがとう。
//// これは、私の問題のほとんどの原因となっているコードの例です。
function LeadStartSection
(buffer, time, gainNode, bufferList)
{
console.log("playing lead Start section");
var timer = setTimeout(function() { //checks when audiobuffer has finished
console.log('sample times out at' + timer);
}, buffer.duration * 1000);
var Length = buffer.duration;
console.log(Length);
var n = 1;
////Example of second method/////
playLead(buffer, time, gainNode,n, bufferList);
playLead(buffer, time + Length, gainNode, Length,n, bufferList);
playLead(buffer, time + Length*2, gainNode, Length,n, bufferList);
playLead(buffer, time + Length*3, gainNode, Length, n+2, bufferList);
}
///example of what I would like to do///
for (i=o; i<leadPlayCount; i++)
{
PlayLead(buffer, gainNode, Length, bufferList);
}
*最初の例では、n = n+2 で中間セクションがキューされるため、n が関数に渡されます。
* 2 番目の例では、各ループが終了前のループの直後に開始されるように playLead を呼び出すのに問題があります。代わりに、メソッドは一度に 4 回呼び出されます。playLead メソッドのリターンを受け取るまで for ループが続かない方法があったのではないかと思っていましたが、それは間違っているようです。
これにより、私がどこにいるのかをもう少し理解していただければ幸いです。他に入れて欲しい物があれば聞いてください。助けてくれてありがとう!