ようこそゲストさん

mitc - 日記

2007/09/06(木) foobar2000のTitle Formatting編集メモ

はてブ 2007/09/06 26:01 雑記miff

まえがき

foobar2000が何かはwikiを参照.
簡単に書くとミュージックプレイヤーです.

注意

全てTrack info panel mod上で試しているので,foobar2000の他の部分で使う場合とは若干のズレがある可能性があります*1
TitleformatなのかTitle FormatなのかTitle Formattingなのか,それらは全て意味が異なる単語なのかが今いちわかりません.
日本語のwikiではTitle Formatting,英語のwikiではTitleformatとしているようにも見えますが.
foobar2000のPreferencesでは,Title Formattingと書いてありますが,Titleformatを使って表示を変える行為をTitle Formattingと言うのかも.
とにかくよくわからないので誤用していたり表記がゆれてます.ごめんなさい!

多くの知識は試行錯誤での経験則です.
疑問点なども多分公式のフォーラムを参照したりリファレンスを読み込んだらわかることなんだと思います.
ちゃんとした知識を得ることがあればその部分は随時修正していきます.

ほとんど日本語Wikiと英語Wikiを参照しながら試しました.
これだけの情報が広く公開されているのはとてもありがたいです.

*1 : あるかどうかもわかりません

基本構文メモ

他にも色々あるので日本語wikiのこのページを参照

基本操作

操作Title FormatCっぽく書くと
変数への代入$puts(変数名)foo = 100;
変数値の取得$get(変数名)printf("%s",foo);
もし$if(a,b,c)(a != null) ? b : c;
もし同じ整数なら*2$ifequal(a,b,c,d)(a == b) ? c : d;
もし大きければ$ifgreater(a,b,c,d)(a > b) ? c : d;
もし長ければ$iflonger(a,b,c,d)(length(a) > length(b) ? c : d
if文がちょっと面倒です.
Title Formatでは,例えば「%title%で再生中の曲のタイトルを取得する」といったように,
コンポーネントから提供される情報があらかじめセットされています.
しかし,曲を再生されていない時には%title%には何が入っているのか…….
if文では,%title%に何か入っていれば真,入っていなければ偽と判定をします.
自分でフラグの管理をする時はifequalを使う方が良さそうです.

比較

操作Title Formatイメージ
大なり$greater(x,y)x > y
同じ文字列か$strcmp(x,y) 
長い文字列か$longer(x,y)length(x) > length(y)

算術演算

操作Title Format計算
足し算$add(x,y...)x + y + ...
引き算$sub(x,y)x - y
かけ算$mul(x,y...)x * y * ...
割り算$div(x,y)x / y
剰余$mod(x,y)x % y
???$muldiv(x,y,z)x * y / z

論理演算

操作Title Format計算
論理積$and(x,y...)x AND y AND ...
論理和$or(x,y...)x OR y OR ...
排他的論理和$xor(x,y)x XOR y
否定$not(x)NOT x

*2 : 「整数」を比較する関数である点に注意

基本事項

  • 基本的に全ての値は文字列
  • 計算に小数は扱えない
  • 関数の頭には$を付ける
  • %%で文字列を囲むことによってPHPで言うところのスーパーグローバル変数のようなものを参照できる
    • Title Formatでの呼び方は「フィールド」
    • 本記事のサンプルでは,フィールドの意味についてはコメントで簡単に触れるのみです
    • フィールドの詳細については,本記事末尾の参考文献を見てください
  • %%で読み込める変数も関数もそれぞれにfoobar2000本体で提供されるものと個別のプラグインで提供されるものがある
  • 座標指定時はウィンドウの左上が(x,y)=(0,0)となる
  • タブ,改行は無視される
  • メタ文字は,シングルクォーテーション(')で囲むとエスケープできる
  • シングルクォーテーションを出力するためには重ねる('')必要がある
  • 色の指定は,10進数でR,G,Bを指定する
    • 例)-255-255-255*3で#FFFFFF
  • 位置,長さ指定時は特に何も指示が無い場合ピクセル単
  • 変数は,曲が変わるとクリアされる*4

変数の扱いについて

次のように関数の引数に指定するスイッチに変数の中身を書きだせます.
$puts(PEN_COLOR, 255-0-0)
$puts(BRUSH_COLOR, 0-255-0)
$drawrect(X,Y,W,H,brushColor-$get(PEN_COLOR) penColor-$get(BRUSH_COLOR))
drawrect関数は,Track Info Panel Mod上の関数なのでちょっと不適切な例かもしれませんが.

さらに,次のような無茶そうなこともできます.
バッドノウハウになるのかな?
// Global
$puts(func_write_decorated_string_B,
	$rgb(192,168,3)
)
$puts(func_write_decorated_string_E,
	$rgb()
)
// PerTrack
もじれつ

$get(func_write_decorated_string_B)もじれーつ$get(func_write_decorated_string_E)

もじれつ
ormat_variables_test.png

こうして見ると,変数というよりは#defineって感じですね.

*3 : ハイフンで挟んでいるのは例なだけで,場合によっては色々な指示パターンがあるかも

*4 : 試していませんが

Track Info Panel Modで遊ぶ

Track Info Panel Modは,再生中の楽曲についての情報を表示するなどの機能を持ったパネルを追加するコンポーネントです.
Columns UIが必須なので注意.
詳しくは,日本語wikiのこのページを参照して下さい.

次のURLの英語wikiに詳しい説明があります.(一番下にいじり倒したサンプル有り)
http://wiki.hydrogenaudio.org/index.php?title=Foobar2000:Components_0.9/Track_Info_Panel_Mod_%28foo_uie_trackinfo_mod%29

日本語wikiに載っているサンプルが,一番シンプルな形で,
これに画像を張りつけたりして凄くいじると英語wikiのサンプルのような形に持っていくこともできるようです.
プレイリストなど壊れると困る部分でTitleFormatの練習をするのはちょっと怖いので,
初期状態では何も表示しないこのパネルをいじってみることにします.

4つのセクション

Track Info Panel ModのTitle Formatは,4種類のセクションに分けて書きます.
セクションの開始は,次に示すコメントを記すことで宣言します*5
新たなセクションの開始を宣言することは,直前のセクションの終了を同時に宣言することになります.
同じセクションがいくつもあっても大丈夫なようです.

英語版wikiの翻訳
// Global 
グローバルな値を置く.
// Background 
背景の要素はここ(例:背景画像).一つだけ描画する.
// PerTrack 
トラック毎に変化する要素はここ(アルバム名,アーティスト名など)ボタンもここに.
// PerSecond 
毎秒変化する要素はここ(再生位置など)
セクションの違いは,基本的に再描画のタイミングのようです*6
そして,PerSecondセクションに書いた要素だけは,毎秒再描画されるようです.
例えば,Globalに%_time_elapsed_seconds%*7を置くと次の画像のようになると思います.

ormat_section_col.png

これは,%_time_elapsed_seconds%は毎秒更新されるので毎秒異なる数字が描画されるのですが,
Globalセクションに置かれたものは再描画されないので描画が重なっているから……と解釈しました*8
ちなみにPerTrackセクションに置くとそもそも最初の一回(曲が変わる瞬間)以外は更新されないようです.

セクションを跨ぐ処理

セクション間の変数のやり取りは,よくわかりません.
// PerTrack
$puts(foo, bar)

// Global
// 出力1
$get(foo)

// PerTrack
// 出力2
$get(foo)

// PerSecond
// 出力3
$get(foo)
出力1と出力2はうまく出力されますが,出力3はだめです.

// PerSecond
$puts(foo, bar)

// Global
// 出力1
$get(foo)

// PerTrack
// 出力2
$get(foo)

// PerSecond
// 出力3
$get(foo)
出力1と出力3はうまく出力されますが,出力2はだめです.

こうして見ると,とりあえずPerSecondセクションとPerTrackセクションは相互にやり取りできないように見えます.

*5 : タブやスペースなどが行頭にあってはいけません

*6 : 良くわからない部分が多いので断定はできません

*7 : 演奏経過時間を秒数で返す

*8 : 断言できません!

参考文献

より詳細な情報を求めるならば英語版のwikiが一番詳しいです.

日本語

  • Track Info Panel の簡単な導入
    • http://tnetsixenon.xrea.jp/foobar2000/index.php?Track%20Info%20Panel%20%E8%A7%A3%E8%AA%AC
  • Track Info Panel Modの簡単な解説
    • http://www5.pf-x.net/~motorhead/trackinfomod01.html
  • 初学者向けTitle Formattingの記法講座
    • http://tnetsixenon.xrea.jp/foobar2000/index.php?TitleFormatting%20%E8%A7%A3%E8%AA%AC
  • 日本語版Title Formattingリファレンス
    • http://tnetsixenon.xrea.jp/foobar2000/index.php?Title%20Formatting%20Help
  • 日本語版Title Formatting関数リファレンス
    • http://tnetsixenon.xrea.jp/foobar2000/index.php?Title%20Formatting%20Help%20Function
  • Title Formattingで使えるフィールド一覧
    • http://tnetsixenon.xrea.jp/title_formatting.html
  • Kei_9 なげやりにっき -  覚え書き1
    • Columns UIプレイリスト用Titleformat作成手順の参考
    • http://d.hatena.ne.jp/Kei_9/20060517/1147869248

英語

  • Titleformatのリファレンス
    • http://wiki.hydrogenaudio.org/index.php?title=Foobar2000:Titleformat_Reference
  • Track Info Panel Modのリファレンス
    • http://wiki.hydrogenaudio.org/index.php?title=Foobar2000:Components_0.9/Track_Info_Panel_Mod_%28foo_uie_trackinfo_mod%29

あとがき

私自身が試行錯誤しながら書いたので間違いが含まれている可能性が高いです.
間違いに気付き次第修正していきます.
気付かなければ永遠に間違いが残されます.

2007/09/07 第一版


名前:  非公開コメント   

E-Mail(任意/非公開):
URL(任意):
  • TB-URL  http://mitc.s279.xrea.com/diary/061/tb/