2012年6月14日木曜日

MIDIIO on VC++2010Express

今VisualC++でMIDIを扱おうとしています.

っていうか久々でしたね.

自分のための備忘録です.
他の人は役に立つかなー?

そこでいろいろ調べていたらMIDIIOっていうモノがありました.
MIDIIOってのはMIDI信号の入出力用ライブラリなのですよ.
こんな便利なものがあるなんて!
これで勝つる.
と思ってはいたんだけど実際に組もうとすると
リンクエラーが出まくったのだよ.

そもそも僕はLinuxの組み込みばっかりやってたから
VC++なんてほとんど使ったことない.
VC#は昔にDirectXプログラミングやってた.
なので知識がVC++単体で組めるレベルまでしかないのです.
外部ライブラリのインポート?やりかたわからん…

ということで手順.
VC++をバリバリに使ってる人からしたら
当然なレヴェルの出来事です(・ω・)

1.ダウンロードしなきゃ始まらない
MIDIIOはフリーなのです.
素晴らしい.
これで勝つる.
http://openmidiproject.sourceforge.jp/MIDIIOLibrary.html
ここから一番新しいモノを落としてくる.
今現在だとV.0.8かな.

MIDIIOの公式ガイドブックというサイトもあります.
http://www.oifii.org/ns-org/nsd/ar/cp/midi_sf-jp_Sekaiju2/MIDIIO/docs/MIDIIO.html

前提なのですが,このエントリはそのV0.8とVC++2010Expressを使って
ビルドが通ったぜ!ウェーイ
VC++2008Expressも同様に試しています(以下,赤字は後日追記)
っていうところまでしか確認してません.
音が出せない環境で今書いているので
素晴らしいことに動作確認していません.
確認しました ビルドが通るだけで鳴りません

で,ダウンロードしてきたMIDIIOLib0.8.zipを適当なところで展開.
我々が使うのは
・MIDIIOLib0.8\MIDIIO.h
・MIDIIOLib0.8\Release\MIDIIO.dll
・MIDIIOLib0.8\Release\MIDIIO.lib
の3ファイルです.

2.各ファイルを適切な場所に置く
その3ファイルをVC++の管理下に置きます.

VC++を開いて適当なプロジェクトを作ってみて
画面左の「ソリューションエクスプローラ」でプロジェクト名を右クリックして
「プロパティ」を選んで
「構成プロパティ」>「VC++ディレクトリ」
VC++2008では
ツール>オプション>プロジェクトおよびソリューション>VC++ディレクトリ

を見てみたことがあるのなら分かると思うのですが,
ライブラリやヘッダファイルを置く場所というのは決まっています.
VC++は特定のディレクトリにあるライブラリやヘッダファイルを見ているのです.
もちろんVC++が参照するディレクトリを追加することもできるのですが,
参照ファイルが増えるに連れ参照ディレクトリを増やすなどということは普通はしません.

なので,VC++が最初から見ている場所にMIDIIOのファイルを置いていきます.

ちなみにいまの環境はWindows7 64bitでやっています.
前提としてVC++がインストールされているディレクトリを
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC
とします.
VC++2008なら
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC
ですね
Express Editionではインストール先選べなかったと思うので
多分このあたりにインストールされてるはずです.

まずはMIDIIO.h
これは
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include
ここに移してください.

次にMIDIIO.lib
これは
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib
ここ

最後にMIDIIO.dll
こいつは
C:\Windows\System32
ここと
C:\Windows\SysWOW64
ここ
多分OSが64bit版なら後者だけでいいと思います.
32bit版なら前者(後者はないと思うふ)
まぁ両方入れておけばいいでしょう(・ω・)

これで下準備が終わりました.

この章の2文目に書いた「構成プロパティ」>「VC++ディレクトリ」を見てみてください.
さっきやったことで
「実行ディレクトリ」にDLLを,
「インクルードディレクトリ」にヘッダを,
「ライブラリディレクトリ」にライブラリを保存したことがわかります.

3.テストプログラムを実行するビルドを通す

MIDIIO 公式ガイドブックのVC++から使うサンプルプログラムを実行します.
http://www.oifii.org/ns-org/nsd/ar/cp/midi_sf-jp_Sekaiju2/MIDIIO/docs/MIDIIO.html#APPENDIX_A

まずはVC++を開き,今後のためも考えてWindowsフォームアプリケーションのプロジェクトを作りましょう.
ここではプロジェクト名をtestとします.
testプロジェクトができたら左のソリューションエクスプローラの
「ソースファイル」>「test.cpp」をいじっていきます.

すでにmain関数が出来ているはずなのでとりあえずそいつは放置
適当な関数名int testFuncとでもして作成します.
testFunc関数内にサンプルプログラムのmain関数をまるっとコピペ.
インクルードするヘッダファイルの部分もまるっとコピペ.
でもそのままではエラーだらけです.

まずは
'MIDIOut_OpenW' : 1 番目の引数を 'const char [32]' から 'const wchar_t *' に変換できません。
というエラーが出るはずなので

MIDIOut* pMIDIOut = MIDIOut_Open ("Microsoft GS Wavetable SW Synth");
この行を

const wchar_t * wchar = L"Microsoft GS Wavetable SW Synth";
MIDIOut* pMIDIOut = MIDIOut_Open (wchar);
こう修正する.


次に
ijw/native モジュールが検出されました。pure モジュールとリンクできません。
とかいうエラーがでます.(ピュア)
元々.NETで使うことを前提としてないライブラリだからでしょうか.

ツールバーの「プロジェクト」>「プロパティ」
(or ソリューションエクスプローラのtestの上で右クリック,「プロパティ」を選択)
「構成プロパティ」>「全般」の
「共通言語ランタイムサポート」が「純粋 MSIL 共通言語ランタイム サポート (/clr:pure)」になっているのを
「共通言語ランタイム サポート (/clr)」に変更する
このエラーはこれで終わり


最後に
未解決のトークン **** が関数 **** で参照されました。

未解決の外部シンボル **** が関数 **** で参照されました。
外部参照  * が未解決です。
というエラーがどっさり出るはずです.

ヘッダファイルをインクルードしてる後に
#pragma comment(lib, "MIDIIO.LIB")
を加えてやるとこのエラーも終了.

これでビルドが通るはずです.

でもたとえmain関数内でこのtestFunc関数を呼び出しても
音はなりませんでした.
今回は第一章で書いたとおり
ビルドが通るまでなのでここまでです.

0 件のコメント:

コメントを投稿