objective-cをちょい研究!ブログ -46ページ目

objective-cをちょい研究!ブログ

WILLCOMを卒業してiOS開発者に転身しました。。
コメント&トラックバック大歓迎です。

GSPlayerというZero3でもMIDIが再生できるソフトがありました。
MIDI再生部分についてはプラグインという形でDLL化していて、
ソースも公開されているようなので、ちょっと試しに動かしてみました。
プラグインのgspmidi.dllというDLLより、mapGetDecoderという関数を
インポートすればいろいろな関数が使えるようです。


http://hp.vector.co.jp/authors/VA032810/index.htm
MIDI Plug-in から gspmidi101.zip をダウンロードして解凍
ppc\gspmidi.arm.CAB を解凍
0gspmidi.001 を gspmidi.dll にリネームしてDLLを抽出
Sourcecode(gspmidi101src.zip)よりmapplugin.hをインクルード


<C++ソース>

MAP_DEC_PLUGIN* (__stdcall WINAPI *mapGetDecoder)(); //関数宣言
HINSTANCE hDll = LoadLibrary(_T(gspmidi.dll"));    //DLLインポート

mapGetDecoder = (MAP_DEC_PLUGIN*(__stdcall WINAPI *)())

    GetProcAddress( hDll,TEXT("mapGetDecoder")); //関数アドレス取得


//関数実行(関数コレクション取得)

MAP_DEC_PLUGIN* b = mapGetDecoder();

b->GetFileExtCount(); //← こんな感じで呼出し実験。
FreeLibrary(hDll);

※TABの代わりに全角スペース使ってます。コピペの際は置換して下さい。

Windows Mobile 6のMIDIを再生する関数(waveOutWrite)を試したところ、アドエスで鳴るには鳴りました。
が、ノートオンとノートオフしか使えないみたい。音色や音量を指定してもまったく変化無し。
(ちなみにベロシティによる音量はできました)
電子音というか、まさに3和音だった502iシリーズのような音でした。
音が悪いって書かれている人がいたんですが、このことだったんですね(--;


一応参考までにメッセージ部分の解説です。


<ノートオン>
MidiMessage[j].DeltaTicks=0; '待ち時間
MidiMessage[j++].MidiMsg=0x7F3C90;

90…0chで音を鳴らす(91なら1ch、92なら2ch…)
3C…中央のドの音を鳴らす。1ずらすごとに半音上下します。
7F…ベロシティ。0~127で音量みたいなものです。


<ノートオフ>
MidiMessage[j].DeltaTicks=50;
MidiMessage[j++].MidiMsg=0x003C80;

80…0chの音を止める(91なら1ch、92なら2ch…)
3C…3Cの音を止める。ノートオンで指定した音階と同じものを指定する。
00…ノートオフベロシティ。とりあえず0でOKです。


#とりあえずは、テンキーで演奏する電子ピアノでも作ってみようかな。

Zero3で普通にMidiが着信音にできることすら知らなかった(^^;;;
調べてみると、Windows Mobile 6 からMIDIがサポートされているらしい。Microsoftのページにサンプルも発見。
http://mtbeta.msdn.microsoft.com/ja-jp/library/aa910248.aspx?altlang=ja-jp


WAVE系関数を使ってますが、構造体にMIDIメッセージ突っ込んで渡してあげるだけでいいみたい。音色データも作らなくていいのかな。低レベルMIDI関数的な使い方できそうなので、なんとかなりそう。

Zero3用のプログラムを何か作りたいなと思っているんですが、簡単に作れそうなものってほぼ作られてるんですね。さて何を作ろう・・・

今日思いついたのが、自分にできることと言えばPsmPlayerをZero3用に移植すること。MIDI再生のAPIを使えば何とかなるだろうと調べたところ、Windows MobileではMIDIが再生できないことが判明。早速挫折…

なにかフリーのMIDIドライバがないか探したんですが、ソフト音源を内蔵したMIDI再生ソフトはいくつかあったんですが、外から呼んで使うのは無理そう。

えーい、最終手段でソフト音源まで自作してしまえー!ってことで、まずは調査を開始することにしました。PsmPlayer for Windows Mobileプロジェクト始動です(^^; MIDI音源の自作は無理だとしても、調査経過をブログに書いておけば、誰か作ってくれないかと(他力本願・・・(^^;;;)


大まかな流れは、MIDIをWAVEに変換して鳴らす。幸い(限りなく不幸中のですが)、Windows MobileでもWAVEは再生でき、Sound APIも用意されていました。

問題としては、和音を再生するには、SoundAPIでは同時発音できないので、波形を重ねてあげないといけない。ただ、波形の重ね合わせは単純な足し算でよさそうなのでなんとかなりそう。

2つめは、1曲分のWAVファイルを作ると膨大になってしまうので、WAVデータを作りながら再生させないといけない。低レベルAPIを使うしかなさそう。

3つめは、WAVEへの音色変換ですが、DLSファイルを利用しようと考えてます。どうやらWindowsにもgm.dlsというファイルが音色ファイルが標準で入っているようです。まだバイナリエディタで眺めただけですが、RIFF形式のファイルに音色データとしてWAVEファイルが沢山埋め込まれているようです。これなら何とかなりそう???