doubledepth

BMSツクール Ver2.0.4

改行文字がCRLFに変更されたり、MIDIの出力名の変更で強制終了しなくなったり、安定性が増した。あとWAV sliceの際にbit深度を選べるようになり、裁断対象WAVをDAWから書き出す段階で配慮する必要がなくなった……わけでもないが多少杜撰に扱っても事後的に対処できるようになった……と思いきやそうでもないようだ。

本日のbacktrace:
#<NoMethodError: undefined method `bytesize' for nil:NilClass>
----------------------- backtrace -------------------------------
(section)                |(line)|(method)
  WAV::WavBase           |   842|in `_extract'
  WAV::Wav               |   728|in `_extract'
  WAV::WavBase           |   680|in `_dump_real_buffer'
  WAV::WavBase           |   647|in `_dump_data_buffer'
  WAV::WavBase           |   635|in `_dump_data'
  WAV::WavBase           |   617|in `_save_file_without_rescue'
FileBase                 |    78|in `block in save_file'
FileBase                 |    78|in `open'
FileBase                 |    78|in `save_file'
  WAV::WavBase           |    88|in `save_file'
  WAV::Wav               |    42|in `save_file'
FileBase                 |    91|in `save'
  Scene_SMF (WAV波形表示)|   320|in `block in on_slice_ok'
  Scene_SMF (WAV波形表示)|   312|in `each'
  Scene_SMF (WAV波形表示)|   312|in `on_slice_ok'
  LNS203 Selectable拡張  |    92|in `call'
  LNS203 Selectable拡張  |    92|in `call_handler'
Window_Command           |   136|in `call_ok_handler'
  LNS290 Window_Setting  |   834|in `process_ok'
Window_Selectable        |   297|in `process_handling'
Window_Selectable        |   276|in `update'
  LNS290 Window_Setting  |   230|in `update'
  LNS120 サブシーン      |   319|in `block in update_all_windows'
  LNS120 サブシーン      |   358|in `block in each_window'
  LNS120 サブシーン      |   355|in `each'
  LNS120 サブシーン      |   355|in `each_window'
  LNS120 サブシーン      |   319|in `update_all_windows'
Scene_UIBase             |    33|in `update_all_windows'
Scene_Base               |    49|in `update_basic'
Scene_SMF (シーン作成)   |   140|in `update_basic'
Scene_Base               |    41|in `update'
Scene_UIBase             |    25|in `update'
  LNS120 サブシーン      |   204|in `main'
  LNS120 サブシーン      |    67|in `run'
Main                     |     9|in `block in <main>'
LNS000 組み込み拡張      |   717|in `block in rgss_main'
                         |     1|in `block in rgss_main'
                         |     1|in `loop'
                         |     1|in `rgss_main'
LNS000 組み込み拡張      |   715|in `rgss_main'
Main                     |     9|in `<main>'
-------------------------+------+--------------------------------

たしか、32-bit float WAVを、16-bitで裁断しようとしてerrorが発生した。いちおう裁断そのものは遂行されたが、裁断結果は32-bit Floatのままであり、各波形も期待した結果よりも短くなっていた。(例によって私が勘違いしている可能性がとても高い)


一箇月を経て

書きかけのBMS分岐parserは(私の想像が及ぶ範囲であればおおむね期待通りに処理できるようになった。ようやく最初の壁は越えられそうな感じ。もう一箇月経てば何もかも忘れそうだが…… “オートメーション工場”を突っ込むと500 MiB近いMemoryを消費するのが心苦しい。

BMSツクール Ver2.0.3a

BMS出力まで完了できた。出力されるBMSの改行文字はLFのみなので、GDAC2 usersは自分でCRLFに変更する必要がある。いまどきGDAC2を必要とするような図表著者なら何の問題もなさそう。

本日のbacktrace:
#<NoMethodError: undefined method `[]' for nil:NilClass>
--------------------- backtrace -------------------------------
(section)              |(line)|(method)
  SMF::Smf             |    96|in `rename_track'
  Scene_SMF (基本UI)   |   247|in `process_rename'
  LNS203 Selectable拡張|    92|in `call'
  LNS203 Selectable拡張|    92|in `call_handler'
Window_Command         |   136|in `call_ok_handler'
  SMF::Window_TrackList|    62|in `process_ok'
Window_Selectable      |   297|in `process_handling'
Window_Selectable      |   276|in `update'
  SMF::Window_TrackList|    46|in `update'
  LNS120 サブシーン    |   319|in `block in update_all_windows'
  LNS120 サブシーン    |   358|in `block in each_window'
  LNS120 サブシーン    |   355|in `each'
  LNS120 サブシーン    |   355|in `each_window'
  LNS120 サブシーン    |   319|in `update_all_windows'
Scene_UIBase           |    33|in `update_all_windows'
Scene_Base             |    49|in `update_basic'
Scene_SMF (シーン作成) |   140|in `update_basic'
Scene_Base             |    41|in `update'
Scene_UIBase           |    25|in `update'
  LNS120 サブシーン    |   204|in `main'
  LNS120 サブシーン    |    67|in `run'
Main                   |     9|in `block in <main>'
LNS000 組み込み拡張    |   717|in `block in rgss_main'
                       |     1|in `block in rgss_main'
                       |     1|in `loop'
                       |     1|in `rgss_main'
LNS000 組み込み拡張    |   715|in `rgss_main'
Main                   |     9|in `<main>'
-----------------------+------+--------------------------------

何をしようとしてerrorが発生したのか瞬時に忘れてしまったが、たしか「v2.0.1時点で何かをしようとしていたMIDI file」をv2.0.3aで開いて、renameしようとしたが変更せずEnterを押した……ような気がする……

Ver2.0.1で「整理」を行っていた場合、再度「整理」を行ってください。

あっ、これかあ。ちゃんと書いてあるのに私アホだな。まあ“update_xxも確認できてよかった。


このapplicationを使う前は「オートメーションに疑似対応」という謳い文句について「何らかのparametersを階調化し、『結果として同一となる音声断片』をうまいこと判断して切り分けてくれるのかな?」などと想像していたが(このsoftwareの用語でいうところの整理がautomationにも適用されるものと勘違いしていた)、私の理解が正しければそういうわけでもないようだった。とはいえいわゆるぶつ切りばらし切りをその場その場で臨機応変に出し分けていける感じは便利そうに思う。AutoSaveが個人的には苦手だが(私が忘れっぽすぎるので)、一般的にはこれもまた便利そうな感じ。

念のため残していたVer2.0.1などのGame.exeもWindowsDefenderに消されてしまったので、無圧縮版も公式で配布し続けてくださると、すくなくとも私にはありがたい。uBMplayだったかBMSEだったか、あのあたりもUPX圧縮版がAntivirus softwaresに消されたり隔離されたりしていたような。

BMSツクール Ver2.0.3a起動しました〜〜〜

Windows Defenderに怒られる

紹介ページのほうでも書いているのですが、Enigma Virtual Boxでパッケージ化している関係かDefenderがトロイの木馬だ!!とお怒りになられるようです。Ver2.01にて作者のサブPCでも同じ警告が出ました(その時は「デバイスで許可」した)が、2.03については何も言われなかったのでDefenderの気まぐれで警告されていそうです。

一応圧縮前のファイル群をスキャンしてウィルスが無いことは確認しているので大丈夫だと思うのですが……

Trojan:Win32/Wacatac.B!ml」でググると他のフリーソフトでも同じ警告が出ることがあるようなので、証明書の付いてない実行ファイルはとりあえずこれだとみなしているのかもしれません。

Virtual Boxでパッケージ化する前のファイルたちをそのまま圧縮したものを貼ってみます。もしこちらでなら警告されないようなら、紹介ページのほうにもこのリンクを載せておこうと思います。

https://www.dropbox.com/s/5y8co3r0o94wvdv/BMS_Maker2.0.3a.zip

長文失礼しました。

おかげさまで無事downloadでき、起動するところまで確認できました! 迅速にご対応いただきありがとうございました! 今後Defenderにひっかかるようなことがあれば「デバイスで許可」を試してみることにします(buttonを押す時間的猶予がある場合は)。BMS出力は明日確認させていただきます!

BMSツクールVer2.0.3がWindows Defenderに隔離される

B(略)

アイエエ!Debug!?Debugナンデ!?

修正しました(Ver2.0.3)…重ね重ね申し訳ない

https://w.atwiki.jp/coolnaurl/pages/28.html

こちらこそ何度も申し訳ないといいますか、前々から私だけQwilight installerでWindowsDefenderに怒られたりToyMusical3でWindowsDefenderに怒られたりPlugout4製品版が私だけ起動しなかったりしてtrouble遭遇率が異常な気がしているので本当に申し訳ないんですよね…… 話を戻すとWindowsDefenderいわくTrojan:Win32/Wacatac.B!mlだそうです。そんなはずねえだろ😠って思って「検疫」を選ぼうとしても決定する前にWindowが閉じてしまうのでdownloadさえできておりません……

BMSツクールVer2.0.2がまたもやDebugBuildっぽい

です!(取り急ぎご報告まで)

#RANDOM#SWITCHを交互に1000層まで繰り返したらbugの嵐

昨日修正したbug

いま修正失敗したbug
BMS誤った補完
#SWITCH 1
#CASE 1
 #RANDOM 2
 #IF 1
  #00001:99

 #IF 2
  #SWITCH 1
  #CASE 1
   #00001:9A
  #ENDSW

 #ENDRANDOM
#ENDSW
#SWITCH 1
#CASE 1
 #RANDOM 2
 #IF 1
  #00001:99
 #ENDIF
 #IF 2
  #SWITCH 1
  #CASE 1
   #00001:9A
  #ENDSW
  #ENDRANDOM
 #ENDIF
#ENDSW

こんにちは、BMSツ(略)の作者です。

エラーチェックの報告助かります。

エラーメッセージを拝見したところ恐らくWAVの読み込みそのものとは関係ない部分で発生しているようです。多分S1から出力されたWAVに関しては問題なく読み込めると思います。多分。

nil がどうのこうのエラーが出る件については、原因と思われる部分を直した(あと微妙に機能を追加した)Ver2.02を公開しましたので、お試しください。(いちおうURLを貼っておきますが、以前貼ったものと同じです)

https://w.atwiki.jp/coolnaurl/pages/28.html

うお〜そういえばBMSに出力しようとして失敗していたような気がします…… 私の記憶は常に曖昧なのでerror logに頼れるのはありがたいです。v2.0.2は明日試させていただきます、今夜はI’m going to oFuton.

チンパンテスト人員

https://www.microsoft.com/ja-jp/download/details.aspx?id=35

https://www.microsoft.com/en-us/download/details.aspx?id=8109

公開日がになっていて、どちらも更新されてそうですね。

うお〜情報いただきとても助かります! 先日夜に教えてくださった方もありがとうございました! SHA-256署名されたinstallerもWindows Vista/XP上でinstall可能でした(Web InstallerのVista/XP経路は塞がれたようでした)。署名者名がMicrosoft CorporationであることだけはVista/XPでも確認できるようです、が、私のようななんでも“OK”を押してくれるチンパンはそんなこと気にしないので結局のところ今までと特に変わりない感じでした。まさにヨシ!


本日は日本における猫の日で猫缶先生が興奮しておられた。ほっこり。

書きかけのBMS parserがその場しのぎの集大成と化して泣いてる。まだ分岐で詰まってる。

BMSツクール2

FL Studio userなら解説動画の通りの手順で万事うまくいくはず。Studio Oneでもほぼ同じ手順で使えるようだが、S1由来のWAVをSoundEngineなどの波形編集softwareで開いて何も変更せず上書き保存する」などの方法で予めmetadataを削除しておく必要はあるかもしれない(何度かerrorが発生したが記録するのを失念しており、どうやったらerrorが発生しなくなったのか思い出せない)。手元で試した限りではWAVの読み込み時やBMSの出力時にerrorが出たが、いつまでもcomputerと和解できない私がどこかで手順を誤ったに違いない。自信ニキがBMSツクール2を試してくださることを祈る。

配布頁に私が訪れるつど解説記事の内容が充実していくのが凄い。BMSにおける音切り工程についての基本的な理解がある人なら、ここまで丁寧な説明があれば余裕をもって使い方を理解できそう。

Errorは自動的にloggingされclipboardに格納されるようだ。それを思い出すまで私はいつもの癖でError Message WindowをActiveにしてCtrl+Cを押してしまっていたため、スクリプト ' Scene_SMF (WAV波形表示)' の 139 行目で NoMethodError が発生しました。undefined method `[]' for nil:NilClassのようなぼんやりした情報しか得られなかった(経緯も思い出せない)。

BMS file出力失敗時のerrorは以下の通りだった:
#<TypeError: nil can't be coerced into Fixnum>
--------------------- backtrace ----------------------------------------
(section)              |(line)|(method)
  BMS                  |      |SeqList:43:in `+'
  BMS                  |      |SeqList:43:in `block (2 levels) in merge'
  BMS                  |      |SeqList:36:in `each'
  BMS                  |      |SeqList:36:in `block in merge'
  BMS                  |      |SeqList:25:in `each'
  BMS                  |      |SeqList:25:in `each'
  BMS                  |      |SeqList:35:in `merge'
  SMF                  |      |Smf:161:in `block in export_bms'
  SMF                  |      |Smf:80:in `each'
  SMF                  |      |Smf:80:in `each_sorted_track'
  SMF                  |      |Smf:154:in `export_bms'
  Scene_SMF (基本UI)   |   477|in `on_export_ok'
  LNS203 Selectable拡張|    92|in `call'
  LNS203 Selectable拡張|    92|in `call_handler'
Window_Command         |   136|in `call_ok_handler'
  LNS290 Window_Setting|   836|in `process_ok'
Window_Selectable      |   297|in `process_handling'
Window_Selectable      |   276|in `update'
  LNS290 Window_Setting|   230|in `update'
  LNS120 サブシーン    |   319|in `block in update_all_windows'
  LNS120 サブシーン    |   358|in `block in each_window'
  LNS120 サブシーン    |   355|in `each'
  LNS120 サブシーン    |   355|in `each_window'
  LNS120 サブシーン    |   319|in `update_all_windows'
Scene_UIBase           |    33|in `update_all_windows'
Scene_Base             |    49|in `update_basic'
Scene_SMF (シーン作成) |   139|in `update_basic'
Scene_Base             |    41|in `update'
Scene_UIBase           |    25|in `update'
  LNS120 サブシーン    |   204|in `main'
  LNS120 サブシーン    |    67|in `run'
Main                   |     9|in `block in <main>'
LNS000 組み込み拡張    |   714|in `block in rgss_main'
                       |     1|in `block in rgss_main'
                       |     1|in `loop'
                       |     1|in `rgss_main'
LNS000 組み込み拡張    |   712|in `rgss_main'
Main                   |     9|in `<main>'
-----------------------+------+-----------------------------------------

DirectX 9.0c SDK (June 2010)復活

Installerの署名がSHA-1からSHA-256に変更され、再配布されている。教えてくださった方ありがとうございました! 明日以降にBMSE非公式helpを更新します。でもこれ、従来のEnd-User Runtimeよりも説明するのが面倒くさい感じ。

  • 言語が英語以外だと文字化けの嵐。(1)(2)(3)
  • Uninstallが可能。可能ならその件に関しても説明したほうがよいのだろうけれど、
  • UninstallしてもD3DX9_43.dllその他のruntime filesは残り続ける。

BMSツクール Ver2.0.1無事起動

BMSツクールが略:

大変申し訳ありません。

ランタイムについては完全に見当違いでした。DLL自体が(Releaseビルドであるべきなのに)Debugビルドであったことがエラーの原因でした。DLLを正常なものに差し替えてついでに別のバグを直したVer2.0.1を公開したのでこちらでお試しください。(このページ→ https://w.atwiki.jp/coolnaurl/pages/28.html でリンクを貼ってます)

DebugBuild DLLなんてあるんですね〜迅速な修正ありがとうございました! 解説動画もさくっと用意されていて凄いです。起動を確認して動画を一度観たところで寝る時間が来たので続きは明日試させていただきますね。BMSE非公式Help冗長版も併せて微更新させていただきました〜

取り急ぎComment返信

BMS Maker 2 が起動できない件について:

WAV処理部分のコードはVisual Studio 2019から作られているので、Visual C++の最新のランタイムをインストールすれば多分動くと思います。もしダメならまた教えて下さい。

作者様のお手を煩わせてしまい申し訳ないです……! 前回は以下のruntime環境で起動しようとしてerrorが発生しました:

  • Microsoft Visual C++ 2015–2019 Redistributable (x64) - 14.28.29325.2
  • Microsoft Visual C++ 2015–2019 Redistributable (x86) - 14.24.28127.4

x86版が古かったようなので、ご助言に従ってv14.28.29325.2をinstallしましたが、BMS Maker 2を起動しようとしたところ、再び前回と同じerrorが発生しました。裏に見えるconsole windowには[:size_of_double, []]とだけ表示されておりました。RPGツクール関連runtimeとして、

  • RPGツクール2000 ランタイムパッケージ
  • RPGツクール2003 ランタイムパッケージ
  • RPGツクールVX RTP 1.02
  • RPGツクールVX Ace RTP 1.00
  • RGSS-RTP Standard 1.03

が当環境に導入済みでした。お役に立てれば幸いですが……


私も自分がuploadした1000層分岐のHTML sourceを眺めていたらbugを見つけてしまった。寝よう!

divしかないなポルナレフ

分岐制御用のsidebarを私は馬鹿正直にfieldset要素でくるんでいたが、結局うまくいかなかった。fieldsetoverflow:scrollを指定してもscrollbarが出ない。要素上でwheel middle-clickからautoscrollingしても思い通りに移動できない。文字列を選択しつつdragしても水平方向にscrollingできない。最初からdivで妥協していれば私の数日間は無駄にならなかっただろう。まあいいや。

“オートメーション工場”の入れ子の終わり際を視覚化できて、なかなか達成感があった。入れ子にされた#RANDOMのscope終端符}は1260個分連続している。これが何の役に立つかというと何の役にも立たないが、HTML形式では512層までが限度であるはずの入れ子構造を延々視覚化し続けられたりして私が楽しい。

Comment返信

https://www.dropbox.com/s/eguwkrwyj1si60j/winrar-option-file.png

WinRAR 圧縮率は言うまでもなく、特定のファイルを格納しないだけでなく、圧縮しづらいファイルを圧縮せず格納する機能が強力で購入に踏み切りました。

画像の設定のパッケージ作成にOGGやMPGが含まれている場合、ものすごい速度で進捗ゲージが伸びていきます。そのうえ最終的なサイズはほとんど変わらないというから、もうこれはオススメするしか…。

あ〜っ「OGGやMPGは無圧縮で書庫に格納してしまう」というのはとても賢いですね!!! そうですよね、あのへんの圧縮済み形式は無理に縮めても圧縮できて数%程度ですし、割に合いませんよね。WinRARのこの機能はBMS package編纂者の強い味方といえましょう。

私も過去に数回買っております。Computerを乗り換えるたびに登録keyをどこに置いたか忘れてしまいますが…… Everythingで探しても見つからないなあと思ったらdo-not-delete-this-serial.zipとか圧縮してあって当時の自分を殴りたいですね(いまrenameした)

BMS Maker 2

new! シーケンス化機能によりオートメーションに疑似対応!!←ヤバい!

えっそれは素でやばい。いまのところ絶対に「スクリプト 'LNSX00 DLL読み込み' の 23 行目で RuntimeError が発生しました。」ってなって起動できないので修正版が待たれます!!![修正済]

あと安定したらBMS Maker旧版の頁からBMS Maker 2の頁にhyperlinkしてくださると、個人的にはありがたいかなと思うのです。[参照済み]先日BMSE非公式Helpから参照させていただいたところでした。

ゴウォーク形態

第三回BMS衆議院選の2月14日朝までの修正を反映した非公式packageが公開されていた。とてもありがたい。書庫はRAR5形式でquick open informationが付与されているので素早く開かれる。一般的なBMS作品のresources構成だとRAR4形式のほうが圧縮率は高まる場合も多いが、古いRAR形式で圧縮された巨大なBMS packageは開くだけでも延々待たされるので、私はRAR5形式を推す。


分岐を視覚化するうえで当初考えていた画面はそれなりに単純で気に入っていたが、この形だと視覚化できないnodeがあることに気付いたので作り直し中。今回はBMX2WAV v2にならい#RANDOMによって生成された値」のscopeも視覚化を試みる。#ENDRANDOMで閉じられないscopeは図表末尾でまとめて閉じられる。“オートメーション工場”の場合、}が5000個くらい連続する。

こじらせ迷宮

BMIIDXView2015のtree viewに示唆を受けて、深すぎる入れ子nodesを別のcontextに切り離してみたところ、(おそらく)うまくいった。書きかけのBMS parserは、“オートメーション工場”のような際限のない兄弟型も、nest1500.bmsのような無制限の子孫型も、「小分けにされた複数のBMS filesの構文木の集合」のように管理する。しかし最初のmodelingが拙かったため、“オートメーション工場”の先頭から末尾までを#IF#ENDIFでくるむだけで(小分けにする処理に失敗して)応答不能状態に陥る。どのように直せばいいかはなんとなくわかるが、今から書き直すのはしんどい。寝よう!

nest1000.bms

Stress testの一環としてscriptで出力した、1000重の入れ子にされた#RANDOM|#SWITCH bms。最大1000回乱数生成しうるということは、999重の入れ子と呼ぶべきかもしれないが、まあいいや。

BMX2WAV v2は無言で強制終了する。nanasigroove1は音が鳴らなかったり図表が描画されなかったりしてよくわからないが、unindent版の#RANDOM#SETRANDOMに全置換して渡すと強制終了する。uBMplay/mBMplay/BMIIXView2015は普通に演奏する。BMIIXView2015のtree viewは127層ごとに構文木を折り返しつつ全分岐を描画してくれる(すっげ〜)。私の書きかけparserは死んだので制限を設け、深すぎる入れ子は代替nodeに置換することにした。1000層以上の入れ子を扱えそうな方法も思いついたが、オートメーション工場対策で既に複雑化してしまっているので、今回は諦める。

(地震の件、ご心配いただきありがとうございました。皆様もご無事でありますように)

オートメーション工場を倒した

Firefoxで2.8秒、Blinkでも3.1秒ほどでオートメーション工場の構文木を構築できるようになった。あちこち処理を変えまくったので“壊れた分岐”のtestは全部やり直す必要がありそうだが、とりあえず先に進めるめどが立ってよかった。祝杯はいましがたの地震でふいになった。

ンッゴォーーーー

Web browsersにBMS fileをdropすると分岐を入れ子のように視覚化するところまでできていたが、“オートメーション工場”をBlinkにdropすると一切の応答がなくなり頭が真っ白になった。本命がこのありさまではふりだしに戻るしかない。応急的な小細工こそ思いついたが……

Fork版μBMSC 3.5について

設定fileiBMSC.Settings.xml)が従来版μBMSCとの互換性を持たない、という情報を匿名氏に教えていただいた(ありがとうございました!)。教えていただくまで私も忘れていたが、私が捕捉できたBluvel氏の私家版μBMSCはすべて、設定fileに互換性がなかった。従来版μBMSCに私家版を上書きinstallすると、起動に失敗する。私家版は新規installに限る。

私の記憶が確かなら、上書きinstallして起動するとμBMSCのWindowがぶっ壊れて混沌たる光景が見られたような。上書きinstallした結果としてviewer appsの設定が全部吹っ飛んだ方もいらっしゃる様子なので、移行を検討されている方はご注意ください。

ギョエー

入れ子にされたBMS分岐を入れ子なしのHTML要素で表現するために、Custom Data属性値をCSS変数のように使えるだろうと思っていたが、将来的にはともかく現時点では以下のようには書けなかった:

#OUTLINER :is(section, article, aside)[data-nesting-level] {
    margin-inline-start: calc(attr(data-nesting-level em, 0) + 1em);
}

これが駄目ならnest1000.htmのように入れ子用のrulesを1000個書いて待ち受けるか、HTML要素のstyle属性に直接styleを書き込むような力技しか思いつかないが、気が進まない。他に方法はないのか。

BMSE非公式Helpを更新した

これらはOfficial Microsoft Download Centerからまだ入手できるが、installersがSHA-1で署名されていて先行きが不安なので、非公式HelpではWeb Archiveを参照した。あんまり良くない対応だが。

Comments返信

RMS値の話をしたものです。bms-rendererとの存在を知れたので十分です!ありがとうございました。

これはご丁寧に! bms-rendererはWindows以外の環境でBMSをWAV化できる数少ない選択肢のひとつでした。PulsusがMonoや.NET Coreなどを介してWindows外で動作するなら、Pulsusも同じ用途に使えるかもしれません。

 ちなみにμBMSCの拡張版は私以外にも作っています。

https://github.com/psyk2642/iBMSC/releases

おお〜、これは🗹 Disable vertical movesを記憶できるのがとっても気持ちいいですね! のちほど特徴を確認してみます、情報ありがとうございました! 24鍵盤図表をBMS形式で表現する試みも応援しております!

Microsoftダウンロードセンター、SHA-1署名のダウンロードを「本当に」提供中止[追記] から提供再開

はい私死んだ! 半年前の危惧が現実に。BMS clientsでいうと、LR2, HDX/IIDXv, mBMplay (DirectX9 modeの場合), PMSee-VはDirectX9.0cのRuntime Librariesを必要とする。しかしDirectX End-User Runtimes (June 2010)のinstallerはSHA-1署名なので、もはや公式siteからはdownloadできない。またuBMplay 1.5系が必要とするVisual C++ 2010 ランタイム (x86)も、installerはSHA-1で署名されている。こちらはこの日記を書いている時点では依然download可能だが、今後いつまで生きているかは分からない。bMoL/BmrFが必要とするVisual C++ 2005 ランタイム (x86)に関しても然り。そしてこれらに限らずMicrosoft関連の文書群の多くの所在がまたもや変更されまくり。

そしてDirectX End-User Runtime Web Installerはinstallerのdownloadこそできなくなったが、installerを実行すると普通にwebを経由してDirectX 9.0cまでのruntime filesをinstallできてしまう。そっちは塞がなくていいのだろうか。

近日中にBMSE非公式helpを更新したい。

μBMSC私家版がやばい

新設定: スクラッチ位置の変更、LNの始点と終点をリンク

BMSON形式で出力できたり、左側Scratch Laneの描画位置を変更できたりする。「LNの始点と終点をリンク」はよくわからない。この私家版は#BMP定義も編集できるので、いまのところ個人的には最もお勧めしたいBMS図表editorsのひとつ。

BlackCity [7EXTRA]”をBMSONに変換してみたところ停止時間が合わなかったが、そういえばこの図表はもともとiBMSC/μBMSCでも扱えない異常な分解能なので仕方なかった。たぶん一般的な図表なら問題ないはず。

    "bga_events": [
      {
        "id": 36,
        "id_set": [],
        "condition": "",
        "interval": 0,
        "y": 9992
      },

 ““何か””が企てられている……

HTML beautifierを一生分見た日

計算量や実行効率やalgorithmを気にするような水準に私は達していないのだから、迂遠でも確実な方法を選んでいこうな、と自分を誤魔化していたが、DOMを6周したあたりで流石に「回り道にも限度はあるのでは……?」と思い始めた。#IFが来ないうちに突然#ELSEIFが来た場合は、そのblockは#IFと同様に解釈すれば問題なさそうだが、突然#ELSEが来た場合はどう扱うのが適切だろうか。「否定すべき条件が示されなかった」とみなし、#ELSE blockを丸吞みするかな。そういう寛容さは誰も幸せにしないんじゃないかという気もするけどまあヨシ!

Fullpath定義のBMSON、もしかするとfbmsonplayが生成する_temp.bmsを参考にされたのかも。

BMS filesの音量一括調整だが、beatoraja userかつIRを気にしない私なら、RMSなりLUFSなりをまとめて計測したのち、適切な#VOLWAVを各個算出してBMS file末尾に直接上書きしていくscript」を組むかな。IRに参加したくなったら、末尾に追記した#VOLWAVを削れば済むはず(fileのtimestampとかがfile hashに関係ないなら、元に戻せるはず)。でもたぶんそういう話じゃなさそう。

情報系つよつよおじさん is WATCHING ME

いつも楽しく拝見させていただいております。

BOFXVIにおいてそちらが興味ありそうな話を振っておきます。

https://twitter.com/bms_of_fighters/status/1323104589776789505

「bmsonにおいてフルパスで定義された作品」がありました。上記の報告を受けて現在は修正されていますが、すくなくともDLした当初は当然ではありますが再生できない作品でした。

使用ソフトはbeatorajaでした。今思えばフルパスでもいけたんだなあとなんとなく思っています。

ちなみにこの時は時期的に一斉公開前の話となります……と言ってる時点で誰がこの話をしているかはおわかりかと思いますので名前は敢えて言いません。

(TweetID=>new Date(Number((BigInt(TweetID)>>22n)+1288834974657n)))("1323104589776789505")
// Mon Nov 02 2020 12:28:10 GMT+0900 (日本標準時)

一斉公開開始が、件の作品登録がTweetが、作品修正が、なので半日間は誰もが未修正版を得られたようですが、お話ぶりから実行委員会のどなたかとお見受けします。お話を振っていただきありがとうございます!

BMSON仕様は“The implementation must protect from malicious paths”と定めており、これは脆弱性対策の一環と思われます。Path traversalやnull byte攻撃とまでいかなくても、fullpath定義によって図表著者氏の個人情報が一部漏れてしまうincidentは現に起こってしまったわけで、私見ではpathの定義を手放しで肯定はできないように感じています。Secureなcodingは難しすぎる……

  • BananaBeats, beatoraja, BmsONEおよびPulsusは、fullpathが定義された音声をplaybackします。
  • Bemuseおよびraindropは、fullpathが定義された音声をplaybackしません。
  • Bemuseは上位階層参照のみならず下位階層参照も禁じています。miss系のdivided BMSを遊べるようになれば個人的には嬉しいですが、開発者氏らが階層参照そのものを禁止する判断を下したとしても仕方ないだろうとは思います。[追記] Bemuse v50にて、“miss”やその他の一部のBMSが用いる「pathの定義」が解釈されるようになりました!

BMSでいうと#PATH_WAVとかありますし、beatorajaのresource参照は回線さえ越えうるので、図表著者としては夢が広がるのですけど。

自信ニキも見てる

複数のBMSファイルの音量を整えたいのですが、いい方法はなんかないですかね…RMSとかLUFSとかを計測して一気に調整、って形がベストだと思うんですけど

情報技術音痴の私に聞かれてもあれですが、そのご質問にはたまたま答えられそうです。A study of loudness in BMS filesがちょうどそんな感じの手法だったように記憶しています。あとは一連の流れを自動化できれば良さそうですが、SoundEngineは大量の音声を処理するには低速すぎるし、Voltは趣旨が違うような、あっでもcommandlineがありますね、私は試したことはないですけど……

あっ、やっぱり駄目だ

先日はBMSの#RANDOM#SWITCHを同じ扱いにすることを検討したが、#RANDOMの生成値の寿命を考えたら#SWITCHから#ENDSWまでをひとつのblockとして扱うしかないという結論に達した。#IF#ELSEIF#ELSEがblock scopeを作るのは分かるが、#CASE#DEFがblock scopeを作るのはおかしい。と個人的には感じるので、#CASE#DEFはblockではなくlabelにするしかない。

#TITLE scope
#BPM 60
#SWITCH 1
#CASE 1
    #SETRANDOM 2
#CASE 2
#CASE 3
    #IF 1
        #00111:11
    #ELSE
        #00115:55
    #ENDIF
#ENDSW
title = "scope";
bpm = 60;
switch (getRandomInteger(1, 1)) {
case 1:
    let value = getRandomInteger(2, 2);
case 2:
case 3:
    if (value === 1) {
        data["001"]["11"] = ["11"];
    } else {
        data["001"]["15"] = ["55"];
    }
}
  • JavaScriptでは必ずelse blockが選ばれる。[追記] switch (2)またはswitch (3)の場合、Uncaught ReferenceError: can't access lexical declaration 'value' before initializationになる。letでなくvarなら常にelse blockが選ばれるが、varはblock scopeを持たないのでswitch文の外で変数を宣言したのと同じ意味になり、比較する意味がない。
  • nanasigroove1では必ず#ELSE blockが選ばれる。要indent消去。
  • BMIIDXView2015では必ず#IF blockが選ばれる。
  • case句がblockではないことを示すための“an unstructured switch” styleのindent。

IIDXvは#CASE#DEFもblockとして扱う。Flowは#CASE 1から#CASE 3までFALL THROUGHするが、#CASE 1で生成された#RANDOMの値は#CASE 3まで届かず、既定値として値1が適用される(charatbeatHDX同梱html → 遊び方 → 更新履歴 → v0.92を参照)。

推測だが、初代nanasigrooveは#RANDOM#SWITCHと同様のblockとして実装している。閉じられていない#RANDOMが一定数以上連続するとcall stackが溢れるし、#RANDOM未宣言の#IF#ENDIF」や「#SWITCH未宣言の#CASE|DEF#ENDSW」は全内容が解釈される。

ここにきてmodel変更

#TITLE skip
#BPM 130

#RANDOM 2
#SWITCH 3
    #CASE 1
        #00111:11
        #IF 1
            #SKIP
        #ENDIF
    #CASE 2
        #00113:22
        #IF 2
            #SKIP
        #ENDIF
    #DEF
        #00115:33
#ENDSW
title = "skip";
bpm = 130;

let value = getRandomInteger(1, 2);
switch (getRandomInteger(1, 3)) {
    case 1:
        data["001"]["11"] = ["11"];
        if (value === 1) {
            break;
        }
    case 2:
        data["001"]["13"] = ["22"];
        if (value === 2) {
            break;
        }
    default:
        data["001"]["15"] = ["33"];
}
  • JavaScriptで結果は5通りに分岐する(key1 or 3 or 5 or 1+3 or 3+5)。
  • nanasigroove1で結果は3通りに分岐する(key1 or 3 or 5)。要indent削除。
  • BMIIDXView2015いわく、9行目に不正な#SKIPがあります」。そうかな…そうかも…

#SWITCHが開かれてから「最初の#CASE句または#DEF句」までのnodeもnanasigrooveは解釈できる。JavaScriptだとvar r=1;switch(r){r+=1;default:console.log(r)}Uncaught SyntaxError: invalid switch statementになるが、C言語だとそうでもないのだろうか。EasyIDECで挿し込んだprintfは何の反応もなかったが、errorにはならなかった。えぇ……

#SWITCH#RANDOMのように扱い、#CASE|DEF(#CASE|DEF)–#ENDSW#IF(#ELSEIF#ELSE)–#ENDIFのように扱えば、nodeにも寛容になれそうだ。現在の書きかけparserの#SWITCHは外殻と#CASE|DEFの二重block構造でうまく働いているので書き直したくはないが、仕方ない。ただし変更後は、複雑な入れ子で終端符が省略された場合にどんな構文木が導出されるのかまったくわからなくなるだろうな。[追記] このmodelは欠陥があるので捨てた。

Phokanupou

次の検索結果を表示しています: Photokano

書きかけのBMS parserに問題があったが、自前の再帰下降構文解析関数を捨てたら一瞬で解決した。悲しいのか嬉しいのかわからない感情が生じた。これで#RANDOM系の入れ子や終端符省略には対応できたと思う。私は#SWITCH系を素朴にcode blockとしてmodel化していたが、よく考えたらこれはただのgotolabelでしかないような気がしてきた。以下の説明はへえ〜と思ったしやっぱり〜とも思った。

Switch statements come in two main variants: a structured switch, as in Pascal, which takes exactly one branch, and an unstructured switch, as in C, which functions as a type of goto.

The second form are unstructured switches, as in C, where the cases are treated as labels within a single block, and the switch functions as a generalized goto. This distinction is referred to as the treatment of fallthrough, which is elaborated below.

a generalized goto(一般化された後藤)

「switch文 goto」で検索して上位にhitした頁からC言語のcodeを拝借し、BMSおよびJavaScriptで書き直してみた。
#BPM 130
#TITLE block or label
#WAV11 01.wav
#WAV22 02.wav
#WAV33 03.wav

#SETRANDOM 3
#SWITCH 3
    #CASE 1
        #00111:11
        #IF 3
    #CASE 2
            #00113:22
        #ENDIF
        #SKIP
    #DEF
        #00115:33
#ENDSW
// #001: key1 + key3
// or key3 or key5
bpm = 130;
title = "block or label";
wav["11"] = "01.wav";
wav["22"] = "02.wav";
wav["33"] = "03.wav";
// generate randomInt from 3 to 3
let value = getRandomInteger(3, 3);
switch (getRandomInteger(1, 3)) {
    case 1:
        data["001"]["11"] = ["11"];
        if (value === 3) {
    case 2:
            data["001"]["13"] = ["22"];
        }
        break;
    default:
        data["001"]["15"] = ["33"];
}
// Uncaught SyntaxError:
//  expected expression, got keyword 'case'

後者はerrorになるが、前者は初代nanasigrooveで遊べてしまう(indentは消す必要がある)。nanasigrooveの挙動を観察すると、

  • #SETRANDOMの値を12に変更しても、結果は変わらない。
  • #IF 3#CASE 2の間に#SKIPを挿入すると、結果はkey1 or key3 or key5になる。[追記] #SETRANDOMの値が何であれ、#IF 3の中の#SKIPが評価される。
  • #RANDOMの生成値と#SWITCHの生成値は別物。共有されない。当然? [追記] #RANDOMを伴わない#IF blockをどこに置いてもlabel番号を問わず#IF blockの内容が評価されてしまうんですけど???
他方、BMIIDXView2015のTREE VIEW:
#SWITCH 3 < #CASE 1 < #IF 3 < #CASE 2と表示されるが、実際の演奏結果はkey1 or key5になる。#IF 3#CASE 2の間に適当に何か書いても反映されない。#CASE 1直下の#IF blockに処理を流すには、#CASE 1直下の階層に(#IFに到達する前に)#RANDOMを書いておく必要がある。

TechnicalGrooveは強制終了し、BMX Outlinerはerrorで停止する。

私の書きかけparserの場合、#IF 3を終端符なしの空っぽのcode blockとして解釈し、即座に閉じる。#CASE 2の内容は普通に解釈し、始端符なしの#ENDIFは単に無視する。結果としては初代nanasigrooveの解釈と一致する。

日記

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
Brilliant Techno Square
雑多なメモ
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