WavIO DLL R言語 エクステンション
このプログラムは、「Waveファイルの入出力」と「録音、再生」の機能を持っています。R言語のスクリプトから呼び出す、ダイナミックリンクライブラリです。
「R言語のスクリプトから録音再生、WAV入出力」
注意:
- 音の再生時は、音量に十分注意してください。
私の提案は、ボリュームを できるだけ絞ったままにして、動かさないことです。音量は、PCMデータの値で制御します。いつも(32767/max(abs(pcm))を乗じるなどして)データがマキシマイズされている状態で使っていれば、突然大きな音が出ることはなくなります。
- このプログラムは、すべて完了復帰です。録音再生には時間がかかります。 指定する値に注意してください。
- 音声データは、大きいです。指定した条件でどれだけの容量になるか、試算した上で使ってください。
- このプログラムは、すべて入出力の一方がメモリ(主記憶)です。分割して扱う機能はありません。容量に注意してください。
1.ファイル構成
- カレントディレクトリ/WavIO_R.R
R言語のスクリプトで、関数定義をしています。
- カレントディレクトリ/WavIO_R.dll
C++で書いたDLLで、RからはCの関数が呼び出せるので、インタフェースに
使います。
- R言語のインストールディレクトリ/bin/ClassLibrarySub_R.dll
C#で書いたDLLで、機能の本体です。
※ カレントディレクトリ
R言語を起動して、「ファイル」「スクリプトを開く」としたときに表示されるディレクトリです。
このディレクトリは、R言語を起動するアイコンやメニューの「プロパティ」「作業フォルダ」で決められます。
※ R言語のインストールディレクトリ
わたしのパソコンでは、
C:\\Program Files\\R\\R-2.7.0\\bin
です。
2.インストール
ダウンロードしたWavIO_R_xx.zipを解凍すると3つのファイルが展開されます。
前述の「ファイル構成」の記述に従ってコピーしてください。
3.使い方
R言語のコンソール・ウインドウで
> source("WavIO_R.R")
と、入力します。
WavIO_R.dllがロードされ、WavIO_R.Rに記述された関数が有効になります。
> wav16play
のように関数名を入力すると、関数のスクリプトが表示されます。
R言語のスクリプトの例は、「R言語でWaveファイル、録音、再生」を参照ください。
4.関数
- wav16play(x, ch=1, hz=11025)
xをPCMデータとして再生します。もし、xがLISTの場合は、wav16read()で入力したものと見なして、LISTの$ch,$hz,$pcmを使います。
- wav16record(ch=1, hz=11025, sec=2)
録音デバイスから、sec秒間録音します。関数値がPCMデータを表すベクトルです。
- wav16read(path, start=0, samples=99000)
ファイル名pathを開いてPCMデータを読み出します。$ch,$hz,$pcmからなるLISTを返します。start、samplesの単位は、モノなら2バイト、ステレオなら4バイトです。(8ビット/サンプルも読みます。16ビット化されて読み込まれます。)
- wav16write(path, x, ch=1, hz=11025)
ベクトルxをPCMデータとしてWaveファイルに書き込みます。もし、xがLISTの場合は、wav16read()で入力したものと見なして、LISTの$ch,$hz,$pcmを使います。
5.ビルド
5.1.R.libの用意
Visual Studioのプロジェクトでビルドするには、R.LIBが要ります。
dumpbin /exports R.dll
で、R.dllのエクスポートの一覧が得られる。これをエディタで、
Exports:
関数名
:
に、編集しR.DEFとします。
lib /def:R.DEF /machine:x86 /out:R.lib
5.2.WavIO_R.dll(C++で作成するDLL)
VC++ 9.0 Expressを使いました。「WIN32プロジェクト」で「DLL」をチェックして普通のDLLを作ります。
Rスクリプトは、C(C++)の関数を呼び出せます。WavIO_dll_R.cppは、Rスクリプトとのインタフェースをします。
WavIO_R.cppは、/clrでコンパイルするマネージドのプログラムです。このプログラムからC#で作成したDLLを呼び出します。WavIO_dll_R.cppとWavIO_R.cppは異なるコンパイルオプションでコンパイルします。
VC++上のGUIで設定したので、どこをどうしのかは良く記憶していないので、「コマンドライン」の表示を貼っておきます。
WavIO_dll_R.cppのコンパイルオプション
|
/O2 /Oi /GL /I "C:\\Program Files\\R\\R-2.7.0\\include" /AI "C:\\Program Files\\R\\R-2.7.0\\bin"
/D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_USRDLL" /D "WAVIO_DLL_R_EXPORTS"
/D "_WINDLL" /D "_MBCS" /FD /EHsc /MD /Gy /Fo"Release\\\\" /Fd"Release\\vc90.pdb"
/W3 /nologo /c /Zi /TP /errorReport:prompt
|
WavIO_R.cppのコンパイルオプション
/O2 /Oi /GL /I "C:\\Program Files\\R\\R-2.7.0\\include" /AI "C:\\Program Files\\R\\R-2.7.0\\bin"
/D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_USRDLL" /D "WAVIO_DLL_R_EXPORTS"
/D "_WINDLL" /D "_MBCS" /FD /MD /Gy /Fo"Release\\\\" /Fd"Release\\vc90.pdb"
/W3 /nologo /c /clr /TP /errorReport:prompt |
リンクのオプション
/OUT:"/codesamples/R_WORK\\WavIO_R.dll" /INCREMENTAL:NO /NOLOGO
/LIBPATH:"C:\\CodeSamples\\R_WORK\\lib" /DLL /MANIFEST
/MANIFESTFILE:"Release\\WavIO_R.dll.intermediate.manifest"
/MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG
/PDB:"c:\\CodeSamples\\R_WORK\\WavIO_R.pdb" /SUBSYSTEM:WINDOWS
/OPT:REF /OPT:ICF /LTCG /DYNAMICBASE /NXCOMPAT /MACHINE:X86
/ERRORREPORT:PROMPT R.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib
advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib |
5.3.ClassLibrarySub_R.dll(C#で作成するDLL)
WavIO2.DLLなどで使ってきたClassLibraryから抜粋と、結構な修正をして、ClassLibrarySub_R.dllを作りました。
|