hoge diary - カテゴリ - foobar2000

[foobar2000] 重複曲を除く Playlist Tree 用 Scheme コード

foobar2000 Playlist Tree を使って「レーティングが 4 以上の曲」を取り出そうとして,以下の Query を今まで使っていました.

Source: @database
Criteria: rating GREATER 3

しかしこの方法だと,違うアルバムに同じ曲が入ってるなどするときに,それらが両方ともツリーに入ってしまうので若干不便です.foobar2000 の "Remove Duplicates" はファイルのパスで同じかどうかを判定しているために使えませんでした.

そこで,Playlist Tree の Scheme によるカスタマイズに目を付け,「レーティングが 4 以上の曲で,かつ重複しているものは最初に検索で見つかった 1 曲だけにする」という Scheme コードを書きました.

; RATING が 4 以上の曲だけを得る.
; ただしアーティストとタイトルが重複する曲は列挙された最初の1曲だけにする
(begin
    ; 曲の一致性を判定する比較するための文字列を得る関数
    (define getKey (lambda (handle)
        (format-title handle "%title%%artist%")
    ))
    ; getKey 関数の結果に基づいて,handle1 と handle2 が同じかどうかを判定する述語
    (define isEqualKey? (lambda (handle1 handle2)
        (if (equal? (getKey handle1) (getKey handle2)) #t #f)
    ))
    ; isEqualKey? の結果に基づいて,指定したリストにhandleが入っていれ
    ; ば #t なければ #f を返す
    (define isInList? (lambda (l handle1)
        (let ((already-added #f))
            (begin
                (for-each (lambda (handle2)
                    (if (isEqualKey? handle1 handle2) (set! already-added #t))
                ) l)
                already-added
            )
        )
    ))
    (define addSongs (lambda (handle)
        (add-node handle (list
            (format-title handle "%artist%")
            (format-title handle "%album%")
            (format-title handle "%track%. %title%")
        ))
    ))

    (define songs_candidate (list))

    ; リスト l に既に同じ曲(一致性の判定は isInList? が行う) があれば
    ; 追加しない
    (define addToList (lambda (handle)
        (if (isInList? songs_candidate handle)
            ()
            (set! songs_candidate (cons handle songs_candidate))
        )
    ))

    ; RATING > 3 の曲リストを作って,songs_candidate に入れる.
    (for-each-db-entry (lambda (handle)
        (addToList handle))
        "rating GREATER 3"
    )

    ; songs_candidate をツリーに追加する
    (for-each addSongs songs_candidate)
)

Lisp 系言語のコードをまともに書くのは今回が初めてな上,手続き型言語の考えがどうしても頭から離れず,begin 使いまくりです (begin は C でいうカンマ演算子のようなもので,引数を順番に評価し,最後に評価した引数を値とする関数です).ちゃんと動くのでよしとします.

あとはこれらを以下のようにして Playlist Tree のクエリに登録します.これで作業完了です.

Source: @scheme
Criteria: (空欄)
Format: (上に書いたコードをここに貼り付ける)

これを導入したときのツリーは下のような感じになります.赤線で囲んだツリーが今回書いたクエリによるもので,上が最初に書いていたクエリによるものです.重複が取り除かれていることがわかります.

Scheme による 重複除去処理を施した Playlist Tree の図

これで重複を気にする必要がなくなりました.

[foobar2000] foobar2000 で記録した ReplayGain を Amarok で使用する

ReplayGain を計算あるいは適用する Amarok スクリプト紹介されていました.スクリプトの ChangeLog によれば,バージョン 0.7.1 以降で foobar2000 が ID3v2 タグに記録した ReplayGain 情報を読めるようです.というわけで,インストールしてみました.

曲の再生時にボリュームが変化します.おそらく DCOP 経由で Amarok 本体のボリュームを調整しているのでしょう.

これで,Amarokfoobar2000 については ReplayGain が適用できました.あとは... 私が持っている iPod nano にも適用できれば OK です.

とはいえ,foobar2000 は ReplayGain を ID3v2 タグの TXXX フレーム (ユーザ定義フレーム) に記録しているので,iPod が読んでくれるはずはないと考えています.

その可能性があるとすれば,ID3v2.3 タグの RVAD フレームもしくは,ID3v2.4 タグの RVA2 フレームです.foobar2000 が TXXX フレームに書き込んだ情報を RVA2 フレームに書き込むツールを作れば実現できそうです.

もっともその前に,iPod が RVA2 を読むかどうかを調べてみる必要がありそうです.

[foobar2000] foo_uie_lyrics_panel で ID3 タグ内の歌詞を表示

iPod で歌詞を表示するために,Amarok + Lyrics ID3 スクリプトを使って曲ファイルの ID3v2.3 タグに歌詞を書き込んでいくと,foobar2000 でもそれを表示したいと思うのが人情.

foobar2000 Wiki で,それを叶えるためのコンポーネントが紹介されています.foo_uie_lyrics_panelfoo_uie_lyrics の 2 つが載っていたので,ここでは解説に従って,前者をインストールしました.

ID3v2.3 タグの USLT タグフィールドに書かれた歌詞をこのコンポーネントで表示するには,foo_uie_lyrics_panel の設定 (Preference を開き,Tools - Lyrics panel の順に辿る) で,"Search" タブにある "Lyrics sources" 欄に $meta(UNSYNCED LYRICS) を追加します.これで,曲を再生すると,タグに書き込まれた歌詞が表示されます.

[foobar2000] kode's foobar2000 OSD Plug-in

kode's foobar2000 plug-ins に,foobar2000 用の OSD プラグインがありました.

早速インストールしてみました.設定項目も思ったより多くていいと思います.以下は参考のためのスクリーンショットです.

[foobar2000] foobar2000

WinampamaroK に近づける方法はないものか,といろいろ調べているうちに,foobar2000 というプレイヤーに出会いました.

試しにインストールして使ってみます....

見た目は実にシンプルです.普段プレイヤーウィンドウを最小化している私にとっては,Winamp のスキン化されたウィンドウよりも foobar2000 の簡素なウィンドウの方が合うと思います.

また,デフォルトの設定から何もいじらずとも,ID3v2.4 UTF-16LE のタグを表示できました.これについても,日本語化パッチを当てないとタグの内容を表示できない(つまり,仕様通りに実装できていない) Winamp よりも勝っています.

foobar2000 は amaroK 同様,曲のデータベースを保持できますので,曲名やアーティストの表示は非常に高速です.

なお,私はプレイリストを amaroK っぽくしたかったので,Columns UI プラグインモジュールを組み込んでいます.

探してみると,MSN Messenger 7 用のプラグインモジュールも見つかりました.

結局のところ,私にとってかなりいい感じですので,Winamp から乗り換えることにしました.


Valid XHTML 1.1! Valid CSS!
© 2004-2009 ぱくちゃん.
Last modified: Sun Jan 18 14:09:47 JST 2009