textage.cc/score js(bms2jsh.js) 移植実験3

dual control (8th) がトリッキーな定義をしていて、だいたいいつも処理に失敗する件


1 小節目が 4 分の 32 拍子である Mr.T の面白楽曲で、スコアも出にくいアイツですよ

https://textage.cc/score/8/dual.html?DN400 より

genre="GARAGE HOUSE";title="dual control";
artist="Mr.T";bpm="131~140";measure=52;back=6;ln[0]=1536;tc[0]=["1310"];
/* 中略 */

// (註) DPN 定義部
if(l){notes=403;
sp=["#QAAAwECAo-QCKg","#5DA7EQ_","#OAAAd6BQ1EQ","#7CA5Cw2Dg", /* 中略 */ , 
"#SAzA6BQ7Dw_Eg", // [52]
"#qAFAoAAIw7Ew3Fw1Gg5IA5JQ5KQ3SA_", // [53]
"#BAGAFAAAY4Ng2Qg7cw5dQ3dw1eg5gA5hQ5hw5iQ1qw6tw-QCKiAAA"]; // [54]
sp[46]=sp[14];sp[47]=sp[15];

dp=["#BA4rI-QAlI","#5AA7BQ_FA","#Bd","#TcAAIAA2BQ_FA", /* 中略 */ , 
"#OgAAf4Cw", // [52]
"#Qg5AAAAFQ5Dw3EQ1HQ1Iw1Jg1KA7UQ_Wg", // [53]
"#BA4rInAAC5bw3cQ1cg1fQ1gw1hg1iA5rg7sQ-QAlIAAQ"];} // [54]

if(s.charAt(5)!="0"){ln[0]=3072;sp[0]=sp[54];dp[0]=dp[54];tc[0]=["1310","140896"];}
hd();w("<table><tr><td>");b(0);w("<\/td><td>");sp[0]=sp[53];dp[0]=dp[53];
tc[0]=["140384"];b(0);w("<\/td>");for(x=1;x<measure;x+=4){
w("<td valign=bottom>");b(x,x+3);w("<\/td>");}ft();

基本的にs.charAt(5)'0'なので、この if 構文は実行されない。そのあと最初にb(0)をコールし 1 小節だけ描画して、次にsp[0]=sp[53];dp[0]=dp[53];として[0]を更新してからb(0)を改めてコールする。そして for ループでb(x,x+3);をコールし 4 小節ずつ描画している(1~4, 5~8, ..., 49~52)。これはあくまで「4 分音符 16 個ずつ描画したく、td 2 セルの両方に小節番号 "1" を振りたい」描画側の都合と考えられる。

だからmeasure52で定義されて、単純に[53][54]を処理することは禁忌だった。

描画を考慮しなくてよい dual.html の場合のみ特殊処理として、ln[0]=3072;sp[0]=sp[54];dp[0]=dp[54];tc[0]=["1310","140896"];としてから、[0][52]を実行して、[53][54]は無視する(あるいはpop()して配列から除去する)、とするのが一番正確か。

余談

2nd の「SOFT LANDING ON THE BODY」でも、同様の特殊処理があった。ただしこの楽曲は現時点で AC でも INF でも遊べないので、楽曲ごと処理除外とする。