はじめまして、Visual C++6.0の経験が、約3週間のカミ—ヤ777といいます。よろしくお願いします。
『著作者:田辺義和氏 Windowsサウンドプログラム』のリアルタイム処理の
WaveThruプログラムを応用して、リアルタイムに雑音(騒音)をおさえつつ、
過小な音量を大きくしたり、過大な音量を小さくするマルチなリミッター機能を作っています。
↓以下が、そのアドレスになります。
http://www.cactussoft.co.jp/download.htm
ボリュームコントロール機能は、WaveOutSetVolume()関数やWaveOutGetVolume
()関数を使いました。
私としては、入力された音のレベルを求めて、この大きさを使って、レベルをコントロールできるのでは?
と思っています。
そこで、このソースの『WaveThruDlg.cpp』の、入力側の録音バッファがある
GetRecBuffData(CBuffPos* pBuffPos, LPBYTE pBuff, DWORD nLength)
関数にレベルをコントロールできそうな情報があるのか?、深いところまで理解していないですが
これに一次のIIRフィルタを用いれば、入力レベルを検出できるのではないかと思っています。
そして、この検出された入力レベルをもとに、再生側である出力の
SetPlayBuffData(CBuffPos* pBuffPos, LPBYTE pBuff, DWORD nLength)関数と、
組み合わせて数値演算式で処理を行えば、リミッタが実装できるのではないかな?
と思っています。
それか、ボリュームコントロール機能を作る際に用いた、WaveOutSetVolume()関数や
WaveOutGetVolume()関数を使うことで、できるのかな?とも思っています。
ただ、これらの作り方が見えてこず、わからない状態で、しかも、
期日も迫っていますので、非常に困っています。
どういった関数やを使えばいいのか、コードを書けばいいのかわかりません。
誠に恐縮ですが、アドバイスよろしくお願いします。失礼します。
まず・・・
WaveOutSetVolume()関数やWaveOutGetVolume()関数を使った場合
ハードウェアによっては、雑音が入る場合があります。また、サ
ポートしていないハードウェアもある場合があることを言い置い
て・・・
今回必要な機能としては、リアルタイムに変化する入力音源の
レベルを何らかの数値フィルタでレベルを検出しつつ、結果、
ボリュームをリアルタイムに可変させて、出力を調整するとい
う機能になりますネ!
では、リアルタイムに出力としての音量を可変させられるか?
と言う部分で、入力される音源の速度(サンプルレート)に対
し、そこまで高速にボリューム変化(応答性)を行って結果が
得られるかどうか・・・疑問です。
わざわざ数値フィルタでレベル検知をするのですから、もう
一歩踏み込んで、ソフトウェアアンプを作り、音量はそのま
まで、出力を可変させるような仕組みの方が、具合がいいと
思います。
あと、WAVEデータ(RIFF)の中身はちゃんとご存知
ですか?
それが解っていれば、ボリュームの可変と、WAVEデータ
のみでの出力可変は、どちらでも可能かと思います。
データサブチャンクには、実際にサンプリングされた生の値
が入っていますので、試しにその値を半分にしてみるとかし
て、聞き比べて下さい。ボリューム可変より楽に調整が可能
かと思います。
レベルの検出では、サンプリングレートによりますが、WAVE
のサブチャンク中の生データの総和がレベルに相当します。
周波数成分をスペクトル解析で求めるのも手ですが・・・
FFT・逆FFTと言う方法です。
ですが、リアルタイム性にかけるので、オススメしません。
録音バッファにある程度の容量を持たせれば、それも可能か
とは思いますが・・・
ただし、サンプリングレートやモノラル・ステレオ等のパラ
メータはいじらないように・・・間違うとスピーカを壊すだ
けではなくて、サウンドカードも壊してしまうことになりま
すから・・・
ご検討下さい。
※ WAVEファイルをエディットできるツールは別に持って
おられますか?あれば、非常に便利です。
出力特性やレベルをいじって、別名で保存し、WAVE
ファイルをバイナリエディタで見比べれば、その差として
どこが変化したのか、歴然です。聞き比べれば尚、よく、
解りますので・・・
● 言うは易し・・・行うは難し・・・です。
C言語で行う場合、かなりのコードをかかないと到達でき
ないと思います。
掲載されていたホームページですが・・・
WaveOSC
WaveSono
この2ツを組み合わせれば、今欲しい機能の大半はできて
しまいます。そういう意味では、コードを書く手間は無く
なりますので、その2ツのソースも解析され、理解される
ことをオススメします。
以上。
掲載URLでのサンプルソフトですが・・・
残念ながらソースな無かったのですネ!
しかしながら、マルチポスト・・・
そちらの掲示板でお聞きになっているので、
そちらで目的を達して下さい。
以上。
録音したデータの再生部への受け渡し個所に、レベルのデータを変更する関数を挿入したら、できました。
何とか解決できて良かったです。お世話になりました。本当にありがとうございました。
解決のチェックを入れ忘れていたので、入れておきます(^^。
ツイート | ![]() |