トップページ > 記事閲覧
midiループ再生の不具合
名前:green 日時: 2015/05/01 21:38

音楽再生用のmidiファイル(.mid)をループ再生するプログラムで 曲がループ再生する時に、プログラムの進行が一瞬とまってしまいます。 以前にも同様の質問があり修整されていたと思いましたが 最新版でも同じ症状でしたので質問してみました。 簡易的なmidi再生とモデル描画サンプルです #include "DxLib.h" int ShowWindow(HWND hwnd,LPCSTR Filter,char *FileName,DWORD Flags){ OPENFILENAME OFN; ZeroMemory(&OFN,sizeof(OPENFILENAME)); OFN.lStructSize = sizeof(OPENFILENAME); OFN.hwndOwner = hwnd; OFN.lpstrFilter =Filter; OFN.lpstrFile =FileName; OFN.nMaxFile = MAX_PATH*2; OFN.Flags = Flags; OFN.lpstrTitle = "midファイルを開く"; return (GetSaveFileName(&OFN)); } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { char FileName[MAX_PATH * 2]; ZeroMemory(FileName, MAX_PATH * 2); ChangeWindowMode(TRUE); if( DxLib_Init() == -1 ) return -1 ; int i=0; int ModelHandle=MV1LoadModel( ".\\DxChara.x" ) ; MV1SetPosition( ModelHandle, VGet( 320.0f, 0.0f, 600.0f ) ) ; ShowWindow(GetMainWindowHandle(), "*.mid", FileName, 0); PlayMusic( FileName, DX_PLAYTYPE_LOOP ); SetDrawScreen( DX_SCREEN_BACK ) ; while( ProcessMessage() == 0 ) { ClearDrawScreen() ; MV1SetRotationXYZ(ModelHandle,VGet(0.0f,float(i)*0.05f,0.0f)); MV1DrawModel(ModelHandle); DrawFormatString( 0, 0, GetColor( 255,255,255 ), "フレーム:%4i ", i ) ; ScreenFlip() ; i++; } DxLib_End(); return 0; }
メンテ

Page: 1 |

Re: midiループ再生の不具合 ( No.1 )
名前:管理人 日時:2015/04/29 23:18

すみません、ループ時に処理が止まるのは仕様です DXライブラリは標準で midi ファイルの演奏には MCI( Multimedia Control Interface )の機能を 使用しているのですが、この機能を用いた場合、ループ時に処理が一瞬止まります これは MCI の中で止まっているので、DXライブラリ側ではどうしようもできません 処理を止めない方法としては、音色が変わってしまいますが MCI の代わりに DirectMusic を使用して midi ファイルを演奏するという方法があります( DirectMusic での演奏の場合はループ時に処理が止まらないので ) PlayMusic を呼ぶ前の箇所に SelectMidiMode( DX_MIDIMODE_DM ) ; という記述を増やすと MIC ではなく DirectMusic を使用して midi ファイルを演奏しますので、よろしければお試しください m(_ _)m
メンテ
Re: midiループ再生の不具合 ( No.2 )
名前:green 日時:2015/04/30 05:09

DirectMusicモードを設定して問題なくループ再生ができました。 ご教示いただき感謝します、ありがとうございました!。
メンテ
Re: midiループ再生の不具合 ( No.3 )
名前:green 日時:2015/04/30 21:15

上に関連した質問なのですが自作ゲーム内で SelectMidiMode(DX_MIDIMODE_DM)を設定してBGMを鳴らして そのあとにPlaySoundMemを使って効果音(.wav)を出そうとしましたが 音が出ないようです(PlaySoundFileでは効果音がでます) 仕様かどうか質問してみました #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){ ChangeWindowMode(TRUE); if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } int SE; SE=LoadSoundMem("test.wav"); int BGM; LoadGraphScreen( 0 , 0 , "test1.bmp" , TRUE ) ; SelectMidiMode(DX_MIDIMODE_DM); PlayMusic( "test.mid", DX_PLAYTYPE_LOOP ); while(ProcessMessage()==0) { PlaySoundMem(SE,DX_PLAYTYPE_NORMAL); //PlaySoundFile("test.wav",DX_PLAYTYPE_NORMAL ) ; } DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }
メンテ
Re: midiループ再生の不具合 ( No.4 )
名前:管理人 日時:2015/05/01 17:08

すみません、SelectMidiMode を使用するとサウンドシステムの初期化が発生してしまっていました ( なのでそれまで読み込んでいたサウンドなどが解放されてしまっていました ) DirectMusic を使用するためのこの記述 SelectMidiMode( DX_MIDIMODE_DM ) ; を DxLib_Init の呼び出しの前の箇所に移動してください m(_ _;m
メンテ
Re: midiループ再生の不具合 ( No.5 )
名前:green(解決) 日時:2015/05/01 21:39

ご教示ありがとうございました。 dxlib_initの前に置く事で効果音が再生されるようになりました。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存