• ベストアンサー

MCIを使ったMIDIの連続再生

c言語とMCIを使ってMIDI形式の音楽データを再生する事は出来るのですが、当然曲が終わると再生も終わります。しかしゲームのBGMとして使いたいので、曲をループさせたいのですがその方法が分かりません。 前にOKwebで同じ様な質問を見付けた覚えがありますが、その時はすぐに必要というわけではなかったので、完全には読みませんでした。そしていざ調べようと検索したのですが、今度はこれといったものが見付からず、質問させて頂きます。 MCI_NOTIFYの様な記述が必要だった様な気がするのですが、ご存知の方おられましたら回答を宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★mciSendString() ならアドバイス出来るけど。 ・MCI は mciSendCommand() それとも mciSendString() のどちらですか?  MCI_NOTIFY という事はやっぱ mciSendCommand() ですよね。  指定したウィンドウに MM_MCINOTIFY メッセージをポストするので  『MM_MCINOTIFY』を処理して再生するようにすればいいと思う。 ・mciSendString() の方なら次のような感じで簡単に出来ます。  mciSendString( TEXT("Play Music NOTIFY"), NULL, 0, hWnd );  ↑  『hWnd』がウインドウのハンドル。  『Play Music』が識別文字列。 ・下に mciSendString() 関数によるマクロ群を紹介します。 サンプル: #define FuncMCI_Open(s)    mciSendString(s,NULL,0,NULL) #define FuncMCI_Close()    mciSendString(TEXT("Close Music"),NULL,0,NULL) #define FuncMCI_CloseAll()   mciSendString(TEXT("Close All"),NULL,0,NULL) #define FuncMCI_PlayNotify(h) mciSendString(TEXT("Play Music NOTIFY"),NULL,0,h) #define FuncMCI_Play()    mciSendString(TEXT("Play Music"),NULL,0,NULL) #define FuncMCI_Stop()    mciSendString(TEXT("Stop Music"),NULL,0,NULL) #define FuncMCI_Pause()    mciSendString(TEXT("Pause Music"),NULL,0,NULL) #define FuncMCI_Resume()   mciSendString(TEXT("Resume Music"),NULL,0,NULL) 使い方: // 再生 FuncMCI_Open( ("abc.mid") ); FuncMCI_PlayNotify( hWnd ); ←再生を繰り返す指定 ※再生を繰り返さない場合は FuncMCI_Play() を使う。 // 停止 FuncMCI_Stop(); FuncMCI_Close(); // 一時停止 FuncMCI_Pause(); // 再開 FuncMCI_Resume(); その他: ・マルチメディアについてはあまり詳しくないので次のリンクを参考にして下さい。  私が以前ネット検索で見つけて参考としたものです。  未整理のためリンクだけ載せます。  http://tgws.fromc.jp/prog/prog10.html  http://www.int21.co.jp/pcdn/vb/noriolib/vbmag/9802/mci/  http://www.mb.ccnw.ne.jp/garger-studio/vbgame/112.html  http://hp.vector.co.jp/authors/VA030681/VBTips/Music.htm  http://hpcgi1.nifty.com/MADIA/DelphiBBS/wwwlng.cgi?print+200301/03010051.txt  http://homepage3.nifty.com/goldenchild/mci.htm  http://www007.upp.so-net.ne.jp/hama_d/newapi/chapters/c25.html  http://www.bekkoame.ne.jp/i/mr.manri/MCI/index.html  http://homepage1.nifty.com/rucio/main/technique/teq_1.htm  http://msdn.microsoft.com/library/en-us/multimed/htm/_win32_multimedia_command_strings.asp  上記のは主に mciSendString() 関数について調べた結果です。 最後に: ・調べるなら『MM_MCINOTIFY』で検索してみて下さい。 ・以上。下の『参考URL』もどうぞ。

参考URL:
http://wisdom.sakura.ne.jp/system/winapi/media/mm3.html
noname#67169
質問者

お礼

回答有難う御座います。 私が使用していたのはMCI は mciSendCommand()の方ですが、mciSendString()の方も知っていたので、試してみました。しかし音は出せますがループ再生させる事が出来ず、MM_MCINOTIFYで検索してみた所ようやくループが出来る様になりました。多くのサイトの紹介、有難う御座います。全て見て参考にさせて頂きました。 私と同じ疑問を持った人のために、下記に一応私がネットで知った書き方を載せておきます。 mciSendCommand(    0, MCI_OPEN, MCI_OPEN_TYPE |      ↓ここを足します    MCI_OPEN_TYPE_ID | MCI_OPEN_ELEMENT | MCI_NOTIFY,    (DWORD)&mop);    mciSendCommand(mop.wDeviceID, MCI_PLAY, 0, 0); と書くと、MCIの処理が終了するとNOTIFYメッセージが来るらしい。 すると、来た時にMM_MCINOTIFYが呼び出されるらしい。 case MM_MCINOTIFY:   if(wp!=MCI_NOTIFY_SUCCESSFUL){   MessageBox(hWnd,"異常終了しました",NULL,MB_OK);   break;   }   mciSendCommand((MCIDEVICEID)lp,MCI_SEEK,MCI_SEEK_TO_START,0);   mciSendCommand((MCIDEVICEID)lp,MCI_PLAY,MCI_NOTIFY,(DWORD)&mop);   return 0; 上の二つを書いた所、MIDIのループ再生に成功しました。

関連するQ&A