2010 . 08 . 24

ニコニコ動画用スキン「2coMeter2」アップデート

2coMeter2をアップデートしました。

従来の表示タイプに加え、指定時間毎に一件づつ順次表示していく[2coMeter2R]と 10件まとめて表示する[2coMeter2Th/Tv]を新たにバリエーションに加えました。

このバージョンはRainmeter-1.3beta以上で動作可能です。

製作メモ

[2coMeter2R]はフィード内のアイテム(動画情報)を一件づつ指定した間隔で順次表示していくというスキンです。

以前も似たような趣旨でFeedLineというスキンを製作したことがありますが、今回はまた違ったアプローチでより効率的な方法を模索してみました。

幸いにも1.3ベータにて、「!RainmeterWriteKeyValue」というスキンの内容を書き換える機能が追加され、これを効率よく使用することでそれが可能となりました。


理屈は単純で、指定した時間になると変数NUMががカウントアップされその番号に書き換えられたスキンで新たにリフレッシュされます。

そして変数NUMは何件目を取得対象にするかという正規表現に働いて取得するポイントが変わっていくという仕組みで、変数NUMが変数MAXに達すると再び0に戻ります。


さて、ここまでは動作的に問題ないのですが、問題はスキンの起動時です。

上記の手法だと、スキンを終了した時のポイントで次回から始まることになってしまいます。

そうではなく、起動時は必ず1件目から始めたいという問題をクリアするためには、ちょっとした細工が必要になりそうです。

まず考えたことは、OnRefreshActionで起動時に強制的に変数NUMを0に書き換えること、しかしこれでは、指定時間でリフレッシュを繰り返すこのスキンでは、毎回0に書き換えられてしまうことになります。

OnRefreshActionコマンドは初回起動時だけではなくリフレッシュの時にも同様に働くコマンドだからです。

そこでリフレッシュ時には適用されず、初回起動時にのみ適用される方法として次のような方法を考えてみました。


これはCalcのCounter関数を利用する方法です。

Counter関数はUpdate秒間隔で1づつカウントアップを繰り返す特殊な関数で、これ自体はスキンの開始から終了まで止まることなく働き続け、たとえ途中でリフレッシュしたりDisabledにしても0にリセットされることがない、という特徴を持っています。

[RESET]
Measure=Calc
Formula=Counter
IfEqualValue=1
IfEqualAction=!Execute [!RainmeterWriteKeyValue Variables NUM 0][!RainmeterRefresh]

そこでこの特徴を利用して上記のように設定すれば、スキンを起動した直後だけ指定コマンドを実行することができるようになります。

Counterが1を返すのはスキン開始直後の1回限りで、その後スキンがリフレッシュされても2度と1は返しません。

注意点としては、必ず「IfEqual」を使うこと。これを「IfAbove」にしてしまうと当然リフレッシュ時に「1以上」という評価でコマンドが実行されてしまいます。


!RainmeterWriteKeyValueコマンドは非常に強力で今後いろいろな利用が期待できる機能といえます。

ただし、書き換えた内容をスキンに適用するためにはスキンのリフレッシュが不可欠であることは言うまでもありませんが、このリフレッシュのタイミングがこの機能を使いこなす上でポイントになってくるでしょう。

安易にリフレッシュの設定をすると永久ループを形成してしまう恐れもあり、上記のようなCounter関数を利用する方法はその解決策の一つとして挙げられます。



さて、もう一つオマケ機能ということで、スキンの更新間隔毎にフェードアウト&インしながら更新されるという機能を入れてみました。

これはスキンが書き換えられリフレッシュされる直前に!RainmeterHideFadeでスキンをフェードアウトして、リフレッシュ直後に!RainmeterShowFadeでフェードインするという仕組みです。

[START]
Measure=Calc
Formula=START+1
IfAboveValue=1
IfAboveAction=!Execute [!RainmeterShowFade][!RainmeterDisableMeasure START]
[COUNT]
Measure=Calc
Formula=#MAX#>(#NUM#+1)?(#NUM#+1):0
[ROTATION]
Measure=Calc
Formula=Counter%(#UPDATE#+2)
IfEqualValue=#UPDATE#
IfEqualAction=!RainmeterHideFade
IfAboveValue=#UPDATE#
IfAboveAction=!Execute [!RainmeterWriteKeyValue Variables NUM [COUNT]][!RainmeterRefresh]

具体的には、[ROTATION]で指定時間に達するとIfEqualActionで!RainmeterHideFadeが実行され、それを過ぎるとIfAboveActionでスキンの書き換えが行なわれ同時にスキンがリフレッシュされます。

次に[START]によってスキン開始一秒後に!RainmeterShowFadeが実行されるというわけです。

スキンには「OnRefreshAction=!RainmeterHide」と定義しており基本的には非表示でスタートすることを明示しておき、上記の!RainmeterShowFadeによって表示させてやるようにします。


上は!RainmeterShowFade/HideFadeを利用してスライドショーのように見せるやり方の応用ですが、その他にもこんな使い方もできるので興味のある方は試してみてください。

(定義した5つの語句がフェードしながら切り替わっていく例)

[Rainmeter]
DynamicWindowSize=1
[Variables]
num=1
Phrase1="1st Phrase"
Phrase2="2nd Phrase"
Phrase3="3rd Phrase"
Phrase4="4th Phrase"
Phrase5="5th Phrase"
[MeasureCount]
Measure=Calc
Formula=(((Counter%50)-((Counter%50)%10))/10)+1
Substitute=".00000":""
[MeasureSwitch]
Measure=Calc
Formula=Counter % 10
IfEqualValue=8
IfEqualAction=!RainmeterHideFade
IfAboveValue=8
IfAboveAction=!Execute [!RainmeterSetVariable num [MeasureCount]][!RainmeterShowFade]
DynamicVariables=1
[Phrase1]
Measure=Time
Format=#Phrase1#
[Phrase2]
Measure=Time
Format=#Phrase2#
[Phrase3]
Measure=Time
Format=#Phrase3#
[Phrase4]
Measure=Time
Format=#Phrase4#
[Phrase5]
Measure=Time
Format=#Phrase5#
[MeterText]
Meter=STRING
FontSize=75
AntiAlias=1
FontColor=FFFFFF
Text=[Phrase#num#]
DynamicVariables=1



[2coMeter2Th/Tv]はまとめて10件表示するタイプのスキンです。

とはいっても、通常の[2coMeter2]をただ10個並べるのではスキンは巨大になってしまうので、1個あたりの表示内容は簡潔に画像とタイトルのみにしました。

また、さらに省スペース化を実現するため、新たに追加されたツールチップ機能を使ってタイトルを表示することにしました。


当初は「ToolTipTitle」でタイトルと、「ToolTipText」で概要を表示させる設定でしたが、概要が長い場合にツールチップが巨大になり相当のリソースを消費してしまうことになるため、これは却下することにしました。

また、「ToolTipTitle」はツールチップの幅を定義する「ToolTipWidth」の対象外で長いタイトルではツールチップの幅を抑制できないことから、結局、「ToolTipTitle」は使わず「ToolTipText」でタイトルだけを表示する簡素な仕様になりました。


また、右(下)ボタンで何件目を表示するかを指定できるようにしてみました。

これは前述の!RainmeterWriteKeyValueを使った方法と同様で、あらかじめボタンには変数番号が指定されていて、ボタンをクリックすればその番号に書き換えられ新しいスキン内容で更新されるという仕組みです。

ただし、ランキング用フィードなどは100件までありますが、一般の動画フィードなどは30件までしかないので、そのようなフィードでは40件目以降をクリックしても当然エラーになることに注意してください。