doubledepth

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