• 締切済み

トラックのループの仕方

こんにちは。 windowsプログラムでMCIコマンドを使ってCDの音楽ファイルを再生するプログラムを作りました。(http://www13.plala.or.jp/kymats/study/MULTIMEDIA/mciCommand_cd.cppというサイトのソースを使わせていただきました。) 左クリックするごとに次の曲に進むのですが、何もしないと今再生中の曲が終わると止まってしまいます。同じ曲をループさせたいのですが、どうすればいいのでしょうか? http://www13.plala.or.jp/kymats/study/MULTIMEDIA/mciCommand_callback.html  というサイトに行ってMCIのループに関することを読んだのですが、 このサイトにのっていたのは一つのファイルをループさせるソースコードでCDのトラックのように複数のファイルの中から左クリックによってファイルを選んで再生をループするようなプログラムにしたいのですが どうすればいいのでしょうか?

みんなの回答

回答No.1

 こんばんは。こう言うことでしょうか。 ・左クリックでトラックを進める ・左クリックで最後のトラックを超えると停止 ・左クリックしないとそのトラックを繰り返す #include<windows.h> #pragma comment(lib,"winmm") //デバイスデータ static MCI_OPEN_PARMS _S_mop; //再生中のトラック static DWORD _S_track = 0; //オープン static const MCI_OPEN_PARMS Open(HWND hWnd, LPCTSTR lpstrDeviceType = "CDAudio") { MCI_OPEN_PARMS mop = {0}; mop.lpstrDeviceType = lpstrDeviceType; mop.dwCallback = (DWORD)hWnd; mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE, (DWORD)&mop); return mop; } //クローズ static void Close(const MCI_OPEN_PARMS& mop) { //停止 mciSendCommand(mop.wDeviceID, MCI_STOP, 0, 0); //クローズ mciSendCommand(mop.wDeviceID, MCI_CLOSE, 0, 0); } //トラック数の取得 static DWORD GetTrackCount(const MCI_OPEN_PARMS& mop) { MCI_STATUS_PARMS status = {0}; status.dwItem = MCI_STATUS_NUMBER_OF_TRACKS; mciSendCommand(mop.wDeviceID, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)&status); return status.dwReturn; } //時間フォーマットの変更 static void SetTimeFormat(const MCI_OPEN_PARMS& mop) { MCI_SET_PARMS msp = {0}; msp.dwTimeFormat = MCI_FORMAT_TMSF; mciSendCommand(mop.wDeviceID, MCI_SET, MCI_SET_TIME_FORMAT, (DWORD)&msp); } //再生 static DWORD Play(const MCI_OPEN_PARMS& mop, HWND hWnd, DWORD dwPos) { const DWORD dwTrackSum = ::GetTrackCount(mop); MCI_PLAY_PARMS mpp = {0}; mpp.dwCallback = (DWORD)hWnd; mpp.dwFrom = MCI_MAKE_TMSF(dwPos, 0, 0, 0); mpp.dwTo = MCI_MAKE_TMSF(dwPos + 1, 0, 0, 0); //トラック末端以外 if(mpp.dwFrom >= 1 && mpp.dwTo <= dwTrackSum) { mciSendCommand(mop.wDeviceID, MCI_PLAY, MCI_FROM | MCI_TO | MCI_NOTIFY, (DWORD)&mpp); return dwPos; } //トラック末端 else if(mpp.dwFrom == dwTrackSum) { mciSendCommand(mop.wDeviceID, MCI_PLAY, MCI_FROM | MCI_NOTIFY, (DWORD)&mpp); return dwPos; } //次のトラックがないので停止 mciSendCommand(mop.wDeviceID, MCI_STOP, 0, 0); return 0; } //再生トラック番号などの表示 static void PrintTrack(HDC hDC, DWORD dwPos) { //文字のゴミを消す為に塗り潰す RECT rc; ::GetClientRect(::WindowFromDC(hDC), &rc); ::FillRect(hDC, &rc, (HBRUSH)::GetStockObject(WHITE_BRUSH)); TCHAR str[256] = {0}; if(dwPos == 0) { wsprintf(str, "%s", "停止中"); } else { wsprintf(str, "%s = %d", "トラック再生中", dwPos); } TextOut(hDC, 0, 0, str, lstrlen(str)); } LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_CREATE: _S_mop = ::Open(hWnd); SetTimeFormat(_S_mop); InvalidateRect(hWnd, NULL, FALSE); return 0; case WM_LBUTTONDOWN: _S_track = Play(_S_mop, hWnd, ++_S_track); InvalidateRect(hWnd, NULL, FALSE); return 0; case MM_MCINOTIFY: //フラグが楽曲再生終了を意味している時 if(wParam == MCI_NOTIFY_SUCCESSFUL) { //同じ楽曲を度再生する _S_track = Play(_S_mop, hWnd, _S_track); InvalidateRect(hWnd, NULL, FALSE); } return 0; case WM_PAINT: { PAINTSTRUCT ps; HDC hDC = BeginPaint(hWnd, &ps); PrintTrack(hDC, _S_track); EndPaint(hWnd,&ps); } return 0; case WM_CLOSE: Close(_S_mop); DestroyWindow(hWnd); break; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hWnd, uMsg, wParam, lParam); } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow) { WNDCLASS wc; MSG msg; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WindowProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = __FILE__; if(!RegisterClass(&wc)) return 0; HWND hWnd = CreateWindow(__FILE__,"MCIコマンドによるCD再生", WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); if(hWnd == NULL) return 0; while(GetMessage(&msg, NULL, 0, 0) == TRUE) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; }

shomarket
質問者

補足

ありがとうございます。 書いていただいたソースコードを実行しました。 しかし、 ・左クリックしないとそのトラックを繰り返す の処理だけがなぜか行われず、そのまま音が止まってしまいます。

関連するQ&A

  • ActiveBasic 音楽のループ再生

    Active Basic4.23.00でプログラムを書いています。 音楽再生ソフトを作ってみようと思い、作り始めたのですが、なかなかループ再生が出来ません。 チェックボックス1がチェックされていると、ループさせようと思っています。 ↓問題のコード Sub MainWnd_MciNotify(flags As Long, DevID As DWord) If SendMessage(GetDlgItem(hMainWnd,CheckBox1),BM_GETCHECK,0,0)=BST_CHECKED Then Dim bErr As Long Dim mpp As MCI_PLAY_PARMS mpp.dwCallback=hMainWnd mpp.dwFrom=0 bErr=mciSendCommand(mop.wDeviceID,MCI_PLAY,MCI_NOTIFY or MCI_FROM,mpp) If bErr Then MessageBox(hMainWnd,"デバイス再生エラー","Error",MB_OK or MB_ICONHAND) Exit Sub End If Else mpp.dwCallback=hMainWnd mpp.dwFrom=0 End If End Sub 一見、(少なくとも自分は)成功しているように見えるのですが、 2回ループした後、フリーズしてしまいます。 すみませんが、何故そうなるかが分かる方がいらっしゃいましたら、すみませんが、ご教授ください。 お願いします。

  • 「なでしこ」のループの仕方を教えて下さい

    最近、なでしこでプログラミングを始めました。入門サイトのプログラムをベースにして、ポケモンのプログラムを作ってみたのですが、メタグロスの攻撃が終わったあと、ドダイトスの攻撃に戻す方法が分かりません。 下がそのプログラムです。わかる方は、訂正お願いします。           (急所に当たるか、効果が抜群かのどちらかでバトルが終わるようにしています。) ドダイとはイメージ ドダイの画像は「C:\Users\s\Pictures\ファイル名.png」 ドダイのXは0 ドダイのYは100 グロスとはイメージ グロスの画像は「C:\Users\s\Pictures\ファイル名.png」 グロスのXは100 グロスのYは0 「C:\Users\s\Documents\ファイル名」を「music」でMCI開く 「play music repeat」をMCI送信 「メタグロスが あらわれた!」と表示 急所は10の乱数 効果は10の乱数 「ドダイトスの こうげき」と言う  0.8秒待つ もし、急所>8ならば  「きゅうしょに あたった!   メタグロスを たおした!」と言う    終わる もし、効果>7ならば  「こうかは ばつぐんだ!   メタグロスを たおした!」と言う     終わる 違えば、もし、効果<3ならば  「こうかは いまひとつの ようだ…」と言う 違えば、もし、効果=0ならば  「こうかは ないようだ…」と言う 違えば  「わざは メタグロスに あたらなかった…」と言う 「メタグロスの こうげき」と言う  0.8秒待つ もし、急所>8ならば  「きゅうしょに あたった!   メタグロスに まけてしまった…」と言う     終わる    もし、効果>7ならば  「こうかは ばつぐんだ!   メタグロスに まけてしまった…」と言う    終わる 違えば、もし、効果<3ならば  「こうかは いまひとつの ようだ…」と言う 違えば、もし、効果=0ならば  「こうかは ないようだ…」と言う 違えば  「わざは ドダイトスに あたらなかった…」と言う 「ひきわけに おわった…」と言う  終わる

  • c++をVisualStudioでコンパイル

    http://www13.plala.or.jp/kymats/study/game_other/TOKOPUYO/tokopuyo.html ここのソースを自分でコンパイルして動かしたいです。 VisualStudio2005(製品版)で実行ファイルを作れますか? VBはわかるのですがC++は初めてです。 わからないままwin32プロジェクトを作って、ビルドしたら58件エラーがでました。コンパイルしても7件エラーがでました。 よろしくおねがいします

  • Cubase ループ再生

    Cubaseを使用しています。 ループ再生についてお尋ねしたいのですが、曲の一部をループする際、ルーラーをドラッグして設定する以外にあるサイトでShift + Gのキーボードショートカットで同じように行うことが出来ると見ました。 しかし実際に行ってみてもなにも変化がありませんでした。 個人的にループ再生は頻度の多い機能なので、他にやり方があればなと思い質問しました。 回答お願いします。

  • swf書き出しでループ

    フラッシュをサイト作りに初めて使います。 ムービーは出来てswfとhtmlに書き出したんですが、swfファイルをhtmlファイルに配置すると、ループしてしまいます。htmlに書き出しの方は書き出しの時に「ループ」チェックボックスがあるのでチェックを外しておけばループしません。そっちを使えばいいんですが、htmlエディタ(アドビ-ゴーライブ6.0)で読み込んだ時「解析に失敗しました」とエラーメッセージが出ます。でもブラウザーでは平気に見られるので、これでいいかとも思いますが、swfでループさせない方法を知っておく必要があると思ってお尋ねしました。 ループはフラッシュで新規ファイルを作る時に初期設定があるんですか?ループ再生させたい場合もありますよね。 どこを見たらいいんでしょうか、よろしくお願いします。 フラッシュはMX、MacOS10.4です。

    • ベストアンサー
    • Flash
  • 曲のBPMが知りたい

    http://www14.plala.or.jp/nekokirin/03datamenu/databasemenu.html の他にいろいろな曲のBPMが載っているサイトを知りたいのですが、どこかいいところはないでしょうか?  よろしくお願いします。

  • MCIを使ったMIDIの連続再生

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

  • 音楽ファイルをトラックごとに分けたい

    友人にもらった音楽ファイルを開けてみると、十曲ぶんのファイルがひとつのファイルとしてあったのですが(CDのようにトラックごとにわかれてはいなく、再生すると十曲まとめて一曲の扱いになっている)これをトラックごとに編集しなおすことは可能でしょうか?もしくは、そういうことができるソフトはあるでしょうか?

  • 音楽のループについて(JavaScript)

    JavaScriptで音楽をループさせています。 ループの最後と最初に間が入ってしまい、原因がわからず困っています。 どなたか教えて頂けませんでしょうか。 使っているJavaScriptは「audio.js」というスクリプトです。(下記※1参考サイト) 設置自体は、素人の私でも簡単でしたので参考サイトを参照しそのまま設置しました。 全てのブラウザで音楽が流れましたので、そこまでは良かったのですが 流れ終わったあと音楽が止まってしまいますので、ループの設定をしなければと思い 下記のコード(※2)でループすることはできました。 しかし、ループした時の最後と最初にワンテンポ間が出来てしまいます。 私のPC(Windows7)で現象が起きているのはSafari(5.1.7)です。 WindowsXPだとChromeでも起きているようです。(バージョンは不明です) サイトが重たいのかなと思い、HTMLコード等工夫してサイトを軽くしたりしましたが変わりませんでした。 他に、ブラウザが音を読み込む過程を考えて、メディアプレイヤーなのか、QuickTimeなのか 「規定のプログラムの設定」で決められたプログラムに左右されていると思い、プログラムを変更しましたが現象は変わらないように思えました。 audio.jsが良くないのでしょうか。 原因が特定できずに困っています。 ループの最後と最初に間が入らないようにするにはどうすればいいのでしょうか。 どなたかご存知の方がいましたら、ご享受お願いします。 また、JavaScriptでループが綺麗に動くスクリプトをご存知の方がいらっしゃいましたら、教えていただけないでしょうか。 よろしくお願いします。 ※1参考サイト 主要ブラウザ全てにaudio要素でMP3を再生できるようにするスクリプト -audio.js http://coliss.com/articles/build-websites/operation/javascript/js-a... ※2 <コード> <audio src="http://URL/images/AAA.mp3" loop /> ※JavaScriptのコードについては、読み込みファイル名とCSS部分しか変更していません。

  • 2バイトデータのビットシフトについて

    PIC 12F683 をつかった温度ロガーのプログラムについて、 質問させていただきます。 こちら http://www8.plala.or.jp/InHisTime/page179.html#PIC-144 のプログラムなのですが、mikroC のソース、 http://www8.plala.or.jp/InHisTime/PIC-144/thermo_logger_v3.c の、EEPROMからのデータ読み出し部分で、 EEPROM_24LC1025_Page_Read(addr, buf, 2); ad = (buf[1] << 8) + buf[0]; このように、読み出したデータ(buf)に対して、 ビットシフトをしているのですが、 このようにして、データが取り出せることの、仕組みがわかりません。 たとえば、AD変換のデータが、デフォルトの左詰め10ビットとして、 buf[1] : 1111 1111 buf[0] : 1100 0000 というデータだとして、上記のビットシフトで、 なぜデータが取り出せるのかが理解できません。 どなたか、よろしければなるべく具体的に、 お教え願えませんでしょうか。