バージョン 0.9.5.3 から作者の暴走により、それまで使えてたコンポーネントが使用できなくなったので、1.x 系へのバージョンアップを控えていましたが、私が Panels UI で実現していた UI が 1.x 系でも完全ではないが、ほぼ再現できました。実はこれから紹介する UI は 2011/12 頃から作成したものを少しずつ手直ししつつ現在に至ったものです
本記事執筆時点での foobar2000 のバージョンは以下の画像の通りです

特徴は上記画像の青色の枠1で囲っているボタンをクリックする度に、青色の枠2 が下記画像の様に Playlist switcher → Playlist Tree Mod Panel → Queue Contents Editor と順次切り換えられる事です

| 名称 | ファイル名 |
| Album List 4.6 | foo_albumlist.dll (2018-07-24 10:54:02 UTC) |
| Audioscrobbler 1.4.7 | foo_audioscrobbler.dll (2010-06-04 00:27:04 UTC) |
| CD Audio Decoder 3.0 | foo_cdda.dll (2018-07-24 10:54:04 UTC) |
| Converter 1.5.3 | foo_converter.dll (2018-07-24 10:54:04 UTC) |
| Cuesheet Creator 0.4.6 | foo_cuesheet_creator.dll (2007-03-10 02:58:28 UTC) |
| Custom Database 0.1.0_beta1 | foo_customdb.dll (2010-03-04 03:10:54 UTC) |
| Equalizer 1.2.1 | foo_dsp_eq.dll (2018-07-24 10:53:56 UTC) |
| SoX Resampler 0.8.3 | foo_dsp_resampler.dll (2013-01-14 22:04:36 UTC) |
| Standard DSP Array 1.3.1 | foo_dsp_std.dll (2018-07-24 10:53:58 UTC) |
| File Operations 2.3 | foo_fileops.dll (2018-07-24 10:54:00 UTC) |
| Online Tagger 0.7 | foo_freedb2.dll (2018-07-24 10:54:14 UTC) |
| Monkey's Audio Decoder 2.1.7 | foo_input_monkey.dll (2015-12-26 17:39:03 UTC) |
| FFmpeg Decoders 3.2.4 | foo_input_std.dll (2018-07-24 10:54:34 UTC) |
| TAK Decoder 0.4.7 | foo_input_tak.dll (2015-12-26 17:45:09 UTC) |
| TTA Audio Decoder 3.4 | foo_input_tta.dll (2017-04-02 13:23:01 UTC) |
| Logitech LCD Display 0.5.5 | foo_logitech_lcd.dll (2010-11-16 23:25:16 UTC) |
| Masstagger 1.8.4 | foo_masstag.dll (2013-04-13 06:28:20 UTC) |
| Menu Addons 1.4.2 | foo_menu_addons.dll (2010-01-16 02:18:34 UTC) |
| Navigator 0.8 | foo_navigator.dll (2014-07-20 07:57:34 UTC) |
| Playlist Tree Mod Panel 3.0.6.3 Scheme [Jan 9 2010 - 15:37:18] | foo_playlist_tree_mod.dll (2010-01-09 14:37:50 UTC) |
| Playlist History 0.1.6 | foo_playlisthistory.dll (2014-02-06 20:47:54 UTC) |
| Queue Contents Editor 0.5.1 | foo_queuecontents.dll (2016-01-06 16:29:40 UTC) |
| Quick Tagger 1.0.3 | foo_quicktag.dll (2010-09-01 01:15:08 UTC) |
| ReplayGain Scanner 2.3 | foo_rgscan.dll (2018-07-24 10:54:10 UTC) |
| Seek box 0.0.3 | foo_seek_box.dll (2010-04-21 06:03:30 UTC) |
| Skip Track 1.9.8 | foo_skip.dll (2016-10-14 12:16:59 UTC) |
| Columns UI 0.5.1 | foo_ui_columns.dll (2017-04-09 00:27:24 UTC) |
| Func User Interface 0.3.0_beta1 | foo_ui_func.dll (2010-03-05 08:44:00 UTC) |
| Default User Interface 0.9.5 | foo_ui_std.dll (2018-07-24 10:54:14 UTC) |
| Album Art Panel 0.2.7 | foo_uie_albumart.dll (2007-10-23 13:39:18 UTC) |
| Album list panel 0.3.7 | foo_uie_albumlist.dll (2017-04-09 00:52:02 UTC) |
| Biography View 0.4.2.4 | foo_uie_biography.dll (2010-12-10 23:47:22 UTC) |
| Console panel 0.5 | foo_uie_console.dll (2017-04-09 00:51:57 UTC) |
| ELPlaylist 0.6.9.1.2(beta) | foo_uie_elplaylist.dll (2010-10-30 12:51:16 UTC) |
| Library Tree 0.3.4.6.1 | foo_uie_library_tree.dll (2011-07-24 09:08:24 UTC) |
| Panel Stack Splitter 0.3.8.3(alpha) | foo_uie_panel_splitter.dll (2009-12-09 15:16:12 UTC) |
| Typefind 0.3.1 | foo_uie_typefind.dll (2017-04-09 00:51:48 UTC) |
| Channel Spectrum panel 0.17.2 | foo_uie_vis_channel_spectrum.dll (2008-05-17 18:02:12 UTC) |
| ZIP/GZIP/RAR Reader 1.8 | foo_unpack.dll (2018-07-24 10:54:08 UTC) |
| UPnP/DLNA Renderer, Server, Control Point 0.99.49 | foo_upnp.dll (2016-10-28 14:05:26 UTC) |
背景色がこの色で表記しているコンポーネントは必須です
普段はあまり気にしていなかったのですが、先日に foobar2000 本体やコンポーネントをアップデートした際に異様に起動が遅い…foobar2000 をインストールしたディレクトリを覗いてみると custominfo_sqlite.db のサイズが 6MB 超えている…
なんでだろうと思い、一旦 foobar2000 を終了し SQLite Database Browser にて custominfo_sqlite.db の中を見てみると、同じ曲の fieldname が PLAYED_TIMESTAMP のレコードがやたらとできてる…多分コレのせいでしょう…
Preferences › Playback Statistics Custom › Playback Statistics Custom Settings の Play Stamp をチェックしていると Playback Statistics Update Timing に合致する度にレコードが挿入されてしまう。要はコレは再生履歴なんですが、foobar2000 じゃこのデータを使う手段や使い道がないのでチェックオフにしておく
で、PLAYED_TIMESTAMP フィールドは UI の中でも使用していないので、このレコードを削除する事にします。SQLite Database Browser で行ってもいいんですが、PHP で以下のような簡易ダイエットスクリプトを作成して実行
- <?php
- $dbf = './custominfo_sqlite.db';
- $dbh = new PDO( 'sqlite:'.$dbf );
- $stmt = $dbh->query( 'DELETE FROM quicktag WHERE fieldname = "PLAYED_TIMESTAMP"' );
- echo 'row count: '.$stmt->rowCount()."\n";
- echo 'error code: '.$stmt->errorCode()."\n";
- $stmt = $dbh->query( 'VACUUM' );
- echo 'error code: '.$stmt->errorCode()."\n";
- ?>
上記スクリプトを実行する事によって、約 25000 レコードが削除され、6.02MB だったファイルが 1.19MB までに小さくなりました。小さくなった custominfo_sqlite.db を foobar2000 のディレクトリに戻し、起動…サックリ起動するようになりました
使用しているフィールド PLAY_COUNT, FIRST_PLAYED_TIMESTAMP, LAST_PLAYED_TIMESTAMP が UI 側で正常に表示される事を確認して終了です
と言っても、0.9.5.1 から 0.9.5.2 へのバージョンアップです…0.9.5.3 から作者が暴走し始めたので、1 0.9.5.2 にしました
取り敢えず、自分が使用しているコンポーネントの覚え書き
コンポーネントもアップデートして、自分が作った UI が動作する事も確認して終了…また、暇をみて UI 弄りでもしましょうかね…
Panels UI が不安定で頻繁に foobar2000 がクラッシュする問題についてチョット纏めてみました。あくまでも、私自身のソフトウェア環境、経験、検証に基づくものだと言う事を前置きしておきます
私が主に foobar2000 を動かしている環境としては…
以上のような環境なんですが、Panels UI を使い始めた頃は、まともに設定画面を開けなくて苦労しました。そこで、以下の事を試しました
1番に関してはほとんど (と言うか、全く) 効果が得られませんでした。アプリケーションの言語を色々と変更してみたんですが…劇的な効果が得られたのは 2番でした。ウィンドウを制御するソフトウェアに私は ぴたすちお 1 を使用していたんですが、このソフトウェアの使用をやめる事によって、設定画面を開く事によって foobar2000 がクラッシュすると言う問題は完全に解消しました
これで、設定画面が完全に開けるようになって、るんるん気分 2 で TF を書き、foobar2000 でお気に入りを再生させていたのですが、長時間再生させていると下記に示している不具合が出てくるケースに遭遇 3
上記、2つの問題はかなりの時間を浪費して調べた 4 結果、Panels UI の TF を記述する際には以下の点に注意する様にする事によって解消しました
以上のような対策を施す事によって、私の環境下では foobar2000 + Panels UI 0.14.12 は安定して動作しています
Panels UI の私的マニュアルです。Commands references なんていきなりディープなものを作っておきながら、introduction (序章、入り口) 部分のマニュアルがないのはオカシイので作ってみました。特に 原文: Foobar2000:Components 0.9/Panels UI (foo ui panels) - Hydrogenaudio Knowledgebase には特にタイトルが明記されていなかったので、内容から推測して勝手に introduction と命名しました

Panels User Interface
| Maintainer: | terrestrial |
| Stable release: | 0.13.8 beta [June 12 2007] |
| Preview release: | 0.14.12 beta [Jul 18 2007] |
| Foobar version: | 0.9.4.x |
| Use: | Graphical user interface |
| License: | - |
| Website: | panels.fooblog2000.com |
| Discussion thread: | Hydrogenaudio Forums |
Panels UI は titleformatting の使用によるfoobar2000 の外観を変更する為の GUI です。これらは Panels UI 独自の titleformat 機能およびフィールドと foobar2000 の機能とフィールドを含んでいます。Panels UI は現在統合されている Track Info Mod と Single Columns Playlist コンポーネントの後継者です
Panels UI はまだベータ段階にあって、それは手広くテストされていません
Panels UI の開発は 2007年7月現在 停止している様です…('A`)
以下の特徴を提供するカスタマイズ可能なユーザーインターフェイス (UI) です
このインポート、エクスポートは機能していません。インポートは PanelsUI ディレクトリに .PUI ファイルをコピーする事で代用できます。エクスポートは Layout を変更または foobar2000 を終了した際に .PUI ファイルが保存されるので、適当なディレクトリにコピーする事で代用できます
バージョン 0.14.x は foobar2000 をクラッシュさせる場合があって不安定です。この理由から 0.14.x は公式の Known Problematic Components(問題のあるコンポーネント) にリストされています
foo_uie_tabs の中に Track Display を加えた場合、その中の Track Display の $panel は機能しません
0.14.12 のダウンロード: Panels UI : 0.14.12
今回はタイトルの通り $newsyntax を使って一つ作ってみました。楽ですね、これは。表示するパーツをカテゴリーに分けて、$alignabs を行えば、あとはその中では最後に行った $alignabs からの相対座標になるので、座標を考えるのに頭を悩ます事はなさそうです
※ 掲載されているスクリーンショットの内容などは記事執筆者 zodiac の趣味、趣向を表すモノではありません
zodiac-1.02.pui.zip (2.43MB)
注意: 各コンポーネントの日付、バージョン番号等は記事執筆時点のものです
注意: コンポーネントの日付、バージョン番号等は記事執筆時点のものです


// ----- font names
$puts(f.n1,'ヒラギノ丸ゴ Pro W4')
$puts(f.n2,'Silkscreen')
$puts(f.n3,'Tahoma')
$puts(f.n4,'Georgia')
// ----- album art work image file
$if($fileexists($replace(%_path%,$ext(%_path%),png)),
$puts(CoverImg,$replace(%_path%,$ext(%_path%),png)),
$if($fileexists($replace(%_path%,$ext(%_path%),jpg)),
$puts(CoverImg,$replace(%_path%,$ext(%_path%),jpg)),
$if($fileexists($replace(%_path%,$ext(%_path%),gif)),
$puts(CoverImg,$replace(%_path%,$ext(%_path%),gif)),)))
参照: how to use
| バージョン | 日付 | 内容 |
| 1.02 | 2008/07/12 (土) | こっそり更新…('A`) |
| 1.01 | 2008/02/17 (日) | ちょこっと修正 |
| 1.00 | 2008/02/13 (水) | 新規作成。この名前は何とかならんかったものか…('A`) |
某掲示板のスレにやっつけで、矩形だけでレーティングの設定を行う Panels UI の TF を挙げたんですが、その時に書いた TF のコードをもっと汎用的にしてみました
線描画のみなので、画像などのリソースは必要ありません。…が、下記のコードを見てお解りの様に美しくないです。2 TF はループインストラクションがないので、どうしてもこうなってしまいます。あとは、レートの設定を行う事はできるんですが、該当のタグを消す事はできません
- // Global
- // padding (ボタン間の隙間)
- $puts(m.p, 1)
- // start at position (左上隅の描画開始位置 m.l=左 m.t=上)
- $puts(m.l, 15)
- $puts(m.t, 15)
- // 矩形の幅 (ボタンの幅)
- $puts(w, 20)
- // 矩形の高さ (ボタンの高さ)
- $puts(h, 5)
- // 通常表示時の線の色
- $puts(c.n, 212121)
- // レイティングが設定されていた時のボタン全体の色
- $puts(c.o, 212121)
- // マウスポインターをボタン上に重ねた時のボタンの枠線の色
- $puts(c.h, 808080)
- // PerTrack
- $rectabs(0, 0, %_width%, %_height%, $c(220,220,220), null)
- $select(%rating%,
- $rectabs($get(m.l), $eval($get(m.t)+{$get(h)*4}+{$get(m.p)*4}), $get(w), $get(h), $get(c.o), null),
- $rectabs($get(m.l), $eval($get(m.t)+{$get(h)*4}+{$get(m.p)*4}), $get(w), $get(h), $get(c.o), null)
- $rectabs($get(m.l), $eval($get(m.t)+{$get(h)*3}+{$get(m.p)*3}), $get(w), $get(h), $get(c.o), null),
- $rectabs($get(m.l), $eval($get(m.t)+{$get(h)*4}+{$get(m.p)*4}), $get(w), $get(h), $get(c.o), null)
- $rectabs($get(m.l), $eval($get(m.t)+{$get(h)*3}+{$get(m.p)*3}), $get(w), $get(h), $get(c.o), null)
- $rectabs($get(m.l), $eval($get(m.t)+{$get(h)*2}+{$get(m.p)*2}), $get(w), $get(h), $get(c.o), null),
- $rectabs($get(m.l), $eval($get(m.t)+{$get(h)*4}+{$get(m.p)*4}), $get(w), $get(h), $get(c.o), null)
- $rectabs($get(m.l), $eval($get(m.t)+{$get(h)*3}+{$get(m.p)*3}), $get(w), $get(h), $get(c.o), null)
- $rectabs($get(m.l), $eval($get(m.t)+{$get(h)*2}+{$get(m.p)*2}), $get(w), $get(h), $get(c.o), null)
- $rectabs($get(m.l), $eval($get(m.t)+{$get(h)*1}+{$get(m.p)*1}), $get(w), $get(h), $get(c.o), null),
- $rectabs($get(m.l), $eval($get(m.t)), $get(w), $get(h), $get(c.o), null)
- $rectabs($get(m.l), $eval($get(m.t)+{$get(h)*4}+{$get(m.p)*4}), $get(w), $get(h), $get(c.o), null)
- $rectabs($get(m.l), $eval($get(m.t)+{$get(h)*3}+{$get(m.p)*3}), $get(w), $get(h), $get(c.o), null)
- $rectabs($get(m.l), $eval($get(m.t)+{$get(h)*2}+{$get(m.p)*2}), $get(w), $get(h), $get(c.o), null)
- $rectabs($get(m.l), $eval($get(m.t)+{$get(h)*1}+{$get(m.p)*1}), $get(w), $get(h), $get(c.o), null)
- )
- $textbutton($get(m.l), $get(m.t), $get(w), $get(h),
- $rectabs(0, 0, $get(w), $get(h), null, $get(c.n)),
- $rectabs(0, 0, $get(w), $get(h), null, $get(c.h)), 'Custom Info/Rate 5', tooltip, 'rate 5')
- $textbutton($get(m.l), $eval($get(m.t)+{$get(h)*1}+{$get(m.p)*1}), $get(w), $get(h),
- $rectabs(0, 0, $get(w), $get(h), null, $get(c.n)),
- $rectabs(0, 0, $get(w), $get(h), null, $get(c.h)), 'Custom Info/Rate 4', tooltip, 'rate 4')
- $textbutton($get(m.l), $eval($get(m.t)+{$get(h)*2}+{$get(m.p)*2}), $get(w), $get(h),
- $rectabs(0, 0, $get(w), $get(h), null, $get(c.n)),
- $rectabs(0, 0, $get(w), $get(h), null, $get(c.h)), 'Custom Info/Rate 3', tooltip, 'rate 3')
- $textbutton($get(m.l), $eval($get(m.t)+{$get(h)*3}+{$get(m.p)*3}), $get(w), $get(h),
- $rectabs(0, 0, $get(w), $get(h), null, $get(c.n)),
- $rectabs(0, 0, $get(w), $get(h), null, $get(c.h)), 'Custom Info/Rate 2', tooltip, 'rate 2')
- $textbutton($get(m.l), $eval($get(m.t)+{$get(h)*4}+{$get(m.p)*4}), $get(w), $get(h),
- $rectabs(0, 0, $get(w), $get(h), null, $get(c.n)),
- $rectabs(0, 0, $get(w), $get(h), null, $get(c.h)), 'Custom Info/Rate 1', tooltip, 'rate 1')
ボタンの表示順は上から 5, 4, 3…1 と 5段階に表示しています。基本的に太字部分の変数を適切な値に変更を行う事によって動作します。$textbutton() のパラメーター command はメニューを呼び出していますが、これも適切な値に変更します
ボタンの並び順は縦方向ですが、$textbutton() や $rectabs() の座標パラメーターを変更する事で横方向にボタンを描画させる事もできます
Panels UI 0.14.12 のマニュアルメモです。公式マニュアルの体裁を維持しつつ Panels UI を使っている時にプレーンテキストファイルにメモとして残していたのを加えたものを加筆したモノなので公式マニュアルのローカライズ版ではありません
また Panels UI 0.14.12 を使いながら titleformat の実行結果やその時のコード、スクリーンショットなども掲載しています
なお、ここの blog の仕様上、投稿記事の容量に制限がある為、現在の所 2つの記事に分けて掲載しています。記事の続きの方にさらに続けて内容が書けるのでそちらの方に vol.2 の分を加えました。私のブログでは記事の続きを閲覧する為にクリックは必要なく、続けて表示される様にテンプレートを修正しています
※ 掲載されているスクリーンショットの内容は記事執筆者 zodiac の趣味、趣向を表すモノではありません
このリファレンスは Panels UI 特有の titleformat 機能と変数に関する情報です。ほとんどの情報が Panels UI 0.14.10 で導入された新しい構文を使用しています
色指定を異なった書式で指定します。各関数は BGR 16進数 の書式文字列を返します
パラメーター r には赤。g には緑。b には青 を 10進数表記の文字列で 0~255 の範囲内で指定します。RGB 形式でパラーメーターで指定された色を返します
$c(0,128,255)
$color(0,128,255)
パラメーター h には色相。s には彩度。l には輝度 を 10進数表記の文字列で指定します。HLS 形式でパラーメーターで指定された色を返します
$h(359,359,255)
色相、彩度、輝度で指定する値に統一性が見られない理由からなのか、指定する値の有効範囲に関する明示的な記述がありません。ただ、パラメーター h(色相) と s(彩度) は 0~359 が有効範囲の様です。無効な値を指定すると近似値を返す様です
パラメーター c には 16進数表記の文字列で指定します。RGB 16進数 形式でパラーメーターで指定された色を返します。HTML 記述の様に先頭の # (シャープ) は不要です
$hexcolor(00ff80)
パラメーター b の % を n% の色 a および (100-n) で色を返します
$blendcolor(10,10,5)
パラメーター n で指定されたシステムで定義されている色を返します。n は 0~30 の整数値を指定します。n の値の記述については msdn または下記テーブルを参照してください
| 値 | 意味 |
|---|---|
| 21 | 3D オブジェクトの暗い影の色 |
| 15 | 3D オブジェクトの表面色と、ダイアログボックスの背景色 |
| 20 | 3D オブジェクトの最も明るい色(光源に面した辺) |
| 22 | 3D オブジェクトの明るい色(光源に面した辺) |
| 16 | 3D オブジェクトの影の色(光源に面していない辺) |
| 10 | アクティブウィンドウの境界の色 |
| 2 | アクティブウィンドウのタイトルバーの色 Windows98 と Windows2000: グラデーション効果が有効になっている場合、アクティブウィンドウのタイトルバーのグラデーションのうち、左端の色を指定します |
| 12 | マルチドキュメントインターフェイス(MDI) アプリケーションの背景色 |
| 1 | デスクトップの色 |
| 18 | プッシュボタンのテキストの色 |
| 9 | タイトルバー、サイズボックス、スクロールバーの矢印ボックス内のテキスト |
| 27 | Windows98, Windows2000: アクティブウィンドウのタイトルバーのグラデーションのうち、右端の色を指定します |
| 28 | Windows98 と Windows2000: 非アクティブウィンドウのタイトルバーのグラデーションのうち、右端の色を指定します |
| 17 | 淡色状態(無効状態) のテキストの色。現在のディスプレイドライバが純色(ベタ色) の淡色(灰色) をサポートしていない場合、この色は 0 に設定されます |
| 13 | コントロール内で選択されている項目の色 |
| 14 | コントロール内で選択されている項目のテキストの色 |
| 26 | ホットトラッキング項目の色 |
| 11 | 非アクティブウィンドウの境界の色 |
| 3 | 非アクティブウィンドウのタイトルバーのテキストの色 Windows98, Windows2000: グラデーション効果が有効になっている場合、非アクティブウィンドウのタイトルバーのグラデーションのうち、左端の色を指定します |
| 19 | 非アクティブウィンドウのタイトルバーのテキストの色 |
| 24 | ツールチップコントロールの背景色 |
| 23 | ツールチップコントロールのテキストの色 |
| 4 | メニューの背景色 |
| 7 | メニュー内のテキストの色 |
| 0 | スクロールバーの軸の色 |
| 5 | ウィンドウの背景色 |
| 6 | ウィンドウの枠の色 |
| 8 | ウィンドウ内のテキストの色 |
文字配置を全てリセットします。この関数は以下の例と同様です
$alignabs(0,0)$align(left,top)
$rectabs(0,0,0,0,$c(220,220,220),null)
$align(right,bottom)$textcolor(0-128-255)これは右下に表示される foobar2000
$alignabs()$textcolor(0-0-255)これは左上に表示される foobar2000
上記のサンプルコードでは 1行目では描画領域全体を塗りつぶし、2行目で右下に文字列を表示し、3行目にて $alignabs() で文字配置を全てリセットし、文字列表示を行っています
文字描画開始位置を指定します。パラメーター x には横座標、y には縦の座標を整数値、画素単位で指定します
パラメーター
$alignabs(,10)$textcolor(0-128-255)foobar2000
$alignabs(10,)$textcolor(255-0-128)foobar2000$textcolor(0-255-0)foobar2000
$alignabs(20,20)$textcolor(0-0-255)foobar2000
サンプルコードと実行結果の画像から解るようにパラメーターを省略すると 0 と解釈されるようです
文字列の描画を行う矩形を設定します
パラメーター
$alignabs(10, 10, $sub(%_width%,20), $sub(%_height%,20) )
$textcolor(0-128-255)1-foobar2000
$alignabs(10, 10, $sub(%_width%,20), $sub(%_height%,20), right, )
$textcolor(0-64-255)2-foobar2000
$alignabs(10, 10, $sub(%_width%,20), $sub(%_height%,20), , bottom )
$textcolor(0-0-255)3-foobar2000
$alignabs(10, 10, $sub(%_width%,20), $sub(%_height%,20), center, middle )
$textcolor(255-0-128)4-foobar2000
パラメーターを省略するには , (カンマ) を記述する必要があるようです。また w, h に 0 を指定すると、幅と高さが最大になるようです
水平および垂直方向の文字列の配置方法を指定します
パラメーター
$alignabs(0,0,0,0)$textcolor(0-128-255)
$align(,middle)foobar2000
$align(right,)foobar2000
パラメーターを省略するには , (カンマ) を記述する必要があるようです。2~3行目のコードの結果から解るようにそれぞれ left, top に設定されるようです
現在の行の高さパラメーター n を整数値、画素単位で指定します
$lineheight(18)
foobar2000$char(10)
こんにちわ$char(10)
$lineheight()
foobar2000$char(10)
こんにちわ$char(10)
パラメーターを省略したり、無効な値を指定するとリセットされるようです
現在の行の幅で表示しきれない文字列は次の行に折り返されます。$char(10) を出力することによってこの設定を解除できます
哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴絢綾鮎或粟袷安庵按暗案闇鞍杏以伊位
$char(10)
$char(10)
$wordwrap()哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴絢綾鮎或粟袷安庵按暗案闇鞍杏以伊位
表示しきれない文字列は末尾が ... (3つのピリオド) に置き換わります
パラメーター n で指定した分だけ整数値、画素単位にて字下げを行います
foo$tabx(20)bar$tabx(60)2000$char(10)
hello$tabx(20)world$tabx(60)!!$char(10)
パラーメーター n が画素単位だと言う事に注意。タブコード $char(9) を出力する訳ではない
現在の短径領域の幅を返します
$alignabs(10,10,$sub(%_width%,20),$sub(%_height%,20),left,top)
'%_width%' : $tabx(60)%_width%$char(10)
'$width()' : $tabx(60)$width()$char(10)
'%_height%' : $tabx(60)%_height%$char(10)
'$height()' : $tabx(60)$height()
右の実行結果画像からも解るように機能していないようです。戻り値が %_width% よりも小さい値が返ってくるはずなんですが…
現在の短径領域の高さを返します
サンプルコードと実行結果は $width() を参照してください
これも、どうやら機能していないようです。戻り値が %_height% よりも小さい値が返ってくるはずなんですが…
フォントの外観を設定します
パラメーター
bold と thin オプションは排他的なものなので同時に指定すると表示がおかしくなります
注釈
Panels UI の設定画面の Effects ボタンを押す事によって、上記オプションをプレビューで確認しながら GUI で操作できるプレビューダイアログが表示されます。このダイアログ最下部に確定した $font() 関数のパラメーターが記述されているので、これをクリップボードにコピーし、元の Panels UI の設定ダイアログ上にペーストして使用できます
$font(Tahoma,30,bold,italic,strikeout,underline)札幌は$char(10)
$font(Tahoma,30,textalpha,128,alpha,128,
radius,2,iterations,1,offset,5,glow,3,effectcolor,$c(0,0,255))雪が積もってる
上記のコードを実行すると右の画像の様な結果になります
文字にパラメーター n を整数値、画素単位で指定された分加えます。$addcharspace() は各文字の間を n 画素分追加、削除します
foobar2000だもん$char(10)
$addcharspace(5)foobar2000だもん$char(10)
foobar2000だもん$char(10)
$addcharspace(-1)foobar2000だもん$char(10)
$addcharspace(0)foobar2000だもん
設定を解除するには明示的にパラメーターに 0 を指定する必要があるようです。追加、削除される間隔は文字の右側です
文字をパラメーター n を整数値で指定された幅に設定します
foobar2000だもん$char(10)
$fixedwidth(5)foobar2000だもん$char(10)
$fixedwidth(-1)foobar2000だもん$char(10)
$fixedwidth(10)foobar2000だもん$char(10)
$fixedwidth(0)foobar2000だもん
設定を解除するには明示的にパラメーターに 0 を指定する必要があるようです
文字の色を BGR 16進数文字列パラメーター c によって設定します
サンプル
例1: 下記の例では文字が赤くなります
$textcolor($hexcolor(ff0000))
例2: 下記の例でも文字が赤くなります
$textcolor(255,0,0)
と、公式マニュアルでは記述されていますが、上記の2つの例は $newsyntax() 関数で新書式対応にしていないと動作しません。旧書式で上記の例と同じようにするには以下の様に記述します
$textcolor(255-0-0)
$textcolor($hexcolor(ff0000))foobar2000だもん$char(10)
$textcolor(255,0,128)foobar2000だもん$char(10)
$newsyntax()
$textcolor($hexcolor(ff0000))foobar2000だもん$char(10)
$textcolor(255,0,128)foobar2000だもん
$newsyntax() を行っていないと新書式では動作しないので注意。$newsyntax() を行いたくない場合は旧書式でパラメーターを記述する必要があります
パラメーター text のキャピタライズによってフォントを切り替えます。その際、同時に $textcolor() 等で色指定も可能です
$smallcaps(
$font(Tahoma,14,bold)$textcolor(0-128-255),
$font(Tahoma,12)$textcolor(255-0-128),
fooBar2000$char(10)
)
$smallcaps(
$font(Tahoma,14,bold)$textcolor(0-128-255),
$font(Tahoma,12)$textcolor(255-0-128),
FooフーバーBar
)
サンプルコードの実行結果からも解るようにマルチバイト文字は小文字扱いの様です。また、パラメーター text は大文字に変換されるようです
この関数でサポートされる画像ファイルフォーマットは PNG, BMP, GIF, JPEG, ICO の 5種類
パラメーター
| n | 意味 |
|---|---|
| 1 | 時計廻りに 90°回転 |
| 2 | 時計廻りに 180°回転 |
| 3 | 時計廻りに 270°回転 |
| 4 | 左右反転 |
| 5 | 時計廻りに 90°回転し、左右反転 |
| 6 | 上下反転 |
| 7 | 時計廻りに 90°回転し、上下反転 |
| n/a | 左右 反転 | 上下 反転 | 左右 上下 反転 | n/a |
| 時計廻りに 90°回転 | 5 | 7 | 3 | 1 |
| 時計廻りに 180°回転 | 6 | 4 | 0 | 2 |
| 時計廻りに 270°回転 | 7 | 5 | 1 | 3 |
| n/a | 4 | 6 | 2 | 0 |
右の基準となる画像を元にパラメーターの関係を表したサンプルコードと結果画像を以下に示します
resize,w,h パラメーターと clip,x,y,w,h パラメーターとの関係
$imageabs(0,$sub(%_height%,225),/i\imageabs_sample.png)
$imageabs($sub(%_width%,150),0,/i\imageabs_sample.png,resize,150,113)
$imageabs(10,10,/i\imageabs_sample.png,clip,55,84,33,28,resize,150,113)
rotateflip,n パラメーターと clip,x,y,w,h パラメーターとの関係
$imageabs(0,0,/i\imageabs_sample.png,rotateflip,1)
$imageabs($sub(%_height%,70),0,/i\imageabs_sample.png,
rotateflip,1,clip,130,200,70,70)
resize,w,h パラメーターによる拡大処理
$imageabs(-90,0,/i\imageabs_sample.png,nokeepaspect,resize,400,300)
元画像より大きなサイズでリサイズを行うには nokeepaspect を指定しなければなりません
以上の結果から $imageabs() における同時指定パラメーターの優先順位は以下の順です
矩形を描画します。元の関数名は $drawrect() です
パラメーター
$rectabs(0,0,%_width%,%_height%,$c(0,128,255),null)
$imageabs(0,25,/i\10028807.jpg,resize,200,150)
$rectabs(30,30,$sub(%_width%,60),$sub(%_height%,60),null,$c(0,0,255))
$rectabs(50,50,$sub(%_width%,100),$sub(%_height%,100),
$c(255,128,255),$c(255,128,255),alpha,128)
Persistent Variable (略して PVARS) これらの変数の定義、取得関数は foobar2000 が起動している間、値を保つ変数です。Panels UI 自身、Track Display, Single Column Playlist, Library Filter の titleformat 中で共通して使用できます
| コード | 結果 |
| $getpvar(foo,bar) | [unknown pvar] |
| $setpvar(foo,bar) | |
| $getpvar(foo) | bar |
| $getpvar(Foo) | bar |
| $setpvar(foo,2000) | |
| $getpvar(foo) | 2000 |
foobar2000 の変数操作関数 $put(), $puts(), $get() を使用して PVARS にアクセスすることができない事に注意
最後にパラメーター name に格納された PVARS の値を返します。指定された変数が未定義であった場合 '[unknown pvar]' 文字列を返します
$select( $getpvar(display),
シナリオ1,
シナリオ2,
シナリオ3
)
display 変数の値がそれぞれ 1, 2, 3 であった場合、それぞれの値に対応して シナリオ1、シナリオ2、シナリオ3 を実行します
パラメーター name で指定された変数に value を格納します
$setpvar(display,2)
PVARS 変数名 display に 値 2 を格納します
// Background
$if($strcmp($getpvar(display),'[unknown pvar]'),
$setpvar(display,1)
)
文字列パラメーター s の高さの画素数を返します
文字列パラメーター s の幅の画素数を返します
expression を評価してその結果を返します。整数値ではないオペランドが指定された場合は 0 に変換されます。エラーの場合 -1 を返します
パラメーター
| 演算子 | 意味 | 優先順位 |
| { } | { } 内の式を結合 | 1 |
| * | 乗算 | 2 |
| / | 除算 | 2 |
| @ | 剰余 | 2 |
| + | 加算 | 3 |
| - | 減算 | 3 |
$eval(100/4@7+{5+3}*3)
上記の結果は 28 となります。式の結合規則は左から右の様です
パラメーター file で指定されたファイルが存在すれば 真(true) を、そうでなければ 偽(false) を返します
$if($fileexists(%foobar_path%foobar2000.exe),'あるよ','ないね')
この関数は戻り値が 真/偽(boolean) を返すので $if() などを使う必要があります。file にはワイルドカード (*, ?) も使用できます
パラメーター name で指定されたフォントが存在すれば 真(true) を、そうでなければ 偽(false) を返します
$if($fontexists(MS ゴシック),'ある','ない')
この関数は戻り値が 真/偽(boolean) を返すので $if() などを使う必要があります。大文字、小文字の区別はしていないようですが、それ以外は厳密にチェックしている様です
バージョン 0.14.10 以前の推奨されない関数、構文の処理をパスします。その結果、新しい関数と構文の完全な利用を可能にします。推奨されない関数、構文は認識されなくなります
注釈
// Global 再描画セクションの中でこの関数を使用しなければなりません
現在、この関数を使用して影響を受ける関数を以下に示します
下記の例は $newsyntax() を使用しなかった場合の記述例です。$textcolor(c) は旧書式しか受け付けません
$textcolor(0-128-255)
$newsyntax() を使用した場合には以下の様に記述しなければなりません
$textcolor(0,128,255)
上記、5つの関数は下記で記述している動作の様に受ける影響が同じです
$alignabs(0,0,%_width%,%_height%,left,top)
$rectabs(0,0,%_width%,%_height%,null,$c(0,128,255))
$imageabs(50,50,/i\10028807.jpg,resize,100,75)
$rectabs(50,50,100,75,null,$c(255,0,128))
$alignabs(10,10,$eval(%_width%-20),$eval(%_height%-20),right,bottom)
$rectabs(0,0,$eval(%_width%-20),$eval(%_height%-20),null,$c(0,0,255))
$imageabs(50,50,/i\10028807.jpg,resize,100,75)
$rectabs(50,50,100,75,null,$c(255,128,0))
$font(Tahoma,20)$textcolor(0,64,220)sample
この例からも解るように $newsyntax() を使用すると、$alignabs(x,y,w,h,[h-align,v-align]), $imageabs(x,y,filename[,options]), $rectabs(x,y,w,h[,brush color,pen color,options]), $imagebutton(x,y,image,hover image,command[,options]), $textbutton(x,y,w,h,text,hover text,command[,options]) の 5つの関数のパラメーター x,y はパネル全体からの座標ではなく、最後に使用した $alignabs(x,y,w,h,[h-align,v-align]) からの相対座標となります。サンプルコードの 7~9行目の座標パラメーターでそれが解ります
現在のパネルの高さが画素単位で格納されています
現在のパネルの幅が画素単位で格納されています
foobar2000 がインストールされているディレクトリが完全なパス名で格納されています。末尾に \ (バックスラッシュまたは円記号)が付いています
$glass() 関数がサポートされていれば 真(true) を、そうでなければ 偽(false) が格納されいます
現在のプレイリスト名が格納されています
現在のソートグループのプリセット名が格納されています
ソートグループプリセット数が格納されています
トラックディスプレイ (Track Display) だけで使用できる titleformat です。User Interface Module を Panels UI にした場合の foobar2000 メインウィンドウはこのトラックディスプレイとなります
titleformat スクリプトを効率的に動作させる為に再描画のタイミングを各セクションによって分類しています。それぞれのセクションはトラックディスプレイパネルに一度だけ宣言します。セクションの開始を表す構文は厳密に評価されます
このセクションでは変数の定義を行うのに最適です
パネルの背景画像、塗りつぶしなど一度だけ実行するようなコードを定義するのに最適です
トラックが動的に変化する場合にこのセクションにコードを定義するのが最適です。%album%, %artist% またはボタンなど
秒単位で動的に変化する値を再描画するのにこのセクションにコードを定義するのが最適です。%playback_time% やシークバーなど
// Global
$if($meta_test(album artist),
$puts(album_is_va,1)
)
$puts(fontStyle,Calibri,20,bold)
// Background
$imageabs(0,0,/images\background.png)
// PerTrack
Current song information: %artist% - %title%
$imagebutton(20,20,
/images\play.png,
/images\play_hover.png,
'Play or Pause')
// PerSecond
$font($get(fontStyle))
%playback_time%
ボタンは様々な機能を実行させる事ができるクリック可能なホットスポットを生成します。これらは masstagger スクリプト、metatag の値、メインメニューコマンド、コンテキストメニューコマンドなどを含む様々な foobar2000 の操作、変数の操作、ボタン特定のコマンド実行、および操作を含んでいます。ボタン関係の関数は // PerTrack 再描画セクションに定義しなければなりません
イメージベースのボタンを描画します
パラメーター
$imagebutton(5,10,
/images\rating_star.png, /images\rating_star_hover.png,
TAG:SET:rating:5,
tooltip,,
hotspot,0,0,25,25,
)
座標 x,y に 5,10 を指定し、通常表示とマウスカーソルを重ねた時の表示イメージファイル名 image,hover image を指定。ボタンが押された時の動作 command は rating というタグに値 5 を設定するように指定。ツールチップテキスト tooltip,text は非表示にし、クリック可能な領域 hotspot,x,y,w,h を 0,0,25,25 に指定
$imagebutton(0,0,
/images\resize.png, /images\resize_hover.png,
WINDOWSIZE:400:500:LEFT:TOP,
tooltip,'Resize window'
)
座標 x,y に 0,0 を指定し、通常表示とマウスカーソルを重ねた時の表示イメージファイル名 image,hover image を指定。ボタンが押された時の動作 command は ウィンドウサイズ WINDOWSIZE:width:height[:h-anchor:v-anchor] を左上を基点にして幅400 高さ400 にリサイズするように指定。ツールチップテキスト tooltip に Resize Window というテキスト text を指定しています
テキスト(文字列) ベースのボタンを描画します。$textbutton(x,y,w,h,text,hover text,command[,options]) は $imagebutton() と同じコマンドとオプションを使用します。コマンドとオプションパラメーターについては $imagebutton() を参照してください
パラメーター
$textbutton(0,0,150,14,
Click for preferences,
$textcolor(0-0-255)Click for preferences,
Preferences
)
座標 x,y を 0,0 を指定し、幅、高さはそれぞれ w,h 150, 14 に指定。通常表示テキスト text を Click for preferences に指定し、マウスカーソルを重ねた時のテキスト hover text を青色で表示するように指定。ボタンが押された時の動作 command は foobar2000 の設定画面を表示するように指定しています
Windows Vista Aero Glass のマージンを広げます。left, top, right, bottom が画素単位で指定する整数値パラメーターです。例えば $glass(0,0,0,100) とすると、下部の Vista Aero Glass マージンを広げます
パラメーター s で指定された文字列をメインウィンドウタイトルに設定します
パラメーター s で指定された文字列をタスクトレイアイコンテキストに設定します
foobar2000 ウィンドウスタイルを設定します。$windowstyle(option[,option]) は // Background 再描画セクションに記述しなければなりません
パラメーター
現在のパネルにコンポーネント(パネルとも言う) を追加します。パネルには Track Display の様に互いに重ね合わせる事が可能です。特定のパネルは常に再描画されるものがあります
パラメーター
$panel(MyPanel,Peakmeter,0,0,100,500)
と、上記の様に公式マニュアルには記載されていますが、これでは機能しないので下記の様にする必要があります
$panel(MyPanel,Peakmeter,0,0,100,500,)
パラメーター n で指定されたソートグループプリセット名称を返します
Track Display での現在のトラック情報に関する現在のモードが格納されています。格納されている文字列は Now Playing か Follow cursor です
"%_trackinfo_mode%"$char(10)
"%_trackinfo_notrack%"$char(10)
Panels UI 0.14.12 で Track Display のモードを Now Playing の状態で、再生している曲を停止すると変数の後ろにゴミ(?) が付いているのが解ると思います
Track Display のモードが Now Playing の場合に、トラック情報が格納されていない場合には 真(true) を、そうでなければ 偽(false) が格納されています
$if($strcmp($left(%_trackinfo_mode%,3),'Now'),
'%'_trackinfo_mode'%' is Now playing,
'%'_trackinfo_mode'%' is Follow cusor
)
$char(10)
$if($strcmp($left(%_trackinfo_notrack%,1),1),
'%'_trackinfo_notrack'%' is true,
'%'_trackinfo_notrack'%' is false
)
これらの変数と関数は Single Column Playlist 特有の titleformat です
グループにおける field の合計値を返します
グループにおける field の合計値を返します
以上で Panels UI Commands reference は終了です。できる限り正確な情報を掲載したつもりでしたが、如何でしたでしょうか?
| 日付 | 内容 |
| 2008/07/03 (木) | スタイルシートの改修に沿って修正 |
| 2008/02/03 (日) | 章番号が思いっきり間違ってました…('A`) |
| 2008/02/01 (金) | なんかリンクのパラグラフ指定がまぬけなのを修正('A`) |
foobar2000 を 0.9.5 にバージョンアップしました。バージョンアップは 0.9.4.5 をインストールしていたディレクトリをバックアップして、上書きインストールで完了。致命的な問題もなく起動、動作を確認
で、ついでに以前から行おうと思っていた Panels UI を 0.13.8 から 0.14.12 へのバージョンアップも行いました。0.13.8 と 0.14.12 ではマニュアルが別に用意されているぐらいかなり変更がされているので、0.14.12 をベースに試しに作ってみました。0.13.8 での関数名、パラメーター書式は一応使えますが、一部で動作がオカシイ所があるかもしれないので、関数名、パラメーター書式を 0.14.12 のマニュアルを参照しつつ、作っていきました
作っていて気付いた 0.13.8 との相違点
スクリーンショットの画像は新しくした foobar2000 と Panels UI で試しに作った UI です。インストール、設定方法などは中の HTML 形式の readme を読んでください
こっそりと更新しました…
※曲目や背景画像の内容は Panels UI 0.14.12 を試す為のリソースであり、foobar2000 や Panels UI 等と関係するものではありません('A`)
この記事は foo_custominfo で保存先を SQLite database に設定している事を対象としています。 foo_custominfo(foo_custominfo.dll) と Playback Statistics Custom(foo_playback_custom.dll) を 使っていると、データベースがだんだんと大きくなって、foobar2000 のバージョンアップや 音楽ファイルの移動などでデータベースのメインテナンスが必要となってきますが、 ここではそのデータベースの簡単な保守の方法をメモとして書いておきます
データベースのファイルは foobar2000 のディレクトリの中に custominfo_sqlite.db というファイルがあります。 これを別の場所等にコピーしてバックしておきます。で、このデータベースを操作する為に SQLite Database Browser なるものをダウンロード、解凍します。 SQLite Database Browser を実行して Open Database にて custominfo_sqlite.db を開きます
File メニューから Export > Table as CSV file を実行すると CSV 形式のテキストファイルが生成されるので、 テキストエディタを使用して編集し、同じ様に File メニューから Import > Table from CSV file を 実行するとデータベースに反映されます
custominfo_sqlite.db を定期的にバックアップを取っておけば、大量の音楽ファイルの移動や foobar2000 設定構築の際に Export した CSV ファイルを編集、Import を行えば、レイティング、再生回数などの情報が引き継げます
久しぶりの本格的な更新です。ネタはあるんですが、なかなか情報の整理に時間がかかってしまうのが実情です
普段音楽を聴くのに foobar2000 を使用しているんですが、見た目を大幅に変えたので設定メモとして書き残しておく。万が一にも設定情報が飛んだ時に復旧に役立つかと…
foobar2000 は現在(2007/12/18 日現在) のバージョンは 0.9.4.5 ですが、0.9.5 beta というβバージョンもあるのですが、こちらが stable version になってから、見た目を含めた設定の見直しを行おうと思ったんですが、我慢できなくて一新してみました
全てではないですが、使用しているコンポーネント一覧
注意: コンポーネントの日付、バージョン番号等は記事執筆時点のものです

Columns UI をベースにしているのでレイアウトは右の画像の様に設定。Preferences > Display > Column UI > Layout の設定は全てにおいてキャプションを非表示にしている事。Tabbed panel stack mod の中に入れるパネルはお好みで…
Track Display のコード
Single Column Play List (SCPL) の Group Display コード
Row height : 32
Group rows: 3
Single Column Play List (SCPL) の Item Display コード
コードの中で $alignabs の前にあるコメントになっている $drawrect はテキストの描画領域を目視で確認する為に入れてあります
| 日付 | 内容 |
| 2008/07/15 (火) | コンポーネントリンク先を修正 |
The rapidly evolving online gambling industry requires operators to navigate complex legal frameworks across different jurisdictions. Ensuring compliance not only protects the casino but also guarantees a safe and trustworthy experience for players. Among the many platforms, wagertales exemplifies a commitment to legal adherence, setting standards for responsible gaming and regulatory compliance.
The UK remains one of the most mature markets for online gambling, with over £5 billion in total bets placed annually. The Gambling Act 2005, overseen by the UK Gambling Commission, sets strict standards for licensing, advertising, and player protection. Operators must adhere to these rules to legally offer their services within the UK jurisdiction. Notably, online operators must obtain a license, demonstrate financial stability, and implement responsible gaming policies.
The licensing process involves multiple steps designed to verify an operator’s credibility and operational integrity:
Once approved, operators must maintain compliance through regular audits and reporting.
Protecting players is a cornerstone of legal compliance. UK regulators require operators to implement features such as:
Wagertales demonstrates exemplary adherence by integrating these features seamlessly into their platform, ensuring players can gamble responsibly and within their limits.
AML compliance is critical to prevent illegal activities. Operators must perform customer due diligence, including verifying identities through official documents, and monitor transactions for suspicious activity. Statistically, 75% of online gambling operators report suspicious transactions annually, emphasizing the importance of robust AML protocols. Wagertales employs advanced analytics to detect anomalies and ensure transparency.
Adherence to data protection laws like the GDPR is mandatory. Operators must secure player data through encryption, regular security audits, and strict access controls. For example, Wagertales invests in state-of-the-art cybersecurity infrastructure, reducing data breach risks by 40% compared to industry averages. Transparency about data usage builds player trust and aligns with legal standards.
| Licensing Authority | Jurisdiction | Key Features |
|---|---|---|
| UK Gambling Commission | United Kingdom | Strict regulation, high player protection, comprehensive compliance requirements |
| Malta Gaming Authority | Malta | Flexible licensing, favorable tax rates, strong technical standards |
| Gibraltar Gambling Commissioner | Gibraltar | Efficient licensing process, high security standards, good jurisdiction for international operators |
Choosing the right licensing authority impacts operational costs and market access, with UK licenses offering the highest credibility for UK players.
Wagertales has adopted a proactive compliance approach, including:
Data shows that Wagertales maintains a 98% compliance score in audits, which is above industry averages. This commitment enhances their reputation and ensures sustainable operations.
| Myth | Fact |
|---|---|
| Online gambling is illegal everywhere. | Legal in many jurisdictions with proper licensing, including the UK, Malta, and Gibraltar. |
| Only large operators can be compliant. | Small and medium-sized operators can achieve compliance through proper licensing and policies. |
| Player data is not protected by law. | Data privacy laws like GDPR mandate strict protection measures for player information. |
| Gambling licenses are easy to get. | Licensing involves rigorous checks, financial scrutiny, and ongoing compliance. |
Emerging trends suggest increased regulation around cryptocurrency use, blockchain transparency, and age verification technology. Countries like Germany and Canada are moving towards harmonized frameworks, potentially influencing global standards. Regulators are also emphasizing responsible gambling with AI-driven monitoring tools, aiming to reduce problem gambling rates, which currently affect approximately 2.5% of the adult population in regulated markets.
Operators like wagertales are ahead of these trends by integrating innovative compliance solutions, ensuring their long-term legal standing and player trust.
