◆Accessで音楽演奏 その2

[ ホーム ] [ 上へ ]

・CSound使用例

さっそくこちらで 作成したFrmSoundフォームに必要な実装をして演奏をしてみます。
VBエディタでツールバーの表示(V)→プロジェクトエクスプローラ(P)で プロジェクトエクスプローラシートを表示します。プロジェクト内のMicrosoft Accessクラスの中に Form_FrmSoundがあるはずなので選択をしてF7を押下してください。 フォームモジュールが表示されるので以下を書いてください。

'//FrmSoundフォームモジュール////////////////////////////////
'//

Option Compare Database  
Option Explicit  

'メンバ変数
Private vmoSnd                  As CSound  
Private WithEvents vmoTimerFrm  As Access.Form  

'フォームLoadイベントプロシージャ
Private Sub Form_Load()  
    Set vmoSnd = New CSound  
    Set vmoTimerFrm = New Form_FrmSoundTimer  

    'プロパティ設定
    Me.RecordSelectors = False  
    Me.DividingLines = False  
    Me.TimerInterval = 1000  

    Me!F_PATH.AfterUpdate = "[Event Procedure]"  
    Me!txt_curpos.Value = 0  
    Me!txt_curpos.Locked = True  
    Me!txt_seekpos.Value = 0  
    Me!txt_seekpos.ValidationRule = ">=0 And <=1000"  
    Me!txt_seekpos.IMEMode = 2  
    Me!txt_seekpos.AfterUpdate = "[Event Procedure]"  
    Me!cmd_play.OnClick = "[Event Procedure]"  
    Me!cmd_pause.OnClick = "[Event Procedure]"  
    Me!cmd_stop.OnClick = "[Event Procedure]"  

    vmoTimerFrm.OnTimer = "[Event Procedure]"  

End Sub  

'フォームCloseイベントプロシージャ
Private Sub Form_Close()  
    Set vmoSnd = Nothing  
    DoCmd.Close acForm, "FrmSoundTimer": Set vmoTimerFrm = Nothing  
End Sub  

'レコード移動時イベントプロシージャ
Private Sub Form_Current()  
    InitDevice 
End Sub  

'ファイルパス更新時イベントプロシージャ
Private Sub F_PATH_AfterUpdate()  
    InitDevice 
End Sub  

'デバイス初期化
Private Sub InitDevice()  
    If vmoSnd.Open_(IIf(IsNull(Me!F_PATH.Value), "", Me!F_PATH.Value), AUTO) Then  
        ChangeCtrlState MCI_MODE_STOP  
    Else 
        ChangeCtrlState MODE_NOT_READY  
    End If  
End Sub

'Playボタンクリックイベントプロシージャ
Private Sub cmd_play_Click()  
    If Not vmoSnd.Play_() Then Exit Sub  

    vmoTimerFrm.TimerInterval = IIf(vmoSnd.RestMillSec_ <= 0, 100, vmoSnd.RestMillSec_)
    ChangeCtrlState MCI_MODE_PLAY  
End Sub  

'Pauseボタンクリックイベントプロシージャ
Private Sub cmd_pause_Click()  
    If Me!cmd_pause.Caption = "Pause" Then '標題がPause(一時停止する時) 
        If Not vmoSnd.Pause_() Then Exit Sub  

        vmoTimerFrm.TimerInterval = 0  
        If vmoSnd.Status_() = MCI_MODE_PAUSE Then  
            ChangeCtrlState MCI_MODE_PAUSE  
        Else 
            ChangeCtrlState MCI_MODE_STOP  
        End If  

    ElseIf Me!cmd_pause.Caption = "Resume" Then '標題がResume(再開する時) 
        If Not vmoSnd.Resume_() Then  
            If Not vmoSnd.Play_ Then Exit Sub  
        End If  

        vmoTimerFrm.TimerInterval = IIf(vmoSnd.RestMillSec_ <= 0, 100, vmoSnd.RestMillSec_)
        ChangeCtrlState MCI_MODE_PLAY  
    End If  
End Sub  

'Stopボタンクリックイベントプロシージャ
Private Sub cmd_stop_Click()  
    If Not vmoSnd.Stop_() Then Exit Sub  

    vmoTimerFrm.TimerInterval = 0  
    ChangeCtrlState MCI_MODE_STOP  
End Sub  

'現在位置移動イベントプロシージャ
Private Sub txt_seekpos_AfterUpdate()  

    Select Case vmoSnd.Status_()  
        Case MCI_MODE_PLAY '演奏中 
            If vmoSnd.Seek_(Me!txt_seekpos.Value) Then  
                Me!txt_curpos.Value = Me!txt_seekpos.Value  
                vmoSnd.Play_

                vmoTimerFrm.TimerInterval = IIf(vmoSnd.RestMillSec_ <= 0, _
                                                             100, vmoSnd.RestMillSec_) 
            End If  

        Case MCI_MODE_PAUSE '一時停止
            If vmoSnd.Seek_(Me!txt_seekpos.Value) Then  
                Me!txt_curpos.Value = Me!txt_seekpos.Value  
                vmoSnd.Play_
                vmoSnd.Pause_

                vmoTimerFrm.TimerInterval = 0
            End If  

        Case MCI_MODE_STOP '停止 
            If vmoSnd.Seek_(Me!txt_seekpos.Value) Then  
                Me!txt_curpos.Value = Me!txt_seekpos.Value  

                vmoTimerFrm.TimerInterval = 0  
            End If  

        Case Else  
            Me!txt_seekpos.Value = 0  
            Me!txt_curpos.Value = 0  

            vmoTimerFrm.TimerInterval = 0  
    End Select  
End Sub  

'タイマイベントプロシージャ(演奏時現在位置表示用)
Private Sub Form_Timer()  
    If vmoSnd.Status_() = MCI_MODE_PLAY Then  
        Me!txt_curpos.Value = vmoSnd.CurrentPosition_()  
    End If  
End Sub  

'巻戻し用タイマ イベントプロシージャ
Private Sub vmoTimerFrm_Timer()  
    vmoSnd.Seek_ 0  
    ChangeCtrlState MCI_MODE_STOP  

    vmoTimerFrm.TimerInterval = 0  
End Sub  

'フォームコントロール表示状態変更
Private Sub ChangeCtrlState(argeDevState As ENUM_MODE_STATE)  
Select Case argeDevState  
        Case MCI_MODE_PLAY  
            Me!ID.SetFocus 
            Me!txt_seekpos.Enabled = True  
            Me!cmd_play.Enabled = False  
            Me!cmd_pause.Enabled = True  
            Me!cmd_pause.Caption = "Pause"  
            Me!cmd_stop.Enabled = True  

        Case MCI_MODE_PAUSE  
            Me!ID.SetFocus 
            Me!txt_seekpos.Enabled = True  
            Me!cmd_play.Enabled = False  
            Me!cmd_pause.Enabled = True  
            Me!cmd_pause.Caption = "Resume"  
            Me!cmd_stop.Enabled = True  

        Case MCI_MODE_STOP  
            Me!ID.SetFocus 
            Me!txt_seekpos.Enabled = True  
            Me!txt_seekpos.Value = 0  
            Me!txt_curpos.Value = 0  
            Me!cmd_play.Enabled = True  
            Me!cmd_pause.Enabled = False  
            Me!cmd_pause.Caption = "Pause"  
            Me!cmd_stop.Enabled = False  

        Case Else  
            Me!ID.SetFocus 
            Me!txt_seekpos.Enabled = False  
            Me!txt_seekpos.Value = 0  
            Me!txt_curpos.Value = 0  
            Me!cmd_play.Enabled = False  
            Me!cmd_pause.Enabled = False  
            Me!cmd_pause.Caption = "Pause"  
            Me!cmd_stop.Enabled = False  
    End Select  
End Sub

以上でできたので早速使ってみます。AccessにもどってFrmSoundフォームを フォームビューで表示してください。データベースに登録した音楽ファイルのパスが 対応していればPlayコマンドボタンが使用可能なのでクリックしてください。左側の テキストボックスに現在の演奏位置が0から1000の範囲で表示されます。また、 移動したいときは右側のテキストボックスに0から1000の範囲で入力すると 演奏位置が移動します。
(当初VC++のときのようにスライダーコントロールを 使おうとしたのですが、標準ではなくActiveXコントロールで実装しようとしたのですが、 ツマミの位置が移動するごとに演奏がブツブツ途切れてしまったので やむなくこのような仕様にしました。)