Codeを書くまでが遠い
“オートメーション工場”
これに限らずクソデカBMS問題への対処法がわからない。
“オートメーション工場”
これに限らずクソデカBMS問題への対処法がわからない。
#RANDOM
–#ENDRANDOM
は、たぶん変数のblock scopeとして理解できる。#title flow test
#bpm 60
#wav11 01.wav
#wav22 02.wav
#wav44 04.wav
#wav66 06.wav
#wav88 08.wav
#wav99 09.wav
#wavbb 11.wav
#00111:1100000000000000
#random 2
#00112:0022000000000000
#if 1
#wav33 03.wav
#00113:0000330000000000
#endif
#00114:0000004400000000
#random 2
#if 1
#wavcc 12.wav
#00213:000000cc00000000
#endif
#if 2
#wavdd 13.wav
#00214:00000000dd000000
#endif
#endrandom
#if 2
#wav55 05.wav
#00115:0000000055000000
#endif
#00122:0000000000660000
#if 1
#wav77 07.wav
#00123:0000000000007700
#endif
#00124:0000000000000088
#endrandom
#00225:9900000000000000
#if 2
#wavaa 10.wav
#00211:00aa000000000000
#endif
#00212:0000bb0000000000
title = "flow test";
bpm = 60;
wav["11"] = "01.wav";
wav["22"] = "02.wav";
wav["44"] = "04.wav";
wav["66"] = "06.wav";
wav["88"] = "08.wav";
wav["99"] = "09.wav";
wav["BB"] = "11.wav";
data["001"]["11"] = ["11",,,,,,,];
{
let value = getRandomInteger(1, 2);
data["001"]["12"] = [,"22",,,,,,];
if (value === 1) {
wav["33"] = "03.wav";
data["001"]["13"] = [,,"33",,,,,];
}
data["001"]["14"] = [,,,"44",,,,];
{
let value = getRandomInteger(1, 2);
if (value === 1) {
wav["CC"] = "12.wav";
data["002"]["13"] = [,,,"CC",,,,];
}
if (value === 2) {
wav["DD"] = "13.wav";
data["002"]["14"] = [,,,,"DD",,,];
}
} // end of inner let scope
if (value === 2) {
wav["55"] = "05.wav";
data["001"]["15"] = [,,,,"55",,,];
}
data["001"]["22"] = [,,,,,"66",,];
if (value === 1) {
wav["77"] = "07.wav";
data["001"]["23"] = [,,,,,,"77",];
}
data["001"]["24"] = [,,,,,,,"88"];
} // end of outer let scope
data["002"]["25"] = ["99",,,,,,,];
if (value === 2) { // undefined global value
wav["AA"] = "10.wav";
data["002"]["11"] = [,"AA",,,,,,];
}
data["002"]["12"] = [,,"BB",,,,,];
Scopeの外のcode blockは、少なくともBMX2WAV上では(分岐指定時に明示的にcheckしない限り)演奏されない。この日記を書いているうちに書式違反に寛容になれそうな方法を思いついた! 寝る。
Notesの個別化はBMSON形式でなければ難しそうだが、
#(1204)11:01(+)(23+)(24+ -25])02()00(+])
(うわあ……。)(+)
”(23+)
”(24+ -25])
”(+])
”()
”00
、みたいな感じ? 実際は正負符号のような重要な記号を無造作に扱うわけにもいかないだろうから、いまはとりあえず「囲まれたASCII印字可能文字keysを受理しうる」くらいのゆるい雰囲気でparserを書き進めている。何も考えずに書いた前述の例を眺めていて突然気がついたが、括弧英数字拡張ならBMSONのLayered Notesも普通に表現できそうだし、#(3724800)01:UX
最初の壁が鉄壁すぎる。不完全な入れ子構造への対処法を求めるあまり、私はとうとうHTML parser仕様を眺め始めた。う〜ん、わからん。#ENDIF
と#ENDRANDOM
を全部消し去ってもuBMplayは100層の入れ子分岐として解釈してくれる。つまり事前に数え上げているわけではない。
なんか、layer
仕様を満たす透過画像」に一括変換するところまで含めて、File
JSON .parse (BMSON)
vs 初手で分岐を構文解析しないとぐちゃぐちゃになるBMS形式Programmingの素養がない私にとってBMSはあまりにも高すぎる壁だった。#ENDIF
が省略された入れ子無しの#RANDOM
」と「入れ子の#RANDOM
」を区別したいが、私にはそのalgorithmがわからない。事前に#IF
と#ENDIF
の個数を数えるとか糞みたいな方法しか思いつかない。
beatoraja 0.8.1、
そのままではBemuseでは遊べないので、以下の手順を踏む。
Bemuseのpitch changing機構と管弦楽曲の相性は最高だった。しっかり作られた管弦楽器のKEY音が、演奏を誤ると狂った音階に化けるのが、たまらなくthrillingで楽しい。決めの密着Long
Bemuseのこの仕組みは音階notesに対しては「演奏している実感」を絶大にboostする一方で、
昨年末にreleaseされていた。60 %
くらいまで許容していたような記憶がある。今でもそうなのかは知らないが、無音含有率をこのように定量化できるなら、省力化したいBMS作家にとっては有益かもしれない。
Anzu BMS Diff ToolはBMS filesの比較に特化している。どちらも比較だけでなく図表の単純な誤りも検出してくれるので、これらの支援toolsがBMS作家に広く知られると良いと思う。
Radio buttonは一般的には排他選択肢として用いられるので、この場合はcheckbox一個だけにするか、
可視notesを#000
に置いている図表は警告されるが、#049
以降は明らかに誤りだが、重複定義によるnuanceはおそらく意図されたものだろう。無視できない警告だけを取捨選択する判断が検証者には求められる。
間違って
Commentで「Unicode関連の検証に役立つかもしれないやつ」としてご紹介いただいた書体。
NTTのwebpageでIPv6と読み仮名が振ってあって、それでこそ日本だよね、せっかく表音文字を使っているのだから私もがんがん読み仮名を振っていこうと思った。モ……
#DEFEXRANK 2
#DEFEXRANK 3
#DEFEXRANK 4
, #DEFEXRANK 5
"judge _rank": 5
#RANK 0
, #DEFEXRANK 0
, #DEFEXRANK 34
, "judge _rank": 0
, "judge _rank": 25
#RANK 1
, #DEFEXRANK 67
, "judge _rank": 1
, "judge _rank": 50
#RANK 2
, #DEFEXRANK 100
, "judge _rank": 2
, "judge _rank": 75
#RANK 3
, #DEFEXRANK 1
, #DEFEXRANK 134
, "judge _rank": 3
, "judge _rank": 100
#RANK 4
, #DEFEXRANK 167
, "judge _rank": 4
, "judge _rank": 125
"judge _rank": 0–4
#RANK 0–4
と一致する。#DEFEXRANK 0
は、#RANK 0
と一致する。#DEFEXRANK 1
は、#RANK 3
と一致する。Label | #RANK | #DEFEXRANK | "judge |
---|---|---|---|
VERY HARD | 0 | 34 | 25 |
HARD | 1 | 67 | 50 |
NORMAL | 2 | 100 | 75 |
EASY | 3 | 134 | 100 |
VERY EASY | 4 | 167 | 125 |
“Une Nuit sur le Mont Chauve”"judge
100
とするBMSON書式仕様に照らし合わせると異常に厳しい判定となるはずだが、"judge
だったりして、書式仕様の誤解例が案外多いようでもあり、こうなるとbeatorajaの解釈が事実上の標準として今後も支持されそう。
math
: sup
: 2220−1img
: 数式を画像で賄えば、縦書きHTMLの始祖さえsupportできる。画像の代替textとしてTeXを書けば、
先日HTML内のMathML内にHTMLのmark
WSL2からbeatorajaを起動しようとしたが、応答はあっても起動はしなかった。ならばと「WSL2 + Ubuntu 20.04でGUIアプリを動かす」と「WSL2でGUIアプリを起動」を試し、どちらの方法もxeyesを起動するところまではいけたが、肝心のbeatorajaは起動せず。特に何もしなくても2021年内にはWSL2でGUI表示が可能になりそうという噂もあり、私はVcXsrvとMobaXtermをuninstallした。
JavaBigInt
型とかが使えるようになっていて隔世の感があった。BigInt
型が実装されたのは公開のSafari 14かららしいので、今すぐ使うのはややためらわれる。最大値が環境に依存するらしいことも気になる(64-bit Blinkは、
日記ついでにMathMLを使い始めた。FirefoxならContent MathMLも使っていけるが…… [追記] 使えません。いつもの勘違いでした。すみません。ついでなのでMDNの例のようにContent MathMLも混ぜ書きしたところ、
Power&
構文みたいなexec
奴)とかどうやるのかな〜と検索している。
「beatorajaをUbuntuで最速で動かす」を実行済みの環境で、そういえばJava 15にできるのかな、と思い立って以下を実行した。できたっぽい。
sudo apt remove bellsoft-java11-runtime-full
sudo apt autoremove
sudo apt install bellsoft-java15-runtime-full
sudo apt update
sudo apt upgrade
勘でcommandを打った後で、このJavaがLibericaという名前でv15が出ていたことを知る。このJavaは「JavaFX--module-path
や--add-modules
を指定する必要がない(というか指定すると駄目だった)。以下の指定でbeatorajaはとりあえず起動した。
exec java -XX:+UseShenandoahGC -Xms4g -Xmx4g -cp /home/username/Desktop/beatoraja0.8.1/beatoraja.jar:ir/* bms.player.beatoraja.MainLoader
[VMware Workstation 16 Player + Ubuntu 20.04 + Liberica JDK 15 + beatoraja 0.8.1] かつ
INFO: 描画されないことが確定しているSkinObject削除 : 17 / 761 Jan 18, 2021 4:51:10 AM bms.player.beatoraja.MainController create INFO: 初期化時間(ms) : 49188 VMware: vmw_ioctl_command error Cannot allocate memory. Aborted (core dumped)
beatoraja-configからPLAY buttonを押下すると選曲画面の音楽が流れ始めるが、画面が真っ黒のまま延々待たされbeatorajaが突然終了する。その後
“MUSIC SELECT” skinをbeatoraja defaultに変更すると、あとJava 11 + beatoraja 0.7.6では以下のerrorは出ていなかったような気がする…… が、どちらもuninstallしてしまったため確認不能。
(java:1894): Gdk-WARNING **: 04:47:36.957: XSetErrorHandler() called with a GDK error trap pushed. Don't do that.
Modern
2020年4月から今日までの当日記logが、古いSafariやAndroid
先日の<U+1F441 U+200D U+1F5E8>
iOSからWeb拍手を経由して、絵文字忍者の肌色多様性を示してくださった匿名さん、ありがとうございました。しかしWeb拍手はあらゆる絵文字をcommentから消し去ってしまった。まあShift_JIS時代のserviceだから仕方ないのだけど…… 申し訳ないのでこの場で肌色忍者について言及してみる。
画像はTwemojiから。これらの絵文字そのものをBMSON上でescapeすると、以下のような感じ。
{
"version":"1.0.0",
"info":{
"title":"\uD83E\uDD77\uD83E\uDD77\uD83C\uDFFB\uD83E\uDD77\uD83C\uDFFC\uD83E\uDD77\uD83C\uDFFD\uD83E\uDD77\uD83C\uDFFE\uD83E\uDD77\uD83C\uDFFF",
"artist":"131",
"init_bpm":140,
"judge_rank":84,
"total":32,
"level":1,
"mode_hint":"beat-5k",
"resolution":2
},
"lines":[{"y":0},{"y":8}],
"sound_channels":[{
"name":"v_foon.wav",
"notes":[{"x":1,"y":8}]}
]}
\uD83E\uDD77
は無添加のU+1F977
NINJAを示す。忍者にU+1F3FB..1F3FF
を後置すると、
Windows 10 20H2 + Bemuse 48.3の場合、
もちろん書体によって絵柄が異なるうえ、絵文字の異体字の解釈も機種に依存する場合がある。ちょうど目玉の絵文字に
Firefox 84はTwitter型の<U+1F441 U+200D U+1F5E8>
#TITLE 𠄔言
とか#GENRE
とか環境と実装を限定すれば、#BACKBMP
や"title
BOMつきUTF-8符号化BMS形式かBMSON形式で図表を作成したうえで、"title": "\uD840\uDD14\u8A00"
"genre": "\uD83D\uDC41"
Web browsersが描画できない文字はBemuseも描画できない。たとえば
Windows 10 Version 20H2 (日本語環境) + Firefox 84.0.2 + Bemuse 48.3の場合、U+20114
は細明體書体で描画され、U+1F441
はSegoe UI Symbol書体(白黒)またはSegoe UI Emoji書体(色付き)で描画される。
Ubuntu 20.04 + Firefox 84.0.2 + Bemuse 48.3の場合、U+20114
は文字化けを示す矩形として描画され、U+1F441
はFirefoxに組み込まれたEmojiU+20114
も描画される可能性がありそうだが、私は元に戻せそうにないので試していない。
BOMつきUTF-8符号化BMS形式かBMSON形式で図表を作成したうえで、U+20114
はおそらく細明體書体で描画され、U+1F441
はSegoe UI Symbol書体で描画される。
BOMつきUTF-8符号化BMS形式で図表を作成したうえで、#GENRE
。この文字列値が指定された図表をWindows 7やWindows 8.1やWindows 10 Version 1511以前の環境で演奏すると、U+1F441
はSegoe UI Symbol書体で描画される。
演奏画面下部の#GENRE
, #TITLE
, #ARTIST
表示枠には、
BOMつきUTF-8符号化BMS形式で図表を作成したうえで、
これら以外にも絵文字などを描画できるBMS実装は存在するかもしれないが、私は確認しきれていない。
BMS実装がUnicodeをsupportしていることと、環境がUnicodeをsupportしていることと、文字を描画できる書体が存在することと、代替書体にfallbackする仕組みが存在することと、図表fileのtext encodingは、それぞれ話が異なる。書きながら私もわからなくなってきた。
Windows 10 Version 1909に20H2への自動更新が降って来ていたので更新した。
Windows 10のメモ帳の既定のText EncodingがBOM無しUTF-8になってから二年が経とうとしている(Version 1903でUTF-8に変更されたらしい)。この変更に気付いておられない感じのBMS作品をそこそこ見かけるが、
BmsONEは常に小節線を省略せず書き出すが、これは以下のBMSON小節線仕様に準拠する実装がBmsONEとraindropしか存在しないがゆえに仕方なしにそうしたものと思われる。
- If this is not specified (
null
orundefined
), then a 4/4 time signature is assumed, and a bar line will be generated every 4 quarter notes.
そういえば
"lines": [
{"y":0},{"y":960},{"y":1920},{"y":2880},{"y":3840},{"y":4800},{"y":5760},{"y":6720},{"y":7680},
{"y":8640},{"y":9600},{"y":10560},{"y":11520},{"y":12480},{"y":13440},{"y":14400},{"y":15360},
{"y":16320},{"y":17280},{"y":18240},{"y":19200},{"y":20160},{"y":21120},{"y":22080},{"y":23040},
{"y":24000},{"y":24960},{"y":25920},{"y":26880},{"y":27840},{"y":28800},{"y":29760},{"y":30720},
{"y":31680},{"y":32640},{"y":33600},{"y":34560},{"y":35520},{"y":36480},{"y":37440},{"y":38400},
{"y":39240},{"y":40200},{"y":41160},{"y":42120},{"y":43080},{"y":44040},{"y":45000},{"y":45960},
{"y":46920},{"y":47880},{"y":48840},{"y":49800},{"y":50760},{"y":51720},{"y":52680},{"y":53640},
{"y":54720},{"y":55680},{"y":56640},{"y":57600},{"y":58560},{"y":59520},{"y":60480},{"y":61440},
{"y":62400},{"y":63360},{"y":64320},{"y":65280},{"y":66240},{"y":67200},{"y":68160},{"y":69120}
],
“frozen summit”#xxx04
に配置したうえで、#xxx07
に動画を配置すれば、
“CROSSPEED”
“Une Nuit sur le Mont Chauve”#158
には違和感があった。ここではTrumpetの高音部と低音部がKEY音としてまとめられている。この場面で連打が現れることによって、演奏者の聴覚は高音部にfocusする。
java.io.IOException: D:\bms\Nancyatte A-1 Climax\Mescaline_ogg\Kick_Filter_011.ogg : 0 samples at bms.player.beatoraja.audio.PCM$PCMLoader.loadPCM(Unknown Source) at bms.player.beatoraja.audio.PCM.load(Unknown Source) at bms.player.beatoraja.audio.PCM.load(Unknown Source) at bms.player.beatoraja.audio.PortAudioDriver.getKeySound(Unknown Source) at bms.player.beatoraja.audio.PortAudioDriver.getKeySound(Unknown Source) at bms.player.beatoraja.audio.AbstractAudioDriver$AudioCache.load(Unknown Source) at bms.player.beatoraja.audio.AbstractAudioDriver$AudioCache.load(Unknown Source) at bms.player.beatoraja.ResourcePool.get(Unknown Source) at bms.player.beatoraja.audio.AbstractAudioDriver.lambda$setModel$1(Unknown Source) at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) at java.base/java.util.HashMap$EntrySpliterator.forEachRemaining(HashMap.java:1837) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) at java.base/java.util.stream.ForEachOps$ForEachTask.compute(ForEachOps.java:290) at java.base/java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:746) at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290) at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1016) at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1665) at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1598) at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183) 1月 09, 2021 7:58:17 午後 bms.player.beatoraja.audio.AbstractAudioDriver setModel 情報: 音源ファイル読み込み完了。音源数:968
Microsoft DefenderがQwilight installerを
-5.84 dB
下げられていた。だいたい#VOLWAV 51
。-2.92 dB
下げられていた。だいたい#VOLWAV 71
。#BPM 120
#TITLE invalid path
#WAV01 d.wav
#BMP01 e.bmp
#00104:01
#00111:01
bmsonでの地雷は比較的実装しやすそうな印象もあるのですが、そこまでに必要な手続きをわからないでいます。
地雷をsupportしないBMSON実装が地雷を適切に無視できるよう、"bomb
"name"
"d"
"d"
"d"
"l"
"d"
非開発者によるたたき台としてはこんな感じでしょうか。とはいえ私自身は地雷に何の思い入れもないので案の持ち合わせがありません、
[寝て起きて追記] 地雷に定義された音の一部だけを切り出して使う場合、かつ当該波形の切り出されない部分が地雷として使用されない場合、"c": false
の先頭部分は単純に破棄できないような気がするな……。あ〜、
思いつき次第追記していく。
#RANDOM
分岐を使える。#999
以上の小節を使える。JSON .parse (file)
ちょっとだけ先日の続き。
「けもびーつ」収録作品#ExtChr
を行う。
先端判定の有無、終端判定の有無、押下中にCOMBOが増加するか否か、それぞれについて見映えや操作にmatchするKEY音がある。こうした観点からすると、
[追記] “HARDTEK DJMIX”
WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by org.lwjgl.LWJGLUtil$3 (file:/D:/beatoraja0.8.1/beatoraja.jar) to method java.lang.ClassLoader.findLibrary(java.lang.String) WARNING: Please consider reporting this to the maintainers of org.lwjgl.LWJGLUtil$3 WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations WARNING: All illegal access operations will be denied in a future release
ほとんどの場合Port
#RANDOM
BMS list#OPTION
command