doubledepth

_wsh_bms2bmson.js v0.0.8

#STP(bemaniaDX書式のSTOP sequence)をsupportした。

_wsh_bms2bmson.js v0.0.7

#LNTYPE 2(MGQ書式)をsupportした。SHK氏の古いBMSの一部(“shk67\heavenly demonic_NBK(HD5KEY).bmsや、shk70\im_GB2.bmsなど)を正しく変換できるようになった。

shk40の書式不明のLongNote図表をうまく変換できないのは、仕様とさせてください。
  • Rhythm-itでこの図表は、「LongNote終点まで鍵盤を押し続け、LongNote終点に重ねられた可視noteを押下せよ」というKusofumenと化す。
  • ruv-it!では誤り訂正が働いて、LongNote終点位置に重ねられた可視noteも(始点位置に重ねられた可視noteと同様に)撤去されるようになった。しかしその結果として、LongNote終点位置に重ねられた可視notesの音声は、図表著者が期待した形では鳴らされなくなった。
  • LR2でも誤り訂正が働くが、AUTOPLAY中は「LongNote終点位置に重ねられた可視note」も鳴る。
  • LongNoteの始点側のみが存在し、終点側が見つからないまま図表終端に達したとき、ruv-it!は図表終端をLongNote終端とみなす。一方LR2はこれを無効なLongNoteとみなし、始点側を捨てる。

拙作構文解析器では、おそらくbeatoraja 0.5.1と同じ解釈がなされる。図表終端がLongNote終端として補完されない点を除けば、ruv-it!と同じように図表が解釈される(と思う)。

_wsh_bms2bmson.js v0.0.6

重複するBGM notesが変換されないBugを修正した。影響範囲が広い。すみません。

#BPM 120
#WAV01 kick.wav
#00101:01
#00101:01
{"":"🎹","version":"1.0.0",
"info":{"init_bpm":120,"level":3,"resolution":240},
"lines":[{"y":0},{"y":960},{"y":1920}],
"sound_channels":[{"name":"kick.wav","notes":[]}]}

KEYとBGMで同じ音が同時に鳴る場合はBGM側を破棄する」というBMSON仕様がある。これを満たすための処理を微妙に間違えていた。修正後は正しく"notes":[{"y":960}]に変換される。

_wsh_bms2bmson.js v0.0.5

画像自体の変換はうまくいっていたが、出力されるBMSON図表の画像定義関連に致命的なBugがあった。FilePathの定義を変換する際に、FilePath文字列の加工を誤っていた。このBugを修正した。

FileNameのみを定義している大多数のBMS図表には、このBugの影響はありません。BOFU系の巨大なBMS eventsでは稀に相対pathを定義している図表が存在しますが、それらがもし画像形式のLAYERを用いていたなら、v0.0.4までの変換器では誤変換される可能性があります。申し訳ございません。

長く退屈な詳細:
#BMP01 ..\cyc-foonmain_00000.bmp
#BMP02 ../title.bmp
#BMP03 ./cyc-foonmain_00000.bmp
#BMP04 .\title.bmp
#BMP05 child/cyc-foonmain_00000.bmp
#BMP06 child/title.bmp
#00104:01
#00107:0002
#00204:03
#00207:0704
#00304:05
#00307:0706

こういうPathの定義が、v0.0.4まではこんなんなっちゃってたので、

"bga":{
"bga_header":[
{"id":1,"name":"..\\cyc-foonmain_00000.bmp"},
{"id":2,"name":"___alpha_layer_../title.png"},
{"id":3,"name":"./cyc-foonmain_00000.bmp"},
{"id":4,"name":"___alpha_layer_.\\title.png"},
{"id":5,"name":"child/cyc-foonmain_00000.bmp"},
{"id":6,"name":"___alpha_layer_child/title.png"},
{"id":7,"name":"___undefined_alpha.png"}
],

v0.0.5以降ではちゃんとこうなるように修正した。

"bga":{
"bga_header":[
{"id":1,"name":"..\\cyc-foonmain_00000.bmp"},
{"id":2,"name":"..\\___alpha_layer_title.png"},
{"id":3,"name":"./cyc-foonmain_00000.bmp"},
{"id":4,"name":"___alpha_layer_title.png"},
{"id":5,"name":"child/cyc-foonmain_00000.bmp"},
{"id":6,"name":"child\\___alpha_layer_title.png"},
{"id":7,"name":"___undefined_alpha.png"}
],
"bga_events":[…],
"layer_events":[…]},

変換Logから抜粋する通り、上位階層への参照はBMSON仕様違反なので、画像を変換しない。

"these_layers_are_converted_to_alpha_png": {
    "success": [
        "child\\title.bmp => child\\___alpha_layer_title.png",
        "title.bmp => ___alpha_layer_title.png"
    ],
    "failed": [
        "../title.bmp [Err] Invalid Path. (See BMSON Spec)"
    ]
},
"created_explicit_image": [
    "___undefined_alpha.png"
],

以下のような定義は、BMSONの仕様に違反する。BMSON図表内のPath文字列は、必要なら「BMSに定義されている通りの位置を参照するように」変換されるが、BMSONとしては正しくない。正しさが保証されないpathを食わされたまま頑張りたくないので、画像そのものは変換しない。

// above the current folder
#BMPz1 a//b\\\\c/../\..\/.\../..\\\title.bmp
// if HDX_COMMENT = true,  #BMPz1 = "a" (BMSON valid?)
// if HDX_COMMENT = false, #BMPz1 = "..\\title.bmp" (BMSON invalid)

// Full path (Windows) (BMSON invalid)
#BMPz2 D:\bms\title.bmp

// Full path (Unix) (BMSON invalid)
#BMPz3 /D/bms/title.bmp

BMSONの仕様に違反するかどうか判断がつかなかったが、Windows固有の「Drive名つき相対path」も、すくなくともこの変換器では違反として扱う。必要ならBMSON図表内文字列のみ変換される。

// If this chart file exists on D-drive,
// title.bmp in the same folder as this chart file is found.
#BMPz4 D:title.bmp
// BMSON invalid

前述の、まるでFull Pathの書き間違いのように見える#BMPz4定義は、「もしこのBMS図表がD-Drive上に存在するなら、BMS図表と同じfolder内にあるかもしれないtitle.bmpが参照される」という意味であるはずだが、自信がない。

BMSON仕様は「『BMSON図表が存在するfolder』の外部を参照するpath」を問答無用で禁止してくれているので、食わされるfile pathの検証処理はかなり楽な部類だと思う。それでもなお、file pathまわりは私には難しすぎる。ピリオドで始まったり、ピリオドで終わる ファイルやフォルダ作ってみたよ!」とか最近知ってがっくりきたし。これたぶん260文字制限とかも外せるやつだよね……


v0.0.4で「C-like Comment Syntaxの実装がうまくいかない」と書いたが、普通にうまくいっていた。

私が眠すぎて勘違いしていただけだった。
#TITLE "\"あい\"うえお /* ♡ */ニャハ" /* ここはコメント内 */\"文字列\"は続くよ"どこまでも/* ▵ */ムー"// 残りはコメント

HDX/IIDXvにおいて、前述の#TITLEの値は以下の文字列としてparseされる。

"あい"うえお /* ♡ */ニャハ "文字列"は続くよどこまでも/* ▵ */ムー

ということは、前述の#TITLEが以下のBMSON codeに変換されていれば、正しく変換されている。

"title":"\"あい\"うえお /* ♡ */ニャハ \"文字列\"は続くよどこまでも/* ▵ */ムー",

ただ、このHDXの特徴は影響範囲が広すぎて難しい。すくなくとも変換時には使いどころなさそう。

  • #WAV01 a,b;c.wavは、file “a,b;c.wavではなく、file “a,bを探す。
  • #BMPz1 a//b\\\\c/../\..\/.\../..\\\title.bmpは、../title.bmpではなく、aを探す。

_wsh_bms2bmson.js v0.0.4

【G2R2014 詳細情報】 TEAM : メスの本能 No.236 "croque em bouche / noctie* "のNormal図表で強制終了するBugを修正した。#xxx5nの行に#LNOBJの番号が現れることを想定していなかった:

#LNOBJ 04
#04154:04

この例はLongNoteとして解釈されるほうがよさそうだったのでそのようにしたが、各laneの最初のNoteが「#xxx5n、かつ突然の#LNOBJ」だった場合などについて真剣に考慮してはいない。

修正ついでに、#LNOBJ zなら値0Zと見做し、#LNOBJ 0123なら値23と見做すように変更した。

charatbeatHDX VIOLETおよびBMIIDXView2015のC-like Comment Syntaxを実装した。変数HDX_COMMENTから真偽値で有効無効を切り替える。私の理解した通りに実装したつもりだが、明示的文字列がWeb版の構文解析結果と異なり、うまくいかなかった。果てしなく眠いので修正は後日に

_wsh_bms2bmson.js v0.0.3

ImageMagickについて「Portable版でも可」と書いたが、v0.0.2まではむしろPortable版しか使えなかったv0.0.3からはInstaller版にも対応した。Installer版を使用されていた方、申し訳ございません。

以下にConfigの詳細を書いた。

var TARGET_FOLDER = "D:\\bms\\BOFU2017";

変換対象BMS群のroot folderをfull pathで指定する。JavaScriptの文字列値なので、WindowsのPath区切り文字\は引用符内では二重に記述する必要がある(\\)。面倒ならSLASH区切りでも大丈夫。

var OUTPUT_FOLDER = "D:\\bms\\BOFU2017toBMSON";

変換されたfilesが出力されるべき場所、つまり保存先のroot folderをfull pathで指定する。指定したPathにfolderが存在しない場合は、変換実行時に自動的に作成される。

指定したPathにfolderが既に存在し、その配下に変換済みBMSON/PNG filesが既に存在する場合、変換実行時に前回の出力済みfilesを確認なく上書きする

var IMAGE_MAGICK = "C:\\ImageMagick-7.0.7-11-portable-Q16-x64";

ImageMagickをinstallした場所を、full pathで指定する。EXE fileの位置」ではなく「Folderの位置」。ImageMagickをinstallした場所によっては、Scriptを管理者権限で実行する必要があるかも。

var DEFAULT_CHARSET = "Shift_JIS";

読み込み時にUnicode Byte-Order-Markが見つからなかった図表のうち、変数FORCE_CHARSETS内で文字符号化方式が指定されていない図表は、ここに指定したEncodingで読み込まれる。

Code Page Identifiers“.NET Name”を指定できる。有効な名前の一覧は、Windows Registry Entry "HKEY_CLASSES_ROOT\\MIME\\Database\\Charset"配下SubKeysを参照されたい。

var FORCE_CHARSETS = {"Chart Path": "Encoding Name", …};

TARGET_FOLDER配下に「個別に文字符号化方式を指定したい図表」がもしあれば、そのpathとEncoding名をCOLONで組にして指定することができる。複数の組をCOMMAで区切って列挙できる。

Full path、またはTARGET_FOLDERから子方向へのpath」が有効。後者の場合、TARGET_FOLDER"Chart Path"を足し合わせてFull pathが構築される。指定された位置に図表が存在すれば、Pathと組にされたEncodingで読み込む。指定された位置に図表が存在しないなら読み込みをskipする。

var LIMITED_RESOLUTION = 2;

Rhythmの表現精度を、0から2までの整数値で指定する。

0
無制限。最高精度。9007199254740991を超える値は引用符で括られる。
1
beatorajaが解釈できる範囲内に値を丸める(2147483647以下)。
2
BmsONEが解釈できる範囲内に値を丸める(24000以下)。

精度が足りずにが同時押しに化けうる場合は、それを抑止するために変換後の"resolution"が制限値を超えることがある(たとえば値2 vs. “Lots Of Spices [Abusive]”)。BmsONEならうまく変換できる可能性もあるので、そちらをお試しください。

参考までに、Bemuse/raindropの上限は1.7e±308BMSON仕様やPulsusの上限は4294967295

var OMIT_FALSY = true;

trueなら、「省略してもしなくても大部分の実装で解釈が変わらない値」を省略する。具体的には"sound_channels"配下の、"c":false"l":0、および"x":0。これらの各key-value pairsは出力されない。"y":0を省略すると実装によって解釈が異なるので、これは省略しない。)

falseなら、Falsyなkey-value pairを省略しない。CircularRhythmをsupportしたい場合や、BMSON仕様を遵守したい場合は、falseに変更されたい。

var LINIFY = false;

trueなら、出力されるBMSON codeを改行しない。

var BLANK_AUDIO = "___undefined___";

[v0.0.3] BMS図表内で一度以上参照されている#WAV番号のitemが未定義である場合、BMSONへの変換時にこの変数の文字列値が"name"の値として使われる。

値は空文字列("")か、Windowsの妥当なfile name文字列を指定する。"CON"とか書くと叱られる。

とある実装のとあるBugを回避するために追加したつもりだったけど、いつのまにか直ってた?(気づいてなかった)。おそらく既に不要なoptionではあるけど、せっかくなので残しておく。

var HDX_COMMENT = false;

[v0.0.4] trueなら、charatbeatHDX VIOLETおよびBMIIDXView2015のC-like Commentを解釈する。

_wsh_bms2bmson.js v0.0.2

  • LongNotesが変換されないBugを修正した。原因は「文字列値の一文字目」の修正漏れだった。
  • 一部の画像がPulsusで警告される現象を、ImageMagickにPNG32を強制することで回避した。
  • #OPTION charatbeatHDX:LONGMODE nも、beatoraja用BMSON key "t"に反映するよう変更した。

BMSON変換例もLongNotesが変換されていなかったので修正した。失礼しました。

「resourcesへの参照」として定義された「full path、または上位階層を通過するpath」は、おそらくBMSON仕様に違反するはず。今のところ、変換時に実際に参照する必要がある#BMP[00-zz]の画像files以外は素通しだが、本来なら音声などもpathを正規化・検証する必要があるかもしれない。

_wsh_bms2bmson.js

v0.0.8

更新履歴

v0.0.8
  • #STP(bemaniaDX書式)を実装。
v0.0.7
  • #LNTYPE 2(MGQ書式)を実装。
v0.0.6
  • 重複するBGM notesが変換されないBugを修正。
v0.0.5
  • FilePathの定義を変換する際に、FilePath文字列の加工を誤っていたのを修正。
v0.0.4
  • #xxx5nの行に#LNOBJの番号が現れると強制終了するBugを修正。
  • HDX/IIDXvのC-like Comment Syntaxを実装。変数HDX_COMMENTを追加。
v0.0.3
  • Installer版ImageMagickに対応できていなかったのを修正。
  • 一度以上参照される未定義#WAVに任意名を設定できる変数BLANK_AUDIOを追加。
v0.0.2
  • LongNotesが変換されないBugを修正。
  • 一部の画像がPulsusなどで警告される現象を、ImageMagickにPNG32を強制して回避。
  • #OPTION charatbeatHDX:LONGMODE nも、beatoraja用BMSON key "t"に反映するよう変更。
v0.0.1
  • 初公開。

概要

BMS形式の図表群をBMSON形式に一括変換するWSH JScriptです。G2R2014/BOFU2015/BOFU2016/BOFU2017は一通り変換できることを確認済み。(正しく変換できるとは言ってない)(いずれもpackage版の図表のみ)

動作環境

  • Windows Vista以降
  • ImageMagick 7.0.7-11以降(Portable版でも可を推奨

Installer版は環境変数Pathの優先順位などが弄られて面倒らしいので、Portable版を推奨します。

特徴

  • BMS仕様のBackGround Animationを、BMSONの仕様に適合するように画像filesごと変換できる。(元の画像には影響を及ぼさない。新たに生成された「変換後画像」を追加する形になる)
  • 変換対象図表のText Encodingを個別に指定できる。
  • 倍精度浮動小数点数で表現しきれない値も正しく変換できる(あんまり意味ないけど)
  • 不可視notesや地雷notesの情報もいちおう変換して残すので、後で何かに使えるかも。

使い方

  1. 前述のText fileを「名前をつけて保存」する。
  2. 保存したText fileを、メモ帳などのText Editorで開く。
  3. 先頭の“Config”区間内にある大文字の変数の値を、適宜設定する。詳細は別項を参照
  4. 保存してText Editorを閉じる。
  5. このText fileの名前を変更する。名前末尾の.txtを削除し、拡張子.jsにする。
  6. 拡張子.jsに変更したText fileを、double-clickなどで実行する。
  7. 変換が完了したら、Enterを押してConsoleを閉じる。
  8. 保存先として指定したfolderに、変換済みfilesが出力される。出力されたBMSON filesおよびPNG files(あれば)を、元のfolderに全てcopyする。保存先folderの中身ごと「切り取り上書き」が楽。

注意点

  • 設定はScript fileをメモ帳などで直接編集することによってしか行えません。すみません。

  • File pathはJavaScriptの文字列として指定する必要があります。Windowsのpath区切り文字\は、引用符の中では二重に書かなければなりませんので、ご注意ください。たとえば:

    var TARGET_FOLDER = "C:\\Users\\IRUser\\Desktop\\BMS";

    よくわからない方は、\のかわりに/を用いても構いません。

    var OUTPUT_FOLDER = "C:/Users/IRUser/Desktop/BMSON";

    (ただし、Path区切り文字にSLASHを用いた指定が常にうまくいくかどうかは不明です。)

  • Drag-and-Dropには対応できません。WSHのDrop機能はUnicode Pathを扱いづらいそうなので。

  • #RANDOM#SWITCHにはいまのところ対応していません。分岐を持つ図表は変換せずskipします。BOFU2017一括変換中に無視される図表が多くて申し訳なくなったので、今後対応するかも。

  • [v0.0.2] 一部の変換後画像がPulsusなどで警告されるのを修正。(ImageMagickにPNG32を強制)

    Blackcityなどが用いる黒一色の画像を、BMSON仕様に沿うようにImageMagickで変換すると、1 bit/sampleのgrayscale画像が出力されます。beatorajaなどでは問題なく描画されますが、PulsusではよくわからないErrorが出ます。単色PNG画像を保存した際の不可解な挙動」に近いのかな。

    v0.0.1ではこの問題を解決できていないので、変換される方はそのような画像が混じりうるものとご了承ください。変換後のBMSON図表が実際に正しく再生されるかどうか、必ずご確認ください。

  • Hashの算出にcertutil.exeを用いました。Windows VistaのそれはSHA-1しか算出できないようです。つまり変換完了後に出力されるLog.txtの内容は、環境により異なる場合があります。

  • 変換後の分解能を制限したはずであるにもかかわらず、LIMITED_RESOLUTIONの制限を超える"resolution"の値が出力される場合があります。これは「値をこれ以上丸めると、同時押しになるべきでないnotesが同時押しに化けてしまう」という状態を抑止した結果かもしれません。かわりにBmsONEなどで変換してみてください。

  • BMSON仕様をみるに、LAYER画像のPNG化は、単純に全部を透過PNGに変換すればよいというわけでもなさそうです。「透過用の画像とは別に、元の非透過画像がそのまま使われる状況」もあるので、変換前の画像も消さないでください。“PARTY TIME IN MY DREAM”などがわかりやすい例ですが、beatoraja 0.5.1では"mode_hint"の値を"beat-7k"などに変更しないとNo-BGA状態に。

  • File名が.(FULL STOP)から始まる図表は読み込みません。Mid2BMSの中間filesや、Mac OS特有のResource Forkなどがこれに該当します。これらは時々BMS書庫に同梱されています。

Windows 10のInsider PreviewでシステムロケールをUTF-8にするオプションが追加される

ついにこの時が来てしまった。このoptionが有効な環境でLR2が走ると、従来のBMS図表の非英数字は。例外はUTF-8符号化図表だけ。今後もLR2などの「Unicode非対応のBMS実装」とも互換性を保ちたい図表著者には、いくつかの選択肢がある。

  • #TITLE#WAVなどのあらゆるBMS tagsについて、値に非ASCII文字を一切使わない。
  • 非ASCII文字を使う必要がある場合は、必ずμBMSCBmsONEで「UTF-8符号化BMS(ON)図表」を用意する。Legacy Encoding(日本語環境ならShift_JIS)のBMS図表は補助的に用意する。

遠くない未来にSystem Localeの既定値はUTF-8になり、Windows 95/98からの二十年来のANSI Text資産は「Encodingを明示しないと読めないもの」になる。

本日の成果

すくなくともBOFU2017 package収録済み図表群の一括変換中に強制終了することはなくなった

Alcubierre Drive変換中のWSHのMemory Usage:
4 GiB

Programmingに関する私の技術は、Algorithmや実行時間などのperformanceを追求できる水準に達していない。しかし、図表2100枚の一括変換に要した合計所要時間が三時間近かったり、単なる文字列操作で4 GiBものMemoryを消費するというのは、さすがに許容できない。

ImageMagickあたりと連携すれば、現在は羅列するにとどめている画像群も一括変換できそうではある。動画とか巻き込んでいる時点でお察しだけど。

今日の越えられない壁

UTF-32のBMS図表を変換できるようになったかわりに、batch job終了時にhangしたり、実行中のtest1.jsが突如消滅してその後test1.jsという名前が使えなくなったり(新規textをその名前に変更しようとすると「このファイルの名前を変更するには管理者の権限が必要です」などと警告される)、何もかもわからない。編集中のJS fileが突然消えてかなりびびったしなんなのこれ。PowerShellとの連携をやめれば普通に働く。またはdouble-clickでなくCommand PromptからJS fileを起動すれば普通に働く。または「batch job終了時に何か入力を待ってからpromptを閉じる」という余計なことをしないなら普通に働く。何度見直してもまったく原因がわからないけど標準入出力関連が怪しいかな〜

[翌朝追記] UTF-32図表を変換して再起動すると必ず実行file.jsが消滅する。PowerShell連携とか完全にいらない発想だった……UTF-32図表を変換するのは今度こそ諦めた。

諦めて他の図表を変換しようとしたらWeb版では発生しえない謎の無限loopが発生。寝る。直した。唐突な始端側#LNOBJでHangする。始端側#LNOBJの配置番号を全角化してやりすごす案(備忘)

今日の罠

「文字列値の一文字目」を拾うためにstring[0]のように添え字accessしていた箇所、Internet Explorer 4–8やJScript 3.0–5.812では軒並みundefinedが入っていた。string.prototype.charAt(0)に書き換えた。厳密にやるなら代用対にも対処しないと危ない。WSHによるBMSBMSONへの一括変換は可能になったが、前述の修正漏れで予期せぬ箇所で座標配列が空になったりする。怖すぎ。というか「修正漏れ」が出てくるような四百行以上続く巨大関数とか低知能すぎるでしょ

UTF-32 text fileは、PowerShellを経由すれば普通に読めることに気づいた。
/*global WScript */
var getTextUtf32 = function (target) {
    "use strict";
    var lines = [];
    var cmd = "PowerShell.exe -NonInteractive Get-Content -Encoding UTF32 '" + target + "' | Out-String";
    var ps = WScript.createObject("WScript.Shell").exec(cmd);
    while (!ps.StdOut.AtEndOfStream) {
        lines.push(ps.StdOut.readLine());
    }
    ps.StdIn.close();
    return (ps.ExitCode === 0)
        ? lines.join("\r\n")
        : ps.ExitCode;
};
WScript.echo(getTextUtf32("D:\\🎹\\1F3B9-UTF32-BE-BOM.bms")); // succeeded
WScript.echo(getTextUtf32("D:\\🎹\\1F3B9-UTF32-LE-BOM.bms")); // succeeded
[翌日追記] この方法だとPiped StringがSystem Localeで符号化されてしまい、System Localeで表現できない非ASCII文字が??に文字化けしてしまっていた。以下訂正版:
/*global WScript, readAsText */
var getTextUtf32 = function (target) {
    "use strict";
    var tmp = target + ".___tmpbm.txt";
    var cmd = "PowerShell -NonInteractive Get-Content -Encoding UTF32 '" + target + "' | Out-File '" + tmp + "'";
    WScript.createObject("WScript.Shell").run(cmd, 0, true);
    var txt = readAsText(tmp); // self-made function
    WScript.createObject("Scripting.FileSystemObject").deleteFile(tmp);
    return txt;
};
WScript.echo(getTextUtf32("D:\\🎹\\1F3B9-UTF32-BE-BOM.bms")); // succeeded
WScript.echo(getTextUtf32("D:\\🎹\\1F3B9-UTF32-LE-BOM.bms")); // succeeded

[翌々日追記] 変換可能だが、Computerを再起動するとJScript.js file。私には原因の特定も修正も不可能だったので、UTF-32図表の読み込みを断念した。

うまくいきそうに見えたけど、PowerShell 3.0未満の環境では実行しても反応が返ってこない。PowerShell 3.0以降をinstall可能なOSはWindows 7以降。というわけで、この方法でUTF-32に対応するならWindows Vistaさえ門前払いということに。いよいよPowerShellでよくない? 標準出力のbuffer sizeが上限4096 bytesらしいという話もある……、が一行十二万字超えのBMS図表Blackcity_spa.bmeをUTF-32で別名保存して試したら普通に変換できた(PowerShell 3.0–5.1で確認)。たぶん私「標準出力」を勘違いしている。

日記

眠すぎて腕に力が入らない。先月の不思議現象の原因が判明して、少しすっきりした。

WSH JScriptの罠を踏みまくって発狂。たとえばvalue.split(/[^0-9A-Z]/)[0]value"あ11"のとき、普通の実装では["", "11"]が得られ、Internet Explorer 4–8やJScript 3.0–5.812では["11"]が得られる。なのでvalue.split(/[^0-9A-Z]/)[0]||def;(値がFalsyならdefを適用)も駄目。ーッ〜ッ

すくなくとも今週中は他のことを考える余裕はなさそう。雑魚いなりに間に合わせたいんです……

WSH備忘

ADODB.Streamcharset propertyに指定できる文字列は、Windows OSのversionによって異なる。Windows 2000では、GB18030はsupportされておらず、BOMつきUTF-16(Big Endian)も「引数が間違った型、または許容範囲外であるか、競合しています」と警告される。UTF-8の冗長表現は素通し。Windows XPではbyte列の非最短表現は対策されていたが、CESU-8の代用対がU+FFFDに置き換えられるのはWindows Vistaから。なのでWindows XP以前では変換器が起動しないように変更した。

それWSH選ぶ意味なくない? Win7以降で最初から使えるPowerShellでよくない? って思った。

図表著者の名義は、Shift_JISEUC-JPEUC-KRGBKGB18030Big5のうちどれ?

などの不毛な問題を解決すべく、BMSON形式への一括変換を試みる。Legacy Encodingの完璧な自動判別は不可能なので、例外のみ手動で決め打ち・BOMがあれば従う・BOMなしなら既定のEncodingを適用することにした。原始人並みだがBOFU2017の全図表を期待通りに読み込むところまではできた。

ちなみに当方発見済みの例外はこんな感じ。これら以外にも見落としがあるかも:
// Config ====================================================================
var TARGET_FOLDER = "D:\\bms\\BOFU2017";
var DEFAULT_CHARSET = "Shift_JIS";
var FORCE_CHARSETS = {
    "Alpha Phase 2017\\Last Love to You_\\7A.bms": "EUC-KR",
    "Alpha Phase 2017\\Last Love to You_\\7H.bms": "EUC-KR",
    "Alpha Phase 2017\\Last Love to You_\\7N.bms": "EUC-KR",
    "Alpha Phase 2017\\Last Love to You_\\LY_BASE.bms": "EUC-KR",
    "EVER BURST\\vaccuum\\vacuum_n.bms": "GBK",
    "EVER BURST\\vaccuum\\vac_e.bms": "GBK",
    "EVER BURST\\vaccuum\\vac_h.bms": "GBK",
    "EVER BURST\\vaccuum\\warning.bms": "GBK",
    "HARSH NOISES N ROUGH ANIMATIONS\\ayhaz_GodzillaBazooka\\godzillabazooka.bms": "ISO-8859-1",
    "HPS+\\JKRevolution\\JR_7KSHD.bms": "EUC-KR",
    "like the Wind\\[9RAN]Revs your Heart\\SPI.bms": "Shift_JIS", // ←↓ with UTF-8 BOM
    "NEW MUSIC!!\\Cosine_Is_This_Your_Memory_ogg\\ITYM_02_Hyper.bms": "Shift_JIS",
    "和食チェーン\\[和食チェーン] Ponz - いたずらな夜 (ogg)\\_itazura_na_yoru(NORMAL).bms": "UTF-8"
};

“Maman, Godzilla est venu à mon marriage et m'a menacé avec un Bazooka”は途中で制御文字らしきbyte列が混入するので、"ISO-8859-1"という解釈も間違いかも。

手元で検証した限りではBOMつきのUTF-8/UTF-16/GB18030は読み込めたが、WSHADODB.StreamUTF-32をsupportしていないようだった。System.Text.UTF8Encodingなどの.NET Framework”のいくつかのclassはWSHでも使えたが、System.Text.UTF32Encodingは借用できなかった。諦めた。

#RANDOM系の変換はBmsONEにお任せするとして、BGA仕様の差異にどこまで追従するか考え中。

日記

現時点でRealtek公式からdownloadできるRealtek High Definition Audio Driver R2.82では、Realtek HD Audio ManagerRAVCpl64.exe)が動作しなかった。www.station-drivers.comから最新のdriverを導入し、「フロントパネルジャック検出」を無効にしたところ、Virtual MachineのUbuntuでも音が鳴るようになった。数日前“Windows Subsystem for Linux”は冤罪だった。

(^^)#000#999まで五百回繰り返した図表に対して、BOFU2017 No.88 “Alcubierre DriveのRuby scriptを適用してみた。#1000以降の小節も出力されたり、いろいろと興味深かった。

BOFU2017 No.7 “Strahlzwergのような、#999まで小節長変更があるけど曲は既に完了している図表」を、私のBMS parserは考慮していなかった…… 不覚。変換器とか無限loopに陥るので要修正。

日記

Ubuntu 17.10日本語版をVirtual Machineとして導入した。やはり「デフォルト サウンドデバイスを開くことができません:」の警告が出ている。HostたるWindows側でどうにかしないと駄目っぽい。

「BOMつきShift_JIS」のBMSを更に発見。UTF-8のByte Order Markという「EncodingがUTF-8であることを明示するための目印」さえ信頼できないとなると、単純にText fileを開くだけでも難しすぎる。

Rubyをinstallした。RubyInstaller2がMSYS2を何度もdownloadしようと試みて失敗し続ける。動画閲覧などで回線を使っている間はdownloadingも中断されない。そこに気づくまで二十分ほど無駄にした。結局installingだけで一時間半くらいかかって日付が変わってしまった……。続きは明日。

備忘録・BOFU2017の珍しいBMS tags

No.395 The Swan's Journey
#BMP02 bga.wmv
#BGA02 bga.wmv
No.370 tripdown
#VOLWAV 70

#BMP01 Tripdown.png

#BGA01 ooo
#BGA02 Tripdown.png
  • #BGA関連の不思議な技法が流行っている? 単なる誤り?
  • BananaBeats、beatoraja、およびPulsusは#VOLWAVを解釈する。
No.411 AirDROP
#STOP01 0
  • 旧版Another図表。現在は修正済み。
#WAV01 ��ô 6.wav
  • 全図表がBOMつきUTF-8で符号化され、Easy図表のみU+FFFDあり(文字化けの結果)。
  • Python言語のsource filesource.py)同梱。
No.150 Pulsation
#DIFFUCULTY 3
  • 誤字。
No.88 Alcubierre Drive
  • 無量大数を軽々凌駕する発狂分解能、126003954190622841820816938520698981517882100406352274689636588083570040437216730867544587840974593677991903545882806840526036892638078707320932898157508310675505081933558796047618054083554044936502374547930063183913534071754212482652748738466985729678426246490055741141797391038438557292828878754893053740618138377631330656910450150150379768899862450456899039638876307517621622978564071923171862195895275243412454632872197594704726912603405556249192827391733353874818671768190050766031982536211365019321049048115507011012733460545913693660135505748752400000
  • Ruby言語のsource file_warp.rb)を実行することによって、図表にgimmickを付与する。Programmerしか作れない図表最高すぎる。小節線という有限のresourceを節約しようとして結果的に音楽的に視覚的に違和感が出ている箇所があって、そこはBMSON形式を推したい。
  • 有理数近似で分数化すると絶対に誤差が出そうな小節長の小数値やばい。BMS形式でどうぞ。
No.310 カリオストロの穿孔
#VOLWAV 500
  • カリオストロの搾乳
No.13 Past connextion (BMS Edit)
#DIFICULTY 2
  • #DIFFICULTY 2も正しく定義されており、そのうえでの誤字。
No.236 IZANAGI
#COMMENT Notes Design : DRIVE.
#COMMENT Notes Design : Arishima_Caprico
No.369 Widow's kiss
#STOP05 1.5
  • 小数値#STOPはLR2で期待通りに働かない。
No.335 KAWAII FREESOZAI EXPLOSION
#PREVIEW
  • preview.oggが存在するので、すくなくともbeatorajaではpreview機能が働くはずだが。
No.82 divine's GATE
#DIFICULTY 2
No.489 Rain Storm
#VOLWAV 90
No.342 Number Y
#DEFFICULTY 1
No.36 瀬戸内百景
#VOLWAV 65
  • 初心者用図表だけ#VOLWAV 80なあたり、意図がありそうでへぇ〜ってなった。
No.167 Ridiculous CRISIS -BMS edit-
No.168 shortness of breath
#DIFICULTY 3
# DIFFICULTY 3
#DIFFICULTLY 4
  • テキスト編集を許すな
No.384 5000兆円面接
#VOLWAV 127
#STAGEFILE#STAGEFILE 
No.393 けふぃーと!=ネパール山岳マフィア=さぐ$らいふ密着24時~インディアンの風~
#DIFFICULT 4
#DIFFICULT 3
  • #DIFFICULTYと誤字が両方ある。Torrent版7H.bmsの豪快な文字化けにふく(修正済)
No.319 jellyfish memories
#DIFFICULT 3
#DIFFICULT 2
  • _dph.bms_dpn.bmsのみ誤字。
No.184 Revs your Heart
  • SPI.bmsのみ「UTF-8のBOM」つきShift_JIS
No.313 Is This Your Memory?
  • ITYM_02_Hyper.bmsのみ「UTF-8のBOM」つきShift_JIS

beatorajaでCJK文字を部分的に共存可能にする

beatoraja default skin + Noto Sans CJK jp: Thai文字・絵文字・𠮷野家の「つちよし」は描画されない。Hangul字母は分解されて描画される。

beatoraja\skin\default\VL-Gothic-Regular.ttfを、NotoSansCJKjp-Regular.otfと挿げ替え、以下のBMSON code断片にて検証した:

"subtitle": "\n[Unicode 1.0.0] Thai: \u201C\u0E2A\u0E27\u0E31\u0E2A\u0E14\u0E35\u0E04\u0E48\u0E30 \u0E2A\u0E27\u0E31\u0E2A\u0E14\u0E35\u0E04\u0E23\u0E31\u0E1A\u201D\n[Unicode 1.1.0] CJK unified ideographs: \u201C\u4F60\u597D\u201D\n[Unicode 1.1.0] Hangul Jamo: \u201C\u110B\u1161\u11AB\u1102\u1167\u11BC\u1112\u1161\u1109\u1166\u110B\u116D\u201D\n[Unicode 2.0.0] Hangul Syllables: \u201C\uC548\uB155\uD558\uC138\uC694\u201D\n[Unicode 3.1.0] CJK Unified Ideographs Extension B: \u201C\uD842\uDFB7\u91CE\u5BB6\u201D\n[Unicode 6.0.0] Emoji: \u201C\uD83C\uDFB9\u201D"

元の文字は以下の通り。MSIE/EdgeではHangul字母が分解されて描画される:

[Unicode 1.0.0] Thai: “สวัสดีค่ะ สวัสดีครับ”
[Unicode 1.1.0] CJK unified ideographs: “你好”
[Unicode 1.1.0] Hangul Jamo: “안녕하세요”
[Unicode 2.0.0] Hangul Syllables: “안녕하세요”
[Unicode 3.1.0] CJK Unified Ideographs Extension B: “𠮷野家”
[Unicode 6.0.0] Emoji: “🎹

「あらゆる文字を収録したfont」は、現在のTrueType/OpenType仕様では不可能らしいWindows 10環境のWeb browsersで試した結果、「指定された書体が扱えない文字」にはfallbackが働く(FontLink機構?)。以下のCSSを指定して、各browsersがどの書体を適用するか確認した。

font-family: "Noto Sans CJK JP", "Noto Sans CJK JP Regular" !important;
/* Noto Sans CJK JP: local installed */

Thai文字はTahomaかLeelawadee UIで描画される。EmojiはSegoe UI Emojiで描画される。𠮷野家」の「つちよし(U+20BB7)」はNoto Sans CJK書体に収録されているはずだが、beatorajaでは描画されない。基本多言語面に無い文字を扱うために特別な処理が必要なのかもしれない。

Web browsers並とまではいわないものの、各国語版Windowsで古くから扱えたCJK Legacy Encodings(GBK/GB2312/CP936、Big5/CP950、Shift_JIS/CP932、EUC-KR/UHC/CP949)の範囲内の文字なら、おそらく現時点でもbeatorajaで使用できるものと前提してよさそう。code point U+10000以上の文字、たとえば「𠮷(つちよし)」や絵文字や梵字は、たぶん使えないので自重する感じで。

当然ながらBMSON形式が前提。あるいはcharatbeatHDXなどで書体をNoto Sans CJKに変更して、BOMつきUTF-8で図表を保存して……あ〜そういえばcharatbeatHDXはUTF-8じゃなくてCESU-8にしなきゃ駄目なんだった……まあ「U+10000以上の文字は使用禁止」としておけば問題は発生しないはず。

BOFU2017 No.17 “D̵̤͗ḛ̷̇a̷̫̓d̶͉́ ̵̜͐S̷̲̋o̵̤̒ǔ̵̠l̶̰͌は、beatoraja + Noto Sans CJKだとこんな感じ:“Dad Soǔl”

"subtitle": "\nD\u0335\u0324\u0357\u1E1B\u0337\u0307a\u0337\u032B\u0313d\u0336\u0349\u0301 \u0335\u031C\u0350S\u0337\u0332\u030Bo\u0335\u0324\u0312\u01D4\u0335\u0320l\u0336\u0330\u034C"

図表著者のたった数文字程度の戯れのために各users様方に巨大なCJK書体をdownloadしていただきbeatoraja既定の書体を挿げ替えていただくというのは、普通に無いわ感ある。そもそもいろいろ試した後で元のVL-Gothic-Regular.ttfに戻したところ、“你好”くらいならVL Gothicでも表示できていたことに気がついた。いつもながら迂闊だった。

日記

私が7-Zipに苦手意識を持っている原因を考えて、英語を読み書きできないからという結論に達した。7-Zipをinstallしようとして英語を理解できずcancelする日々があった。最近は読もうとはしている。

BOM付きUTF-8のファイルを探す」をやりたくて、“Windows Subsystem for Linux”を導入した。その後、Ubuntu(virtual machine)が「デフォルト サウンドデバイスを開くことができません:」と警告を発するようになった。まだ解決できていない。[追記] Audio Driverの特定versionの不具合だった。

BMSE非公式Helpを手元で微修正した。QiitaのHTTPS化を見落としていたので直した。環境依存文字(半角カナなど)を生で記述していた箇所を、狭義のShift_JISで書き表せる形に直した。

BOFU2017 No.366 “disperagioiaの図表内に#!SpeciaL ThankS by RespecterSevenという記述を見つけて、へぇ〜ってなった。#からcommentを開始すると、図表editorを通してもcommentが残る。

備忘録・【BOFU2017】文字化けでLR2でerrorが発生するBMS

たまたま見つけてへぇ〜ってなったので、図表filesだけを抽出していろいろ調べてみることにした。BOFU2017には2200枚近い図表が集まり、その合計sizeは160 MiBに達していた。

No.185 "20,November -BOFU2017 Mix- / Masters_Gumi." - TEAM : 関東三毛猫隊.

Encoding: UTF-8(BOM)。各図表の*.ibmsc filesも同梱されている。μBMSCで既定のencodingのまま編集されたのだろう。BOFU2017参加作品内にBOMつきUTF-8図表は約百枚ある。大半がASCII同然なので、この作品だけが日本語環境のLR2に引っかかったのだとしても、そういうこともあるのかなという感じ。修正差分(v12.2.zip)の20.n.bmsは、ASCII文字のみになってしまった。

No.309 "いたずらな夜 / Ponz" - TEAM : 和食チェーン

Encoding: UTF-8。どういう経緯でこの文字符号化方式が選ばれたのかが気になる。[追記] ちなみにいまのところ、BOMなしのUTF-8はこの図表一枚のみ。

No.491 "無人区-Vacuum Track#ADD8E6- / NoKANY" - TEAM : EVER BURST

Encoding: GBK。EUC-KRやWindows-1252などの「Shift_JISでないLegacy Encoding図表」は他にもいくつか見かけたけど、このBMSだけがたまたま日本語環境のLR2に引っかかったのだとすれば、不運。

日記

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