問題タブ [rtaudio]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
uwp - Universal Window Phone で信号を変換するにはどうすればよいですか?
RTAudio を使用してマイクから信号を取得し、この信号を別のエンコーダーの入力として使用します。UWP は、エンコーダーが必要とするサンプル レートとは異なる固定オーディオ サンプル レートを常に返すようです。
WASAPICapture リターン44100 Hz
信号2 channel
(入力)。1600 Hz
この入力を信号1 channel
(出力)に変換したい。リサンプルを正しく行うにはどうすればよいですか?
WASAPICapture のコールバックから受け取ったデータ。このコールバックは毎回呼び出され、サンプルが提供されるたび64 ms
に480
呼び出されます。私のエンコーダーは320
毎にサンプルを必要とし20 ms
ました。これを取得するにはどうすればよいですか (再フレーム)?
これを行うためのライブラリを提案してもらえますか? それとも自分でコードを書くべきですか?
c++ - Windowsでmingwを使用してrtaudioをコンパイルするには?
プロジェクトで rtaudio を使用したいと考えています。./configure を実行してから make するよう指示する install.txt の指示に従っています。
make を実行すると、大量の警告が表示されます。
誰かがこれについて私を導くことができれば素晴らしいでしょう.
c++ - 基本的なソフトウェア シンセサイザーでは、時間の経過とともにレイテンシが増大します
私は、MIDI 制御のソフトウェア シンセサイザーを完成させる過程にいます。MIDI 入力と合成は問題なく動作しますが、オーディオ自体の再生に問題があるようです。
をオーディオ サーバーとして使用しているのは、私の場合はバックエンドとしてjackd
リアルタイム MIDI 楽器などの低遅延アプリケーション用に構成できるためです。alsa
jackd
私のプログラムRtAudio
では、さまざまなサウンド サーバーに接続し、それらの基本的なストリーム操作を提供する、かなりよく知られている C++ ライブラリを使用しています。名前が示すように、リアルタイム オーディオ用に最適化されています。
Vc
加算合成プロセスを高速化するために、さまざまな数学関数のベクトル化を提供するライブラリであるライブラリも使用します。私は基本的に、たとえばのこぎり波や方形波など、出力に複雑な波形を生成するために、さまざまな周波数と振幅の多数の正弦波を追加しています。
さて、問題は最初からレイテンシーが高いということではありません。おそらく、MIDI 入力など、多くのことで解決または非難される可能性があるためです。問題は、ソフト シンセと最終的なオーディオ出力の間のレイテンシーが最初は非常に低く、数分後には耐えられないほど高くなることです。
これを「ライブ」で、つまり自宅でプレイする予定なので、キーストロークと聞こえるオーディオ フィードバックとの間の遅延が増え続ける中でプレイするのは本当に面倒ではありません。
問題を完全に再現するコード ベースを縮小しようとしましたが、これ以上縮小することはできません。
でコンパイルするg++ -march=native -pthread -o synth -Ofast main.cpp /usr/local/lib/libVc.a -lrtaudio
プログラムは、最初の引数としてサンプル レートを想定しています。私のセットアップではjackd -P 99 -d alsa -p 256 -n 3 &
、サウンド サーバーとして使用しています (現在のユーザーにはリアルタイムの優先度のアクセス許可が必要です)。のデフォルトのサンプルレートjackd
は 48 kHz なので、プログラムを で実行し./synth 48000
ます。
alsa
サウンドサーバーとして使用できますが、相互作用jackd
などのあいまいな理由から、可能な場合は使用することを好みます.pulseaudio
alsa
プログラムを実行することができれば、ノコギリ波が一定間隔で再生されたり、再生されなかったりするのが聞こえ、再生の開始時と停止時にコンソール出力がオンになるはずです。noteOn
が に設定されている場合true
、シンセサイザは任意の周波数でノコギリ波の生成を開始し、noteOn
が false に設定されている場合は停止します。
うまくいけば、最初はオーディオの再生と停止にほぼ完全noteOn
true
にfalse
対応していることがわかると思いますが、私のマシンでは 1 分~1 分 30 秒あたりで非常に目立つようになるまで、少しずつオーディオ ソースが遅れ始めます。
次の理由から、私のプログラムとは何の関係もないと 99% 確信しています。
「オーディオ」は、プログラムを通じてこのパスをたどります。
キーが押されます。
クロックは と で 48 kHz でカチカチ音をたて、後でサンプル バッファとして使用される を
sample_processing_thread
呼び出しSynthesizer::get_sample
て出力を渡します。std::queue
RtAudio
ストリームがサンプルを必要とするときはいつでも、サンプル バッファからサンプルを取得して移動します。
ここで増加し続けるレイテンシーの原因となる可能性のある唯一のものは、クロックのカチカチ音ですが、ストリームがサンプルを消費するのと同じレートでカチカチ音をたてるので、それはあり得ません。クロックの動作が遅くなると、RtAudio
ストリーム アンダーランが発生し、顕著なオーディオの破損が発生する可能性がありますが、これは発生しません。
ただし、クロックのクリックは速くなる可能性がありますが、そうではないと思います。クロック自体を何度もテストしたため、ナノ秒のオーダーで少しジッターが見られますが、これは予想された。クロック自体に累積的な遅延はありません。
したがって、遅延が増大する唯一の原因はRtAudio
、サウンド サーバー自体の内部機能です。私は少しグーグルで検索しましたが、何も役に立ちませんでした。
私はこれを 1 週間か 2 週間解決しようとしてきましたが、私の側で問題が発生する可能性があるすべてをテストしました。
私が試したこと
- クロックに何らかの累積レイテンシがあるかどうかの確認:累積レイテンシは認識されていません
- キーを押してからオーディオの最初のサンプルが生成されるまでの遅延を計り、この遅延が時間とともに増加するかどうかを確認します。遅延は時間とともに増加しませんでした。
- ストリームがサンプルを要求してからサンプルがストリームに送信されるまでの遅延のタイミング ( の開始と終了
stream_callback
):遅延は時間の経過とともに増加しませんでした