doubledepth

I, 💩

(どう見ても血便……ECMAScript5対応環境では引数そのものが書き換わる例

function f (a) {
    "use strict";
    a = 42;
    return [a, arguments[0]];
}
var pair = f(17);
console.assert(pair[0] === 42);
console.assert(pair[1] === 17);

私はこれを忘れて、引数の書き換えに依存していた。Scriptがうまく働かないわけだ。

ところで十年くらい前までひきスウの読み方を知らなくて、当時「こんなん読めるわけないだろ」と憤って読み仮名をふった。今でも微妙に納得いってないので残している。英語は全面的に納得いかない。日本人ならウィドスwidthヘイトheightヘルスカパーHELLSCAPERでしょ。

Now BMSON parsing …

info.mode_hintと実際に使われたxに齟齬がある場合は、どちらに合わせるべき?

  • 値に"beat-7k"が指定されているのに、使用済み"x"05 これは7 Keysでいいとして、
  • 値に"beat-7k"が指定されているのに、使用済み"x"09 これはぽっぽんぽい?

使用済み"x"に合わせていたら無限に形式を創作できてしまうから、"mode_hint"に合わせることにしよう。範囲外の"x"はBGMにでも追いやるのが無難かな。結論が出たので寝る。

Toy Musical 3続報

[追記] Mirror siteにて、Toy Musical 3 ver.2.41が公開されました!

おそらく十日以上前からToy Musical 3の公式Webpageに到達できなくなっていた件に関して、中の人らしき匿名氏からお知らせをいただきました。Maintenanceお疲れ様です。

TMの話ですが、少々更新時にミスしてしまい現在サーバー管理人のVilartさんと連絡を取ろうとしているところです。

ただ、ここ最近は本当にインターネットに出てきていないようなので、いつになるか不明という状況のため、ミラーサイトを近日中に用意したいと考えています。

とのことですので、Toy Musical 3を楽しんでいる方々は続報を待ちましょう〜

私もmirrorの設置に気付き次第、当日記にmirrorへのlinkを追記させていただく予定です。あと、

テケテケサーフ&ロック “99Sec Summer Song”

前述の曲のおそらく#COMMENT相当の指定に、よくわからない‘REVERSE SOLIDUS’が挟まっていました。漢字の「十」がShift_JISのダメ文字だからかな。

思うことがあってBMSON parserを書いている

いまのところよくわからなかったのは、BMSON仕様の破壊的変更に関する以下の二点。

  • Time unit has been changed to pulse
  • BMSInfo.total is changed to relative value

変更される前の古い仕様ではどうなっていたのだろう? 後者はBMSの#TOTALと同様なら適当に換算できるけど、前者がわからないとv0.21準拠図表をv1.0.0に変換しようがない。あと、この「時間単位」がどのkeysに適用されるものなのかもわからない。stopNotes.vに対してだろうか? う〜ん、わからないから放置して他を進めよう。

_wsh_bms2bmson.js v0.1.11

  • #ARGBおよび透過channels#xxx0B0E)の変換をsupportした。画像生成はしない。
  • LAYERとして#BGAを切り出す際に、canvasを透過し忘れていた。このbugを修正した。
  • 前述のbugの修正に伴い、v0.1.10の例示BMSに、出力画像確認用のHTML文書を追加した。

v0.1.10で示した#EXBMP例は、v0.1.11でようやく私の期待通りに変換されるようになった(nanasigrooveと同じ結果にはならない)。変換後のBMSONの映像はPulsus等で確認できる。

以下に述べるchannelsは、#xxx08(拡張BPM変更)と#xxx03(標準BPM変更)の関係に似ている。
  • #xxxA1(BGA BASE用の#ARGB変更)と、#xxx0B(BGA BASE用の不透明度変更)
  • #xxxA2(BGA LAYER用の#ARGB変更)と、#xxx0C(BGA LAYER用の不透明度変更)
  • #xxxA3(BGA LAYER2用の#ARGB変更)と、#xxx0D(BGA LAYER2用の不透明度変更)
  • #xxxA4(BGA POOR用の#ARGB変更)と、#xxx0E(BGA POOR用の不透明度変更)

たとえばBGA BASE用のchannel A1 vs. 0Bで、同一のrhythm座標上に異なる指定が競合した場合は、どちらか一方のみが解釈されるといいね、という感じ。拙作変換器は「file終端に最も近い行」を優先するが、このあたりは実装に依存する。


実装依存といえば、BMSONのGroove Gauge増加量を任意の値に設定できないという意見を見かけた。beatorajaとPulsusに関しては、以下の一行のJavaScriptをWeb BrowsersのConsoleとかに入力すれば、BMS図表とほぼ同じGauge増加量になるBMSONの"total"値を算出できる。

((n,t)=>{i=7.605*n/(0.01*n+6.5);i=i<260?260:i;alert('"total":'+((t/n)/(i/n))*100)})(5000,342.58)

前述の行末の二つの数値のうち、前者(5000)は対象図表の演奏すべきNotes総数、後者(342.58)は対象図表のBMS形式における#TOTAL値。これらを適当に書き換えて適宜うまくやってください。

初等教育の敗北

// #TOTAL => "total"
((n,t)=>{i=7.605*n/(0.01*n+6.5);i=i<260?260:i;alert('"total":'+t*100/i)})(n,t)

// "total" => #TOTAL
((n,t)=>{i=7.605*n/(0.01*n+6.5);i=i<260?260:i;alert("#TOTAL ":+t*i/100)})(n,t)

Toy Musical 3をちまちま遊んだ

公式WebpageでPHP errorが発生している。私は数日前に気がついた。いつからこうなっていたかは知らない。[追記] 現在対処中とのことです。座して待ちましょう〜

私は難易度30以上をもはやclearできないので、低難度図表を中心に遊んでいる。ゆめきのこ(HYPER)、リリフラ(EX)、fatal movements(HYPER)、ヒカリゴケ(HYPER?)、ゆかた(HYPER?)、などなどが今のところ楽しい。

_wsh_bms2bmson.js v0.1.10

  • #EXBMPに部分的に対応した。当面はalpha channelを含まないBMP画像のみ変換する。
  • #DIFFICULTY 4のような、余計な空白を含む値に対応しきれていなかった。直した。
  • Notes/Eventsが出尽くした後も、長さ一拍未満の小節が続く間は図表を継続するようにした。
  • COLONで区切られたHEADER文や、SPACEで区切られたDATA文も、受け入れるようにした。

BGA BASE、BGA LAYER、#EXBMP#BGAなどをごちゃごちゃに用いると、nanasigroove上でさえどうしてそうなるのかよくわからない描画結果がもたらされる。いうに及ばず拙作変換器もわからない。#xxx04に置かれた#EXBMP定義を透過すべきかどうかさえ、私には判断がつかない。

#ARGBやopacity channelsは#BMP/#EXBMP/#BGA/#@BGAからは独立していて定義番号領域を異にするため、悪用すると初代“りりくろ”以上に野放図に色替え画像群が生成されうる。組み合わせ数は、#BMP系1296枠×#ARGB系1295枠×256諧調×256諧調×256諧調×256諧調…… 7208329512222720通り?

[追記] #BMP系1296枠×(非透過channels用の、#ARGB1295枠+255諧調)×(透過channels用の、#ARGB1295枠+255諧調)3113640000通り? まだなんか根本的に計算を間違っている気がするけど

なので、これは画像を生成するところまではやらなくてもいいかなあ〜と思い直した。透過率変更events的な独自keysをBMSON内に生やしておくところまでやっておけば、後から使いたい人は使えるんじゃないかなあ〜……

あとは#EXWAVや音量変更channelsや#WAVCMDなども、え〜っと、SoX(Sound eXchange)とかを使えば変換できなくはなさそう。でもなあ〜……

知恵捨てが暗躍する

琥珀堂さん更新してほしいなあ……

#EXBMPにおいてPNG to PNGの変換をひとまず諦めることによって、#EXBMPの変換を部分的にsupportした。やりとげたと思いきや、cmd.exeの引数長さ制限に抵触する事例が発覚。

magick "from.bmp" two-lone-swordsmen png32:"to.png"
magick "from.bmp" -transparent #F7F7F7 -transparent #F7F7F8 -transparent #F7F7F9 -transparent #F7F7FA -transparent #F7F7FB -transparent #F7F8F7 -transparent #F7F8F8 -transparent #F7F8F9 -transparent #F7F8FA -transparent #F7F8FB -transparent #F7F8FC -transparent #F7F8FF -transparent #F7F9F7 -transparent #F7F9F8 -transparent #F7F9F9 -transparent #F7F9FA -transparent #F7F9FB -transparent #F7F9FC -transparent #F7F9FD -transparent #F7F9FF -transparent #F7FAF7 -transparent #F7FAF8 -transparent #F7FAF9 -transparent #F7FAFA -transparent #F7FAFB -transparent #F7FAFC -transparent #F7FAFD -transparent #F7FAFE -transparent #F7FBF8 -transparent #F7FBF9 -transparent #F7FBFC -transparent #F7FBFD -transparent #F7FCF7 -transparent #F7FCFA -transparent #F7FCFC -transparent #F7FCFF -transparent #F7FDFA -transparent #F7FDFB -transparent #F7FDFC -transparent #F7FDFE -transparent #F7FDFF -transparent #F7FEFC -transparent #F7FEFD -transparent #F7FFFB -transparent #F7FFFD -transparent #F8F7F7 -transparent #F8F7F8 -transparent #F8F7F9 -transparent #F8F7FA -transparent #F8F7FB -transparent #F8F7FC -transparent #F8F8F7 -transparent #F8F8F8 -transparent #F8F8F9 -transparent #F8F8FA -transparent #F8F8FB -transparent #F8F8FC -transparent #F8F8FD -transparent #F8F9F7 -transparent #F8F9F8 -transparent #F8F9F9 -transparent #F8F9FA -transparent #F8F9FB -transparent #F8F9FC -transparent #F8F9FD -transparent #F8FAF7 -transparent #F8FAF8 -transparent #F8FAF9 -transparent #F8FAFA -transparent #F8FAFB -transparent #F8FAFC -transparent #F8FAFD -transparent #F8FAFE -transparent #F8FAFF -transparent #F8FBF8 -transparent #F8FBF9 -transparent #F8FBFA -transparent #F8FBFB -transparent #F8FBFC -transparent #F8FBFD -transparent #F8FBFE -transparent #F8FCF7 -transparent #F8FCFA -transparent #F8FCFB -transparent #F8FCFC -transparent #F8FCFD -transparent #F8FCFF -transparent #F8FDF9 -transparent #F8FDFC -transparent #F8FDFE -transparent #F8FDFF -transparent #F8FEFA -transparent #F8FEFF -transparent #F8FFFD -transparent #F8FFFE -transparent #F8FFFF -transparent #F9F7F7 -transparent #F9F7F8 -transparent #F9F7F9 -transparent #F9F7FA -transparent #F9F7FB -transparent #F9F8F7 -transparent #F9F8F8 -transparent #F9F8F9 -transparent #F9F8FA -transparent #F9F8FB -transparent #F9F8FC -transparent #F9F8FD -transparent #F9F9F7 -transparent #F9F9F8 -transparent #F9F9F9 -transparent #F9F9FA -transparent #F9F9FB -transparent #F9F9FC -transparent #F9F9FD -transparent #F9F9FE -transparent #F9FAF7 -transparent #F9FAF8 -transparent #F9FAF9 -transparent #F9FAFA -transparent #F9FAFB -transparent #F9FAFC -transparent #F9FAFD -transparent #F9FBF7 -transparent #F9FBF8 -transparent #F9FBF9 -transparent #F9FBFA -transparent #F9FBFB -transparent #F9FBFC -transparent #F9FBFD -transparent #F9FBFF -transparent #F9FCF8 -transparent #F9FCF9 -transparent #F9FCFA -transparent #F9FCFB -transparent #F9FCFC -transparent #F9FCFD -transparent #F9FCFE -transparent #F9FDF9 -transparent #F9FDFA -transparent #F9FDFB -transparent #F9FDFC -transparent #F9FDFE -transparent #F9FDFF -transparent #F9FEFC -transparent #F9FEFD -transparent #F9FFFC -transparent #F9FFFD -transparent #F9FFFE -transparent #F9FFFF -transparent #FAF7F7 -transparent #FAF7F8 -transparent #FAF7F9 -transparent #FAF7FA -transparent #FAF7FB -transparent #FAF8F7 -transparent #FAF8F8 -transparent #FAF8F9 -transparent #FAF8FA -transparent #FAF8FB -transparent #FAF8FC -transparent #FAF8FD -transparent #FAF8FE -transparent #FAF9F7 -transparent #FAF9F8 -transparent #FAF9F9 -transparent #FAF9FA -transparent #FAF9FB -transparent #FAF9FC -transparent #FAF9FD -transparent #FAF9FE -transparent #FAFAF7 -transparent #FAFAF8 -transparent #FAFAF9 -transparent #FAFAFA -transparent #FAFAFB -transparent #FAFAFC -transparent #FAFAFD -transparent #FAFAFE -transparent #FAFBF7 -transparent #FAFBF8 -transparent #FAFBF9 -transparent #FAFBFA -transparent #FAFBFB -transparent #FAFBFC -transparent #FAFBFD -transparent #FAFBFE -transparent #FAFBFF -transparent #FAFCF8 -transparent #FAFCF9 -transparent #FAFCFA -transparent #FAFCFB -transparent #FAFCFC -transparent #FAFCFD -transparent #FAFCFE -transparent #FAFCFF -transparent #FAFDF9 -transparent #FAFDFA -transparent #FAFDFB -transparent #FAFDFC -transparent #FAFDFD -transparent #FAFDFE -transparent #FAFDFF -transparent #FAFEF9 -transparent #FAFEFA -transparent #FAFEFC -transparent #FAFEFD -transparent #FAFEFF -transparent #FAFFFD -transparent #FAFFFE -transparent #FAFFFF -transparent #FBF7F7 -transparent #FBF7F8 -transparent #FBF7FA -transparent #FBF7FB -transparent #FBF8F7 -transparent #FBF8F8 -transparent #FBF8F9 -transparent #FBF8FA -transparent #FBF8FB -transparent #FBF8FC -transparent #FBF9F7 -transparent #FBF9F8 -transparent #FBF9F9 -transparent #FBF9FA -transparent #FBF9FB -transparent #FBF9FC -transparent #FBF9FD -transparent #FBFAF7 -transparent #FBFAF8 -transparent #FBFAF9 -transparent #FBFAFA -transparent #FBFAFB -transparent #FBFAFC -transparent #FBFAFD -transparent #FBFAFE -transparent #FBFBF7 -transparent #FBFBF8 -transparent #FBFBF9 -transparent #FBFBFA -transparent #FBFBFB -transparent #FBFBFC -transparent #FBFBFD -transparent #FBFBFE -transparent #FBFBFF -transparent #FBFCF8 -transparent #FBFCF9 -transparent #FBFCFA -transparent #FBFCFB -transparent #FBFCFC -transparent #FBFCFD -transparent #FBFCFE -transparent #FBFCFF -transparent #FBFDF8 -transparent #FBFDF9 -transparent #FBFDFA -transparent #FBFDFB -transparent #FBFDFC -transparent #FBFDFD -transparent #FBFDFE -transparent #FBFDFF -transparent #FBFEF9 -transparent #FBFEFA -transparent #FBFEFB -transparent #FBFEFC -transparent #FBFEFD -transparent #FBFEFE -transparent #FBFEFF -transparent #FBFFFA -transparent #FBFFFD -transparent #FBFFFE -transparent #FBFFFF -transparent #FCF7F7 -transparent #FCF7F8 -transparent #FCF8F7 -transparent #FCF8F8 -transparent #FCF8FA -transparent #FCF9F7 -transparent #FCF9F9 -transparent #FCF9FA -transparent #FCF9FB -transparent #FCF9FC -transparent #FCFAF7 -transparent #FCFAF8 -transparent #FCFAF9 -transparent #FCFAFA -transparent #FCFAFB -transparent #FCFAFC -transparent #FCFAFD -transparent #FCFAFE -transparent #FCFBF7 -transparent #FCFBF8 -transparent #FCFBF9 -transparent #FCFBFA -transparent #FCFBFB -transparent #FCFBFC -transparent #FCFBFD -transparent #FCFBFE -transparent #FCFBFF -transparent #FCFCF7 -transparent #FCFCF8 -transparent #FCFCF9 -transparent #FCFCFA -transparent #FCFCFB -transparent #FCFCFC -transparent #FCFCFD -transparent #FCFCFE -transparent #FCFCFF -transparent #FCFDF8 -transparent #FCFDF9 -transparent #FCFDFA -transparent #FCFDFB -transparent #FCFDFC -transparent #FCFDFD -transparent #FCFDFE -transparent #FCFDFF -transparent #FCFEFA -transparent #FCFEFB -transparent #FCFEFC -transparent #FCFEFD -transparent #FCFEFE -transparent #FCFEFF -transparent #FCFFFB -transparent #FCFFFC -transparent #FCFFFD -transparent #FCFFFE -transparent #FCFFFF -transparent #FDF8F8 -transparent #FDF8FB -transparent #FDF9F9 -transparent #FDF9FA -transparent #FDF9FC -transparent #FDFAF7 -transparent #FDFAF8 -transparent #FDFAF9 -transparent #FDFAFA -transparent #FDFAFB -transparent #FDFAFC -transparent #FDFAFD -transparent #FDFAFE -transparent #FDFBF7 -transparent #FDFBF8 -transparent #FDFBF9 -transparent #FDFBFA -transparent #FDFBFB -transparent #FDFBFC -transparent #FDFBFD -transparent #FDFBFE -transparent #FDFBFF -transparent #FDFCF8 -transparent #FDFCF9 -transparent #FDFCFA -transparent #FDFCFB -transparent #FDFCFC -transparent #FDFCFD -transparent #FDFCFE -transparent #FDFCFF -transparent #FDFDF8 -transparent #FDFDF9 -transparent #FDFDFA -transparent #FDFDFB -transparent #FDFDFC -transparent #FDFDFD -transparent #FDFDFE -transparent #FDFDFF -transparent #FDFEFA -transparent #FDFEFB -transparent #FDFEFC -transparent #FDFEFD -transparent #FDFEFE -transparent #FDFEFF -transparent #FDFFFB -transparent #FDFFFC -transparent #FDFFFD -transparent #FDFFFE -transparent #FDFFFF -transparent #FEF7F7 -transparent #FEF8F7 -transparent #FEF8F8 -transparent #FEF8F9 -transparent #FEF9F7 -transparent #FEF9F8 -transparent #FEFAF7 -transparent #FEFAF8 -transparent #FEFAF9 -transparent #FEFAFA -transparent #FEFAFB -transparent #FEFAFD -transparent #FEFBF9 -transparent #FEFBFA -transparent #FEFBFB -transparent #FEFBFC -transparent #FEFBFD -transparent #FEFBFE -transparent #FEFBFF -transparent #FEFCF8 -transparent #FEFCF9 -transparent #FEFCFA -transparent #FEFCFB -transparent #FEFCFC -transparent #FEFCFD -transparent #FEFCFE -transparent #FEFCFF -transparent #FEFDF7 -transparent #FEFDF8 -transparent #FEFDFA -transparent #FEFDFB -transparent #FEFDFC -transparent #FEFDFD -transparent #FEFDFE -transparent #FEFDFF -transparent #FEFEF8 -transparent #FEFEF9 -transparent #FEFEFA -transparent #FEFEFB -transparent #FEFEFC -transparent #FEFEFD -transparent #FEFEFE -transparent #FEFEFF -transparent #FEFFFB -transparent #FEFFFC -transparent #FEFFFD -transparent #FEFFFE -transparent #FEFFFF -transparent #FFF7F7 -transparent #FFF7F8 -transparent #FFF8F7 -transparent #FFF8F8 -transparent #FFF8F9 -transparent #FFF9F7 -transparent #FFF9F8 -transparent #FFF9F9 -transparent #FFF9FA -transparent #FFF9FB -transparent #FFFAF7 -transparent #FFFAF8 -transparent #FFFAF9 -transparent #FFFAFA -transparent #FFFAFB -transparent #FFFAFD -transparent #FFFBF7 -transparent #FFFBF8 -transparent #FFFBF9 -transparent #FFFBFA -transparent #FFFBFB -transparent #FFFBFC -transparent #FFFBFD -transparent #FFFBFF -transparent #FFFCF7 -transparent #FFFCF8 -transparent #FFFCF9 -transparent #FFFCFA -transparent #FFFCFB -transparent #FFFCFC -transparent #FFFCFD -transparent #FFFCFE -transparent #FFFCFF -transparent #FFFDF7 -transparent #FFFDF8 -transparent #FFFDFA -transparent #FFFDFB -transparent #FFFDFC -transparent #FFFDFD -transparent #FFFDFE -transparent #FFFDFF -transparent #FFFEF7 -transparent #FFFEF8 -transparent #FFFEF9 -transparent #FFFEFA -transparent #FFFEFB -transparent #FFFEFC -transparent #FFFEFD -transparent #FFFEFE -transparent #FFFEFF -transparent #FFFFF8 -transparent #FFFFF9 -transparent #FFFFFA -transparent #FFFFFB -transparent #FFFFFC -transparent #FFFFFD -transparent #FFFFFE -transparent #FFFFFF png32:"to.png"

おれは
つねに
ばかだな。
🥴

絶対もっといい方法あるでしょ。

喉をやられてgroggy

胃酸に粘膜を焼かれたような感じ。または濃厚なhouse dustに曝されたような感じ。日本では「グロッキー」表記のほうが一般的だけど、英語をさっぱりわからない私がどうこう言えないわな。昔「カプコナイズ」とか造語を編み出した気がするけど、CAPCOM-izeなら「カプコマイズ」が正しいよな。


の当日記で私は以下のようにmemoし、さらにこの問題を修正したつもりだった。

  • Haloの一部の図表は#BMP定義を持つがBGA channelが無い。旧版拙作変換器、無事死亡。
しかしに“Haloに追加された動画差分を確認したところ、強制終了しないだけでは不足であることが分かった。図表著者氏らは、以下の不正なBMSが受け入れられることを期待している。
#BMP01 Halo_BGA.mpg
#00104 01
Comma区切りでないchannel文や、Comma区切りの定義さえ、LR2/BMSE/uBMplayは受け入れる。
#BMP01:Halo_BGA.mpg
#00104 01

Robustness principle(送信は厳密に、受信は寛容に)に従って、私は拙作変換器のparserを書き直したが(未upload)、う〜ん、図表側を普通に#00104:01に書き直せば、Angolmois/beatoraja/HDX/Pulsus/QMS等でも動画が再生されるようになるのに、もったいない。あ〜、でも既に登録されたInternet Rankingの席が図表改訂によって失われるほうがもったいないのか?

わからない

自力でnanasigrooveの描画結果を真似しきるのは無理と結論して、DirectXを経由するcommand-line toolsを探した。DirectXのPNG関連処理が具体的に何をやっているのか結局さっぱりわからなかったので、いっそnanasigrooveが使っているであろうAPIに全てを委ねてみようという発想。Microsoft謹製のTexconvが、私の期待通りに働きそうだった。しかし、うまくいかない。どうして……

nanasigrooveと同じ描画結果になるapplicationsはいくつか見つけていて、そのひとつMassiGraは古いlibpngを利用しているらしい。これかあ……? しかしC言語のsourceを読むのは私にとって難しい。

Toolsを探している過程でPNG Edge Jaggy Cleanerとやらを見かけて、これは個人的に別の用途で微妙に欲しいやつだったので、なんか得した気分になった。

XMedia Recodeの64-bit版を見かけて、こんなの前から出てたっけ? まあいいや、とか思いながら軽率に導入したら起動しなくなって、今までの変換設定がわやになった。そんなー

Photoshop 5.0のbugを加味してもPNG gammaの計算が合わないのでG2R2018に逃げる

今年は5192296858534827628530496329220096という歴史的傑作が生まれた一方で、GO BACKしすぎなDead or Arabesqueみたいな怪作もあり、個人的には非常に楽しい。

数列#TITLEは私にはとても覚えられないので以降2112と表記する。これは誰が見ても真っ当に凄い。なんであんなえぐい和音を無作為に鳴らしておいてしれっと本筋に戻ってこれるんだ…… もちろん無作為ではなく確固たる音楽理論に基づいて計算され尽くした曖昧さだからだろうけど、これは一見普通に見えて実際は今まで誰もやろうとしなかった難行。展開が無作為化されているという事前知識を持って遊ぶとじつにthrilling。音階も凄いけど休符も凄い。氏は非常に良いsense of rhythmをも持つ。

T3Mはなんというか、釣られまいぞと思ってたけど無理だった。LR2で正常に表示されないからという理由でreadme.txtのencodingをUTF-8からShift_JISに変更した作品がある一方で、糞みたいな理由でUTF-16LETIX’s BMSC時代の「の小節長(でなく)」を完璧に使いこなして糞みたいな着地。あとまったく無意味な#LNTYPE 2宣言はともかく、二十世紀末のBGA senseはじつはeventの主旨に直球で寄り添うものかもしれなくて、私はけっこう普通に感動させられた。

Photoshopのbug

おかしなガンマ値が埋め込まれてる例

下のスクリーンショットは、ぼくの友達 (Macユザ) が Photoshop 5.0 で作った、とある PNG 画像を HexEdit で開いたところ。

やっぱりガンマ 4.4 などとゆートンデモな値がうめこまれてるらしいIE でこれを表示すると、ガンマ 4.4 で作られたものとして扱われるので、Mac (ガンマ1.8)/ WIn (ガンマ2.2) のどちらでも本来より暗い表示になるです

Applications: Image Editors (PNG: The Definitive Guide)

Unfortunately, the gamma information PS5 saves in PNG images is wrong; it is always too small by a factor of two, resulting in images that display much too darkly.

えっ俺なんでこんな砂漠の中の水一滴みたいなbug踏まされてるの…… こんなののせいで十日以上詰まってたとかうけるんだけど……

Gu-Gu Gamma

わかりやすい PNG の話 for Web2.2節の補足で例示されている半透明PNG画像を借用して#EXBMPを調べている。うまくいかない。nanasigroove 1.552上で、以下のBMSは期待通りに(?)働く。

#TITLE #EXBMPzz a,r,g,b filename
#BPM 80
#EXBMP01   0,   0,   0,   0 ve.png
#EXBMP02  64, 255, 228, 173 ve.png
#EXBMP03 128, 255, 228, 173 ve.png
#EXBMP04 191, 255, 228, 173 ve.png
#EXBMP05 255, 255, 228, 173 ve.png
#00004:01
#00104:02030405
#00211:01
  • このrgb(255,228,173)は、「透過率0 %の部分における、明るい肌の色」を採取したもの。
  • ただし、画素自身はrgb(255,228,173)を持っていない。実際のRGB値は(255,241,210)
  • nanasigrooveに対しては、Gamma等の補正された値を指定する必要があるようだ。
  • 補正後の値は計算方法次第で微妙に異なる。補正しないapplicationsもある。
  • たとえばWindows Photo Viewerでve.pngを開くと、透過率0 %の肌色はrgb(255,229,174)
  • が、前述の#EXBMP例からARGB値が±1でもずれると、その定義は期待通りには透過されない。

ここまでは十日以上前に調査済み。補正前のRGB値とPNG gAMA chunkは普通に取得できるので、あとは苦も無く変換できそうなもの。なのに何度やっても計算が合わない。いつものごとく私は初歩的なことを見落としているに違いない。色空間やcolor profile等の変更は一通り試したつもり。

Oggenc2.88 using aoTuVb6.03 (Lancer Builds)

Lancer版も一年振りに更新されていた。現時点では更新日時がになっている。じつはにもlibVorbis版とaoTuV版は地味に更新されていた。付けでそれらも改めて更新された。


ここ数日間、Nekokan Serverが非常に不調な状況だそうです。現在serverは必要最低限の装備で稼働しているらしく、完全復旧までは時間がかかるかも……とのことでした。G2R2018という大規模eventも開催中ですし、閲覧者の方々におかれましてはあまり負荷をかけないようお手柔らかにお願いしたいところです。私はG2R2018の閲覧に関してはsmartphone用のlistをおすすめしています。画像やStyleSheet/JavaScript等の関連resourcesを含めてもせいぜい10 filesくらいしか読み込まずに済むので、PC用のlistに比べると圧倒的に軽量です。

出、出〜www土爪〜www

ImageMagickを用いて#EXBMPをBMSONの型にはめることはできた。知恵をかなぐり捨てる方法によって強引にDirectXをemulateしたが、Y.L.Cafeのようにalpha-channelを持つ画像は未だにnanasigroove上での描画結果と一致させることができていない。ここで三日くらい詰まっている……

#TEXTzz stringにおいて、文字列値を引用符で囲うことをnanasigrooveは推奨している。その理由を私はようやく理解できたと思う。以下の#TEXT[01-05]の値はnanasigroove上において等価。

#bpm 120
#title text test
#text01   ->
#text02     ->
#text03       ->
#text04         ->
#text05   "->"
#text06   "  ->"
#text07   "    ->"
#text08   "      ->"
#00199:01020304
#00299:05060708
#00311:01

拙作変換器はいまのところkeyとvalueの区切り文字を「一文字の空白類文字」と決め付けているので、こういった例を投げられると困ってしまう。#EXBMPのfilepath部分に関しても同じことがいえて、解釈をnanasigrooveに寄せるなら文字列値の前後の空白はtrimしなければならない。しかしtrimすると他の機種のようには「空白から始まるfilename」などを読めなくなる。お手上げ。

QMS-player Ver. 0.92

Double-Play (10 Keys & 14 Keys) mode、およびPMS (9 Buttons) modeがついにsupportされました! 今回は旧versionから一箇月しか経っていないにもかかわらず重要な更新が大量に入っているので、G2R2018非公式packages(私は未確認ですが既に編纂されreleaseされているらしい)あたりと一緒に導入してみるにはちょうど良い機会だと思います。

【Freak《Show】Down》[Ninja House]とか読ませると-306 LEVEL FOLDERが作られて、それ選ぶと強制終了したりしますけど、重箱の隅を楊枝でほじくる感じのあのへんのごく一部の図表以外なら既に安定して遊べる域に達していると思うので、Computerに詳しくない日本語環境のWindows usersに対しては特にQMS-playerを積極的に推していきたいです。

_wsh_bms2bmson.js v0.1.9

  • #EXRANK ddd#DEFEXRANK dddと同一視するようにした。(本来の#EXRANKzz dddとは異なる)
  • #BPM 0"init_bpm":0に変換してしまっていたbugを修正した。
  • #TOTAL 0"total":0に変換できなかったbugを修正した。
  • #DIFFICULTYの打ち間違いを(ある程度)吸収するようにした。

いまのところ以下のpatternsを拙作変換器は忖度して#DIFFICULTY [0-5]と同一視する。

#DIFFICULTY 02
#diffidulty 04
#DIFFICULTY  4
#DIFFUCULTY 3
#DIFICULTY 2
#DEFFICULTY 1
#DIFFICULT 3
#DIFFICULTLY 4
#DIFFICULTY2
#DIFFICULTY:3
#DIFFICULTY 3: HYPER

これらの例はすべてBOFU2017とG2R2018で私が実際に見かけたもの。BOFU/G2R以外の作品でもそこかしこでtypoを見かけたような記憶がぼんやりあるが、具体例を思い出せず対処していない。

_wsh_bms2bmson.js v0.1.8-2

  • var LIMITED_RESOLUTION = 3;のとき、"resolution"を最小化するようにした。
  • [v0.1.8-2] 前述の処理が酷くbuggyだったので一時的に無効化した。
  • 値が0や負数の#STOP sequenceを従来は無視していたが、今回から変換するようにした。
Halo_r2_rather.bmeや、自由電子レーザーFEL_LNS.bmsは、#STOP01 -1を用いる。

charatbeatHDXやuBMplayを含むいくつかの機種は、負数値の#STOPをおそらくは図表著者氏らが期待する通りに演奏することができる。ただしこの挙動は仕様で定められたものではなく、最近のBMS関連applicationsの間でも解釈は分かれる。拙作変換器v0.1.8を通せば、BananaBeats 20180529やbeatoraja 0.6.4でもこれらの図表を「図表著者氏らが期待する通りの解釈で」遊ぶことができる。

Negative stop value
AppsBMSBMSON
Banana 20180529NoYes
beatoraja 0.6.4NoYes
Bemuse v42YesYes
Pulsus 0.5.3YesNo
raindrop 0.600YesYes
  • 備考:BMSON仕様が定める停止値の範囲は、04294967295。負数は仕様の範囲外。
  • 備考:LR2はすべての負数#STOP値を-1とみなし、192分音符×1個分、図表をskipする。

同一のpulse座標上に複数のstopEventsが存在し、各duration値の正負が入り混じる場合、BMSON実装は停止時間を足し引きする必要がありそうだ。もっと変換器がそのあたりをおもんぱか必要はなさそうなので無視していたが、duration:0への変換が行えないのは仕様違反かなと思い直した。

_wsh_bms2bmson.js v0.1.7

  • #BMP定義があるが#xxx0[467A]がない図表を変換しようとすると強制終了する問題を修正。
  • FULL STOPから始まり数字が後続する文字列を、有効な小数値として解釈するように変更。
  • 図表基底名の重複に対処するために、出力される図表名に元の拡張子も含めるように変更。
  • #GENRE stringを複数行に複数回記述する、異なる値の多重定義を受理するように変更。

G2R2018List for Smartphone)登録作品をつまみ食いしていた。

  • Haloの一部の図表は#BMP定義を持つがBGA channelが無い。旧版拙作変換器、無事死亡。
  • A.KA.MA.TAKU.RO.MA.TA#xxx02:.5が70個。旧版拙作変換器で変換できず、直した。
  • #SCROLLzz -.dddのような定義も絶対出てくるでしょ、と思ったので受け入れ可能にした。
  • 基底名が重複する状況への対処と、#GENREsによるTaggingへの準備は、思いつきで入れた。

【Freak《Show】Down》_cartoonworks_73.bmsの最後のような小節線芸、拙作変換器は現状では全部なかったことにしてしまう。「図表著者が意図せず拍子を#999まで一様に変更してしまっている状況」と区別できるなら、残したほうがいいような気もするけど。う〜ん、「一拍未満の小節長が連続するなら小節線を残す」とか?

LibreOfficeをv6.1.3.2にUpdateしたらWeb browser上でEmojiが壊れた。以前も同じ目に遭った

Oggenc2.88 / oggdropXPd V.1.9.2

  • libVorbis 1.3.5 1.3.6
  • libOgg 1.3.2 1.3.3
  • Generic: Visual C++ 2008 2015
  • P4/Athlon64 and x64: Intel C++ Compiler 14.0.5 18

Visual C++ Runtime Librariesのsupport期限に関して、Generic旧版は時点で延長supportも終了していたっぽいので、今回の更新で難を逃れたという理解でいいんでしょうか。Oggenc2とかはWindows 9x系では走らないから、Runtimeが無関係ってことはないんでしょうけど、私はWindows XP以降のOSで実行環境として特に何かを要求された記憶はないし、このあたり非開発者の類人猿にはさっぱりわからない部分です。まあ、わからない人はなおさら最新版を使いましょうということで。

_wsh_bms2bmson.js v0.1.6

  • #BMP00/#BGA00が存在する図表で、bga関連idの並べ替えが失敗していたbugを修正。
  • ImageMagick 7以降で不要になったconvert commandをやめた。magickのみを使う。

ImageMagickのcommandが本当にわからない…… 先日の例で使った画像を#EXBMPのように透過しようと試みて、いまのところnanasigroove上での描画結果に最も近づいた指定がこちら。

magick around-7F7F7F.bmp -fuzz 3.125% -transparent "#7f7f7f" png32:_exbmp.png

5行5列の表のうち、中央の9 cellsのみ近似色として透過されることを期待したが、実際は十の字形に透過されてしまう。histogram:info:を問うと、対象画像の色は正しく認識されている。256諧調から許容誤差±8をとるように-fuzzを指定したつもりだが、結果は閾値をぶち抜いていく。元の色成分(7F)を残すcellsだけが透過されるところをみるに、「近似色」の判定基準がDirectXのそれと異なるような感じ。

-fuzzに頼れないとなると、-fxで黒魔術に挑むしかないのだろうか…… よりによって英語と数学とか睡眠導入剤でしかないし、commandline引数に計算式なんか書きたくないけど、他に方法がないなら仕方がない…… あっ解説頁を眺めていたらまだ前なのに急激に眠くなってきた。無理。

_wsh_bms2bmson.js v0.1.5

  • #EXRANK#CHANGEOPTIONの変換後の"y"座標が再計算されなかったbugを修正。
  • option_events[n].notesoption_events[n].triggersに改称した。
  • 拡張子*.m4vも動画とみなすようにした。
#EXBMPをBMSON形式に変換可能にするために、nanasigrooveの仕様・実装を調査した。
  • 通常、#BMP Layer画像は「rgb(0,0,0)の領域(黒く塗られた部分)」を透過する。
  • nanasigroove独自拡張命令#EXBMPは、この透過領域を「任意の色」に変更できる。
  • rgb(x,y,z)が透過指定されたとき、rgb(x±8,y±8,z±8)の領域が実際に透過される。
  • rgb(0,0,0)の領域は、rgb(8,8,8)などの近似色として巻き込まない限り、透過されない。
  • #EXBMPzz 0,0,0,0 xxx.bmpのように指定すれば、色が何であれまったく透過されない

画像“around-7F7F7F.bmp”:5列5行の表。中央のcellはrgb(127,127,127)で、周囲のcellsはその近似色で、それぞれ塗りつぶされている。

#title nanasigroove #EXBMP test
#bpm 130
#bmp01 red_256x256.bmp
#bmp02 around-7F7F7F.bmp
#exbmp03 0,127,127,127 around-7F7F7F.bmp
#exbmp04 0,8,8,8 around-7F7F7F.bmp
#exbmp05 0,0,0,0 around-7F7F7F.bmp
#00004:01
#00107:02030405
#00111:01010101

透過率情報を持つPNG画像に対しては、「任意の透過率と任意の色」を透過領域として指定できる。

#EXBMP01 64,255,228,173 alpha.png

前述の例は、alpha.pngの色領域rgb(255,228,173)のうち、透過率75 %(=非透過率25 %256段階に換算すれば64)に設定されている部分のみを、「完全な透過領域」として指定する。

  • もしも画像そのものが半透明なら、下地の内容は#EXBMPでなくとも)ある程度透過される。
  • 画像自体の透明度とは別に、#EXBMPにて指定されたαRGB領域は完全に透過されるようになる。
  • 対象透過率は厳密に特定する必要がある。色領域のようには近似値を透過してくれない。
  • nanasigrooveはBITMAPV4・BITMAPV5等の「透明度付きBMP」に非対応?(描画されない)
  • nanasigrooveがsupportしているらしいTGA画像・DDS画像の透過関連を、私は試していない。

わかりやすい PNG の話 for Web2.2節の補足で例示されている半透明PNG画像を借用して手元で適当に試した限りでは、α値の扱いは先にまとめた通り。ここまでで#EXBMPの仕様は概ね把握できたと思うが、「指定したαRGB領域を完全に透過せよ」とImageMagickに命じるcommandがわからない。

以下は#EXBMPにさして関わらない、nanasigrooveのBMS parserに関する調査。

  • nanasigrooveのBMS command delimiterは、C言語でいうところの標準空白類文字っぽい。
  • U+0020以外にも、commandによってはU+0009, U+000B, U+000C, U+000Dさえ使えてしまう。
  • U+000D Carriage Returnは、Classic Mac OS (1984–2001)では改行文字だったはず……
  • #EXBMP、数字の先頭が0(の連続)でも構わない。数字の直後のCOMMAは必須(Blue除く)。
  • #EXBMPCOMMAの後から次の数字の間に空白類があってもなくても連続しても構わない。
  • #EXBMPCOMMAが連続すると駄目。
  • #EXBMPARGB値の後からfilepathの間にU+000B・U+000Cがあると駄目。
  • #EXBMP、実際のfilenameが alpha.pngのように空白から始まる場合は空振りする

_wsh_bms2bmson.js v0.1.4

  • 必要なImageMagickの最小versionを一年前の7.0.7-11から最新版7.0.8-14に変更。
#CHANGEOPTIONzzも変換するようにした。

#CHANGEOPTIONzzが用いる#xxxA6は基本的にはBGM notesと同様に複数行列挙可能なchannelですが、nanasigrooveが持つoption-IDsのいくつかは排他的な性質を持っています。変換器は個々のoption-IDsまでは見ていないので、同一のy座標に対して競合する指定がされている場合は図表著者の期待通りには変換されないかもしれません。そもそも元から期待通りに動作しない可能性さえあります。

#title STEALTH or not
#changeoption01 774:HIDDEN_STEALTH
#changeoption02 774:HIDDEN_OFF
#001a6:0001
#001a6:0002
#00111:01010101

前述の例は見た目に反してHIDDEN_STEALTHが適用されます(すくなくともnanasigroove ver.1.552においては)。nanasi1は分岐の構文解析なども含めてloopを末尾から走査しているふしがあり、記述順に依存する曖昧な図表は他とは異なる解釈がなされる場合があります。

{"info":{"title":"STEALTH or not","resolution":1},
"option_events":[
{"name":"774:HIDDEN_STEALTH","notes":[{"y":6}]},
{"name":"774:HIDDEN_OFF","notes":[{"y":6}]} ]}

BMSON変換後はこのように定義ごとにまとまるので、「nanasi1においては無効になるoption」が定義に巻き上げられる形で有効になる可能性はあります(その逆もありそう)。記述順に依存しない図表(曖昧さがない図表)なら、このような問題は発生しません。

_wsh_bms2bmson.js v0.1.3

#TEXTzz#EXRANKzzも変換するようにした。
#title #TEXT and #EXRANK

#text00 "\"MISS\""
#song01 Let’s play basketball!!
#text02 ""
#song02 "You are the ball!!"
#00199:01020103

#rank 3.14159265358979
#exrank01 20.125
#exrank02 potato
#001a0:010002

#00211:01
  • #TEXT00BMSInfo.poor_textに隔離する。#TEXT[01-ZZ]text_eventsに隔離する。
  • #SONGzz#TEXTzzのaliasとして解釈する。競合時は#TEXTzzを優先する。
  • #EXRANK[01-ZZ]judge_eventsに隔離する。

前述の例で#exrank02は無効な値なので、#001a0:010002#001a0:01と事実上等価。しかし拙作parserは現段階では「data文が参照する内容」を評価する前に「data文の長さ」を拾っているので、無意味なdata文によって分解能計算が狂わされる。私の目的を達成するためにBMSONの"resolution"を最小化する必要がありそうなので、どうにかしたい。[追記] v0.1.8でどうにかしたつもり。失敗。


Toy Musical 3” Ver.2.4がreleaseされていたようです! 私はほぼ二箇月遅れで気づきました💦 nanasigrooveの独自拡張のうち、透過channels#xxx[0B-0E])、#EXBMP、および#ARGBに関しては、ImageMagickに丸投げする形でBMSON用画像群に変換できそう。#@BGA#xxx0Aは対応済み、#EXWAV#SWBGAは普通に無理、なのであとは#CHANGEOPTIONかな。

_wsh_bms2bmson.js v0.1.2

  • #BGAの不正な値を受け入れていたbugを修正。
  • 出力されるBMSONのbga関連idをsortするように修正。
  • 出力されるBMSONのbgaHeaderに余計なkeysが生えていたbugを修正。
  • #MOVIE#VIDEOFILEにごく大雑把に対応(bga_events"y":0が空いていれば挿入)。
  • 「同じ内容のBGA関連notesが連続する場合、後続分を休符に置き換える処理」をやめた。

次期BMX2WAV関連の開発日誌が更新再開されていました! 

日記

BMS関連

拙作BMS
bubble / hitkey
二次配布BMS
ノイズの海と鯨 / moka
PARTY TIME IN MY DREAM / HAIJI
BMSE非公式ヘルプ
Lite
Lite-online
Full
Full-online
buglist
iBMSC
Web (Japanese version)
issues
BMS差分
a­nal­gam
boléro
Ketch­up
quovadis
SELF
yellows
Do not use non-ascii filenames
雑多なメモ
bmsplayer data
bms benchmark
Secrets - Feeling Pomu 2nd
grid2sec
bmx2xxx
BMx Outliner
BMS command memo
BMS command memo (Japanese version)
BMS EVENT LITE
#RANDOM BMS list
BMS #OPTION command
BMS Bitmap test
Extended BPM
STOP Sequence
BMS Edge Cases
BMS extensions proposed by Sonorous (unofficial Japanese version)
BMS 2.0 (unofficial Japanese version)
BMS Editors
Do not use non-ascii filenames
BM98 Kikuchan Version 3.30 Revision #4.2
BMSON Checker
_wsh_bms2bmson.js

その他

HTML関連メモ
Dakuten on HTML
nest1000
EVS
Nervous Cascading
Source Han Sans test
User-Agent String
CSS Logical Properties