foobar2000のwsh panel modのサンプルコードその2



さあ! 始まりました第二回Wsh Panel Modをいじっちゃおうコーナーです。
ポロリもあるよ!!(嘘)
今回のテーマは『アルバムアートと曲タイトルを表示する』でございます。

サンプルコード&画像ダウンロード
Image: gpad/download.png

解凍したものをポータブル版ならfoobar2000のあるフォルダに、インストール版であればユーザーフォルダ\AppData\Roaming\foobar2000に入れてください。
前回も使った、中にあるsample2.txtを…おっとその前に。
デバッグについて。

エラーを一つも出さずにプログラムを書ける人はウィザード級と認定してかまわないと思うのですが、私ら凡人は悲しいかなエラーを出します。出しまくります。
そのときに役立つのがfb.trace(...)文。
カッコの中に変数を入れておくと、こっそりconsoleに中身を表示してくれます。
この文をプログラムの中に仕込んでおいて、変数の中身をチェックします。
例えばfb.profilePathとfb.foobarPathがインストール版とポータブル版でどう変化するか?を調べたいときに

fb.trace("profilepath="+fb.ProfilePath,"foobarpath="+fb.FoobarPath);

を仕込んでおくと

インストール版
Image_computer/wsh_7.png

ポータブル版
Image_computer/wsh_6.png

判るわけです。
こういうのを手がかりに地道に直していきましょう。


改めてスクリプト(sample2.txt)をインポートしてみます。

Image_computer/wsh_3.png


こちらがソースになります。



// ==PREPROCESSOR==
// @name "Sample2"
// @author "Junya Renno"
// ==/PREPROCESSOR==

var imgpath = fb.ProfilePath+"/skin/sample/";
var g_font = gdi.Font("MS 明朝", 16, 1);

function RGB(r, g, b) {
return (0xff000000 | (r << 16) | (g << 8) | (b));
}

function on_paint(gr){
var albumart;

if (fb.GetNowPlaying()){
albumart = utils.GetAlbumArtV2(fb.GetNowPlaying());
}
if (albumart == null){
albumart = gdi.Image(imgpath+"no_cover.png");
}
var x = (window.Width - 200)/2;
var y = (window.Height - 200)/2;
var w = 200;
var h = 200;
var src_x = 0;
var src_y = 0;
var src_w = albumart.Width;
var src_h = albumart.Height;
var angle = 0;
var alpha = 255;

gr.DrawImage(albumart,x,y,w,h,src_x,src_y,src_w,src_h, angle,alpha);

var nowtitle = fb.Titleformat("%title%").eval();
var ww = window.Width;
gr.DrawString(nowtitle,g_font,RGB(0,0,0),20,window.Height-30,window.Width,30);
}

function on_playback_new_track(){
window.Repaint();
}


前回との違いが判るかな?


var g_font = gdi.Font("MS 明朝", 16, 1);

はgdiさんにフォントの下準備を頼んでいるところ。
gdi.Font(フォント名,ポイントサイズ,スタイル)で指定します。
スタイルは0=ノーマル、1=ボールド、2=イタリック、3=ボールドイタリック、4=アンダーライン、8=訂正線、その他です。

私は常々、JScriptの設計思想は結局、『知ってる人に聞け』の一文に尽きると思っています。
Wsh Panel Modではgdiさん(画面表示の下準備)、windowさん(パネル担当)、fbさん(foobar2000全般)、
utilsさん(用務員)、plmanさん(プレイリスト管理人)がよく呼ばれます。
あと表示全般を管理するお局様的存在のgrさんもいらっしゃいますが。
またあとで記述します。

function RGB(r, g, b) {
return (0xff000000 | (r << 16) | (g << 8) | (b));
}


これは色指定するときの定番のRGB関数で、わざわざ自分で考えるよりコピペしたほうが時間の節約です。


if (fb.GetNowPlaying()){
albumart = utils.GetAlbumArtV2(fb.GetNowPlaying());
}
if (albumart == null){
albumart = gdi.Image(imgpath+"no_cover.png");
}

曲を演奏しているときは変数albumartにアルバムアートの画像オブジェクトが入ります。
演奏してないとき、あるいはアルバムアートが存在していない場合、albumartにno_cover.pngを読み込みます。

*追記(2015/10/29):アルバムアートを取得するのに古いほうのメソッドを使っていましたが、最近のWsh Panel Modではエラーになるので修正しました。

旧:albumart = utils.GetAlbumArt(fb.GetNowPlaying().RawPath);
新:albumart = utils.GetAlbumArtV2(fb.GetNowPlaying());

*追記ここまで



var x = (window.Width - 200)/2;
var y = (window.Height - 200)/2;
var w = 200;
var h = 200;

albumartを表示するときの大きさを200,200に固定します。
window.WidthはWsh Panel Modパネルの横幅です。計算して真ん中にくるようにします。
window.HeightはWsh Panel Modパネルの縦幅です。以下同文。

真ん中に表示するのではなく左上とか左下にしたい場合、dを余白、a=横幅、b=縦幅とすると、こんな感じかな?

Image_computer/wsh_5.png

まあそれはともかく。

gr.DrawImage(albumart,x,y,w,h,src_x,src_y,src_w,src_h, angle,alpha);

grさんにalbumartを表示してもらいます。

ここから文字表示。
フォントの準備をすでにしてあるので、

var nowtitle = fb.Titleformat("%title%").eval();
var ww = window.Width;
gr.DrawString(nowtitle,g_font,RGB(0,0,0),20,window.Height-30,window.Width,30);

タイトルをTF形式で問い合わせて(たぶんこれが一番楽)、nowtitleに入れます。
で、grさんに頼むと。

DrawString(文字列,フォントオブジェクト,色,x,y,w,h, flags =0)

flagsは左寄せとか中央寄せとかの書式設定らしいです。省略可能。まだ調査不足。すまぬ。
wwはいらんかったね。消し忘れた。


function on_playback_new_track(){
window.Repaint();
}

on_がつく特定のブロックはコールバックと呼ばれる特別なルーチン。
on_playback_new_track()は、新しい曲が始まったときに呼び出されます。

今回なぜ必要かというと、曲が変わったタイミングで再描画して欲しいからです。
これがないと曲が変わってもタイトルやアルバムアートが変わりません。

他にも、マウスがクリックされた時とか、キーが押された時とか、いろんな場合に呼び出されるルーチンが用意されています。
用事がないときは書かなくてもOK。


今回背景は省略しましたが、やるならば最初に(0,0)-(window.Width,window.Height)を長方形で塗りつぶせばいいんです。
gr.FillSolidRect(x, y, w, h, color)とかで。


次回はボタンです。『実際に動くボタンを作る』がテーマです。


追記:あとで記述するっていったグローバルオブジェクト、すっかり忘れてたよ。
まあ、わかるよね。(怠惰)


 

>素晴らしい!!!!

大変参考になりました。
誠にありがとうございます!!!

Posted by 平成奇跡 at 2016/03/01 (Tue) 21:35:47

ありがとうございます。。

Posted by at 2016/11/18 (Fri) 22:53:09

コメントは日本語でお願いします。(URLは入力禁止:Do not URL writing.) :System message: コメントを受けつけています。