MIDI と WAVE の音量を設定する



DirectX の Audio Object Class を使って、MIDI と WAVE の音量を SpinButton で独立して設定します。

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

プロジェクトの作成

  1. [ファイル] [新規作成] [プロジェクト] から空のプロジェクト(Volume)を作成して下さい。
    プロジェクトのフォルダーに次のファイルを格納して下さい。
    Audio Object Class は Object Class Library からダウンロード出来ます。
    プロジェクト/既存項目の追加からプログラムファイルとヘッダファイルをプロジェクトに追加して下さい。
    ファイル名 ファイルの説明
    Volume.cpp 「プログラムの説明」を参考に作成して下さい
    audio.h audio Object Class ヘッダファイル
    audio.cpp audio Object Class プログラムファイル
    Midi1.mid 演奏する MIDI ファイル(適当な MIDI を調達して名前を変更)
  2. WAVE ファイルは、次のフォルダーに格納されているファイルを演奏します。
    音が鳴らない(非常に小さい?)ものがあり (^_^;) 事前にメディアプレイヤなどで確認して下さい。
    c:\\windows\\media\\ringin.wav
  3. ページ先頭の画像を参考にして DialogBox を作成して下さい。
    DialogBox の ID は次のように設定して下さい。
    BOX ID キャプション
    DialogBox IDD_DIALOG1 Direct Audio Sample Program
    SpinButton IDC_SPIN1
    SpinButton IDC_SPIN2
    EditBox IDC_EDIT1
    EditBox IDC_EDIT2
    Button IDC_WAVE WAVE
    Button IDC_MIDI MIDI
    Button IDC_STOP STOP
  4. Edit Box と Spin Button を交互に貼り付けて、TAB オーダで Spin の直前が Edit Box になるように設定します。
    TAB オーダは[書式(レイアウト)][タブオーダ]で、確認と設定ができます。
    Spin の[プロパティ/スタイル]から[自動関連付け]と[数値の自動表示]をチェックすると Spin の値が EditBox に自動的に表示されます。
  5. ライブラリは audio.h の #pragma でリンクするので、特に操作は不要です。
  6. ビルドから実行を選ぶと、コンパイルに続いて実行が行われます。
    WAVE をクリックすると WAVE が10回連続して演奏されます。
    MIDI をクリックすると MIDI の演奏が始まります。
    WAVE 側の SpinButton で WAVE の音量を設定できます。
    MIDI 側の SpinButton で MIDI の音量を設定できます。
    STOP ボタンをクリックするとプログラムが終了します。

プログラムの説明

  1. Audio Object Class を使うので audio.h と audio.cpp をプロジェクトに組み込んで下さい。
    Audio 関係の Library は audio.h から #pragma でリンクしています。
    Audio App; が Object Class の定義です。
    Wave, Midi で演奏するファイルを定義しています。
        #include    <windows.h>
        #include    <commctrl.h>
        #include    "audio.h"
        #include    "resource.h"
    
        //☆Audio Object Class を定義する
        Audio       App;
        char        Wave[64]= "c:\\windows\\media\\ringin.wav";
        char        Midi[64]= "midi1.mid";
        long        db; 
        
  2. WinMain() では DialogBox を表示するだけです。
  3. DialogBox の CALLBACK 関数です。
    WM_INITDIALOG: で SpinBotton の範囲を0~40に、表示値を20に設定します。
        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 がクリックされたときの処理です。
    IDC_WAVE で Wave をロードして10回繰り返して演奏します。
    IDC_MIDI で Midi をロードして演奏します。
    IDC_STOP で WM_CLOSE をポストします。
        switch(LOWORD(wParam))
        {   case IDC_WAVE:
                if (!FAILED(App.Load(Wave)))    App.Play(10);
                break;
            case IDC_MIDI:
                if (!FAILED(App.Load2(Midi)))   App.Play2();
                break;
            case IDC_STOP:
                PostMessage(hDlg,WM_CLOSE,0,0);
                break;
        }
        
  5. SpinButton がクリックされたときの処理です。
    SetVol() で WAVE の音量を、SetVol2() で MIDI の音量を設定します。
    このときパラメータで渡す値は「現在の音量を何デシベル上げるか(下げるか)」の値です。
    正確には 1/100 デシベルの値を指定するのですが、音量の絶対的な大きさでは無いことに注意して下さい。
    仮にゼロを指定すると音量は変わりません。
        case WM_VSCROLL:
            if ((HWND)lParam==GetDlgItem(hDlg,IDC_SPIN1))
            {   i= HIWORD(wParam);
                db= 100*(i-20);
                App.SetVol(&db);
            }
            if ((HWND)lParam==GetDlgItem(hDlg,IDC_SPIN2))
            {   i= HIWORD(wParam);
                db= 100*(i-20);
                App.SetVol2(&db);
            }
            break;
        
  6. プログラムの終了処理です。
    Object Class の Constructor が全てのオブジェクトを開放してくれます。
        case WM_CLOSE:
            EndDialog(hDlg,TRUE);
            return (TRUE);
        
  7. Audio の初期化や後始末の詳細は WAVE を演奏する を参照して下さい。

超初心者の方のために全ソースコードを掲載します。 (^_^;)
全ソースコード

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

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

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