#contents

*foo_func [#t640d4a1]
このコンポーネントは、いろいろな種類の[[TitleFormatting]]の関数を追加したりすることができます。
-[[DLL配布元:http://blog.99ravens.net/index.php?e=265]]
*設定 [#na6ab262]
Preferences>Tools>foo_func から設定できます。

-On init
--foobar2000起動時に実行されるTF (meta情報の参照は不可)
-On quit
--foobar2000終了時に実行されるTF (meta情報の参照は不可)
-On playback starting
--再生開始時に実行されるTF (meta情報の参照は不可)
-On playback new track
--曲変更時に実行されるTF (meta情報の参照可)
-On playback stop
--現在の再生中の曲が停止された時に実行されるTF (meta情報の参照不可)
※次の曲の再生が始まった場合にもコールされる
-On playback seek
--シーク操作時に実行されるTF (meta情報の参照可)
-On playback pause
--一時停止時に実行されるTF (meta情報の参照可)
-On playback time (per second)
--再生中に毎秒単位で実行されるTF (meta情報の参照可)
-On volume change
--ボリューム変更時に実行されるTF (再生中の場合はmeta情報の参照可)
-On timer
--$settimerで設定した間隔で実行されるTF
-Debug
--
TFのデバッグ用、Runボタン押下時以外は実行されない (再生中の場合はmeta情報の参照可)

Preferencesページを開いている間はRunボタンを押さない限り実行されません。
これはTFに異常な処理を記述してしまった場合などのセーフモード的な処理で仕様です。

*関数・変数の解説 [#m4ef2a89]
[[TitleFormatting]]の解説は、[[Reference:http://tnetsixenon.xrea.jp/title_formatting.html]] や [[Title Formatting Help]] などを参考にしてください。

////////////////////////////////////////////////////////////////////////////////
**便利なツール [#d22c577e]


***$calc [#i2bb1507]
:概要|
計算式を実行する
:書式|
$calc(expr)
>
expr
>>
計算式 : 使用できる演算子は+(加算),-(減算),*(乗算),/(除算),%(余り ('%')),{}(カッコ)
<
:使用例|
 $calc({1+2}*3) → 9
 $calc(10'%'3) → 1
 $calc(1.5/2) → 0.75


***$while [#fc02f4bb]
:概要|
TFをループ評価する
:書式|
$while('judge tf','exec tf',[loop])
>
'judge tf'
>>
判定するTF(エスケープ文字対応) : 評価した値が1の場合、exec tfを実行する
>
'exec tf'
>>
実行するTF(エスケープ文字対応)
>
loop
>>
無限ループ防止用、最大ループ回数 : 省略時は100が設定される
<
:使用例|
 $while('1','$hash(test,$add(%test%,1))',10)
:補足|
曲を再生中の場合はmeta情報の参照ができる


***$urlencode [#q0131275]
:概要|
文字列をURLエンコードする
:書式|
$urlencode(str,[charcode])
>
str
>>
文字列
>
charcode
>>
文字コードutf8,sjis,eucを指定 : 省略時はsjisが設定される
<
:使用例|
 $urlencode(あいう,utf8) → %E3%81%82%E3%81%84%E3%81%86
Run ServiceにGoogle検索を追加して使う場合はこんな感じ
 http://www.google.com/search?q=$urlencode(%artist% %title%,utf8)&ie=utf-8


***$console [#a1824d60]
:概要|
consoleに文字を出力する
:書式|
$console(str)
>
str
>>
文字列
<
:使用例|
 $console(test)


***$execute [#l79cc0a4]
:概要|
外部アプリケーションを実行する
:書式|
$execute(file,[param],[show])
>
file
>>
実行するファイルまたはURLまたはフォルダ : 先頭に/でfoobar2000のProfileパスと置き換わる
>
param
>>
実行するファイルに送るパラメータ
>
show
>>
表示方法 (ファイルによっては無効)
-hide 非表示
-normal 通常表示
-maximize 最大化表示
-minimize 最小化表示
<
:使用例|
標準ブラウザでページを開く
 $execute('http://foobar2000.xrea.jp/index.php')
メモ帳を最小化して開く
 $execute(c:\windows\notepad.exe,,minimize)
c:\をエクスプローラで開く
 $execute(c:\)
再生を開始する
 $execute('c:\program files\foobar2000\foobar2000.exe','/play',normal)

***$playback_control [#v953c931]
:概要|
再生をコントロールする
:書式|
$playback_control(command)
>
command
>>
-play 再生
-next 次の曲へ
-prev 前の曲へ
-rand ランダム再生
-stop 停止
<
:使用例|
再生を開始する
 $playback_control(play)


***$getimageinfo [#nf12a4b7]
:概要|
画像の情報を取得する。対応している形式はBMP/GIF/PNG/JPEG形式
:書式|
$getimageinfo(file,mode)
>
file
>>
ファイル名 : 先頭に/でfoobar2000のProfileパスと置き換わる
>
mode
>>
-width 幅
-height 高さ
-type ファイルの種類(BMP/GIF/PNG/JPEG)
<
:使用例|
種類を取得する
 $getimageinfo(c:\test.png,type) → PNG
幅を取得する
 $getimageinfo(c:\test.png,width) → 1024


***$unpack [#x478e16e]
:概要|
書庫から画像等を解凍する(Matroska対応)
:書式|
$unpack(index,file,output,[option])
>
index
>>
アクティブプレイリスト上のアイテムの位置
>
file
>>
対象ファイル名
>
output
>>
出力ファイル名(フルパス)
>
option
>>
delete 存在しない場合はoutputのファイルを削除
<
:使用例|
--再生中の曲が含まれる書庫からcover.jpgを解凍しc:\temp\cover.jpgに出力する
--存在しない場合はc:\temp\cover.jpgを削除する
 // 書庫からcover.jpgの取り出しを試みる
 $puts(img,$unpack(%g_active_index%,cover.jpg,c:\temp\cover.jpg,delete))
 // 存在しない場合は音源と同じフォルダのcover.jpg
 $if($get(img),,$puts(img,$replace(%path%,%filename_ext%,)cover.jpg))
 // ファイル存在チェック
 $if($files($get(img)),,$puts(img,c:\temp\no-cover.jpg))
---※$get(img)に画像ファイル名が入る
---※この例はFollow Cursorモード用なのでNow Playingモードでは%g_active_index%を%g_playing_index%に変更
:補足|
--正常に解凍された場合、outputが返る
---※この関数は今後、仕様変更する可能性があります
---※Matroskaで使用するには別途foo_input_matroska 0.9.2.0以降が必要

////////////////////////////////////////////////////////////////////////////////
**文字列の変換、比較 [#d254e2ba]

***$calc_string [#n3cecc81]
:概要|
文字列のサイズ(ピクセル)を求める
:書式|
$calc_string(font-name,font-size,[font-option],str,mode)
>
font-name
>>
フォント名
>
font-size
>>
フォントサイズ
>
font-option
>>
-b 太字
-i 斜体
-u アンダーライン
-s 打ち消し線
<
>
str
>>
文字列
>
mode
>>
-width 幅を求める
-height 高さを求める
<
:使用例|
 $calc_string('MS Pゴシック',10,ib,テスト,width)


***$wstrsplit [#w3685602]
:概要|
文字列を指定バイト数で区切る(2バイト文字対応)
:書式|
$wstrsplit(str,byte,index,[option])
>
str
>>
文字列
>
byte
>>
区切るバイト数
>
index
>>
取得するindex番号(0が先頭)
>
option
>>
count 分割数を取得する
<
:使用例|
 $wstrsplit(あ1いうえおかきくけこ,4,0) → あ1
 $wstrsplit(あ1いうえおかきくけこ,4,1) → いう
 $wstrsplit(あ1いうえおかきくけこ,4,0,count) → 6


***$pstrsplit [#s3bea9da]
:概要|
文字列を指定幅単位で区切る
:書式|
$pstrsplit(font-name,font-size,[font-option],str,width,index,[option])
>
font-name
>>
フォント名
>
font-size
>>
フォントサイズ
>
font-option
>>
-b 太字
-i 斜体
-u アンダーライン
-s 打ち消し線
<
>
str
>>
文字列
>
width
>>
幅(ピクセル)
>
index
>>
取得するindex番号(0が先頭)
>
option
>>
count 分割数を取得する
<
:使用例|
 $pstrsplit('MS Pゴシック',10,bi,あいうえおabcかきくけこ,30,0)
 $pstrsplit('MS Pゴシック',10,bi,あいうえおabcかきくけこ,30,0,count)


////////////////////////////////////////////////////////////////////////////////
**ファイル操作 [#ndcbfbe5]


***$files [#pf3dc91e]
:概要|
ファイルを検索する
:書式|
$files(cmd,path,[path...])
>
cmd
>>
-n 数値を指定した場合は、n番目(0が先頭)に見つかったファイルを取得する
-count 総ファイル数を取得する
-size 総ファイルサイズを取得する
-path名 ファイルの存在確認をする
<
>
path
>>
検索するパス(ワイルドカードで指定) : 先頭に/でfoobar2000のProfileパスと置き換わる
<
:使用例|
 // ファイルの存在確認
 $if($files(c:\temp\test.txt),trueの処理,falseの処理)
 // ファイル検索
 $files(0,/images\*.jpg)
 $files(3,c:\temp\*.jpg,d:\images\%album%\*.jpg,d:\images\*.png)
 // 総ファイル数
 $files(count,/images\*.jpg,c:\temp\*.jpg,d:\images\%album%\*.jpg,d:\images\*.png)
 // 総ファイルサイズ
 $files(size,c:\temp\*)


***$files_ex [#e172dff2]
:概要|
指定フォルダ配下のファイルを回帰的に検索する
:書式|
$files(cmd,path,file,[file...])
>
cmd
>>
-n 数値を指定した場合は、n番目(0が先頭)に見つかったファイルを取得する
-count 総ファイル数を取得する
-size 総ファイルサイズを取得する
<
>
path
>>
検索するパス : 先頭に/でfoobar2000のProfileパスと置き換わる
>
file
>>
検索するファイル(ワイルドカードで指定)
<
:使用例|
 $files_ex(0,/images,*.jpg)
 $files_ex(3,c:\temp,*.jpg,*.png,*.bmp)
 $files_ex(count,/images,*.jpg)
 $files_ex(size,c:\temp,*)
:補足|
--$files関数との違いは指定フォルダ配下を回帰的に検索する点
--例えばパスに c:\temp を指定した場合、その配下にあるフォルダ内も全て検索する


***$textfile [#c2146b56]
:概要|
テキストファイルを読み込む
:書式|
$textfile(filename,[charcode],[line from],[line to],[option])
>
filename
>>
ファイル名 : 先頭に/でfoobar2000のProfileパスと置き換わる
>
charcode
>>
文字コードutf8またはsjisを指定 : 省略時はsjisが設定される
>
line from
>>
開始行番号
>
line to
>>
終了行番号
>
option
>>
countline
>>>
行数を取得する(line fromとline toは無視される)
>>
crlf
>>>
改行コードをCR+LFで出力する(デフォルトはLFのみ)
>>
tf:'tf'
>>>
行毎にTFを適用し、その結果を出力する(エスケープ文字対応) : TF中に%textfile_line%で処理行の文字列が取得できる
<
:使用例|
ファイルと同じフォルダにあるinfo.txtを読み込む
 $textfile($replace(%path%,%filename_ext%,)info.txt,sjis)
2行目から3行目まで読み込む
 $textfile(info.txt,sjis,2,3)
2行目から読み込む
 $textfile(info.txt,sjis,2)
2行目まで読み込む
 $textfile(info.txt,sjis,,2)
行数を取得する
 $textfile(info.txt,sjis,,,countline)
改行コードをCRLFに変換して表示する
 $textfile(info.txt,sjis,,,crlf)


***$textwrite [#u59c779c]
:概要|
テキストファイルに保存する
:書式|
$textwrite(filename,str,[charcode],[option])
>
filename
>>
ファイル名 : 先頭に/でfoobar2000のProfileパスと置き換わる
>
str
>>
書き込む文字列
>
charcode
>>
文字コードutf8またはsjisを指定 : 省略時はsjisが設定される
>
option
>>
-add ファイルが存在する場合、末尾に追加して書き込む
-crlf 末尾に改行コード(CR+LF)を書き込む
<
:使用例|
 $textwrite('c:\text.txt',%title%,sjis)
 $textwrite('c:\text.txt',%track number%-%title%,sjis,add,crlf)


////////////////////////////////////////////////////////////////////////////////
**メニュー操作 [#n16ecf2d]


***$setcontextmenu [#ze8e340b]
:概要|
コンテキストメニューにアイテムを追加する
:書式|
$setcontextmenu(name,'tf')
>
name
>>
アイテム名
>
'tf'
>>
実行するTF(エスケープ文字対応)
<
:使用例|
--コンテキストメニューに Functions/test を追加する
---実行するとConsoleに曲名が出力される
 $setcontextmenu(test,'$console(%title%)')
:補足|
追加できるアイテムは最大20個


***$removecontextmenu [#d5627e35]
:概要|
$setcontextmenuで追加したアイテムを削除する
:書式|
$removecontextmenu(name)
>
name
>>
アイテム名
<
:使用例|
 $removecontextmenu(test)


***$contextmenu_execute [#kcf59ecc]
:概要|
コンテキストメニューコマンドを実行する
:書式|
$contextmenu_execute(command,[target])
>
command
>>
-フルパスまたはコマンド名
-Convert/Convert to...の場合、Convert to...でも指定可能
-使用できるコマンドは$contextmenu_list()を実行してConsoleより確認して下さい
<
>
target
>>
-実行するターゲットを指定する(省略時はplaylist)
-playlist プレイリストで選択中のファイル
-playing 再生中のファイル
<
:使用例|
選択中の曲のプロパティを表示する
 $contextmenu_execute('Properties',playlist)
再生中の曲を変換する
 $contextmenu_execute('Convert to...',playing)
 $contextmenu_execute('Convert/Convert to...',playing)


***$contextmenu_list [#ve7cec1c]
:概要|
コンテキストメニューコマンド一覧をConsoleに出力する
:書式|
$contextmenu_list()
:使用例|
 $contextmenu_list()


***$setmainmenu [#icbebf8e]
:概要|
メインメニューにアイテムを追加する
:書式|
$setmainmenu(name,'tf')
>
name
>>
アイテム名
>
'tf'
>>
実行するTF(エスケープ文字対応)
<
:使用例|
--メインメニューに Functions/test を追加する
---実行するとメインウインドウのサイズが100x100、透過率が200に設定される
 $setmainmenu(test,'$setwindowsize(100,100)$transwindow(200)')
:補足|
追加できるアイテムは最大20個


***$removemainmenu [#f53a6eb6]
:概要|
$setmainmenuで追加したアイテムを削除する
:書式|
$removemainmenu(name)
>
name
>>
アイテム名
<
:使用例|
$removemainmenu(test)


***$mainmenu_execute [#l4e23475]
:概要|
メニューコマンドを実行する
:書式|
$mainmenu_execute(command)
>
command
>>
-フルパスまたはコマンド名
-Playback/Playの場合、Playでも指定可能
-使用できるコマンドは$mainmenu_list()を実行してConsoleより確認して下さい
-タブ名を入れるとタブがActiveになるかも(Tabbed panel modifiedで確認)
<
:使用例|
--再生中の曲に移動する
 $mainmenu_execute('View/Columns playlist/Activate now playing')
 $mainmenu_execute(Activate now playing)
--トラックが切り替わるタイミングのTFに入れておくと、リストが再生中の曲の箇所に移動するので便利かも


***$mainmenu_list [#l7f526c9]
:概要|
メニューコマンド一覧をConsoleに出力する
:書式|
$mainmenu_list()
:使用例|
$mainmenu_list()


////////////////////////////////////////////////////////////////////////////////
**ポップアップメニュー操作 [#u48a0e4a]


***$popupmenu_create [#labf527b]
:概要|
新しくポップアップメニューを作成する
:書式|
$popupmenu_create(popupmenu_id)
>
popupmenu_id
>>
ポップアップメニューID
<
:使用例|
 $popupmenu_create(test)
:補足|
popupmenu_idが既に存在する場合は作成しない


***$popupmenu_remove [#b5a21afe]
:概要|
ポップアップメニューを削除する
:書式|
$popupmenu_remove(popupmenu_id)
>
popupmenu_id
>>
ポップアップメニューID
<
:使用例|
 $popupmenu_remove(test)


***$popupmenu_additem [#tbbbe0e2]
:概要|
ポップアップメニューに新しくアイテムを追加する
:書式|
$popupmenu_additem(popupmenu_id,item_name,['tf'],[option])
>
popupmenu_id
>>
ポップアップメニューID
>
item_name
>>
アイテム名 : 先頭に-を付けた場合、セパレータ表示となる
>
'tf'
>>
-実行するTF(エスケープ文字対応)
--%index% : index番号
--%checked% : チェックされている場合1、されていない場合は0を返す
<
>
option
>>
check:'tf'
>>>
-チェック項目にするTF(エスケープ文字対応)
-tfを評価し0以外の場合、チェックを付ける
-%index% : index番号
-%checked% : チェックされている場合1、されていない場合は0を返す
<
:使用例|
 $popupmenu_remove(test)
 $popupmenu_create(test)
 $popupmenu_additem(test,再生,'$playback_control(play)')
 $popupmenu_additem(test,停止,'$playback_control(stop)')
 $popupmenu_additem(test,-sep1)
 $popupmenu_additem(test,ランダム再生,'$playback_control(rand)')
 $popupmenu_additem(test,-sep2)
 $popupmenu_additem(test,次の曲,'$playback_control(next)')
:補足|
既存のアイテムの内容を変更する場合は、item_nameを同一にすると変更できる
:参考リンク|
--[[ボタンを押してオリジナルのポップアップメニューを表示させたい>#zbfae295]]
--[[ボタンを押して背景画像選択ポップアップメニューを表示させたい>#a564376d]]


***$popupmenu_removeitem [#ne7e075b]
:概要|
ポップアップメニューからアイテムを削除する
:書式|
$popupmenu_removeitem(popupmenu_id,item_name)
>
popupmenu_id
>>
ポップアップメニューID
>
item_name
>>
アイテム名
<
:使用例|
 $popupmenu_removeitem(test,ランダム再生)


***$popupmenu_view [#d3a2a872]
:概要|
ポップアップメニューを表示する
:書式|
$popupmenu_view(popupmenu_id)
>
popupmenu_id
>>
ポップアップメニューID
<
:使用例|
 $popupmenu_view(test)
:参考リンク|
--[[ボタンを押してオリジナルのポップアップメニューを表示させたい>#zbfae295]]
--[[ボタンを押して背景画像選択ポップアップメニューを表示させたい>#a564376d]]


***$popupmenu_view_ex [#g8f7b11f]
:概要|
プレイリストまたはアイテムリストのポップアップメニューを表示する
:書式|
$popupmenu_view_ex(cmd,['tf'],[from index],[to index])
>
cmd
>>
-playlist プレイリスト
-itemlist アイテムリスト
<
>
'tf'
>>
-表示する内容をTFで指定する(エスケープ文字対応)
--%index% : index番号
--%playlist_name% : プレイリスト名(cmdがplaylistの場合に有効)
<
>
from index
>>
開始index(0が先頭)
<
>
to index
>>
終了index(0が先頭)
<
:使用例|
 // プレイリスト
 $popupmenu_view_ex(playlist)
 // アイテムリスト
 $popupmenu_view_ex(itemlist,'%album%-%title%')
 // アイテムリスト
 // 選択中のアイテムの前後10件を表示
 $popupmenu_view_ex(itemlist,'$wstrsplit(%artist%/%title%,40,0)',$calc(%g_active_index%-10),$calc(%g_active_index%+10))
:参考リンク|
--[[ボタンを押してプレイリストのポップアップメニューを表示させたい>#qd8c8357]]
--[[ボタンを押してアイテムリストのポップアップメニューを表示させたい>#zed1f233]]


***$popupmenu_view_mainmenu [#f328e4f6]
:概要|
メインメニューをポップアップ表示する
:書式|
$popupmenu_view_mainmenu()
:使用例|
$popupmenu_view_mainmenu()


////////////////////////////////////////////////////////////////////////////////
**プレイリスト関連 [#b04f9759]
***%g_playlist_count% [#d027b9c2]
:概要|
プレイリスト件数
***%g_active_playlist_index% [#fcad6308]
:概要|
アクティブプレイリストindex
***%g_active_playlist% [#kfe403f5]
:概要|
アクティブプレイリスト名
***%g_playing_playlist_index% [#f2453ea6]
:概要|
再生中のプレイリストindex : 再生中以外は%g_playlist_count%+1を返す
***%g_playing_playlist% [#k4094aed]
:概要|
再生中のプレイリスト名
***%g_active_index% [#kec8f455]
:概要|
選択中の曲のプレイリスト上での位置(0が先頭)
***%g_playing_index% [#k4d1f4c4]
:概要|
再生中の曲のプレイリスト上での位置(0が先頭)


***$getplaylist [#s96444db]
:概要|
プレイリスト名を取得する
:書式|
$getplaylist(index)
>
index
>>
-プレイリストのインデックス番号を指定する(0~%g_playlist_count%-1)
-省略した場合はアクティブプレイリスト名が返る
<
:使用例|
 $getplaylist(0)


***$getitemcount [#t902ce34]
:概要|
指定したプレイリストの曲数を取得する
:書式|
$getitemcount(playlist)
>
playlist
>>
-プレイリスト名
-activeを指定した場合はアクティブプレイリスト、playingを指定した場合は再生中のプレイリスト、
省略した場合はアクティブプレイリストが設定される
<
:使用例|
 $getitemcount(Default)
 $getitemcount(active) 
 $getitemcount(playing)


***$getmeta [#ebb0bc29]
:概要|
指定したアイテムのmeta情報を取得する
:書式|
$getmeta(index,'tf',[playlist])
>
index
>>
プレイリスト上での位置(0が先頭)
>
'tf'
>>
取得する情報をTFで指定する(エスケープ文字対応)
>
playlist
>>
-プレイリスト名
-activeを指定した場合はアクティブプレイリスト、playingを指定した場合は再生中のプレイリスト、
省略した場合はアクティブプレイリストが設定される
<
:使用例|
アクティブプレイリストの0番目の曲のタイトルを取得する
 $getmeta(0,'%title%')
再生中の曲情報を取得する
 $getmeta(%g_playing_index%,'%album-%title%',playing)
1つ前の曲のタイトルを取得する
 $getmeta($calc(%g_playing_index%-1),'%title%',playing)


***$playlist_save [#le097a26]
:概要|
指定プレイリストを保存する
:書式|
$playlist_save(filename,'tf',[playlist])
>
filename
>>
出力するファイル名 : 先頭に/でfoobar2000のProfileパスと置き換わる
>
'tf'
>>
出力する内容をTFで指定する(エスケープ文字対応)
>
playlist
>>
-プレイリスト名
-activeを指定した場合はアクティブプレイリスト、playingを指定した場合は再生中のプレイリスト、
省略した場合はアクティブプレイリストが設定される
<
:使用例|
 $platlist_save(/test.m3u8,'%path%')
 $playlist_save(c:\temp\playlist.m3u8,'%path%',active)


***$playlist_sum [#g4e05116]
:概要|
指定プレイリストのアイテムごとにTitleFormatを適用して、その整数の和を求める
:書式|
$playlist_sum('tf',['extr tf'],[playlist])
>
'tf'
>>
集計する情報をTFで指定する(エスケープ文字対応)
<
>
'extr tf'
>>
-抽出条件をTFで指定する(エスケープ文字対応)
-true(0以外)のアイテムのみ抽出対象となる
-省略した場合は全アイテムが対象
<
>
playlist
>>
-プレイリスト名
-activeを指定した場合はアクティブプレイリスト、playingを指定した場合は再生中のプレイリスト、
省略した場合はアクティブプレイリストが設定される
<
:使用例|
アクティブプレイリストの全アイテムの再生回数の和を求める
 $playlist_sum('%play_count%')
アクティブプレイリストの中でアルバム名がtestのアイテムを抽出して再生回数の和を求める
 $playlist_sum('%play_count%,'$if($strcmp(%album%,test),1,0)')


***$playlist_group_sum [#hf43b472]
:概要|
指定プレイリストをグループ化しアイテムごとにTitleFormatを適用して、その整数の和を求める
:書式|
$playlist_group_sum('tf','group tf',index,[playlist])
>
'tf'
>>
集計する情報をTFで指定する(エスケープ文字対応)
<
>
'group tf'
>>
グループ化条件をTFで指定する(エスケープ文字対応)
<
>
index
>>
グループインデックス(0が先頭)
<
>
playlist
>>
-プレイリスト名
-activeを指定した場合はアクティブプレイリスト、playingを指定した場合は再生中のプレイリスト、
省略した場合はアクティブプレイリストが設定される
<
:使用例|
アルバム名でグループ化し先頭グループの集計値を求める
 $playlist_group_sum('%play_count%','%album%',0)
:補足|
indexについて : プレイリスト上でアルバム名が下記のような状態で並んでいる場合
 aaaaa ← index=0
 aaaaa
 aaaaa
 bbbbb ← index=1
 bbbbb
 aaaaa ← index=2
 ccccc ← index=3


***$playlist_group [#o6c84c0c]
:概要|
指定プレイリストをグループ化しグループ名、アイテム数を取得する
:書式|
$playlist_group(type,'group tf',index,[playlist])
>
type
>>
-count アイテム数
-name グループ名
-index プレイリスト上のindex
-group グループ総数
<
>
'group tf'
>>
グループ化するTF(エスケープ文字対応)
>
index
>>
グループインデックス(0が先頭) : typeがgroupの場合は無視される
>
playlist
>>
-プレイリスト名
-activeを指定した場合はアクティブプレイリスト、playingを指定した場合は再生中のプレイリスト、
省略した場合はアクティブプレイリストが設定される
<
:使用例|
アルバム名でグループ化し先頭グループのアイテム数を取得する
 $playlist_group(count,'%album%',0)
:補足|
indexについて : プレイリスト上でアルバム名が下記のような状態で並んでいる場合
 aaaaa ← index=0
 aaaaa
 aaaaa
 bbbbb ← index=1
 bbbbb
 aaaaa ← index=2
 ccccc ← index=3


***$playlist_rename [#a6a6e002]
:概要|
プレイリストをリネームする
:書式|
$playlist_rename(old name,new name)
>
old name
>>
リネーム前のプレイリスト名
>
new nane
>>
リネーム後のプレイリスト名
<
:使用例|
 $playlist_rename(test,newplaylist)


***$playlist_create [#m0f25d8e]
:概要|
プレイリストを新規作成する
:書式|
$playlist_create(name,[index])
>
name
>>
プレイリスト名
>
index
>>
-プレイリストを作成する位置(0が先頭)
-省略した場合は一番最後に追加される
-最後以外に追加した場合、Playlists Dropdownなどのコンポーネントで表示がおかしくなるので省略推奨、再起動すれば直る
<
:使用例|
 $playlist_create(test)


***$playlist_active [#c747f918]
:概要|
指定プレイリストをアクティブにする
:書式|
$playlist_active(name)
>
name
>>
プレイリスト名
<
:使用例|
 $playlist_active(test)


***$playlist_exists [#yb04e588]
:概要|
プレイリストの存在をチェックする
:書式|
$playlist_exists(name)
>
name
>>
プレイリスト名
<
使用例
 $playlist_exists(Default)
:補足|
存在する場合は1、存在しない場合は何も返さない


***$playlist_addselecteditems [#va70e637]
:概要|
選択中のアイテムを指定プレイリストに追加する
:書式|
$playlist_addselecteditems(name,[option])
>
name
>>
プレイリスト名
>
option
>>
checkduplicate 重複追加しない
<
:使用例|
 $playlist_addselecteditems(Default)
 $playlist_addselecteditems(Default,checkduplicate)


////////////////////////////////////////////////////////////////////////////////
**その他 [#d1a9931f]
***%g_stop_reason% [#yd25b6b5]
:概要|
再生の停止理由
>
-0 : ユーザによる停止
-1 : EOF
-2 : 他の曲が開始したため
-3 : foobar2000の終了
***%g_track_command% [#r16e94fc]
:概要|
再生開始時に実行されたコマンド
>
-0 : デフォルト
-1 : Playback/Play
-2 : Playback/Next
-3 : Playback/Previous
-4 : Set Track
-5 : Playback/Random
-6 : Resume
***%g_timer_count% [#va8fbdf8]
:概要|
前回、タイマーが発生してからの間隔(1/100sec)
***%g_timer_timeout% [#b0f86f4b]
:概要|
--タイマー間隔(1/100sec)
--$settimerで設定された値
--0の場合はタイマーが解除状態
***$settimer [#f54c5508]
:概要|
タイマーを設定する
:書式|
$settimer(timeout)
>
timeout
>>
-タイムアウト間隔を1/100秒単位で設定する(100=1秒)
-0を設定するとタイマー解除
<
:使用例|
毎秒、タイマーを発生させる
 $settimer(100)
タイマーを解除する
 $settimer()


***$save_variable [#v4c6cdc9]
:概要|
グローバル変数をファイルに保存する
:書式|
$save_variable(file,variable...)
>
file
>>
保存するファイル名 : 先頭に/でfoobar2000のProfileパスと置き換わる
>
variable...
>>
-変数名(%は不要)
-enumhashを指定すると$hash関数で追加された変数を全て保存する
<
:使用例|
%var1%,%var2%,%test%の内容を保存する
 $save_variable('c:\test.var',var1,var2,test)
$hash関数で追加された変数を全て保存する
 $save_variable(/test.var,enumhash)
:補足|
"On quit"イベントで$save_variableを、"On init"イベントで$load_variableをコールすれば前回終了時の情報が引き継げます


***$load_variable [#j13bc10a]
:概要|
グローバル変数をファイルから読み込む
:書式|
$load_variable(file,[option])
>
option
>>
-register グローバル変数の登録にfoo_etcの$register関数を使用する(デフォルト)
-hash グローバル変数の登録に$hash関数を使用する
<
>
file
>>
読み込むファイル名 : 先頭に/でfoobar2000のProfileパスと置き換わる
<
:使用例|
 $load_variable('c:\test.var',hash)


***$setescape [#m7887ae6]
:概要|
--foo_funcの関数中のTFでエスケープ文字の有効/無効を設定する
--エスケープ文字については、「[[エスケープ文字とは>#teeda5a1]]」を参照
:書式|
$setescape(flag)
>
flag
>>
-0 無効
-1 有効
<
:使用例|
' の中に ' が書けないのでエスケープ文字を使用
 $setescape(1)
 $setmainmenu(test,'$console(\"1\")')
 $setescape(0)
:補足|
デフォルトでは無効になっています


***$hash [#hc8eba0c]
:概要|
--連想配列を操作する(初期化/値設定/値取得)
--グローバル扱いになるので、一度登録すると別の場所のTFからでも操作できる
--また、登録した連想配列には%key%でもアクセスできる
:書式|
$hash([key],[value])
>
key
>>
キー
>
value
>>
値
<
:使用例|
 // 初期化(登録されているデータを全てクリアする)
 $hash()
 // 値設定
 $hash(ringo,リンゴ)
 // 値取得
 $hash(ringo) → リンゴ
 %ringo% → リンゴ
 // キー削除
 $hash(ringo,)
:補足|
--foo_etcの$register関数との違い
---例えば%ringo1%というグローバル変数の値を取得する場合、
 $register(ary,1)
 %ringo%ary%%
という表現方法はエラーになるが
連想配列の場合 $hash(ringo%ary%) で値を取得することができる
---但し、foo_etcの$registerで登録された変数は$hash関数では取得できない
---×不正な例
 $register(ringo,リンゴ)
 $hash(ringo)
---○正しい例
 $hash(ringo,リンゴ)
 $hash(ringo)


***$enumhash [#oe83f122]
:概要|
連想配列を列挙する
:書式|
$enumhash([sep])
>
sep
>>
セパレータ (省略時は,)
<
:使用例|
 $enumhash() → aaa,bbb,ccc
 $enumhash(|) → aaa|bbb|ccc


***$random [#rf9c5a25]
:概要|
擬似乱数を取得する
:書式|
$random(max)
>
max
>>
最大値
<
:使用例|
0~10の間の擬似乱数を取得する
 $random(10)


*エスケープ文字とは [#teeda5a1]
$while関数など関数中にTFを書く場合があります。
そのTF中で ' などの記号を使いたい場合にエスケープ文字を使い特殊な働きをキャンセルさせます。
 \d : $
 \p : %
 \{ : (
 \} : )
 \\ : \
 \" : '
対応している関数はそれぞれの関数リファレンスを参照して下さい。
また、この機能は $setescape(1) をコールしている場合のみ有効です。


*よくある質問 [#d0c2e0b8]
**関数を使用すると[UNKNOWN FUNCTION]と表示されエラーになる [#c7189dde]
関数を使っているコンポネとそのバージョンは何でしょうか?
Panels UI 0.13.x,Track Info,Track Info modでは曲を再生中、
またはFollow Cursorモードじゃないと使用できません。
foo_funcなどの拡張関数群はmetadbを参照する部分のhookを利用して実現しているので、
基本的にはmetadbの参照が不要な箇所のTFでは利用できないのです。
Panels UI 0.14.xやPanel Stack Splitterは対応しています。

*foo_func TF Tips [#pb46812c]

**ボタンを押してオリジナルのポップアップメニューを表示させたい [#zbfae295]
狭い画面を有効活用したい時に便利です
#imgr(./snaps/foo_func_popupmenu.png);

1. On initなどのTFに追加
 // ポップアップメニュー作成
 $popupmenu_remove(popup1)
 $popupmenu_create(popup1)
 $popupmenu_additem(popup1,再生,'$playback_control(play)')
 $popupmenu_additem(popup1,停止,'$playback_control(stop)')
 $popupmenu_additem(popup1,-sep1)
 $popupmenu_additem(popup1,ランダム再生,'$playback_control(rand)')
 $popupmenu_additem(popup1,-sep2)
 $popupmenu_additem(popup1,前の曲,'$playback_control(prev)')
 $popupmenu_additem(popup1,次の曲,'$playback_control(next)')
 
 // 作成したポップアップメニューをメインメニューに割り当てる
 $setmainmenu(view popup1,'$popupmenu_view(popup1)')
2. あとはボタンなどの設定にFunctions/view popup1 を割り当てるだけ

**ボタンを押してプレイリストのポップアップメニューを表示させたい [#qd8c8357]
#imgr(./snaps/foo_func_popupmenu_ex_playlist.png);
1. On initなどのTFに追加
 $setescape(1)
 $setmainmenu(view playlist,'
 $popupmenu_view_ex(playlist,\"
 $ifequal(%index%,%g_playing_playlist_index%,♪,
 $ifequal(%index%,%g_active_playlist_index%,■,□))
  $calc(%index%+1). %playlist_name%
 \")
 ')
 $setescape(0)
2. あとはボタンなどの設定にFunctions/view playlist を割り当てるだけ

※アクティブなアイテムの前後x項目を表示させるようにしたい場合、アイテムリストのように「,$calc(%g_active_index%-15),$calc(%g_active_index%+15)」とfrom indexとto indexを追記するだけではダメ。
「アクティブなアイテム+x」個分のプレイリストを表示しようとして、実際に存在するプレイリストをオーバーした分が空で表示されてしまう。
このため、存在するプレイリストの個数を判定して表示数を制限する必要がある。
 $setescape(1)
 $hash(playlistlimit,15)
 $setmainmenu(view playlist,'
 $hash(playlistnum,$calc(%g_playlist_count%-1))
 $hash(playlistactiveplus,$calc(%g_active_playlist_index%+%playlistlimit%))
 $hash(playlistmax,$ifgreater(%playlistactiveplus%,%playlistnum%,%playlistnum%,%playlistactiveplus%))
 $popupmenu_view_ex(playlist,\"
 $ifequal(%index%,%g_playing_playlist_index%,♪,
 $ifequal(%index%,%g_active_playlist_index%,■,□))
  $calc(%index%+1). %playlist_name%$ifequal(%index%,%playlistactiveplus%,
 $tab()Max$ifequal($calc(%index%+1),%g_playlist_count%,
 ,
 . %g_playlist_count%),
 )\",
 $calc(%g_active_playlist_index%-%playlistlimit%),
 %playlistmax%
 )')
 $setescape(0)

**ボタンを押してアイテムリストのポップアップメニューを表示させたい [#zed1f233]
#imgr(./snaps/foo_func_popupmenu_ex_itemlist.png);
1. On initなどのTFに追加
 $setescape(1)
 $setmainmenu(view itemlist,'
 $popupmenu_view_ex(itemlist,\"
 $puts(m,□)
 $ifequal(%index%,%g_active_index%,$puts(m,■),)
 $ifequal(%g_active_playlist_index%,%g_playing_playlist_index%,$ifequal(%index%,%g_playing_index%,$puts(m,♪),),)
 $get(m) $calc(%index%+1). $wstrsplit(%artist%/%title%,60,0)
 \",$calc(%g_active_index%-15),$calc(%g_active_index%+15))
 ')
 $setescape(0)
2. あとはボタンなどの設定にFunctions/view itemlist を割り当てるだけ

**ボタンを押して背景画像選択ポップアップメニューを表示させたい [#a564376d]
#imgr(./snaps/foo_func_popupmenu_check.png);
1. On initなどのTFに追加
 $popupmenu_remove(popup_bg)
 $popupmenu_create(popup_bg)
 $popupmenu_additem(popup_bg,背景1,
 '$hash(BACKGROUND_IMAGE,bg1.jpg)$mainmenu_execute(Functions/redraw)',
 check:'$if($strcmp(%BACKGROUND_IMAGE%,bg1.jpg),1,0)')
 $popupmenu_additem(popup_bg,背景2,'$hash(BACKGROUND_IMAGE,bg2.jpg)$mainmenu_execute(Functions/redraw)',
 check:'$if($strcmp(%BACKGROUND_IMAGE%,bg2.jpg),1,0)')
 $popupmenu_additem(popup_bg,背景3,'$hash(BACKGROUND_IMAGE,bg3.jpg)$mainmenu_execute(Functions/redraw)',
 check:'$if($strcmp(%BACKGROUND_IMAGE%,bg3.jpg),1,0)')
 $setmainmenu(redraw,'**画面を再描画させるTFをここに書く**')
 $setmainmenu(view popup_bg,'$popupmenu_view(popup_bg)')
2. あとはボタンなどの設定にFunctions/view popup_bg を割り当てるだけ

Panel Stack Splitter: 画面の再描画をするには一時的にウインドウサイズを1ピクセル小さくした後、すぐに元のサイズに戻すTFを書けばできます

**foo_title で Playback/Random(ランダム再生)をボタンに割り当てたい [#l503e360]
foo_title では、メニューコマンドの割り当て時にメニューの末尾だけ記述する。
このため、「Playback/Random」と「Playback/Order/Random」が区別されず、「Random」と記述した場合は「Playback/Order/Random」になってしまってランダム再生が実行できない。

1. On initなどのTFに追加
 $setmainmenu(Random Play,'$mainmenu_execute(Playback/Random)') 
2. あとはボタンに Random Play を割り当てるだけ

**アルバムアートをWindows Live Messengerのアイコンに設定する方法 [#z369c661]
1. c:\temp\mes.vbsを作成
 On Error Resume Next
 WScript.CreateObject("Messenger.UIAutomation.1").MyProperty(2) = WScript.Arguments(0)
2. On playback new trak の TF に追加
 // Cover art to Windows Live Messenger
 // 表示させる画像設定
 $hash(img,$replace(%path%,%filename_ext%,)cover.jpg)
 // cover.jpgが存在しない場合の画像設定
 $if($files(%img%),,$hash(img,c:\temp\no-image.jpg))
 
 $execute('c:\temp\mes.vbs',"%img%",hide)


**選択中の曲を指定プレイリストに追加するボタンを作りたい [#w6397f48]
On initのTFに追加
 $setcontextmenu('add to favorite','
 $hash(target,Favorite)
 $if($playlist_exists(%target%),,$playlist_create(%target%))
 $playlist_addselecteditems(%target%,checkduplicate)
 $playlist_active(%target%)
 ')
これでコンテキストメニューにFunctions/add to favoriteが追加されるので、
あとはボタンに割り付けるだけでできます。
もし指定プレイリストが存在しない場合は新しくプレイリストを作成します。

**選択中のプレイリストをコピーしたい [#k72570d1]
mkaに入った曲の場合、プレイリストを保存して読み込むと「プレイリストに入っていた曲数の回数だけ、mkaファイル内の曲すべてが読み込まれる」という問題があります。
このため、バックアップ的にプレイリストをコピーして対処します。

1. On initのTFに追加
 $setmainmenu(Backup Active Playlist,'$puts(activePlaylist,%g_active_playlist%)
 $if($playlist_exists($put(targetPlaylist,$get(activePlaylist)_backup)),
 $playlist_active($get(targetPlaylist))
 $mainmenu_execute(Remove Playlist)
 $playlist_active($get(activePlaylist)))
 $playlist_active($get(activePlaylist))
 $playlist_create($get(targetPlaylist))
// 二度もActivateしなくていいと思うけど念のため
 $playlist_active($get(activePlaylist))
 $mainmenu_execute(Select All)
 $playlist_addselecteditems($get(targetPlaylist),checkduplicate)')
2. メインメニューのFunctions/Backup Active Playlistを実行すると、「(元のプレイリスト名_backup)」という名称でプレイリストがコピーされます。ボタンやキーボードショートカットに割り当てても良いでしょう。

連続してコピーすると、前のコピーは破棄されます。

**再生中の曲がリスト上のどこにあるのか判り難いのでなんとかしたい [#zf81b638]
On playback new trackのTFに追加
 $mainmenu_execute(Activate now playing)
曲が変わるたびにカーソルが再生中の曲に移動します


**カラオケなどプレイリスト上は表示させておきたいけど再生はスキップさせたい [#f23f14ac]
On playback new trackのTFに追加
 $if(
 	$or(
 		$regexpi(%title%,'off vocal'),
 		$regexpi(%title%,'less vocal'),
 		$regexpi(%title%,'karaoke'),
 		$regexpi(%title%,'カラオケ'),
 		$regexpi(%title%,'\(Instrumental\)')
 	),
 	$playback_control(next)
 )
※別途foo_etcが必要


**表示幅に応じてフォントサイズを変更したい [#u9480a83]
#imgr(./snaps/foo_func_fontsize.png);
 // 表示幅
 $hash(w,%_width%)
 // 表示文字列
 $hash(s,'Hello, foo_func world!')
 // フォント名
 $hash(fontname,MS Pゴシック)
 // フォントオプション
 $hash(fontopt,b)
 // 最大フォントサイズ
 $hash(fontsize,30)
 
 $while(
 '$ifgreater($calc_string(%fontname%,%fontsize%,%fontopt%,%s%,width),%w%,1,0)',
 '$hash(fontsize,$sub(%fontsize%,1))',
 30
 )
 
 // 表示
 $font(%fontname%,%fontsize%,include bold,0-0-255)%s%
※この例ではTrack info modを使用していますが、表示部分は各コンポーネントにあわせて修正する必要があります