mikeo_410


WavIO DLL R言語 エクステンション

 このプログラムは、「Waveファイルの入出力」と「録音、再生」の機能を持っています。R言語のスクリプトから呼び出す、ダイナミックリンクライブラリです。

R言語のスクリプトから録音再生、WAV入出力

注意:

  1. 音の再生時は、音量に十分注意してください。
    私の提案は、ボリュームを    できるだけ絞ったままにして、動かさないことです。音量は、PCMデータの値で制御します。いつも(32767/max(abs(pcm))を乗じるなどして)データがマキシマイズされている状態で使っていれば、突然大きな音が出ることはなくなります。
  2. このプログラムは、すべて完了復帰です。録音再生には時間がかかります。    指定する値に注意してください。
  3. 音声データは、大きいです。指定した条件でどれだけの容量になるか、試算した上で使ってください。
  4. このプログラムは、すべて入出力の一方がメモリ(主記憶)です。分割して扱う機能はありません。容量に注意してください。

1.ファイル構成

  1. カレントディレクトリ/WavIO_R.R
    R言語のスクリプトで、関数定義をしています。
  2. カレントディレクトリ/WavIO_R.dll
    C++で書いたDLLで、RからはCの関数が呼び出せるので、インタフェースに
        使います。
  3. 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.関数

  1. wav16play(x, ch=1, hz=11025)
    xをPCMデータとして再生します。もし、xがLISTの場合は、wav16read()で入力したものと見なして、LISTの$ch,$hz,$pcmを使います。
  2. wav16record(ch=1, hz=11025, sec=2)
    録音デバイスから、sec秒間録音します。関数値がPCMデータを表すベクトルです。
  3. wav16read(path, start=0, samples=99000)
    ファイル名pathを開いてPCMデータを読み出します。$ch,$hz,$pcmからなるLISTを返します。start、samplesの単位は、モノなら2バイト、ステレオなら4バイトです。(8ビット/サンプルも読みます。16ビット化されて読み込まれます。)
  4. 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を作りました。

 

 

 

 


web制作会社 ヴェルファイア 横浜 不動産 東戸塚 マンション 保険 見直し