MIDI のテンポを変えて演奏する

DirectX の Audio Object Class を使って、演奏中の MIDI のテンポを SpinButton で操作します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの作成

  1. [ファイル] [新規作成] [プロジェクト] から空のプロジェクト(MidiTemp)を作成して下さい。
    プロジェクトのフォルダーに次のファイルを格納して下さい。
    Audio Object Class は Object Class Library からダウンロード出来ます。
    プロジェクト/既存項目の追加からプログラムファイルとヘッダファイルをプロジェクトに追加して下さい。
    ファイル名 ファイルの説明
    MidiTemp.cpp 「プログラムの説明」を参考に作成して下さい
    audio.h audio Object Class ヘッダファイル
    audio.cpp audio Object Class プログラムファイル
    midi1.mid ネットから適当な MIDI を調達して名前を変更して下さい
  2. このプログラムは、カレントフォルダーに格納されている midi1.mid を演奏しながら「音量とテンポ」を Dialog Box のボタンで操作します。
    ページ先頭の DialogBox を作成して下さい。
  3. DialogBox のキャプションとIDです。
    Edit Box と Spin Button を交互に貼り付けて、TAB オーダで Spin の直前が Edit Box になるように設定します。
    BOX キャプション ID
    DialogBox ダイアログ IDD_DIALOG1
    SpinButton ボリューム IDC_SPIN1
    SpinButton テンポ IDC_SPIN2
    EditBox IDC_EDIT1
    EditBox IDC_EDIT2
    Button 演奏 IDC_BUTTON1
    Button キャンセル IDCANCEL
  4. ライブラリは audio.h の #pragma でリンクするので、特に操作は不要です。
  5. 演奏ボタンをクリックすると演奏が始まります。
    ボリュームの Spin Button でボリュームを設定します。
    テンポの Spin Button で MIDI の演奏テンポが変わります。

プログラムの説明

  1. Audio Object Class を使うので audio.h と audio.cpp をプロジェクトに組み込んで下さい。
    Audio 関係の Library は audio.h から #pragma でリンクしています。
    fTempo がテンポを設定する領域で、1.0f が標準のテンポです。
        #include    <windows.h>
        #include    <commctrl.h>
        #include    "audio.h"
        #include    "resource.h"
        #pragma     comment(lib,"dxguid.lib")
    
        //☆Audio Object Class を定義する
        Audio       App;
        char        Midi[64]= "midi1.mid";
        long        db; 
        float       fTempo= 1.0f;
        
  2. WinMain() では DialogBox を表示するだけです。
  3. DialogBox の CALLBACK 関数です。
    WM_INITDIALOG: で Spin Button を設定します。
        switch (message) 
        {   case WM_INITDIALOG:
                SendMessage(GetDlgItem(hDlg,IDC_SPIN1),UDM_SETRANGE,0,40);
                SendMessage(GetDlgItem(hDlg,IDC_SPIN1),UDM_SETPOS,0,20);
                SendMessage(GetDlgItem(hDlg,IDC_SPIN2),UDM_SETRANGE,0,40);
                SendMessage(GetDlgItem(hDlg,IDC_SPIN2),UDM_SETPOS,0,20);
                break;
        
  4. Button がクリックされたときの処理です。
    演奏ボタンがクリックされたときに midi1.mid をロードして演奏します。
    キャンセルボタンで WM_CLOSE をポストします。
        case WM_COMMAND:
            switch(LOWORD(wParam))
            {   case IDC_BUTTON1:
                    if (!FAILED(App.Load(Midi)))   App.Play();
                    break;
                case IDCANCEL:
                    PostMessage(hDlg,WM_CLOSE,0,0);
                    break;
            }
            break;
        
  5. Spin Button で音量を設定する処理です。
    Spin Button が操作されると WM_VSCROLL: がポストされてきます。
    App.SetVol(&db) で音量を設定します。
        case WM_VSCROLL:
            if ((HWND)lParam==GetDlgItem(hDlg,IDC_SPIN1))
            {   pos= HIWORD(wParam);
                db= 100*(pos-20);
                App.SetVol(&db);
            }
        
  6. Spin Button2 でテンポを設定する処理です。
    SetGlobalParam() でテンポを設定します。
            if ((HWND)lParam==GetDlgItem(hDlg,IDC_SPIN2))
            {   pos= HIWORD(wParam);
                fTempo= (float)pos/20.0f;
                App.g_pPerformance->SetGlobalParam(GUID_PerfMasterTempo,&fTempo,sizeof(float));
            }
            break;
        
  7. プログラムの終了処理です。
    Object Class の Constructor が全てのオブジェクトを開放してくれます。
        case WM_CLOSE:
            EndDialog(hDlg,TRUE);
            return (TRUE);
        

超初心者の方のために全ソースコードを掲載します。 (^_^;)
同じようにプログラムしても WAVE ではテンポが変わりませんでした。
全ソースコード

前田稔(Maeda Minoru)の超初心者のプログラム入門

超初心者のプログラム入門(DirectX9 game program)

超初心者のプログラム入門(DirectX10 game program)