・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コントロールで実装しようとしたのですが、
ツマミの位置が移動するごとに演奏がブツブツ途切れてしまったので
やむなくこのような仕様にしました。)