めちゃくちゃマニアックな発見をしてしまったのでせっかくだし書き起こしてみる。
簡単に言うと、「9KX2」のノーツ数が18,000,226ノーツ、「Pi」のノーツ数が3,154,474ノーツだったかもしれないということ。
前提情報
- MIDIとは
実際の音声ではなく、楽譜のように音符の情報をデータ化したもの。 直前のデータとの差分時間を挟み、種類、チャンネル、高さ、強さなどをバイナリデータで記録していく方式。 - Black MIDIとは
通常であれば数千~数万個のノーツ数しかないMIDIファイルに比べて、とてつもない量のノーツを有しているMIDIのこと。
作者によってさまざまで、数十万、数百万のものもあれば、数億やそれ以上のものもあったりする。 - TSMB2とは
Black MIDI界隈では有名なBlack MIDI作者の省略名。
チャンネル名とかは「TheSuperMarioBros2」。
既存曲のBlack MIDIもあるがオリジナル曲が多く、個人的に好きな曲が多くてよく聴いてる。
その中でも円周率をテーマにした「Pi」やチャンネル登録者数が一定を超えると作成していた「○K」シリーズなどでは、意図的にノーツ数が調整されているものもある。 - 9KX2
TSMB2氏がチャンネル登録者18,000万人記念で作った曲。(たぶん)
9,000人時の「9K」の×2という意味で、曲の前半は「9K」そのままで、後半に新しい部分が追加されている。
ノーツ数は登録者数に絡めて18,000,000ノーツで作られている。 - Pi
円周率をテーマにしている曲で、MIDIアートで「3.141592」という数字が書かれていたり、曲時間、ノーツ数、動画投稿日などが円周率にちなんだ数字になっている。
曲時間3分14秒、ノーツ数3,141,592ノーツ、動画投稿日3月14日といった感じ。
本題
- 発見したきっかけ
普段からプログラムでMIDIを弄るのが好きで、今回はMIDIのフォーマットをちょっと変えて独自形式みたいなのを作れないかな~って思っていろいろ試してた。
MIDIはノートオンとノートオフが別々で配置されているので、ノートオンが来た段階ではまだそのノートがどれくらいの長さあるのかがわからない。
そこで、ノートオンが来た時点で、チャンネル、高さごとに溜めておき、ノートオフが来た時に一番古いのと組み合わせて時間の差で長さを求めるようにしていた。
本来であればノートオフが来た時点では必ずそれに対応するノートオンがあるはずなんだけど、この9KX2でテストしていた時にないパターンが出てきた。
今までだったらノートオフが謎に多いだけだから無視すればいいかと思ってたんだけど、今回はちゃんと調べてみることにした。 - データ上の矛盾
そもそも、何で対応するノートオンがないノートオフがあるんだ?という話になる。
ノートオフの位置がおかしいのであれば、これを無視すると今度は孤立するノートオンが現れそうだけど、実際はそんなことなかった。
プログラムのミスで読む場所がずれてるのであれば、それ以降も正しく読めないはずだけど、そんなこともなかった。
ということは、ただただノートオフが多いということになる。
試しに無視されたノートを数えてみると、452個だった。
全体で1800万ノーツもあるのに、なんでこれだけ?と思い、今度はノートオンとノートオフも数えてみると、それぞれ1800万、1800万452個だった。
はやり無視されたノートの数だけノートオフが多い。
そもそもノートオンとノートオフの数が一致してないのはなんでだ?と思い、もっと調べてみることにした。 - MIDIデータにおける「ノートオフ」
MIDIの仕様として、ノートオフやノートオンはそれぞれ3バイトで記録しており、その間には直前のイベントとの差分時間である「デルタタイム」が可変長で記録されている。
それぞれのバイトの中身は以下の通り>。
1バイト目:上位4ビットがステータスを、下位4ビットがチャンネルを表す。(例:ノートオン、チャンネル12なら「9C」)
2バイト目:最上位ビット以外の7ビットでノートの高さを表す。(0~127)
3バイト目;最上位ビット以外の7ビットでノートのベロシティを表す。(1~127)
そして、ノートオンはステータス9かつベロシティ1以上の時、ノートオフはステータス8かステータス9かつベロシティ0の時となる。
そこで疑ったのが、本来はステータス9でノートオンだったが、何故かベロシティが0となってノートオフとしてカウントされてしまったのではないかということ。
試しにステータス9かつベロシティ0のノートオフを数えてみると、226個で、多かった452個のちょうど半分だった。
おそらく数が一致しない原因はこいつで間違いないだろう。
仮にこいつらがベロシティ1以上であれば、ノートオンとノートオフはともにぴったり18,000,226個となる。 - 意図的にこうしてる?
試しにTSMB2氏の他のMIDIも合わせて見てみたところ、それぞれ以下の通りだった。
・9KX2:表記上ノーツ数18,000,000、ノートオン18,000,000、ノートオフ18,000,452、ステータス9かつベロシティ0のノートオフ226
・Pi:表記上ノーツ数3,141,592、ノートオン3,141,592、ノートオフ3,167,256、ステータス9かつベロシティ0のノートオフ12882
・Unbounded2:表記上ノーツ数891,667、ノートオン891,667、ノートオフ891,667、ステータス9かつベロシティ0のノートオフ0
・Krash Notes:表記上ノーツ数6,738,947、ノートオン6,738,947、ノートオフ6,738,947、ステータス9かつベロシティ0のノートオフ0
これらを見ると、ノーツ数が調整されてるMIDIにのみこのおかしな現象が起こっているということがわかる。
TSMB2氏はたまにFl Studioのワークファイルも配布していることがあるのでおそらくFl Studioで出力していると思われるが、 ノートのベロシティが0になることがあるということになる。
何かの範囲指定処理をかけたときに発生してしまうとかであれば他のMIDIでも起こるはずなので、 最後ノーツ数の端数調整をするために指定ノーツ数分を意図的にベロシティ0にしたのではないかと思ってる。(Dominoはできなかったはず)
MIDIの仕様上ステータス9かつベロシティ0はノートオフとして扱うことになっているので間違ってはいないが、
ノートオンとノートオフの差を埋めて本来の正しい形に直そうとすると、ノーツ数は表記よりもうちょっと多い数になるのではないかと言う話。
もし意図的にやっているのであればそれが正しいノーツ数でもいいかと思うけど、意図してないのであれば本来はもうちょっとノーツ数が多かったんじゃないかと思ってる。