シンプルな「仮想スクラッチャー」を作ろうとしていますが、その背後にある理論がわかりません。私はグーグルで何も役に立たなかったので、私はここでそれを尋ねています:
- スクラッチ(トラックを前方に移動)するとどうなりますか?サンプルのピッチやレートを上げますか?
- この現象をオーディオ処理アルゴリズムでどのようにエミュレートできますか?
サンプルコード/チュートリアルをいただければ幸いです:-)
シンプルな「仮想スクラッチャー」を作ろうとしていますが、その背後にある理論がわかりません。私はグーグルで何も役に立たなかったので、私はここでそれを尋ねています:
サンプルコード/チュートリアルをいただければ幸いです:-)
スクラッチ(トラックを前方に移動)するとどうなりますか?サンプルのピッチやレートを上げますか?
実際に何が起こっているかを考えてください。レコードにはオーディオデータが含まれています。レコードニードルは、レコードからオーディオデータを読み取ります。レコードが回転すると、再生位置が変わります。(これは、再生ヘッドがデジタルオーディオエディタでオーディオファイルを移動するのを見るのと非常によく似ています。)
レコードを物理的に速く回転させると、再生速度が上がります。オーディオはより速く、よりピッチが高くなります。再生レートを2上げると、オーディオは1オクターブ高く再生されます。
レコードを物理的にゆっくり回転させると、再生速度が低下します。オーディオは遅く、ピッチも低くなっています。再生速度を2下げると、オーディオは1オクターブ低く再生されます。
レコードは、物理レコードを高速化または低速化することによってのみオーディオ再生を変更できます。これは、ピッチと再生速度の両方に影響します。一部のオーディオソフトウェアは、ピッチとレートを個別に変更できます。レコードプレーヤーはできません。
(レコードプレーヤーを入手して、それがどのように聞こえるかを試してみてください。)
この現象をオーディオ処理アルゴリズムでどのようにエミュレートできますか?
レコードをスクラッチするDJをエミュレートするには、ユーザーが「スクラッチ」しているときにオーディオの再生速度を調整できる必要があります。
ユーザーがレコードを高速化したら、再生速度を高速化します。ユーザーが記録を遅くするときは、再生速度を遅くします。
ユーザーが記録を停止したら、再生を完全に停止します。
ユーザーがレコードを逆回転させたら、再生を逆にします。
オーディオのピッチを変更する必要はありません。再生速度を変更すると、自動的にそれが行われます。ピッチをさらに調整すると、正しく聞こえなくなります。
ライブラリに関してアドバイスはありませんが、時間をかけてこのようなものを実装するのはそれほど難しくありません。
スクラッチすると、針の下でレコードを前後に移動するだけです。つまり、オーディオファイルの同じ部分を繰り返し前後にループするのと同じです。速度は正弦波と三角波の間のどこかにあると思います。サンプルに対して線形補間を行う必要があります。
モバイルアプリの場合、まず画面の1つの軸をオーディオファイルの時間範囲にマッピングします。最後のを含むバッファを保持しMotionEvent
ます。次が到着したら、座標MotionEvent
に基づいてマップされた開始位置と終了位置を計算します。(X,Y)
次に、2つの間の経過時間を計算しMotionEvents
ます。これにより、ファイルから適切な位置と速度で再生するのに十分な情報が得られ、モーションイベントごとに常に更新されます。
データに対して何らかの平滑化を行う必要があるかもしれませんが、これが出発点です。
可変レートのリサンプラーが適切な場合があります。これにより、再生速度が速くなり、ピッチが同じ比率で増加します。
「スクラッチ」動作の角速度とプラッターの通常の回転速度の比率を追跡し、それをローカルのリサンプリング比率として使用します。
可変幅のSinc補間カーネルを使用するなど、線形補間よりもはるかに優れた(より高いオーディオ品質の)DSPメソッドでレートリサンプリングを実行できます。