問題タブ [synthesizer]
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.
java - MIDI Java がめちゃくちゃな音を生成する
私はJavaのMIDIファイルで各楽器を操作する必要があるプロジェクトに取り組んできました。次に、シーケンスの各トラックから各 MIDI イベントを取得し、レシーバーに送信することにしました。その後、スレッドは各ティックが続く時間を待ってから、次のティックでもう一度実行します。問題は、楽器の音とその順番がめちゃくちゃになってしまうことです。私も各トラックを単独で実行しようとしましたが、それでもめちゃくちゃです! コード:
audio - 正弦波音楽ジェネレーター
私は音と正弦波がどのように機能するか、特に和音について理解しようとする研究を行ってきました。これまでのところ、私の理解は次のとおりです。
それぞれが独立した周波数であり、コンピューターの発電機が簡単に鳴らすことができます。ただし、周波数 A の音符のメジャー コードは次のとおりです。
メジャーコード = b+T+D+A
結果を聞くことができるように、コンピューターシンセサイザーにこの機能を再生させる方法を誰かが持っているかどうか疑問に思っていました。私が見つけたほとんどのプログラムは入力として Hz しか取りません。この関数には波長がありますが、同じ波長の単純な正弦波とは異なります。
注: これは、物理学と音楽のセクションにも投稿します。コンピューター科学者がこれについて何か知っているかどうか疑問に思っています。
java - MIDI シンセサイザ エラーによる Java 文字列の解析と再生
Java でモールス再生メカニズムを実装しようとしています。文字列で正常に動作していましたが、停止機能を実装するために、ドライバーから一度に1つずつ配信される単一の文字で動作させようとしています。
ただし、プログラムはランダムに再生を停止するようです。例えば:
"こんにちは": ... 。.-.. .-.. ---
「---」の直前で無音になる
「うーん」: .... .... .... ....
4 番目の h の最初のドットの後は無音になります。
「おお」: --- --- --- --- ---
4 番目の o の後に沈黙します。
運転者:
再生方法:
c - SDL ミキサーを使用したリアルタイム帯域制限インパルス列合成
この手法を使用してオーディオシンセサイザーを実装しようとしています:
https://ccrma.stanford.edu/~stilti/papers/blit.pdf
SDL2_Mixer ライブラリを使用して、標準 C で実行しています。
これは私のBLIT関数の実装です:
アイデアは、紙の指示に従って、それを組み合わせて方形波を生成することです。この構成で SDL2_mixer をセットアップしました。
そして、ここに私のcreate_rect
機能があります。バイポーラ インパルス列を作成し、その値を統合して帯域制限された rect 関数を生成します。
私の問題は、結果の波はまったく問題ありませんが、数秒後にノイズが発生し始めます。私は結果をプロットしようとしましたが、これがそれです:
何か案が?
編集: 統合する前のバイポーラ BLIT のプロットは次のとおりです。
audio - ビデオ メモリとシステム メモリ間の転送の最適化
しばらく前、私は GLSL を使用して GPU 上でヘビーデューティーなサウンドシンセを作成する実験を行っていました。シンセは、256 以上の同時ボイスを超える非常に複雑なサウンドを生成することができました。CPU に関しては、このようなパフォーマンスが得られるとは夢にも思いませんでした。
(簡単な説明) サウンドを生成するために、NxV サイズの浮動小数点テクスチャを用意しました。N = サンプル数、V = ボイス数。シンセシェーダーは、すべてのテクセルの値を生成します。
次に、2 番目のシェーダーがすべてのボイスを 16 ビットの符号付き整数 1D テクスチャ (またはサウンド カードが必要とする形式) に混ぜ合わせます。この最終的なテクスチャは、ピクセル バッファを使用してできるだけ早くシステム メモリにコピーされた後、サウンド カードに送信されます。
サウンドには、超低遅延の Windows Core Audio を使用しています。
PC に接続された MIDI キーボードで再生できるように MIDI インターフェイスを作成しましたが、Intel GPU を使用するとわずか 3 ミリ秒のレイテンシで完全に動作します (N = 132 サンプルで、必要な 15 ~ 20 ミリ秒よりもはるかに優れています)。 N = 600 ~ 900 サンプル)。しかし、NVidia GPU を使用してさらに重い計算をサポートできるようにすると、レイテンシがはるかに大きくなります (>35ms N=>1500 サンプル)。
その理由は、Intel GPU を使用すると、レンダリングがシステム メモリ上で直接行われ、そのテクスチャのコピーが非常に高速になるためだと理解していますが、NVidia GPU を使用する場合、レンダリングはビデオ メモリで行われ、ビデオ メモリからシステムにコピーされます。転送する必要があるのは約 4KB のオーディオ データだけですが、メモリがボトルネックです (ハードウェアが処理できる 6GB/s にも達しません)。
これを改善する方法はありますか?たとえば、NVidia GPU をシステム メモリに (許容できる速度で) 直接レンダリングさせることは可能ですか? または、彼らが OpenCL で話している有名な共有メモリとは何ですか? OpenCL はこれを改善しますか? (私は OpenCL の経験がありません)