現実逃避のプログラミング
日曜プログラマ、とかそんなんですらなく、いろいろやらなきゃならないときに、「うがー。この現実から逃げ出したい」という状況のときに、なにかくだらないツールのようなものを、VBとかでサクッと作る。そんな感じでやっています。
だからもうほんとに、何もかも忘れていて、インスタンスって何だっけ……インヘリッツって何だっけ……みたいな。感じで。検索しまくり。
VS2005にアップグレードしてから、ほとんど触ってなかったんですが……なんじゃこりゃー……これはVBなのか?……そして.NETなのか?……もはやVB2005というまったく新しい言語の登場ではないのか?(いいすぎ)
とか思ってしまいました。誰もが通る、簡易"MP3プレイヤー"作成。をやってるんですが。
MP3ファイルからIDタグを読み込む、というのはめちゃくちゃ難しいことで、何か既存のAPIを使わないと無理、というところまではわかって、じゃあ何を使おう。っていうんで迷いました。VBMP3.dllは最新版の配布はされていなくて、サポートページも閉じちゃってますね。Macとの互換を考えてQuickTimeか?と思ったのですが、WinユーザはQT嫌う人もいるということを読んだのでアウト。fmodってすごいのがあるのですが、VisualBasic2005からは参照できなかった。なんでだろ?
結局一番簡単な、AxWindowsMediaplayerを使ってみたんですが、メディアプレーヤで再生するだけではタグ情報読めないらしく(たぶん)、いったんプレイリストにアペンドして、プレイリストからインフォをもらう。というやり方にしてみました。
というところまでOK。いま休止中。
問題点は、MP3ファイルを再生するたびにプレイリストを新しく作り(笑)、同じ曲を再生してもジャンジャカプレイリストが作成されてしまう点。これはIf文でプレイリストがなければリストを作って……というふうに直さなきゃ、ですね。どーやんのかわかんないけど。
進捗があればまた報告します。
↓はコード。
Imports System.IO Imports AxWMPLib Imports WMPLib Imports System.Runtime.InteropServices Public Class Form1 Dim stMp3Path As String Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdPlay.Click wmPlayer.Ctlcontrols.play() End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdStop.Click wmPlayer.Ctlcontrols.stop() End Sub Private Sub Form1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles Me.DragDrop stMp3Path = e.Data.GetData(DataFormats.FileDrop)(0) If Dir(stMp3Path) <> "" Then wmPlayer.URL = stMp3Path Dim wArtist As String Dim wTitle As String ' Get an interface to the current media item. Dim currMedia As IWMPMedia = wmPlayer.currentMedia ' Get an interface to the playlist. Dim wList As IWMPPlaylist = wmPlayer.playlistCollection.newPlaylist("WinMP3list") ' Append the media item to the playlist. wList.appendItem(currMedia) wArtist = wmPlayer.currentMedia.getItemInfo("Author") Label1.Text = wArtist wTitle = wmPlayer.currentMedia.getItemInfo("Title") Label2.Text = wTitle End If End Sub Private Sub Form1_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles Me.DragEnter If e.Data.GetDataPresent(DataFormats.FileDrop) Then 'ドロップ効果を取得 e.Effect = DragDropEffects.Copy Else 'ドロップ効果を破棄 e.Effect = DragDropEffects.None End If End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.AllowDrop = True End Sub End Class