はじめに
マルチメディア系のプログラムを作成していると、音のデータをリアルタイムで処理したいときもあるでしょう。今回は「WAVEファイルからデータを読み込み、加工を施した上で再生する」方法を紹介します。
もちろんWAVEデータ全部をメモリに展開するような手抜きはしません。必要応じてファイルを読み込んでいきます。
対象読者
本稿ではC言語を利用します。WINAPIでウィンドウプログラムを作成したことがある人が対象です。それと、内容が応用系なので、参考資料で一度勉強してからの方が理解できると思います。
「waveOut~」「mmio~」が分かる方は大丈夫でしょう。分からない方も参考資料に載っているページに行けば、すぐに分かると思います。
必要な環境
WINAPIを利用するのでWindowsが必要です。動作はXPのみで確認していますが、他のバージョンでも動くでしょう。それと、コンパイル時に「winmm.lib」が必要です。
概要
今回はいろいろなテクニックを使っているため、それぞれのさわりだけを解説します。分からない部分は参考資料を当たってみてください。そちらの方が1つ1つのことを詳しく説明しています。
それでも分からない場合は、質問してください。
行う加工処理
今回はサンプルなので、「モノラル化」と「簡易ボーカルキャンセル」を行います。それぞれ次の演算をデータに施します。
(L + R) / 2
(L - R)
このボーカルキャンセルは手抜きですが、モノラル化よりも違いが分かるので採用しました。それと、これらの加工は、エコーのように時間軸に対して処理する必要がないので楽です。
注意
今回は処理を単純化しているため、次の制限があります。
- 読み込むWAVEファイルのパスは固定(コンパイル時に埋め込み)
- WAVEデータは無圧縮の16ビットステレオに限定。ただし周波数は限定しない(というより、周波数は調整できる)
mp3やoggを読み込みたい方もいると思いますが、デコード処理が必要なため、今回はパスします。