コンピュータや音楽の事書いてます

iTunesのcomインターフェイス

http://q.hatena.ne.jp/1252743398 の問題を考えてたら、iTunesはcom公開してないのかな?っと思ったので調べてみた。
WSH-vbsだと解析が面倒なのでEXCEL-VBAIDEで下調べ。参照設定を見ると頭に"itunes"と付くライブラリが3つほど見えるのでチェックを入れて、

Sub a()
    Dim itunes As iTunesApp
    Set itunes = CreateObject("iTunes.Application")
End Sub

同時にiTunesが起動する。おお、あるある(↓はブレイク中のウォッチウィンドウ)。

ちなみにデバッグ中にiTunesを終わらせると

ハッキングばれとるw

sdkとか入手しなくても良いみたいだ。
という訳で出来たのがこれ。ドライブ内のCDの全曲をwavとmp3両方とも作成する。

Option Explicit
Dim itunes As iTunesApp 'iTunes本体
Sub encode()
    Dim tracks As iTunesLib.IITTrackCollection, track As IITTrack, s
    Set itunes = CreateObject("iTunes.Application")
    For Each s In itunes.Sources 'どのSourceがCDなのか探す
        If s.Kind = ITSourceKindAudioCD Then
            Set tracks = s.Playlists(1).tracks
        End If
    Next
    If tracks Is Nothing Then Exit Sub
    display_tracks tracks '曲名一覧を表示
    For Each track In tracks
        '情報をセルに表示
        Range("a9:b9") = Array("エンコード中の曲名", track.Name)
        Range("a10:b10") = Array("エンコード中のアルバム名", track.Album)
        Range("a11:b11") = Array("エンコード中のアーティスト", track.Artist)
        encode_track "MP3 Encoder", track
        encode_track "WAV Encoder", track
    Next
End Sub
Sub encode_track(etype As String, etrack As IITTrack)
    Dim state As IITOperationStatus 'エンコード中の状態
    itunes.CurrentEncoder = itunes.Encoders.ItemByName(etype) 'エンコード形式の設定
    Set state = itunes.ConvertTrack(etrack)
    Do While state.InProgress = True '終わるのを待つ
        Application.Wait TimeSerial(Hour(Now), Minute(Now), Second(Now) + 1)
    Loop
End Sub
Sub display_tracks(tracks As iTunesLib.IITTrackCollection)
    Dim track As IITTrack, i As Integer
    Cells(13, 1) = "CD内の曲一覧"
    i = 14
    For Each track In tracks
        Cells(i, 1) = track.Index
        Cells(i, 2) = track.Name
        i = i + 1
    Next
End Sub

起動ボタンもつけてみた。(付け方は省略)

ついでにwshバージョンも作成

Option Explicit
Dim itunes  'iTunes本体
dim ITSourceKindAudioCD, msg
ITSourceKindAudioCD=3

do while msgbox("CDを入れたらOK、終了はキャンセル",vbOKCancel)=vbok
	encode
	msgbox "終了しました。" & vbcrlf & msg
loop

Sub encode()
	Dim tracks, track, s
	Set itunes = CreateObject("iTunes.Application")
	For Each s In itunes.Sources 'どのSourceがCDなのか探す
		If s.Kind = ITSourceKindAudioCD Then
			Set tracks = s.Playlists(1).tracks
		End If
	Next
	If tracks Is Nothing Then Exit Sub
	For Each track In tracks
		encode_track "MP3 Encoder", track
		encode_track "WAV Encoder", track
	Next
	'msg = " エンコード中の曲名:" & track.Name & vbcrlf &
	msg=msg & " アルバム名:" & tracks(1).Album & vbcrlf & _
	          " アーティスト:" & tracks(1).Artist & vbcrlf
	display_tracks tracks '曲名一覧を表示
End Sub
Sub encode_track(etype, etrack)
	Dim state 'エンコード中の状態
	itunes.CurrentEncoder = itunes.Encoders.ItemByName(etype) 'エンコード形式の設定
	Set state = itunes.ConvertTrack(etrack)
	Do While state.InProgress = True '終わるのを待つ
		wscript.sleep 200
	Loop
End Sub
Sub display_tracks(tracks)
	Dim track
	msg = msg & "CD内の曲一覧" & vbcrlf
	For Each track In tracks
		msg = msg & track.Index & vbcrlf
		msg = msg & track.Name & vbcrlf
	Next
End Sub