これはゲーム(特にLudum Dareゲーム)用に特別に作成されたサウンド生成ツールであるため、これはゲーム開発の問題だと思います。
振幅の変化が圧力を変化させて音を生み出すという、音のしくみについて基本的な理解があります。でも、プログラミングで音を出す方法、具体的にはsfxrがどのように音を出すのかと思います。私のアプローチは、各振幅を表す値の配列を用意し、それをスピーカーに送信する方法です。しかし、どうやってそれを行うのですか?sfxrが使用するライブラリはありますか?
これはゲーム(特にLudum Dareゲーム)用に特別に作成されたサウンド生成ツールであるため、これはゲーム開発の問題だと思います。
振幅の変化が圧力を変化させて音を生み出すという、音のしくみについて基本的な理解があります。でも、プログラミングで音を出す方法、具体的にはsfxrがどのように音を出すのかと思います。私のアプローチは、各振幅を表す値の配列を用意し、それをスピーカーに送信する方法です。しかし、どうやってそれを行うのですか?sfxrが使用するライブラリはありますか?
回答:
まあ、通常は低レベルにしてオーディオデータをスピーカーに転送する必要はありません。オペレーティングシステムには、そのためのインターフェイスがあります(ALSA、DirectSound、CoreAudioなど)。そのライブラリを使用すると、定期的に固定長のサンプルのブロックを与える必要があります(たとえば、512サンプル)。サウンドライブラリは、その配列を内部バッファーに格納して再生します。
たとえば、ブロックが512サンプル長で、サンプリング周波数が44.1Khzの場合、これは、512サンプルの次のブロックを生成するために512/44100 = 11ミリ秒があることを意味します。更新に時間がかかる場合は、通常、古いブロックが再度再生されます(音は止まりません)。これは壊れたCDのように聞こえ、非常に迷惑です。あなたはそれを望まない。私はsfxrがウェーブ全体を保存し、関連するチャンクをメモリにコピーするだけだと思います、その操作は事実上何もしません。
その上、抽象化されたAPIを提供し、オペレーティングシステムのサウンドアーキテクチャと「対話」する他のライブラリがあります。このようにして、サウンドコードを各システムに適応させる必要なく、マルチプラットフォームアプリケーションを簡単に作成できます。それらの例としては、fmod、OpenAL、SDL、PortAudio、長いetceteraなどがあります。
更新:
sfxrは、WindowsバージョンにはPortAudioを使用し、その他のプラットフォームにはSDLを使用します。main.cppの最後を見ると、これらのエンジンがどのように初期化されているかがわかります。PortAudioにはAudioCallbackと呼ばれる関数へのポインタが渡され、SDLにはSDLAudioCallbackへのポインタが渡されます。これらの関数が実行するのは、512サンプルのブロックを処理し、それを出力バッファーにコピーすることです。処理自体は、SynthSampleと呼ばれるかなり複雑な関数で行われます。これは、sfxrのシンセサイザのすべての内部パラメータが指定されたブロックに必要な出力サンプルを生成する関数です。
私はこの答えを書き始めましたが、どんどん長くなってきたので、これは冗長な答えになるので、それからあなたが何をするかを考えてください。CeeJayが言ったように、通常、このことについて心配する必要はありません。特に、FMOD、Wwise、XACTなどのAPIを使用して、サウンドデザイナーがすべてを自分で接続できるようにすると、「play this.wav」ではなく、「PlayExplosionSoundイベントをトリガー」します。ゲームにサウンドを統合するのがはるかに簡単になります。
SFXRはいくつかの基本的なサウンドジェネレーターを構築することで機能し、GUIに表示されるパラメーターを提供します。XNAとActionScript 3の両方で、基になるミキシングエンジンに直接オンザフライでサンプルを渡す方法が最近提供されました。XNAは既に静的サンプルバッファーを定義できます(XNASfxrSynthがこれを使用しているように見えます)が、DynamicSoundEffectInstanceにサンプルバッファーのフィードを要求するイベントを発生させることができます。これにより、継続的に生成されるオーディオ信号のメモリフットプリントが大幅に削減されます。独自のミキシングエンジンを技術的に作成することもできます。ミキシングのためにすべてのサンプルバッファーが送信される単一のマスターサウンドインスタンスを用意します。
正弦波ジェネレータを作成する一般的な例は、Soundクラスの新しいsampleDataEventイベントに関するAdobeのドキュメントにあります。それは、デジタルオーディオがどのように機能するかを理解し、適切なサンプルバッファーを構築して必要なサウンドを取得することです。また、Andre Michelleのサイトで、Flashのより高度な高度なオーディオ処理についてもご覧ください。
CeeJayが言ったように、オーディオデータは通常、関連するサンプリング周波数を持っています(通常、44.1kHzまたは48kHz-バトルフィールドバッドカンパニーは48を使用して、優れた5.1システムが接続されている場合、高忠実度の再生を実現します)。デジタルオーディオを扱う場合、ナイキスト周波数と呼ばれるものについて心配する必要があります。基本的に、オーディオ信号で表現できる最高周波数は、サンプリング周波数の半分です。44.1kHzと48kHzが最も一般的なサンプリング周波数である理由は、人間の聴覚の範囲が約0〜20kHzであるためです。したがって、44.1kHzと48kHzは、ほとんどの消費者のシステムで忠実度の高いサウンドを再現するのに非常に適しています。
また、最終的なミックスでは通常16のビット深度があります。これは、各サンプルの振幅を表す16ビット(-32768〜32767)があることを意味します。これは、およそ96 dBのボリューム範囲で動作することを意味します。映画館でのサウンドの標準的な強度制限は85 dB SPL(デシベルシステムは相対的であるため、SPLビットはラウドネスを標準化する方法の1つ)であるため、16ビットはほとんどの消費者のシステムのファイナルミックスに適しています。
多くの場合、ゲームは32ビット浮動小数点値を使用して内部ミキシングを行い、サウンドカードにプッシュする前に16ビットに変換します。これは、サンプリング周波数96kHzで24ビットで録音するのと同じ理由です。サウンドの操作を開始するときは、できるだけ多くのヘッドルームが必要です。デジタルオーディオエフェクトは、クールで新しい高周波信号を発生させ、シグナルチェーンのさらに下で操作され、最終的な出力に影響を与えることがあります。16ビット、48 / 44.1kまでミックスすると、これらが途切れる場合がありますが、途中ですべてのデータが保持されます。これは、アートアセットを変更する必要があるたびに再エクスポートされる高解像度の.PSDファイルのコピーを保持するようなものです。ただし、これはすべてオーディオエンジンでリアルタイムに行われます。
オーディオプログラミングの下位レベルの概念について詳しく知りたい場合は、Richard BoulangerとVictor LazzariniによるThe Audio Programming Bookを参照することをお勧めします。私は数週間前に私のコピーを受け取ったばかりで、オーディオプログラミングの概念を理解するのに非常に役立ちます(Cの導入の章は退屈ですが、その中に重要な概念があるため、見逃すことはできませんが、ポインタ算術の説明をじっくりとご覧ください)
別の良い本はフーリエは誰ですか?。数学の背景をほとんど想定しておらず、音声パターンを研究しようとする言語研究者のコンテキストで、フーリエ変換と一般的な波動理論の基礎をカバーしています。子供の紹介の日本語の教科書はかわいい手描きのキャラクターで感じますが、同時に第2章でリーマンの和について話しています。