こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

midiの再生が思うようにできません

ファイルの文字列を1行ずつ読み込み、文字列の数字の範囲によって再生する音楽を変えるプログラムを作成していますが、読み込んだ文字列とは無関係に、ループの初めの範囲で指定してある音楽しか再生されません。読み込んだ文字列ごとに再生音楽を変えるにはどうすればいいのでしょうか?分かる方ご教授願います。

環境:WindowsXP, Visual C++ 2008 Express Edition
以下がプログラムのソースの一部です。

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
FILE *fp;
errno_t err;
TCHAR buf[30];
TCHAR *temp;
int m=0, n=0;

switch(msg)
{
case WM_CREATE:
CreateWindow(TEXT("BUTTON"), TEXT("Play"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,120, 100, 70, 70, hWnd, NULL, hInst, NULL);
break;
case WM_COMMAND:
err = _tfopen_s(&fp, TEXT("C:\\Documents and Settings\\m22015\\My Documents\\Visual Studio 2008\\Projects\\process\\process\\Corner.txt"), TEXT("r+"));
if(err != 0)
break;
temp = (TCHAR*)malloc(_tcsclen(buf)+1);
if(temp == NULL){
MessageBox(hWnd, TEXT("Can't secure of memory"), TEXT("Error"), MB_OK);
break;
}
for(int i=0; i<2; i++){
_fgetts(buf, 10, fp);
_tcstok(buf, TEXT("\n"));
}
while(_fgetts(buf, 30, fp) != NULL){
_tcstok(buf, TEXT("\n"));
_tcscpy(temp, buf);
while(_stprintf(buf, _T("- { x:%d, y:%d }"), m, n)!=EOF){
if((m>=0 && m<110)&&(n>=0 && n<200)){
if(mciSendString(_T("play C+1.mid"), NULL, 0, NULL) != 0)
{
MessageBox(hWnd, _T("Can't play C+1.mid"), _T("Error"), MB_OK);
SendMessage(hWnd, WM_CLOSE, 0, 0);
}
return 0;
}else if((m>=110 && m<220)&&(n>=0 && n<200)){
if(mciSendString(_T("play D+1.mid"), NULL, 0, NULL) != 0)
{
MessageBox(hWnd, _T("Can't play D+1.mid"), _T("Error"), MB_OK);
SendMessage(hWnd, WM_CLOSE, 0, 0);
}
return 0;
}else if((m>=220 && m<330)&&(n>=0 && n<200)){
if(mciSendString(_T("play E+1.mid"), NULL, 0, NULL) != 0)
{
MessageBox(hWnd, _T("Can't play E+1.mid"), _T("Error"), MB_OK);
SendMessage(hWnd, WM_CLOSE, 0, 0);
}
return 0;
}else if((m>=330 && m<440)&&(n>=0 && n<200)){
if(mciSendString(_T("play F+1.mid"), NULL, 0, NULL) != 0)
{
MessageBox(hWnd, _T("Can't play F+1.mid"), _T("Error"), MB_OK);
SendMessage(hWnd, WM_CLOSE, 0, 0);
}
return 0;
}else if((m>=440 && m<550)&&(n>=0 && n<200)){
if(mciSendString(_T("play G+1.mid"), NULL, 0, NULL) != 0)
{
MessageBox(hWnd, _T("Can't play G+1.mid"), _T("Error"), MB_OK);
SendMessage(hWnd, WM_CLOSE, 0, 0);
}
return 0;
}else if((m>=550 && m<660)&&(n>=0 && n<200)){
if(mciSendString(_T("play A+1.mid"), NULL, 0, NULL) != 0)
{
MessageBox(hWnd, _T("Can't play A+1.mid"), _T("Error"), MB_OK);
SendMessage(hWnd, WM_CLOSE, 0, 0);
}
return 0;
}else if((m>=660 && m<770)&&(n>=0 && n<200)){
if(mciSendString(_T("play B+1.mid"), NULL, 0, NULL) != 0)
{
MessageBox(hWnd, _T("Can't play B+1.mid"), _T("Error"), MB_OK);
SendMessage(hWnd, WM_CLOSE, 0, 0);
}
return 0;
}else if(mciSendString(_T("play C.mid"), NULL, 0, NULL) != 0)
{
MessageBox(hWnd, _T("Can't play C.mid"), _T("Error"), MB_OK);
SendMessage(hWnd, WM_CLOSE, 0, 0);
}
return 0;
}else if((m>=110 && m<220)&&(n>=200 && n<400)){
if(mciSendString(_T("play D.mid"), NULL, 0, NULL) != 0)
{
MessageBox(hWnd, _T("Can't play D.mid"), _T("Error"), MB_OK);
SendMessage(hWnd, WM_CLOSE, 0, 0);
}
return 0;
以下省略
.
.
.
}else{
break;
}
}
}
free(temp);
fclose(fp);
break;
case WM_CLOSE:
DestroyWindow(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd, msg, wParam, lParam));
}
return 0;
}

投稿日時 - 2009-01-07 20:31:18

QNo.4611944

すぐに回答ほしいです

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

>読み込んだ文字列とは無関係に、ループの初めの範囲で指定してある音楽しか再生されません。
>読み込んだ文字列ごとに再生音楽を変えるにはどうすればいいのでしょうか?

 読み込んだ「文字列」を、範囲指定で用いている? m n へ「関係」付けている部分が見あたりませんが・・???

 文字列の仕様と、「関係」付けている部分(「以下省略」部分?)を補足していただければ、「回答」がつくと思われます。
+++++++++++++++++++++++++++++++++++++++
現状では、
 ・読み込まれる文字列をテーブル化し、m n と関係付ける。
 ・文字列に「数」が2つ、そのものズバリ含まれるのなら、数値化する関数( atoi() 等)を用い m n へ代入する。
としか・・。

蛇足

if((m>=0 && m<110)&&(n>=0 && n<200)){
   ・(略)
return 0;
}else if((m>=110 && m<220)&&(n>=0 && n<200)){
   ・(略)
   ・(略)
return 0;
}else if((m>=660 && m<770)&&(n>=0 && n<200)){
   ・(略)
return 0;
}
この50行は、( m n は負ではないと仮定)

 ・char cTitle[ 8 ] = { "CDEFGAB" }; と異なる部分を配列にし、
 ・共通部分( n >= 0 && n < 200 )を大外に、

   if( n < 200 ){

     for( i = 0; i < 7; i++ ){

       if( m < ( 110 * ( 1 + i ) ) ){ // 110,220,330,・・770

         ・(略:メッセージ?文字列作成等)

         return( 0 );
       }
     }
   }
  と簡略化できますよ。もちろん else 「なんて」そもそもから不要です。

投稿日時 - 2009-01-08 13:44:45

お礼

遅くなりましたが、回答ありがとうございます。
ファイルは
%YAML:1.0
- { x:476, y:36 }
- { x:789, y:121 }
- { x:546, y:61 }
- { x:109, y:300 }
- { x:560, y:87 }
- { x:462, y:20 }
    ・
    ・
    ・
のようになっています。
数値の変化するごとに、mとnで範囲を指定した音楽を再生させたいと考えているのですが・・・。

あと、訂正ですが
while(_stprintf(buf, _T("- { x:%d, y:%d }"), m, n)!=EOF){
ではなくて、
while(_stscanf(buf, _T("- { x:%d, y:%d }"), m, n)!=EOF){
です(>_<;)
ごめんなさい。


if-elseは簡略化できるんですね!ありがとうございます!!

投稿日時 - 2009-01-11 16:44:51

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問