これは私の以前の質問のフォローアップです:いくつかのサウンドデータを1つの新しいサウンドデータにレンダリングしますか?
サウンドバンクとタイムオフセットを含むファイルを処理して、サウンドを再生する必要があるタイミングをマークし、そこからWaveファイルを生成するプログラムを作成しています。
したがって、FMOD_OUTPUTTYPE_WAVWRITERはこの仕事に最適だと思います。
サウンドバンクの場合、ファイル内で次のようなものを想像してください。
0 kick.wav
1 hit.wav
2 flute.wav
ここで、左側の数字は右側のサウンドファイル名のサウンドIDと、時間オフセットを示しています。
1000 0
2000 1
3000 2
ここで、左側の数字はプログラムにサウンドをミリ秒単位で再生する必要があることを示し、右側の数字はサウンドIDです。
したがって、プログラムを開始すると、FMODは、最初の1秒にキック(kick.wavから)、2番目の秒にヒット、3番目の秒にフルートを含むWaveファイルを生成します。タスクが完了するまで少なくとも3秒間。
ただし、より長い音楽、たとえば5分をレンダリングする場合は、指定されたオフセットでサウンドを再生するのはシステムタイマーに依存するため、タスクが完了するまで少なくとも5分待つ必要があります。ファイル内で、while(true)ループを実行してFMOD::Systemを更新します。たとえばSonyACIDのようなDAWプログラムで見たように、プログラムが実際に指定された時間にサウンドをレンダリングするのを待たずに、より速くレンダリングする方法があるはずだと思います。
次に、APIリファレンスを少し調べます。FMOD_OUTPUTTYPE_WAVWRITER_NRTがあります。これが解決策かもしれないと思ったので、何も変更せずに出力デバイスをすぐに変更しようとしましたが、生成されたWaveファイルの音が台無しになりました。繰り返し音が多く聞こえたり、長い遅延が発生したりします。
では、非リアルタイムバージョンを適切に使用するにはどうすればよいですか?私の場合、NRTを使用するときにfmodシステムを更新する正しい方法は何ですか?
fmodのドキュメント自体にNRT出力タイプの使用法についての明確な説明が見つかりませんでした。
とにかく、私はWindows環境でC++を使用しています。
ありがとう。