問題タブ [sound-synthesis]
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.
sound-synthesis - SuperCollider で FFT チェーンの個々のビンを設定する
私はイメージからサウンドへのプロジェクトに取り組んでおり、SuperColliderで加算合成を実装しようとしています。SinOsc
それぞれのシンセを作成する代わりに、逆 DFFT を使用して (数百の) 正弦波を合計したいと考えています。
SuperCollider のすべてのドキュメントでは、IFFT
「FFT チェーン」と呼ばれるものを消費すると述べFFT
ていPV_*
ます。
しかし、私のアプリケーションでは、信号が周波数領域でどのように表現されるかを既に知っているので、FFT ステージは必要ありません。私が代わりに欲しいのは:
「周波数ドメイン信号」は、Python アプリケーションに既にある周波数ドメインの信号を表す numpy 配列のシーケンスです。したがって、この情報を SuperCollider に渡す必要があります。
私が理解していることから、FFTチェーンはある種のデータストリームを意味しますが、手動でデータを書き込む方法がわかりません。
FTT
また、サイレントFFTチェーン( get of など)で遊んでみましたがSilence.ar
、個々の周波数ビンを手動で設定する方法もわかりません。
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
):遅延は時間の経過とともに増加しませんでした
audio-processing - モジュレーション インデックス = Modulator Operator の「Out」レベル
周波数変調のアルゴリズムについて読んでいます。ほとんどのシンセサイザーでは、各アルゴリズム オペレーターに「出力」レベル ノブがあり、キャリアではこのノブが出力ボリュームを制御します。ただし、モジュレーターの場合、レベル ノブは、キャリアに対する変化の量を決定します。
この量は変調指数ですか?
puredata - FM 合成アルゴリズムで変調器を変調器に接続する
いくつかの Fm シンセ アルゴリズムを純粋なデータに実装したいのですが、私のアプローチが正しいかどうかを知る必要があります。
私の懸念は、オペレーター 5 と 4 をどのように接続すればよいかということです。モジュレーターをキャリアに接続する方法のいくつかの例 (オペレーター 2 と 1 など) を読んだだけですが、モジュレーターを別のモジュレーターに接続する方法は決してないので、わかりません。適切なオブジェクト ( +~ または *~ ?) を使用して、適切に実行している場合。
また、アルゴリズムには、まだパッチに追加していない 6 番目の演算子もあることがわかります。フィードバックについて尋ねなければならないので、それは無視してください。別の質問で尋ねることができると思います。
そして、その dac~ オブジェクトはテスト目的でのみ存在します。
javascript - ウェーブテーブル合成 - WebAudioApi
Web Audio API を使用してウェーブテーブル シンセサイザーを作成しようとしています。私が達成したいのは、波形から別の波形 (Massive や Serum など) に直線的に切り替える可能性です。
例:正弦波から始めて、徐々に方形波に変換するノブを回転させます。
ドキュメントを検索したところ、カスタム波形を作成する方法が見つかりました。
主な問題は、この波形が静的であることです。それを徐々に別のものに変更することはできません。
どうすれば目標を達成できますか? 私は、互いに補完し合うように各波の後に配置された 2 つのゲイン ノードについて考えていました。
例:私の正弦波Gain1
は10で、方形波Gain2
は0です。次に、それらを相補的に、Gain1
= 5、Gain2
= 5などに変更します。
それは有効なアプローチですか?