Un4seen BASS Audio Library で入力モニター


さて、前回「Un4seen BASS Audio Library でサウンド再生してみよう」 でサウンド再生をしてみたわけですが、いろいろいじくっていると便利な機能が結構あるみたい。そこで、「NAudio ライブラリでオーディオを再生する(4)」 で作ってみたインプットをアウトプットに流し込むインプットモニター機能を BASS でも作ってみましょう。ついでに、リバーブかける実験なんかもやってみました。

BASSで入力を扱う

入力は、BASS_Recordxxxx みたいなメソッドが用意されてますので、それを使います。BASS_RecordSetDevice でデバイスを選んで、BASS_RecordInit で初期化して、BASS_RecordStart で入力のキャプチャを開始するという感じです。キャプチャしたオーディオデータをファイルに書きだせばレコーダの出来上がりですが、今回はそれをアウトプットに流し込みます。

データの流し込みは、あとでちゃんと見つけたデータ受け渡しのコールバックを使ってバッファを間に入れておけばいいようです。バッファ _monBuffer は便利なクラス BASSBuffer があるので、2秒ほど確保しておきます。

// 2秒, 44.1kHz, 16-bit, stereo
private BASSBuffer _monBuffer = new BASSBuffer(2f, 44100, 2, 16);

入力側は、こんな感じで inputDataWrite というコールバック関数でデータを受け取り_monBuffer に保存します。RECORDPROC はデリゲートです。

inputChannelProc = new RECORDPROC(inputDataWrite);
inputChannel = Bass.BASS_RecordStart(freq, ch, BASSFlag.BASS_DEFAULT, 20, inputChannelProc, IntPtr.Zero);

 

private bool inputDataWrite(int handle, IntPtr buffer, int length, IntPtr user)
{
	_monBuffer.Write(buffer, length);
	return true;
}

出力側では、BASS_StreamCreate でコールバック outputDataRead を指定しておき、その中でバッファから読みだします。

outputChannelProc = new STREAMPROC(outputDataRead);
outputChannel = Bass.BASS_StreamCreate(44100, 2, 0, outputChannelProc, IntPtr.Zero);
private int outputDataRead(int handle, IntPtr buffer, int length, IntPtr user)
{
	return _monBuffer.Read(buffer, length, user.ToInt32());
}

あとは、入出力を初期化して入力側を BASS_RecordStart、出力側を BASS_ChannelPlay すれば入力の音が出力に流れます。レベルメーターや音量調整は前回と同じ。

リバーブもかけて見よう

bass2-2

BASS ではエフェクトをかけるのも簡単なので、入力にリバーブをかけて出力してみましょう。そのために、BASS  のサイトから BASS FX(bass_fx24.zip、base_fx.dll含む)をダウンロードしてプロジェクトに突っ込みます。リバーブのパラメータは、BASS_DX8_REVERB という構造体で渡しますので、パラメータ設定のUIを作っておきます。流れだけを抜き出すとこんな感じです。出力のチャンネルに、BASS_ChannelSetFX するだけ。なんて簡単なんでしょう!

BASS_DX8_REVERB rev = new BASS_DX8_REVERB();
//:
//:
rev.fInGain=trackBarGain.Value;
rev.fReverbMix=trackBarRMix.Value;
rev.fReverbTime=trackBarTime.Value;
rev.fHighFreqRTRatio=trackBarHighFreq.Value/1000f;
//:
Bass.BASS_FXSetParameters(outputChannel, rev);
Bass.BASS_ChannelSetFX(outputChannel, BASSFXType.BASS_FX_BFX_REVERB, 1);
//:

リバーブかかるよすげえよ

リアルタイムにパラメータをいじるようにはできていませんが、リバーブ簡単にかかりました。こんな機能は、NAudio では簡単にできなかった。イコライザ―なども追加できるようですし、どうも NAudio よりも BASS のほうがやりたいことまで近いイメージ。あとはもう少しネイティブな Core Audio まわりなどを扱えるかどうかが気になりますが、それは回を改めましょう。

bass2-1

load_download
BASEInputMonitor.zip ダウンロード

参考

  • BASS audio library
    http://www.un4seen.com/

You can skip to the end and leave a response. Pinging is currently not allowed.
Subscribe to RSS Feed Twitter は Ume108 だよ