doubledepth

QMS-Player並みに導入しやすくなり優勝するbeatoraja

これからbeatorajaを導入する64-bit Windows usersは、Java同梱版をdownloadして展開してbeatoraja.exeを実行するだけでbeatoraja Configurationを起動できる。

むにむにおじさん氏によるbeatoraja用Skinも併せてお勧めしたい。5 keys図表はこれで遊ぶに限る。ただし版にはbugがあり、演奏中にbeatoraja_log.xmlが肥大化し続ける。これを抑止するには、skin/brand-new/play.luaをメモ帳などで開き、以下の修正を加えて上書き保存する。

174行目あたりに一文字追加して、
    local start_flag = true
    local function _start_flag()
560行目あたりにも一文字追加する。
        {id = "000000", draw = function() return _start_flag() end, dst = {{x = 337, y = 9, w = 144, h = 24}}},

beatoraja全部入り版のEXE file、実行時のcommand-line引数は以下のような感じだった。

"D:\beatoraja0.8.1\.\jre\bin\javaw.exe" -Xms1024m -Xmx4096m -classpath "build\beatoraja.jar;beatoraja.jar;ir\.;ir\..;ir\minir-421.jar" bms.player.beatoraja.MainLoader

beatoraja.exe -a "chart-path"などの引数は、普通に前述の引数群に後続して追加され、それで問題なく動作する。-Xms-Xmxに関しては効果が疑わしいという話もあった(にもかかわらず今もなお指定され続けている)し、Java 15から普通に使えるようになったはずのShenandoahGCが指定されていない理由も私には分からないが(安易にoptionを付けるだけでは意味がないのかも)、全部入り版を選ぶusersはそういった部分に触れるべきではないのだろう。Consoleを確認したい場合や自分好みのoptionsを指定したい場合は、従来通りJava非同梱版を使えばいいだろう。

[追記] 唐突に気がついた。私は「Heap optionを指定すること」が無意味なのだとばかり思っていたが、そうではなく「Heap optionに必要以上の値を割り当てること」が無意味、という話だったのか。やばいなあ〜こんな勘違いする普通? となると、「割り当てる値を増やす」は無意味であっても、-Xms-Xmxを同じ値にする」という小技そのものは有効だったのかもしれない。

[追記] あと「従来通りJava非同梱版を使えばいいだろう(キリッ」ってま〜たかしこぶってるけどJava同梱版にもbeatoraja.jarは存在するのに何を言っているんだろう? 自分で読み返して内容が理解できず物凄く不安になった。

透過PNG LAYERの互換性問題ふたたび

けもびーつ」収録曲“sweet?”のPNG LAYERは、透過領域と完全な黒色を併せ持つ。

透過PNGで黒を透過しない実装の場合、画像全体が薄暗くなる。透過PNGでも黒を透過する実装の場合、画像全体が明るいまま。

  • Angolmois/HDX/IIDXView2015/LR2/mBMplay/nanasi/QMS/ruvitで透過部分周縁部はblendingされる。
  • BananaBeats/beatoraja/BGAEncAdv/Qwilight/Pulsus/raindropで透過部分周縁部はblendingされない。

rgba(0,0,0,n)の画素について、「透明度のみを反映する実装」と「透明度が何であれ完全な黒色は完全に透過する実装」がある。実装を選ばず共通の描画結果を得る方法のひとつは、rgba(0,0,0,n)rgba(1,1,1,n)に置き換えるというもの。(ただしrgba(0,0,0,0)の画素は据え置く)

適当にでっち上げたWSH JScriptに、透過PNG LAYER filesを一括dropし、修正画像を得た
// https://imagemagick.org/script/download.php#windows
var MAGICK = "C:\\ImageMagick-7.0.10-53-portable-Q16-x64\\magick.exe";
(function (ws) {
    "use strict";
    var args = ws.Arguments;
    var txt;
    var tname;
    var txt_w;
    var hist;
    var str;
    var absPath;
    var exec;
    var fso = ws.createObject("Scripting.FileSystemObject");
    var shell = ws.createObject("WScript.Shell");
    var i = 0;
    var l = args.length;
    while (i < l) {
        absPath = fso.getAbsolutePathName(args.item(i));
        if (fso.fileExists(absPath) && fso.getExtensionName(absPath).toUpperCase() === "PNG") {
            txt = absPath.replace((/\.png$/i), ".txt");
            tname = absPath.replace((/\.png$/i), "___.txt");
            exec = shell.exec("\"" + MAGICK + "\" \"" + absPath + "\" \"" + txt + "\"");
            while (exec.status === 0) {
                ws.sleep(200);
            }
            hist = fso.openTextFile(txt, 1);
            txt_w = fso.createTextFile(tname);
            while (!hist.AtEndOfStream) {
                str = hist.readLine();
                if (str.indexOf("(0,0,0,0)") === -1) {
                    str = str.replace((/\u00280,0,0,/g), "(1,1,1,").replace("#000000", "#010101");
                }
                txt_w.writeLine(str);
            }
            hist.close();
            txt_w.close();
            fso.deleteFile(txt);
            exec = shell.exec("\"" + MAGICK + "\" \"" + tname + "\" \"" + absPath + "\"");
            while (exec.status === 0) {
                ws.sleep(200);
            }
            fso.deleteFile(tname);
        }
        i += 1;
    }
    ws.echo("Done.");
}(WScript));

Drag-and-Dropできないpathの問題をPowerShellで解決した

[追記] 以降64-bit Windows用にEXE化された「Java導入不要版」が公式にreleaseされている。これからbeatorajaを導入する場合は公式お手軽版をdownloadして展開するだけでよく、その場合は本記事の内容は不要。

以下の内容のtext fileをBOMつきUTF-8で保存して、beatoraja.ps1と命名する:
# Config =====================================================================

# beatoraja: https://mocha-repository.info/download.php
[string] $beatoraja = 'D:\bms\beatoraja0.8.1\beatoraja.jar'

# OpenJDK (Amazon Corretto): https://aws.amazon.com/jp/corretto/
[string] $java = 'C:\jdk\bin\java.exe'

# JavaFX SDK: https://gluonhq.com/products/javafx/
[string] $javafx = 'C:\javafx-sdk\lib'

# $TRUE or $FALSE
[bool] $skip = $FALSE

# ============================================================================

$java_options = @(
    '-Dsun.java2d.opengl=true'
    '-Dawt.useSystemAAFontSettings=on'
    '-Dswing.aatext=true'
    '-Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel'
)
$env:_JAVA_OPTIONS = "'" + ($java_options -join ' ') + "'"
$is_chart = '\.(bme|bml|bmson|bms|pms)$'
$p1 = '--module-path'
$p2 = '--add-modules=javafx.controls,javafx.fxml'
$p3 = '-XX:+UseShenandoahGC'
$p4 = 'bms.player.beatoraja.MainLoader'
Push-Location -LiteralPath (Split-Path $beatoraja -Parent)

function Start-Configuration ($skip) {
    switch ($skip) {
    $TRUE {& $java $p1 $javafx $p2 $p3 '-jar' $beatoraja '-s'}
    $FALSE{& $java $p1 $javafx $p2 $p3 '-cp' $beatoraja';ir/*' $p4}
    }
}
function Start-Beatoraja ($p) {
    Add-Type -AssemblyName System.Windows.Forms
    $t = 'AUTOPLAY?'
    $c = 'beatoraja: Play only once'
    $b = 'YesNoCancel'
    $i = 'Question'
    $re = [System.Windows.Forms.MessageBox]::Show($t, $c, $b, $i)
    switch ($re) {
    'Yes' {& $java $p1 $javafx $p2 $p3 '-jar' $beatoraja $p '-a'}
    'No'  {& $java $p1 $javafx $p2 $p3 '-jar' $beatoraja $p}
    'Cancel' {Start-Configuration $skip}
    }
}
If ($args.Length -eq 0) {
    Start-Configuration $skip
} ElseIf (Test-Path -LiteralPath $args[0]) {
    $p = [System.IO.Path]::GetFullPath($args[0])
    If ($p -match $is_chart) {Start-Beatoraja $p}
}
Pop-Location

このscript fileを適当な場所に置く。先頭の設定項目の内容は自分の環境に合わせて適宜変更する。


このscriptのshortcutを作成し、shortcutのPropertiesTargetに以下を指定する:

Windows PowerShell 5.1までの場合:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -ExecutionPolicy RemoteSigned -File "D:\bms\beatoraja.ps1"
PowerShell Core 6.xまたはPowerShell 7以降の場合:
"C:\Program Files\PowerShell\7\pwsh.exe" -NoProfile -ExecutionPolicy RemoteSigned -File "D:\bms\beatoraja.ps1"

このshortcutに対してBMS/BMSONの図表fileをdropすると、「batch fileやWSH fileではDrag-and-Dropで渡せないpath」もbeatorajaに渡すことができる。

PowerShell Script経由ならD:\🎹\a.bmsのようなUnicode pathもDrag-and-Dropで渡せる。

Caused by: java.nio.file.InvalidPathException: Illegal char <?> at index 3: D:\??\a.bms

公式のbeatorajaは「Shift_JISで表現できるpath」しか受け付けないが、Unicode pathが渡されていること自体は確認できたので個人的にはすっきりした。ようやく「けもびーつ」の続きが遊べる。

全角空白さん「この俺を超えることはできぬぅ!」

[追記] 以降64-bit Windows用にEXE化された「Java導入不要版」が公式にreleaseされている。これからbeatorajaを導入する場合は公式お手軽版をdownloadして展開するだけでよく、EXE fileへのdropなら全角空白pathもまったく問題なく渡せる。

(役に立たなくなった記事を読む:)

Launch4jを代替するbatch filesを書いたが、以下のpathはbatch filesへDrag-and-Dropしてもbeatorajaに渡せなかった。引数側で引用符を付けても、意図しない箇所で勝手に外される。

D:\bms\ケモノ系オンリーBMSパッケージ「けもびーつ」\[けもびーつ]INSANE WOLF[ogg]\_____INSANE.bms

ちなみに「Launch4jでEXE化したbeatoraja」に対するこのpathのDrag-and-Dropは、有効。「代替batch filesと同じ処理を行うWSH JScript」に対するこのpathのDrag-and-Dropも、有効。Windows batch fileに対するDrag-and-Dropだけが無効。原因は「ファイルエクスプローラからバッチファイルへドラッグ&ドロップして正しいファイル名を得る方法」に書いてあった。

それで思い出したが、旧BMX2WAV用の拙作batch fileでもこの問題に悩まされ、黒魔術めいた文字置換処理を噛ませていた(が、Windows 7以降ではcmd.exeの仕様変更によって動作しなくなった)。先のBOFXVIでもhizumi midbass^^_XXX.oggなどを見かけて私は一人でdamageを受けていた。WSHでもD:\🎹\a.bmsのようなUnicode pathのDrag-and-Dropは不可能だ。どうしたものか。

Java 15 + beatoraja + BmsONE

[追記] 以降64-bit Windows用にEXE化された「Java導入不要版」が公式にreleaseされている。これからbeatorajaを導入する場合は公式お手軽版をdownloadして展開するだけでよく、BmsONEから呼び出す場合も普通にbeatoraja.exeに対して"$(filename)" -aなどと指定するだけでよい。

(役に立たなくなった記事を読む:)

先日はbeatorajaをJava 15上で走らせることに成功したが、BmsONEからbeatorajaを呼び出すところで躓いていた。beatoraja-config.batと同じ場所に以下の内容のbatch fileを書いて解決した。

beatoraja-bmsone.bat:
if %1 == -s call beatoraja-config.bat & goto :eof
set _JAVA_OPTIONS='-Dsun.java2d.opengl=true -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel'
jdk\bin\java --module-path javafx-sdk\lib --add-modules=javafx.controls,javafx.fxml -XX:+UseShenandoahGC -jar beatoraja.jar %*
BmsONE - External Viewer Configuration:
Name:
beatoraja
Program Path:
beatoraja-path\beatoraja-bmsone.bat
Working Directory:
$(exedir)
Play from Beginning:
"$(filename)" -a
Play from Here:
"$(filename)"
Stop:
-s

beatorajaにはtraining modeが用意されているが、演奏開始位置を引数で指定できるのか私は知らない。とりあえず、「最初から再生」した場合は自動演奏を、「現在位置から再生」した場合は手動演奏を行うようにした。

「停止」はbeatorajaの設定画面を起動するようにした。BmsONEから呼び出されるbeatorajaがPortAudioを用いるとBmsONE側の音声が鳴らなくなるので、予めOpenALに切り替えるためだ。が、BmsONEの「停止」buttonは「再生」buttonsが押された後でないと反応しないように見える。これでは結局「音が鳴らなくなってからBmsONEを再起動」するのと変わりがない。最初から「Viewer専用に設定されたbeatoraja」を別に用意しておくほうがsmartかもしれない。

このbatch fileを書いた後で、別のsimpleな方法を某氏に教えていただいた。ありがとうございました。かつてXAMPPのPath環境変数を手動で編集しようとしてぐちゃぐちゃにしたことがある私にとって、JavaのPathを通す作業も難しく見える。私にはあらゆることが難しい(心の俳句)

【2021年版】beatorajaをWindowsにインストールする方法

[追記] 以降64-bit Windows用にEXE化された「Java導入不要版」が公式にreleaseされている。これからbeatorajaを導入する場合は公式お手軽版をdownloadして展開するだけでよく、【2021年版】の手順や本記事の手順はもはや不要だ。

(役に立たなくなった記事を読む:)

最新のJavaを用いてbeatorajaを導入する記事を見つけた。とてもありがたい。記事の手順通りにJava SE 15を導入し、うまくいったので、私はJava SE 8をuninstallした。

しかし、beatoraja.jarLaunch4jでEXE化して使っていた私にとって都合の悪いことに、

launch4j: This application requires a Java Runtime Environment 1.6.0 - 1.8.9

Java SE 15だとLaunch4jが使えないようだった。代替として以下のBatch filesを書いた。

beatoraja-dnd.bat:
set _JAVA_OPTIONS='-Dsun.java2d.opengl=true -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel'
pushd %~dp0
jdk\bin\java --module-path javafx-sdk\lib --add-modules=javafx.controls,javafx.fxml -XX:+UseShenandoahGC -jar beatoraja.jar %1
popd
beatoraja-dnd-autoplay.bat:
set _JAVA_OPTIONS='-Dsun.java2d.opengl=true -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel'
pushd %~dp0
jdk\bin\java --module-path javafx-sdk\lib --add-modules=javafx.controls,javafx.fxml -XX:+UseShenandoahGC -jar beatoraja.jar -a %1
popd

書いておいてなんだが、私はcommandsの意味を何一つ理解していない。前述のbatch filesに直接にBMS fileをDrag-and-Dropしたらbeatorajaが期待通りに単曲演奏modeで起動したからヨシ!

……いや、ヨシじゃないわ、BmsONEからbeatorajaを呼び出す場合はこの方法じゃ駄目だわ……。PulsusのほうがPreview用途には向いているとはいえ、私は"scroll_events"とか"up"とか"t"とかbeatoraja独自拡張を使いまくりたいのだわ…… どうしたものか……

よみがえる#VOLWAV

最近のBMS clientsではBananaBeats, beatorajaおよびPulsusが#VOLWAVを実装している。

獣道エンドレスGAME#VOLWAV 80はaudio mixingに関わりがありそう。#VOLWAVの有無でbeatorajaのAUTOPLAY動画を比較したところ、平均音量の差は-1.81 dBだった。百分率換算では約81.2 %だから、だいたい合ってる。この作品は192分rhythmなどもひっくるめて繊細に調整されている印象が強く、音量調整にもこだわりがありそう。

The Ball and the Fish#VOLWAV 7は……なんだろう意図がわからない。Headphones環境だと後半でdynamic rangeを体感できる値ではあった。#VOLWAVの有無でbeatorajaのAUTOPLAY動画を比較したところ、平均音量の差は-23.11 dBだった。百分率換算では約6.99 %たあぼう氏がimpressionで指摘されている通り、beatorajaで選曲画面からこの図表を遊ぶと、以降に演奏される図表すべての音量が小さくなる。以降の図表に#VOLWAV 100が指定されていたとしても、音量は戻らない。100より大きい#VOLWAVの値はbeatorajaでは無視されるので、図表側から音量を戻すことはできない(無視すること自体は妥当だが)。beatorajaを終了するまで音量低下現象は続く。[追記] 2021年1月8日に修正されていた

Đây chỉ là một bản nhạc bình thường có tựa đề rất dài và được viết bằng tiếng Việt - In F Harmonic Minor”, “Positive Energy”, “Unacceptable Brutality(ANOTHER図表のみ), “w = addict”, “La souvenir”, “大須2020は、100より大きい値の#VOLWAVを持つ。beatorajaでは効果がない。BananaBeatsおよびPulsusでも効果がない……はず。Pulsusの--render optionは#VOLWAVを反映するが、100以上の値はやはり無視される。

🤟湿潤

beatoraja初回起動時に生成されるplayer/playerID/config.jsonについて、Configurationのスキン種類から一度でも選択されたgame-modeには"properties"が設定される(“7KEYS”だけは生成時に既定値が入る)。逆にいえば、スキン種類から選択されない限り"properties"配下の各keysは空配列のままであり、この状態のgame-modeが演奏されると各skin部位が無作為に適用されるようだ。

  • config.jsonはShift_JISで符号化されている。いろいろ都合がありそう。
  • skin/ModernChic配下filenamesに文字化けの痕跡が認められる。演奏に影響はない。

ModernChicPlay(SCURO)-2にはParty Parrot型BOMBが用意されていた(Kakabomb.png)。「BMS側からLua scriptを注入!?」は私の勘違いだった。普通に考えて、そんな危なそうなことをやれるようにするはずがなかった。やりたそうな方々は思い浮かぶし、できると面白そうではある。

BOFXVI二周目にして初めて気付いた斬新なgimmick(勘違い)

かつてBM98には#EXTCHRという隠し要素が存在した。これを用いた作例としては九十九里DISTRACTIONなどがある。次の動画はVirtual Machine越しに“九十九里”を演奏したもの。

BMS側が独自に用意した画像を参照することによって、この図表はnotesの形状を魚やrubber ropeに挿げ替えている。また、GrooveGaugeが減りすぎるとKawase-chanが涙する。私は寒さと発音遅延に悩まされ、Kawase-chanが喜ぶ表情を動画に収めることに失敗した。このような例がかつて存在したという事実を踏まえた上で、次に示すKingdom Of SoulsのDP INSANE動画(序盤のみ)を見てほしい。

beatoraja上でnotesを演奏した瞬間に小節線上に描画される画面効果が、Party Parrotに挿げ替わっている!? す、すげええ〜〜(挿げだけに)

こんなのどうやって実現しているんだ…… BMS file内にはそれらしき記述が存在しないし、音源や動画や画像などのresource files内にLua scriptsでも仕込まれているのだろうか? 疑心暗鬼になって全resourcesを洗ってみたが、私が調べた限りでは疑わしいfileは特には見当たらなかった。

他作品の図表を遊んだときさえ、最初は普通のBOMBが描画されていたのに曲の中盤あたりから突然Party Parrotに挿げ替わったりした。また、演奏画面の背景色や判定文字の書体も無作為に変わったりした。それでようやく私も、これがBMS側による仕掛けではない可能性に気が付いた。思い当たることは数日前にbeatoraja 0.8.1を新規導入したこと(更新差分filesのみの上書きではなく)と、beatoraja 0.8.1 configurationのskin tabに一度も触っていないこと。

私のうすぼんやりした記憶によれば、beatoraja標準skinを用いていた頃の私は、beatoraja更新後一度は必ず設定画面のpulldown menuから5 keys用skinを選択していた。それをしないと5 keys図表ではBGAが一切描画されなかった……ような気がする。もしかすると症状はまったく異なるものだったかもしれないが、ともかく都合の悪い何事かが起こったことだけは覚えている。

設定画面のpulldown menuから14 keys用のskinを一度開いた現在は、今回のParty Parrot現象も再発していない。設定項目を開くだけでよく、設定内容は変更不要、ということは、初回起動時に自動生成されるplainなconfig.jsonに問題があるのだろうか。または、ModernChic側のmenu item indexがずれているとかだろうか。しかしそれを調べようにも、もはや寝るべき時刻だ。

High-Resolution BMS Audio

Riu溶けたアイス、キミの声似た問題を持つ(解決方法も同様)

  • #064の、#WAVEG b_Arpegio_v100l4o4a.wav
  • #069の、#WAVDN b_Bell_v79l2o6g.wav
  • #120の、#WAVDX b_Chord_v33l8o4c.wav

前述の三つの定義から参照される192 kHzの無音声filesが、「PortAudioを用いるbeatoraja」をmuteする。より正確にいうと、波形部分(WAV形式でいう<data> chunk)が存在するのは前提として、

  • 無音filesが11025/22050/44100 Hzなら、それらがOGGだろうがFLACだろうが正常に演奏される。
  • 無音filesが11025/22050/44100 Hz以外なら、全音声がmuteされる

48000 Hzの無音WAVでさえbeatorajaを無音化せしめうるという事実には驚かされた。

BOFXVI一周目では私はこの作品を見逃していた。#064で音声が鳴らなくなったために、大変失礼ながら「失格作品だろう」と早合点していた。Impression期間終了日の前日にたまたまSmartphone用の会場を見たら普通に点数が入っていて「お゙お゛っ」ってなった。まあLR2では問題なく演奏されるのだし、作品頁にはその旨がきちんと書いてあるのだから、ろくに会場を確認していなかった私が悪い。

この作品は全音声が192 kHz、fallde engineopen vox*.ogg以外は192 kHz。参考資料++

BOFXVI、二周目序盤

beatoraja 0.8.1でModernChic skinが微調整されて着実に遊びやすくなった。HCNが押下中か未接触か見分けられるようになり、結果画面にFAST/SLOW推移animationが増え、#RANDOMを用いる図表が選曲画面上で識別可能に。列のHalf表示はBrook skinだったかDuplex skinだったかでできたような記憶があるので、5 keysや10 keysの愛好家はそちらを当たると良いかも。あるいはそれらのみLR2で遊ぶ。

[追記] 新たにHalf Skinがreleaseされた

teletroitがめちゃめちゃ楽しい。擾乱のrhythm。HI-SPEED optionを無効にして遊びたい。

二拍子と四拍子も滅多に区別されない

5億円が欲しいマーチがおそらく150 bpmの二拍子であるように、

(動画は手元で勝手に拍子を変更した差分)

DARUMA105 bpmの二拍子であるように私には感じられる:

小節線が光るtimingで地面を踏み、裏打ちのhi-hatが鳴るtimingで足を地面から離す、という感覚は、競歩めいた210 bpm解釈よりは私に合う。元の図表がBPMを倍取りしているのか、もしくは私が若くないから105 bpmに感じているだけなのか。えっやだ……

Chamomile三拍子と二拍子(6/8拍子)が入り混じる

#SCROLLを駆使して疑似的に一拍の量を変更することは不可能ではないが、この曲はたとえば#029#032のように「6/8拍子のmain phraseに対して3/4拍子のBGMが並置される」ように感じられる箇所もあり、第三者が中立的に拍子を判断するのは難しそうに思われる。図表著者の解釈という不純物を、私はなるべく混入させたくない。(たまたま今の私がそういう気分というだけであって、userとしての私はむしろ図表著者の解釈をこそ受け取って楽しむ性向なので、どうか悪くとられないでくださいね)

CREATIONの0:45–1:00も三拍子と二拍子(6/8拍子)が入り混じる

この動画は拙作差分修正版第2版のBMS-on図表に#LNMODE 3を足したもの。元の図表はBPM変更という形で0:45–1:00を処理していた。一拍の量を曲中で変更できないBMS/BMSON形式において、元の図表のように拍感覚の側にBPMを寄せる判断は、それなりに妥当だろうと私も思う。その過程で生じた齟齬を、拙作差分は#SCROLL定義で小賢しく手当てしている。

個人的には1:33以降も78 bpmくらいに感じられる。しかしBMSON形式の場合、BPMの解釈が変わると音切り位置も全部打ち直しになる。そこまでするのもためらわれ、見なかったことにした。

抗う気力が湧かない冬だから

数年前にCCleaner過去版の挙動変更が原因でEmail clientのProfileが吹っ飛んだ。私はProfileの復旧に失敗し時間をかけて手作業で再設定を行ったが、いくつかのaccountsに関してはpasswordなどを思い出せず放置していた。Google、放置アカウントの保存データ削除へ 2年利用がないフォト、Gmail、ドライブが対象に関連すると思しき英語のEmailが私にも届き、そういえばもはや死に体のaccountとdriveがあったなあと思い出した。思い出したが、朽ちるに任せたい気持ち。

Flash終了。いつか変換器を通してFlash contentsを再び楽しめる日が来るだろうか。

従来のmobile版Twitter終了。もはやJavaScript無効状態だと閲覧すら不可能になってしまった。同様のBMS event informationをたまに見かける。個人的には好ましくないと思うが、抗わない。

Playable Phantomの後半は見方によっては130 bpmと260 bpmのpolytempoなので、kick列のみを260 bpmでscrollingできれば美しいかもしれない。[追記] kick列以外は130 bpmでscrollingする。

Googleしか 接続できない

当環境にて見出しの通りの現象が発生していた。見出しの通りに検索してGoogle Cacheを参照することで、問題を解決できた。“i”“j”を見間違えていたことに気が付かず、数日間を無駄にした。睡眠時間を削りに削った私は猛烈な眩暈と吐き気に苦しめられている。

filenameのUnicode正規化は過去のものになっていた?

macOS Sierra 10.12.6まで使われていたHFS+上では、filenameは内部的に正規化された。」と「ミリバール」はどちらも「ミ + リ + ハ + ゙ + ー + ル」に分解された(濁点は通常の濁点ではなく合成用濁点)。では、BMS/BMSON上でそれらを別々に定義した場合は?

朝に数年来の疑問を思い出して検証用図表を書いた私、夕に検証が無用になっていたと知る。

Apple File System

iOSデバイスには2017年3月27日に iOS 10.3のリリースで導入され、macOSデバイスには2017年9月25日に macOS High Sierraのリリースで導入された[6][1]

(中略)

HFS+が行う Unicode 正規化 を行わないという制限があるため[15]、英語以外の言語では問題が発生する[16]

  • filenameの等価性を考慮しないWindows/Linux上で冒頭の差分を演奏すると、全notesが鳴る。
  • macOS 10.13以降のAPFS上でも、おそらく全notesが鳴るだろう。
  • macOS Sierra 10.12.6までは既にsupportが終了していたようだ。私は結局一度もHFS+環境を検証する機会を持てなかった。以下は反語ではなくMacの使用状況に明るくない私の単純な疑問だが、今後HFS+環境を考慮する必要はあるだろうか? 外付けHDDなどでHFS+環境が必要とされ維持されるなら、やはりBMSは非ASCIIのfilenameを避けたほうが無難だと思われるが……

BMS “LIVELY SHOTERSを遊べない場合

  1. 作品頁からZIP書庫をdownloadする。
  2. CodePage932を指定してZIP書庫を展開(解凍)する。
  3. BMS fileの文字符号化方式を変更する。(CodePage932を指定して開き、BOM付きUTF-8などで別名保存)

以上! 詳細は先日の日記を参照されたい。以下の作品群は同様の問題を抱えている。

  • 簡体字中国語Windows環境下に限り問題なくZIPを展開できLR2などで遊べるTsubasa Mai Kaze
  • 日本語Windows環境下に限り問題なくZIPを展開できLR2などで遊べるSky and Space Journey
  • 日本語Windows環境下に限り問題なくZIPを展開できLR2などで遊べるLIVELY SHOTERS
  • 日本語Windows環境下に限り問題なくZIPを展開できLR2などで遊べる虚への小さな探索隊

些細な問題まで含めれば、同様の作品は数え切れないほど存在する。たとえばBGI19201080.pngは、非日本語圏ではZIP展開時に文字化けしうる(ZIP書庫のfilename encodingの問題)。BMS内容も文字化けしうる(BMS fileのtext encodingの問題)。この画像は非日本語圏では表示されない可能性が高いが、rhythm gameを遊ぶうえでは問題ないように見える。私なら見なかったことにする。

The Crack of DawnRAR書庫なので、展開時にはfilenameが文字化けしない。尤もBMSに定義された文字内容Title_640480.bmpは文字化けしうるので、この画像は非日本語圏では表示されない。

DiSASTER UNiT : CODE_NAME_666ZIP書庫だがfilenameはUnicodeで格納されているので、少なくともWindows間では展開時に文字化けしない(Windows 7以前は文字化けしうる)Mac OS上では인코딩.batの字母が分解されるかもしれないが、私はMac環境を確認できない。BMS内容はASCII文字のみで構成されているので、環境を選ばず正しく演奏される。OGG版にoggenc2.exeを同梱する意図は不明。

いちいちここに書かないが、非ASCII文字.bmsのようなfilenameも多かった。こういう図表は限定された環境のusersしか遊べない可能性があるので、海外勢からの評価が下がっても仕方がないだろうな〜と思いながら眺めている。とはいえ評価とか関係なしに、非ASCII文字を使いたい人は使えばいいんじゃないですかね。1F3B9とかもBOFXVI的にはたぶん大丈夫なのだし(Bemuseで遊べるので)。[追記] あ、でもZIP書庫のURLをquery stringとして与えた場合は、BemuseでもASCII文字のresourcesしか再生されないっぽい。ASCII filenamesが無難であることは確か。

BMS “Tsubasa Mai Kazeを遊べない場合

手順1から3まで。ただし更新版以降は非ASCII文字のfilenameが存在しなくなったため、普通にZIP書庫をdownloadして展開するだけでよい。

1. 作品頁からZIP書庫をdownloadする

にDownload URLが更新されているようなので、古い版を導入済みの場合は最新の書庫を再度downloadする。

2. CodePage936を指定してZIP書庫を展開(解凍)する

簡体字中国語Windows以外の環境でこのZIP書庫を展開する際は、書庫に格納されたfilenamesの文字符号化方式として明示的にCodePage936(簡体字中国語・GB2312・GBK)を指定する必要がある。これを怠ると書庫展開時に「非ASCII文字混じりのfilename」が文字化けする可能性が高い。

展開時のencodingを指定できるarchiver appsは、Bandizip, WinRAR, ZipExtractorなど。第三者による勝手配布site経由だとinstallerにvirusが仕込まれている可能性があるので注意。

3. 展開されたTsubasa Mai Kaze” folderの内容を確認する

BOFXVI_翼舞狂风_BGI.pngが文字化けしていた場合は、書庫の展開に失敗している。やり直し。

現在downloadできる版では、基底名が等しいWAVとOGGが441組存在する。WAVさえあれば同名のOGGは不要なので、OGG filesは全部削除して構わない。

以降の手順が面倒くさい人は、私が勝手に文字符号化方式を変更しただけの差分更新版用の差分を適用されたい。このとき自分の環境に関係ない差分図表は削除されたい。されたいって言いたいだけの日記だった。

(手順4と手順5を読む:)

4. BMS fileの文字符号化方式を変更する

  1. EmEditorMerywxMEditなどの、文字符号化方式を指定できるText Editor appsを用意する。
  2. 前述のいずれかのText Editorで、YI WU KUANG FENG.bmsを開く。
  3. 7行目あたりの#ARTIST 烈風が文字化けしている場合は、CodePage936(簡体字中国語・GB2312・GBK)を指定して開き直すEmEditor/Meryの場合は、Window上部Menubarのファイル” → “読み直し” → “簡体字中国語 (GB2312)を選択して決定する。
  4. 文字化けしていない文書内容を、自分の環境における適切なText Encodingで保存する。Window上部Menubarのファイル” → “名前を付けて保存” → “エンコード:欄からencodingを選ぶ。

    • 日本語Windows環境の場合は、日本語 (CodePage932, Shift_JIS)を選択。
    • 簡体字中国語Windows環境の場合は、簡体字中国語 (CodePage936, GB2312)を選択。
    • 韓国語Windows環境の場合は、韓国語 (CodePage949, ks_c_5601-1987)を選択。
    • 繁体字中国語Windows環境の場合は、繁体字中国語 (CodePage950, Big5)を選択。ただし今回はこの選択肢は不可能(平仮名が不可能)なので、UTF-8 (BOM付き)を選択。
    • それ以外の環境の場合は、UTF-8 (BOM付き)を選択。

    そして、適当な名前をつけて保存する。Internet Rankingはどのみち不可能っぽいので上書き保存で構わないだろうが、original fileを残したい場合は別名で保存する。

5. BMSを遊ぶ

手順4で保存した「UTF-8でないBMS図表」は、日本語Windows環境や簡体字中国語Windows環境や韓国語Windows環境ならLR2などで普通に遊べるはず。もちろん環境とText encodingが一致しない場合は文字化けする。たとえば日本語Windows環境で「簡体字中国語Windows環境で書かれたBMS」などを遊ぼうとすると文字化けする。BemuseはこれらのLegacy Encodingsをそこそこの精度で自動推定することが可能だが、古いwebpagesが文字化けしうるのと同様に、古いencodingのBMSも文字化けしうる。

BOM付きUTF-8のBMSは、BananaBeats, Bemuse, BMIIDXView, charatbeatHDX, mBMplay, Pulsus, Qwilight, ruv-itなどで遊べる。あとiBMSC/μBMSCで編集できる。BOM付きUTF-8のBMSは、原理的にはどんな環境でもあらゆる文字を使えるはず。現実は書体の問題や実装の問題もあるのでそううまくはいかないが、従来のANSI/OEM CodePageよりは互換性が高い。従来実装との互換性は望むべくもない。

Surround BMSの可能性を見た

Daybreak TripのOGG版、beatorajaで遊ぶと全体が22050 Hz Monauralのようにくすんで聴こえる。なぜか全音源が4 channelsになっており、これが演奏時にbeatoraja側によって自動的にStereo形式にresamplingされ、BMS著者氏の意図しない鳴り方になっていたようだ。

WAV版はほぼ全音源が44100 Hz・16 bits・Stereoなので、OGG版よりはBMS著者氏の意図が伝わる可能性が高い。crash.wavのみ192000 Hz・24 bits・Monauralなのでresamplingされうる。

  • mBMplayは「強制再サンプリング」をTrueにしない限りOGG版をものすごい雑音として再生する。
  • BMX2WAV v2はOGG版の音源を読み込めない。
  • ruv-it/uBMplayでOGG版は無音になる。
  • LR2はOGG版を普通に演奏できてしまう。

高画質動画が欲しくなる内容だった。Original BGAをありがたくdownloadさせていただいた。


QwilightはWindows Sonic for Headphonesをsupportしている。これは、Surround録音されたBMSをSurround演奏しうる環境が、既に存在するということを意味するだろうか? BOFXVIのevent規約では「BMS(bmson)作品はLunatic Rave 2、QMS-player、beatoraja、BemuseのいずれかのBMSプレイヤーにおいて正常な演奏ができることを前提とします」とされているのでSurround BMSの出番はなかった。

TAKE it hard

もさらっと高度なことを達成している…… 音楽的に複雑すぎて、私には鼻歌さえけっこう難しい。もしかしてプナイプナイえんそうもこの作品のために準備された感じ? 技術は人権……

#DIFFICULTYの値の前に余分なSPACEが挿入されている。beatorajaの選曲画面を確認してみたが、これは正しくparseされているんだろうか。μBMSCは普通に解釈してくれたが。

#WAVZZ sky and space jouney bmsキー音以外1小説早めたLAST.wav

西欧でBGMが鳴らなそう。曲は楽しかった。最初と最後のLongNotesは波形自体のrelease pointが四拍目裏あたりにある。これらに丁寧にLN終点を合わせたうえで#LNMODE 2|3を指定すれば更にgroovyになりそう。一方で溶けたアイス、キミの声のように「長く押したいが、指を離すtimingをrhythmとして判定されたくはない音」もあり、#LNMODE 1で図表著者の意図が明示される。w = addictのように「Rhythmとして始点終点を判定してほしいが、視覚的には始点終点を必要以上に強調してほしくない音」もある。私の感覚ではこの図表はLR2のdefault skinがしっくりくる。


Arrow/BackSpace/Delete keysを押すとIMEの日本語変換が誤発動する場合がある。Caretの移動さえおぼつかなくなったので、しぶしぶIMEを以前のversionに戻した。

悪役Legiō

#DoomeyTunes#STOP01 1の連射は、LR2を考慮しないなら#SCROLL01 0.75で置き換えられそう。と思ったけどBMSONのbeatoraja拡張だと小数値"rate"が効かなかったので結局単純置換に終始した版がこちら"scroll_events"を使わないなら元のBMS filesをBmsONEにdropすることで普通にBMSONに変換できる。ただし最後のKABOOOOM Wallのような「定義番号が等しいnotesの同時押し」は崩壊する。あとBmsONE自体は“stop_events”をsupportしていないので、BmsONEでpreviewすると曲が崩れる。

BMSON仕様書Edge Cases節の直前に“From the table above, multiple notes may be assigned the same slice.と書いてある。これはつまり、BMSでいうところの「定義番号が等しいnotesの同時押し」は許容されなければならないということだろうか? 仕様の意図を理解しきれていない。

日本語をまともに入力できなくなってしまったので、日記をしばらく休むかも。

无^〜

#DoomeyTunes”、ちょくちょく無音notesでshadow-playingさせてくるので、定義数の問題を解決していただけると一介のuserとしてはとても嬉しい。難しそうだが。

  • #LNOBJをchannel 5169に置き換えれば、定義数が一枠分空く。一枠ではどうにもならない。
  • BGM領域の音声を統合して定義枠を捻出する方法。もし可能だとしても図表8枚分で容量大爆発。
  • 不可視notesが表現に必須でないなら、BMSON形式を選べば定義数の壁は超えられる。しかし大規模BMS eventで勝ちを狙う(なぜ?)作品は、LR2を無視できないだろう(いつまで?)

Mirrorcle World (Hard Schedule Mix)#020#035が楽しい。Tambourineシャンシャン直後にKEYとBGMで音量差をつける箇所、結果的に時代のpopの対比になっている。このワザとらしい演奏感!

おそらくKB4586853を適用したことが原因で日本語入力が狂った😠

#DoomeyTunesに遭遇し、限界夢女さんの鳴き声「無理」「しんどい」を私も発して今日のBMS playingを切り上げた。わかる人にだけわかるちょっとした要素が動画に隠されているらしいけれど、2010年代のBMS OF FIGHTERSをほとんど遊んでいない私にはさっぱり。まあ、分からずとも傑作。

Narrow, Narrow, Us Narrow

Đây chỉ là một bản nhạc bình thường có tựa đề rất dài và được viết bằng tiếng Việt - In F Harmonic Minorの曲名をbeatoraja上で表示できる源真ゴシック、強い。

Playable Phantomの後半で吹き出した。曲中での間隔が実際に変わるこの状況では、“Beats Per Minute”の値も字義通りに変わるのが理に適っているように私には思われる。作品頁で作者氏ご本人はソフランSOFT LANDINGと仰っていたが、これはいわゆるSOFT LANDING(曲のBPMが変わらない状況で、図表のscrolling速度だけを変更する演出)とは別物だろう。定義上の値が260 bpmに変化することに議論の余地はなく、体感されるscrolling速度に関してはBPMとは別の課題として切り分けるべきだと思う。ちなみに#BPM01 260#SCROLL01 0.5を併用すると、拍線だけが圧を高める。これはこれで面白い。

日記

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