_wsh _bms 2 bmson .js v0.0.8
#STP
#STP
#LNTYPE 2
拙作構文解析器では、おそらくbeatoraja 0.5.1と同じ解釈がなされる。図表終端がLong
重複する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":
画像自体の変換はうまくいっていたが、出力されるBMSON図表の画像定義関連に致命的なBugがあった。
File
#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の定義が、
"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" ],
以下のような定義は、
// 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の仕様に違反するかどうか判断がつかなかったが、
// 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
BMSON仕様は「『BMSON図表が存在するfolder』の外部を参照するpath」を問答無用で禁止してくれているので、食わされるfile pathの検証処理はかなり楽な部類だと思う。それでもなお、
v0.0.4で「C-like Comment Syntaxの実装がうまくいかない」と書いたが、普通にうまくいっていた。
#TITLE "\"あい\"うえお /* ♡ */ニャハ" /* ここはコメント内 */\"文字列\"は続くよ"どこまでも/* ▵ */ムー"// 残りはコメント
HDX#TITLE
の値は以下の文字列としてparseされる。
"あい"うえお /* ♡ */ニャハ "文字列"は続くよどこまでも/* ▵ */ムー
ということは、前述の#TITLE
"title": "\"あい\"うえお /* ♡ */ニャハ \"文字列\"は続くよどこまでも/* ▵ */ムー",
ただ、このHDXの特徴は影響範囲が広すぎて難しい。すくなくとも変換時には使いどころなさそう。
#WAV01 a, b; c .wav
”#BMPz1 a //b \\\\c /.. /\.. \/. \.. /.. \\\title .bmp
”【G2R2014 詳細情報】 TEAM : メスの本能 No#xxx5n
#LNOBJ
#LNOBJ 04
#04154:04
この例はLong#xxx5n
、かつ突然の#LNOBJ
」だった場合などについて真剣に考慮してはいない。
修正ついでに、#LNOBJ z
0Z
#LNOBJ 0123
23
charatHDX
から真偽値で有効無効を切り替える。私の理解した通りに実装したつもりだが、明示的文字列がWeb版の構文解析結果と異なり、うまくいかなかった。果てしなく眠いので修正は後日に。
Image
以下にConfigの詳細を書いた。
var TARGET _FOLDER = "D: \\bms \\BOFU2017";
変換対象BMS群のroot folderをfull pathで指定する。\
”\\
”SLASH区切りではうまくいかない状況があります。常に\\
”
var OUTPUT _FOLDER = "D: \\bms \\BOFU2017toBMSON";
変換されたfilesが出力されるべき場所、つまり保存先のroot folderをfull pathで指定する。指定したPathにfolderが存在しない場合は、変換実行時に自動的に作成される。
指定したPathにfolderが既に存在し、その配下に変換済みBMSON
var IMAGE _MAGICK = "C: \\Image Magick-7.0.10-3-portable-Q16-x64";
Image
var DEFAULT _CHARSET = "Shift_JIS";
読み込み時にUnicode Byte-Order-Markが見つからなかった図表のうち、変数FORCE
“Code Page Identifiers”"HKEY
var FORCE _CHARSETS = {"Chart Path": "Encoding Name", …};
TARGET
配下に「個別に文字符号化方式を指定したい図表」がもしあれば、そのpathとEncoding名をCOLONで組にして指定することができる。複数の組をCOMMAで区切って列挙できる。
Full path、またはTARGET
から子方向へのpath」が有効。後者の場合、TARGET
"Chart Path"
var LIMITED _RESOLUTION = 3;
Rhythmの表現精度を、0
から3
までの整数値で指定する。
0
:9007199254740991
1
:2147483647
2
:24000
3
:240
精度が足りずに微細なずれが同時押しに化けうる場合は、それを抑止するために変換後の"resolution"
2
vs. “Lots Of Spices [Abusive]”)。
参考までに、1.7e±308
。4294967295
。
var OMIT _FALSY = true;
true
"sound
"c":
"l":
"x":
。これらの各key-value pairsは出力されない。"y":0
false
false
に変更されたい。
var LINIFY = false;
true
var BLANK _AUDIO = "___undefined___";
[v0.0.3] BMS図表内で一度以上参照されている#WAV
"name"
値は空文字列(""
)か、"CON"
とある実装のとあるBugを回避するために追加したつもりだったけど、いつのまにか直ってた?
var HDX _COMMENT = false;
[v0.0.4] true
var GENERATE _PNGS = true;
[v0.1.0] false
var BMSON _TO _BMS = false;
[v0.2.0] true
var ESCAPE_NON_ASCII = false;
[v0.2.4] true
var USE _UNIX _NEWLINE = false;
[v0.2.4] true
CRLF
のかわりに、LF
を使う。
#OPTION charatbeat HDX :LONG MODE n
"t"
BMSON変換例もLong
「resourcesへの参照」として定義された「full path、または上位階層を通過するpath」は、おそらくBMSON仕様に違反するはず。今のところ、変換時に実際に参照する必要がある#BMP
ESCAPE _NON _ASCII
)を追加。LF
のみにするoptionUSE _UNIX _NEWLINE
)を追加。https:// hitkey .nekokan .dyndns .info /bmson /_wsh _bms2bmson/
に移した。#LNTYPE 2
#999
"bga"
"id"
"lines":[]
#WAV
#EXBMP
#DIFFICULTY 4
#EXRANK ddd
#DEFEXRANK ddd
#EXRANKzz ddd
とは異なる)#BPM 0
"init_bpm":0
#TOTAL 0
"total":0
#DIFFICULTY
var LIMITED _RESOLUTION = 3;
"resolution"
0
や負数の#STOP
sequenceを従来は無視していたが、今回から変換するようにした。#BMP
定義があるが#xxx0 [467A]
#GENRE string
#BMP00
#BGA00
bga
関連id
の並べ替えが失敗していたbugを修正。convert
commandをやめた。magick
のみを使う。#EXRANK
と#CHANGEOPTION
の変換後の"y"
option _events [n] .notes
option _events [n] .triggers
*.m4v
#CHANGE OPTIONzz
も変換するようにした。#TEXTzz
・#EXRANKzz
も変換するようにした。#BGA
の不正な値を受け入れていたbugを修正。bga
関連id
をsortするように修正。bga Header
に余計なkeysが生えていたbugを修正。#MOVIE
と#VIDEOFILE
にごく大雑把に対応(bga _events
の"y":0
が空いていれば挿入)。#BGA
関連処理を多少改善した。#BMP
の多重定義を検出する処理が穴だらけだったのを改善した。#BGAzz
#BMP00
var GENERATE _PNGS = false;
)。#LNOBJ
"up"
OUTPUT _FOLDER
#WAV
の最初のnoteが#nnn[51-69]
"up"
var LIMITED_RESOLUTION = 3;
)#SCROLL
#SPEED
#EXT
#RANK
#TOTAL
#STP
#LNTYPE 2
#xxx5n
#LNOBJ
HDX _COMMENT
#WAV
BLANK _AUDIO
#OPTION charatbeat HDX :LONG MODE n
"t"
BMS形式の図表群をBMSON形式に一括変換するWSH JScriptです。(正しく変換できるとは言ってない)
Installer版は環境変数Path
の優先順位などが弄られて面倒らしいので、
設定はScript fileをメモ帳などで直接編集することによってしか行えません。すみません。
File pathはJava\
”
var TARGET _FOLDER = "C: \\Users \\IRUser \\Desktop \\BMS";
よくわからない方は、\
”/
”
var OUTPUT _FOLDER = "C: /Users /IRUser /Desktop /BMSON";
Drag-and-Dropには対応できません。
#RANDOM
#SWITCH
“Blackcity”
v0.0.1ではこの問題を解決できていないので、変換される方はそのような画像が混じりうるものとご了承ください。変換後のBMSON図表が実際に正しく再生されるかどうか、必ずご確認ください。
Hashの算出に
変換後の分解能を制限したはずであるにもかかわらず、LIMITED
"resolution"
BMSON仕様をみるに、"mode
"beat-7k"
File名が.
”
ついにこの時が来てしまった。このoptionが有効な環境でLR2が走ると、従来のBMS図表の非英数字は絶対に文字化けする。例外はUTF-8
符号化図表だけ。今後もLR2などの「Unicode非対応のBMS実装」とも互換性を保ちたい図表著者には、いくつかの選択肢がある。
#TITLE
#WAV
Shift_JIS
)のBMS図表は補助的に用意する。遠くない未来にSystem Localeの既定値はUTF-8になり、
すくなくともBOFU2017 package収録済み図表群の一括変換中に強制終了することはなくなった。
Programmingに関する私の技術は、
Image
UTF-32のBMS図表を変換できるようになったかわりに、またはdouble-clickでなくCommand PromptからJS fileを起動すれば普通に働く。または「batch job終了時に何か入力を待ってからpromptを閉じる」という余計なことをしないなら普通に働く。何度見直してもまったく原因がわからないけど標準入出力関連が怪しいかな〜
[翌朝追記] UTF-32図表を変換して再起動すると必ず
諦めて他の図表を変換しようとしたらWeb版では発生しえない謎の無限loopが発生。寝る。直した。唐突な始端側#LNOBJ
#LNOBJ
「文字列値の一文字目」を拾うためにstring
undefined
string
/*global WScript */
var get Text Utf32 = function (target) {
"use strict";
var lines = [];
var cmd = "Power Shell .exe -Non Interactive Get-Content -Encoding UTF32 '" + target + "' | Out-String";
var ps = WScript .create Object ("WScript .Shell") .exec (cmd);
while (!ps .StdOut .At End Of Stream) {
lines .push (ps .Std Out .read Line ());
}
ps .Std In .close ();
return (ps .Exit Code === 0)
? lines .join ("\r\n")
: ps .Exit Code;
};
WScript .echo (get Text Utf32 ("D: \\ \\1F3B9-UTF32-BE-BOM .bms")); // succeeded
WScript .echo (get Text Utf32 ("D: \\ \\1F3B9-UTF32-LE-BOM .bms")); // succeeded
[翌日追記] この方法だとPiped StringがSystem Localeで符号化されてしまい、??
”/*global WScript, read As Text */
var get Text Utf32 = function (target) {
"use strict";
var tmp = target + ".___tmpbm .txt";
var cmd = "Power Shell -Non Interactive Get-Content -Encoding UTF32 '" + target + "' | Out-File '" + tmp + "'";
WScript .create Object ("WScript .Shell").run (cmd, 0, true);
var txt = read As Text (tmp); // self-made function
WScript .create Object ("Scripting .File System Object") .delete File (tmp);
return txt;
};
WScript .echo (get Text Utf32 ("D: \\ \\1F3B9-UTF32-BE-BOM .bms")); // succeeded
WScript .echo (get Text Utf32 ("D: \\ \\1F3B9-UTF32-LE-BOM .bms")); // succeeded
[翌々日追記] 変換可能だが、UTF-32
うまくいきそうに見えたけど、
眠すぎて腕に力が入らない。先月の不思議現象の原因が判明して、少しすっきりした。
WSH JScriptの罠を踏みまくって発狂。たとえばvalue
value
"あ11"["", "11"]
["11"]
value
def
すくなくとも今週中は他のことを考える余裕はなさそう。雑魚いなりに間に合わせたいんです……
ADODB
charset
propertyに指定できる文字列は、
それWSH選ぶ意味なくない?
などの不毛な問題を解決すべく、
// 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”"ISO-8859-1"
手元で検証した限りではBOMつきのUTF-8
UTF-16
GB18030
は読み込めたが、ADODB
はUTF-32
System
.NET
Framework”System
#RANDOM
現時点でRealtek公式からdownloadできる
“(^^)”#000
#999
#1000
BOFU2017 No.7 “Strahlzwerg”#999
Ubuntu 17.10日本語版をVirtual Machineとして導入した。やはり「デフォルト サウンドデバイスを開くことができません:」の警告が出ている。
「BOMつきShift_JIS
」のBMSを更に発見。
Rubyをinstallした。
#BMP02 bga.wmv
#BGA02 bga.wmv
#VOLWAV 70
#BMP01 Tripdown.png
#BGA01 ooo
#BGA02 Tripdown.png
#BGA
#VOLWAV
#STOP01 0
#WAV01 ��ô 6.wav
#DIFFUCULTY 3
126 003 954 190 622 841 820 816 938 520 698 981 517 882 100 406 352 274 689 636 588 083 570 040 437 216 730 867 544 587 840 974 593 677 991 903 545 882 806 840 526 036 892 638 078 707 320 932 898 157 508 310 675 505 081 933 558 796 047 618 054 083 554 044 936 502 374 547 930 063 183 913 534 071 754 212 482 652 748 738 466 985 729 678 426 246 490 055 741 141 797 391 038 438 557 292 828 878 754 893 053 740 618 138 377 631 330 656 910 450 150 150 379 768 899 862 450 456 899 039 638 876 307 517 621 622 978 564 071 923 171 862 195 895 275 243 412 454 632 872 197 594 704 726 912 603 405 556 249 192 827 391 733 353 874 818 671 768 190 050 766 031 982 536 211 365 019 321 049 048 115 507 011 012 733 460 545 913 693 660 135 505 748 752 400 000
。_warp .rb
)を実行することによって、図表にgimmickを付与する。#VOLWAV 500
#DIFICULTY 2
#DIFFICULTY 2
#COMMENT Notes Design : DRIVE.
#COMMENT Notes Design : Arishima_Caprico
#STOP05 1.5
#STOP
#PREVIEW
#DIFICULTY 2
#VOLWAV 90
#DEFFICULTY 1
#VOLWAV 65
#VOLWAV 80
#DIFICULTY 3
# DIFFICULTY 3
#DIFFICULTLY 4
#VOLWAV 127
#STAGEFILE#STAGEFILE
#DIFFICULT 4
#DIFFICULT 3
#DIFFICULTY
#DIFFICULT 3
#DIFFICULT 2
Shift_JIS
。Shift_JIS
。beatoraja default skin + Noto Sans CJK jp:
beatoraja
"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"
元の文字は以下の通り。
[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」は、現在のTrue
font-family: "Noto Sans CJK JP", "Noto Sans CJK JP Regular" !important;
/* Noto Sans CJK JP: local installed */
Thai文字はTahomaかLeelawadee UIで描画される。
Web browsers並とまではいわないものの、各国語版Windowsで古くから扱えたCJK Legacy Encodings
当然ながらBMSON形式が前提。あるいはcharatbeatHDXなどで書体をNoto Sans CJKに変更して、
BOFU2017 No.17 “D̵̤͗ḛ̷̇a̷̫̓d̶͉́ ̵̜͐S̷̲̋o̵̤̒ǔ̵̠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既定の書体を挿げ替えていただくというのは、普通に無いわ感ある。そもそもいろいろ試した後で元の
私が7-Zipに苦手意識を持っている原因を考えて、英語を読み書きできないからという結論に達した。
「BOM付きUTF-8のファイルを探す」をやりたくて、その後、
BMSE非公式Helpを手元で微修正した。Shift_JIS
BOFU2017 No.366 “disperagioia”#!SpeciaL ThankS by Respecter
”#
”
たまたま見つけてへぇ〜ってなったので、図表filesだけを抽出していろいろ調べてみることにした。
Encoding: UTF-8
Encoding: UTF-8。どういう経緯でこの文字符号化方式が選ばれたのかが気になる。
Encoding: GBK。Shift_JIS
でないLegacy Encoding図表」は他にもいくつか見かけたけど、このBMSだけがたまたま日本語環境のLR2に引っかかったのだとすれば、不運。
#RANDOM
BMS list#OPTION
command