suzukiplan / tohovgs-pico

東方VGS実機版
GNU General Public License v3.0
0 stars 0 forks source link

BGMサイズ上限 #1

Closed suzukiplan closed 10 months ago

suzukiplan commented 10 months ago

VGS の BGM データは内部的に miniz で圧縮されている。

圧縮済みのデータはフラッシュに書き込む(ソース等と同じメモリ領域に展開される)ので中国製のラズパイPico互換機ならプログラム込みで16MBまでデータを格納できる。(※公式のラズパイPicoなら2MB)

ただし、再生時は RAM(最大256KB)へ展開する必要がある。

無圧縮状態のデータをチェックしてみたところ、東方紅魔郷、東方妖々夢、東方永夜抄の3作品の中では、東方妖々夢の TH07-16 (少女幻葬 〜 Necro-Fantasy) が 330KB(338,336)で限界突破している。

当然ながらプログラム側で使いたいRAM領域もあるので、曲データに使用する RAM 領域は最大でも 128KB 以下(できれば 64KB 以下)程度に抑えたいところだが、結構な数のデータが 128KB 上限でも収まりきらない状況である。

make -f BGM.mak all
tools/vgsmml/vgsmml mml/TH06-01.mml rom/TH06-01.bgm
compressed 29152 -> 2051
bgm-size: 2051
tools/vgsmml/vgsmml mml/TH06-02.mml rom/TH06-02.bgm
compressed 47856 -> 4102
bgm-size: 4102
tools/vgsmml/vgsmml mml/TH06-03.mml rom/TH06-03.bgm
compressed 60560 -> 5996
bgm-size: 5996
tools/vgsmml/vgsmml mml/TH06-04.mml rom/TH06-04.bgm
compressed 49600 -> 3795
bgm-size: 3795
tools/vgsmml/vgsmml mml/TH06-05.mml rom/TH06-05.bgm
compressed 70464 -> 7883
bgm-size: 7883
tools/vgsmml/vgsmml mml/TH06-06.mml rom/TH06-06.bgm
compressed 81400 -> 13628
bgm-size: 13628
tools/vgsmml/vgsmml mml/TH06-07.mml rom/TH06-07.bgm
compressed 92232 -> 14277
bgm-size: 14277
tools/vgsmml/vgsmml mml/TH06-08.mml rom/TH06-08.bgm
compressed 94736 -> 12792
bgm-size: 12792
tools/vgsmml/vgsmml mml/TH06-09.mml rom/TH06-09.bgm
compressed 88624 -> 14530
bgm-size: 14530
tools/vgsmml/vgsmml mml/TH06-10.mml rom/TH06-10.bgm
compressed 170472 -> 20907
bgm-size: 20907
tools/vgsmml/vgsmml mml/TH06-11.mml rom/TH06-11.bgm
compressed 91624 -> 11377
bgm-size: 11377
tools/vgsmml/vgsmml mml/TH06-12.mml rom/TH06-12.bgm
compressed 52528 -> 6701
bgm-size: 6701
tools/vgsmml/vgsmml mml/TH06-13.mml rom/TH06-13.bgm
compressed 120496 -> 15760
bgm-size: 15760
tools/vgsmml/vgsmml mml/TH06-14.mml rom/TH06-14.bgm
compressed 132440 -> 22394
bgm-size: 22394
tools/vgsmml/vgsmml mml/TH06-15.mml rom/TH06-15.bgm
compressed 111024 -> 15720
bgm-size: 15720
tools/vgsmml/vgsmml mml/TH06-16.mml rom/TH06-16.bgm
compressed 32304 -> 2181
bgm-size: 2181
tools/vgsmml/vgsmml mml/TH06-17.mml rom/TH06-17.bgm
compressed 57224 -> 8622
bgm-size: 8622
tools/vgsmml/vgsmml mml/TH07-01.mml rom/TH07-01.bgm
compressed 52808 -> 6802
bgm-size: 6802
tools/vgsmml/vgsmml mml/TH07-02.mml rom/TH07-02.bgm
compressed 84864 -> 11424
bgm-size: 11424
tools/vgsmml/vgsmml mml/TH07-03.mml rom/TH07-03.bgm
compressed 83736 -> 7950
bgm-size: 7950
tools/vgsmml/vgsmml mml/TH07-04.mml rom/TH07-04.bgm
compressed 121128 -> 14373
bgm-size: 14373
tools/vgsmml/vgsmml mml/TH07-05.mml rom/TH07-05.bgm
compressed 37368 -> 3464
bgm-size: 3464
tools/vgsmml/vgsmml mml/TH07-06.mml rom/TH07-06.bgm
compressed 145040 -> 18665
bgm-size: 18665
tools/vgsmml/vgsmml mml/TH07-07.mml rom/TH07-07.bgm
compressed 179712 -> 26239
bgm-size: 26239
tools/vgsmml/vgsmml mml/TH07-08.mml rom/TH07-08.bgm
compressed 155984 -> 11469
bgm-size: 11469
tools/vgsmml/vgsmml mml/TH07-09.mml rom/TH07-09.bgm
compressed 80480 -> 5826
bgm-size: 5826
tools/vgsmml/vgsmml mml/TH07-10.mml rom/TH07-10.bgm
compressed 130120 -> 12408
bgm-size: 12408
tools/vgsmml/vgsmml mml/TH07-11.mml rom/TH07-11.bgm
compressed 108376 -> 16475
bgm-size: 16475
tools/vgsmml/vgsmml mml/TH07-12.mml rom/TH07-12.bgm
compressed 64872 -> 5629
bgm-size: 5629
tools/vgsmml/vgsmml mml/TH07-13.mml rom/TH07-13.bgm
compressed 165640 -> 22338
bgm-size: 22338
tools/vgsmml/vgsmml mml/TH07-14.mml rom/TH07-14.bgm
compressed 101168 -> 16526
bgm-size: 16526
tools/vgsmml/vgsmml mml/TH07-15.mml rom/TH07-15.bgm
compressed 152328 -> 10584
bgm-size: 10584
tools/vgsmml/vgsmml mml/TH07-16.mml rom/TH07-16.bgm
compressed 338336 -> 33393
bgm-size: 33393
tools/vgsmml/vgsmml mml/TH07-17.mml rom/TH07-17.bgm
compressed 141800 -> 9881
bgm-size: 9881
tools/vgsmml/vgsmml mml/TH07-18.mml rom/TH07-18.bgm
compressed 245640 -> 25184
bgm-size: 25184
tools/vgsmml/vgsmml mml/TH07-19.mml rom/TH07-19.bgm
compressed 23784 -> 3574
bgm-size: 3574
tools/vgsmml/vgsmml mml/TH07-20.mml rom/TH07-20.bgm
compressed 71016 -> 3228
bgm-size: 3228
tools/vgsmml/vgsmml mml/TH07-21.mml rom/TH07-21.bgm
compressed 129296 -> 16219
bgm-size: 16219
tools/vgsmml/vgsmml mml/TH08-01.mml rom/TH08-01.bgm
compressed 35064 -> 3734
bgm-size: 3734
tools/vgsmml/vgsmml mml/TH08-02.mml rom/TH08-02.bgm
compressed 98672 -> 11179
bgm-size: 11179
tools/vgsmml/vgsmml mml/TH08-03.mml rom/TH08-03.bgm
compressed 113568 -> 14263
bgm-size: 14263
tools/vgsmml/vgsmml mml/TH08-04.mml rom/TH08-04.bgm
compressed 180240 -> 26363
bgm-size: 26363
tools/vgsmml/vgsmml mml/TH08-05.mml rom/TH08-05.bgm
compressed 91344 -> 8270
bgm-size: 8270
tools/vgsmml/vgsmml mml/TH08-06.mml rom/TH08-06.bgm
compressed 84096 -> 7811
bgm-size: 7811
tools/vgsmml/vgsmml mml/TH08-07.mml rom/TH08-07.bgm
compressed 119728 -> 20130
bgm-size: 20130
tools/vgsmml/vgsmml mml/TH08-08.mml rom/TH08-08.bgm
compressed 109264 -> 8100
bgm-size: 8100
tools/vgsmml/vgsmml mml/TH08-09.mml rom/TH08-09.bgm
compressed 173776 -> 14365
bgm-size: 14365
tools/vgsmml/vgsmml mml/TH08a-10.mml rom/TH08a-10.bgm
compressed 151208 -> 12040
bgm-size: 12040
tools/vgsmml/vgsmml mml/TH08-11.mml rom/TH08-11.bgm
compressed 174608 -> 22924
bgm-size: 22924
tools/vgsmml/vgsmml mml/TH08-12.mml rom/TH08-12.bgm
compressed 119040 -> 12439
bgm-size: 12439
tools/vgsmml/vgsmml mml/TH08-13.mml rom/TH08-13.bgm
compressed 103040 -> 10118
bgm-size: 10118
tools/vgsmml/vgsmml mml/TH08-14.mml rom/TH08-14.bgm
compressed 187832 -> 24612
bgm-size: 24612
tools/vgsmml/vgsmml mml/TH08-15.mml rom/TH08-15.bgm
compressed 199072 -> 25940
bgm-size: 25940
tools/vgsmml/vgsmml mml/TH08-16.mml rom/TH08-16.bgm
compressed 95984 -> 5160
bgm-size: 5160
tools/vgsmml/vgsmml mml/TH08-17.mml rom/TH08-17.bgm
compressed 151048 -> 8259
bgm-size: 8259
tools/vgsmml/vgsmml mml/TH08-18.mml rom/TH08-18.bgm
compressed 185576 -> 22326
bgm-size: 22326
tools/vgsmml/vgsmml mml/TH08-19.mml rom/TH08-19.bgm
compressed 50696 -> 7547
bgm-size: 7547
tools/vgsmml/vgsmml mml/TH08-20.mml rom/TH08-20.bgm
compressed 84272 -> 8009
bgm-size: 8009
tools/vgsmml/vgsmml mml/TH08-21.mml rom/TH08-21.bgm
compressed 83792 -> 7193
bgm-size: 7193

データ構造は変更せず MML コンパイルの最適化で必要サイズを圧縮できるのがベター。 それで無理ならデータ構造の変更が必要になりそう。(※おそらく無理と想定している)

suzukiplan commented 10 months ago

冗長データ削減を試みてみたが効果としてはイマイチなので、データ構造の最適化がベターかもしれない。

VGS の BGM データは、

struct _NOTE {
    unsigned char type;
    unsigned char op1;
    unsigned char op2;
    unsigned char op3;
    unsigned int val;
};

という固定長バッファ(8byte)で、以下のような用途で使っている。

かなり最適化余地がある。

まず、type と op1 は合わせて1バイトにできる

bit7〜4 bit3〜0
type op1

そして type 毎に可変長にすれば良い。

一番多く出現する type は KEYON と KEYOFF だが、KEYON のサイズは 8 → 3 (0.375)、KEYOFF は 8 → 1 (0.125) に圧縮できるので、全体でおよそ 1/4 程度までデータ圧縮できるのではないかと考えられる。

suzukiplan commented 10 months ago

チャンピオンデータのTH07-16 (少女幻葬 〜 Necro-Fantasy) = 330KB(338,336)を 1/4 に圧縮できれば 83KB(84584)になるので、128KB以下への圧縮が可能。

suzukiplan commented 10 months ago

TH07-16 (少女幻葬 〜 Necro-Fantasy) = 330KB(338,336)を可変データ方式で圧縮してみたところ 150KB(153247)までにしか圧縮されなかった。

miniz で圧縮せずにフラッシュに書き込んで、コードと同じように const データとして直接読むしかなさそうかな。

suzukiplan commented 10 months ago

NTYPE_WAIT を データサイズ毎に NTYPE_WAIT_8 (8ビット), NTYPE_WAIT_16 (16ビット), NTYPE_WAIT_32 (32ビット) に分割してみたところ、TH07-16のサイズが 94KB (95,491) になった。

これならイケる。

suzukiplan commented 10 months ago

TH06, TH07, TH08 の合計サイズは 1,898,985 bytes (約1.8MB) やはり無圧縮状態だと現時点の全曲を RaspberryPi Pico (2MB) に収めるのは厳しいので LZ4 圧縮は必要っぽい。

suzukiplan commented 10 months ago

LZ4 圧縮した場合の TH06, TH07, TH08 の合計サイズは 821,757 bytes (約0.79MB) この圧縮率だと純正 RaspberryPi Pico (2MB) に全曲入れるのは無理かな。 (中国製の互換品の16MBモデルなら問題なく全曲入るが)

suzukiplan commented 10 months ago

幾つかピックアップして固定長(従来方式)、可変長(新方式)、LZ4圧縮(新方式を圧縮)のサイズを調査してみた。

MML 固定長 可変長 LZ4圧縮
TH06-01 29,152 8,647 2,603
TH06-10 170,472 47,881 22,310
TH07-16 338,336 95,491 37,951
TH08-18 185,576 53,155 24,419
suzukiplan commented 10 months ago

まだ動くかちゃんとテストしていないがひとまず実装完了したので閉じる

suzukiplan commented 10 months ago

ひとまず、曲再生用に 128KB 確保した状態の RAM と、東方紅魔郷、東方妖々夢、東方永夜抄の3作分の曲データを RaspberryPi Pico(公式)に入れた状態の Flash の占有率は以下のような形。

Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
RAM:   [=====     ]  54.2% (used 142080 bytes from 262144 bytes)
Flash: [=====     ]  48.6% (used 1017076 bytes from 2093056 bytes)