レギュラープレーヤ
(RegularPlayer) |
目次 |
最終更新日:2007/04/27
新規 |
●概要
WMP10/11の標準コンポーネントを利用したカスタムコントロールで、自分のアプリにて簡易的に音楽をソフトウェア制御下で演奏させる場合などに利用する。このコントロールでは、WMPのライブラリとして登録され、各種Tagが設定されている音楽を演奏対象とする。
●原理
WMP10または11をインストールすれば、そのコンポーネントをコントロールとして利用できる。WMP10
SDKをインストールすれば、そのコントロールのプログラミングI/Fも分かる。
●特徴
- UI は、WMP10/11 をそのまま利用。
- 再生中、状態、残り時間、アルバム、トラック番号、タイトル、曲時間、アーティストなどを自動表示する。
- PlayList オブジェクトなどを与えると自動的(勝手に)に再生する。PlayList のItem が、ライブラリ内にあることはユーザが保証する。
- 停止、速送りなどはユーザが行う。
- (カスタマイズ)ポピュラーかクラシックかを内部で判断し、表示内容を自動的に切り替える。
- 歌詞を自動表示する。
- 再生メディアの切り替えに伴う数種のイベントを発生する。
- 残り時間を知らせるイベントがある。
- イベントを利用すれば、再生中の情報表示をユーザ側で行える。
●条件
○WMA Tag
ジャンル、アルバム、参加アーティスト、トラック番号、曲名、作曲者が設定されているとしている。ポピュラーの場合は、作曲者は不要。
○形状
RegularPlayerは、イメージ領域をカットし、代わりに、状態表示、残り時間表示、音楽属性表示のラベルを、ユーザコントロールに配置している。下図参照。
各部の配置
○音楽属性
クラシックとポピュラーでは音楽属性の構造が異なるので、このコントロールでは、WMA Tagの
Category が、"Classic"
となっていれば、クラシックと看做すことになっている。そうでなければ、ポピュラーであるとして属性を処理する。
ポピュラー音楽の表示
アルバム名/歌手
トラック番号. 曲名
評価
演奏時間
クラシック音楽の表示
作品名
楽章. 曲名 (演奏時間)
<作曲者>指揮者、独奏者/オケ名
●技術解説
○WMPコントロールの獲得
・メディアプレーヤをコントロールとして使えるようにする。下図参照。
-
VB.NETにて、ツール→ツールボックスのカスタマイズを選ぶ。
-
カスタマイズのダイアログが表示されるので、COMコンポーネントタブを選ぶ。
-
OCXやクラスモジュールの一覧から、Windows Media Playerの
wmp.dll (system32にあるはず)をチェックする。
-
OKとすると、ツールボックスにMediaPlayerが現われる。
・メディアプレーヤのコントロールを使う。
-
他の部品と同じくコンポーネントを適当なフォームに貼りつけるだけで良い。
-
デフォールトでは、WMPは、フォームに貼り付けられた状態で動作するモードになっているので、そのままとする。
-
今回はプレーヤの操作部分を利用する例なので、表示状態にする。視覚効果が不要であれば、イメージ領域(上部)をサイズを変更して隠す。メディア情報(WMAタグなど)は、操作部分の直ぐ上に表示される。
下図参照。
-
これは、COMコンポーネントなので、.NETへのラッパが必要となり、
AxInterop.WMPLib.dll と
Interop.WMPLib.dll
が自動的に生成されるので、この二つは常に、wmp.dllと同じパスにないと動かないので注意方。
○WMPによる音楽ライブラリ管理方法
PC音楽システムを参照。
○演奏中の状態変化を把握する
PlayListを与えると、WMPにて自動的に曲を連続演奏するが、その間の情報を得るには、wmp.StatusChange
イベントを捕捉する。このイベントは、WMPのステートが変化したり、曲が切り替わった場合に生起するので、そのタイミングで以下のように状態を調べれば良い。
Dim ST As String = wmp.status
Dim cm As WMPLib.IWMPMedia = wmp.currentMedia
If ST = "" Then Exit Sub '空白は無視
lblSts.Text = ST '状態を表示
If ST Like "*再生中*" Then
'WMP10 では、再生中・・・・・、WMP11 では、****再生中・・・ となる
ST = "再生中"
再生中の場合だけ、currentMedia (演奏中の曲)の以下のように情報を獲得する。
クラシックの例
CurrPT = cm.duration
Dim CInfo(5) As String
Dim CT As String = cm.getItemInfo("WM/Category")
If CT = "Classic" Then
'クラシック
Dim OP As String = cm.getItemInfo("Album")
Dim TN As String = cm.getItemInfo("WM/TrackNumber")
Dim TT As String = cm.getItemInfo("Title")
Dim MP As String = cm.getItemInfo("Artist")
Dim sPT As String = " ( " + PTString(CurrPT) + " )"
lblInfo.Text = OP + vbCrLf + TN + ". " + TT + sPT + vbCrLf + MP
Dim Cmp As String = cm.getItemInfo("Composer")
If CComposer <> Cmp Then
RaiseEvent ComposerChanged(Me, Cmp)
CComposer = Cmp
End If
CInfo(0) = Cmp
CInfo(1) = OP
CInfo(2) = MP
CInfo(3) = TT
CInfo(4) = TN
CInfo(5) = CurrPT.ToString
・・・・・・
○残り時間を把握する
タイマーのみでは累積誤差がでるので、タイマーの割込み毎に、wmp.Ctlcontrols.currentPosition
を読み取れば良い。currentPosition はDouble で表された経過時間なので、duration
から引けば良い。これによって、累積誤差はなくなり、正確となる。
ユーザが早送りすると、上記では狂ってしまうので、wmp.PositionChange
イベントを利用し、
Private Sub wmp_PositionChange(ByVal sender As Object, ByVal e As
AxWMPLib._WMPOCXEvents_PositionChangeEvent) Handles wmp.PositionChange
Dim p As Double = e.newPosition
lblTime.Text = "残り " + PTString(CurrPT - p)
If m_CurrentTimeEnable Then RaiseEvent PlayTimeChanged(Me, CLng(p))
End Sub
などとすれば良い。
|