diff --git a/README.md b/README.md index f23c389..9493c09 100644 --- a/README.md +++ b/README.md @@ -2,11 +2,9 @@ **简体中文** - [English](README_en.md) -运行在卡西欧 fx-9750 与 fx-9860 系列图形计算器上的4K(四按键)下落式音游。 - ## 简介 - +运行在卡西欧 fx-9750 与 fx-9860 系列图形计算器上的4K(四按键)下落式音游。 ## 项目开始前可行性的考虑与实现的难度 @@ -20,11 +18,11 @@ ### 铺面来源 -由于鄙人不会写铺子,也从来没有参与过音游的开发,可以看到有一个 Python 脚本,用于把 Malody 的铺面转换成 fx4K 的铺面(后缀为`.f4k`)。由于变速对于鄙人来说难以实现,将会以铺面最初的 BPM 应用到全曲。BPM 将会强制转换为整数。 +由于鄙人不会写铺子,也从来没有参与过音游的开发,可以看到有一个 Python 脚本,用于把 Malody 的铺面转换成 fx4K 的铺面。由于变速对于鄙人来说难以实现,将会以铺面最初的 BPM 应用到全曲。BPM 将会强制转换为整数。 ## 二进制结构 -### f4k 铺面 +### 铺面 | Byte\(s\) | Length | Meaning | | :-------- | :----- | :----------------- | @@ -33,7 +31,7 @@ | `40,41` | 2 | BPM | | `42,43` | 2 | note count | | `44,45` | 2 | song length | -| `44~4F` | 12 | LEAVE BLANK | +| `46~4F` | 12 | LEAVE BLANK | ### 音符 diff --git a/addin/AddinInfo.txt b/addin/AddinInfo.txt index ca2f75c..0ed64f0 100644 --- a/addin/AddinInfo.txt +++ b/addin/AddinInfo.txt @@ -5,7 +5,7 @@ [BINDATA] : "FXADDINror.bin" [DISPNAME] : "fx4K" [APPNAME] : "@FX4K" -[VERSION] : "00.01.0000" +[VERSION] : "00.02.0000" [APL_ICON] : "MainIcon.bmp" [MODULE_NUM] : 0 [MOD1_TITLE] : "fx4K" diff --git a/addin/fx4K.dlr b/addin/fx4K.dlr index 92e9ca1..a6d0e03 100644 --- a/addin/fx4K.dlr +++ b/addin/fx4K.dlr @@ -109,6 +109,7 @@ Sublevel=1 File=C:\users\crossover\My Documents\GitHub\fx4K\addin\lib\game\play.c Line=275 Flags=00001012 +Sublevel=1 [Breakpoint] File=C:\users\crossover\My Documents\GitHub\fx4K\addin\lib\game\play.c @@ -120,6 +121,7 @@ Sublevel=2 File=C:\users\crossover\My Documents\GitHub\fx4K\addin\lib\game\play.c Line=288 Flags=00001011 +Sublevel=1 [Breakpoint] File=C:\users\crossover\My Documents\GitHub\fx4K\addin\lib\game\play.c @@ -144,3 +146,21 @@ File=C:\users\crossover\My Documents\GitHub\fx4K\addin\lib\game\play.c Line=270 Flags=00001012 Sublevel=2 + +[Breakpoint] +File=C:\users\crossover\My Documents\GitHub\fx4K\addin\lib\game\play.c +Line=288 +Flags=00001011 +Sublevel=2 + +[Breakpoint] +File=C:\users\crossover\My Documents\GitHub\fx4K\addin\lib\game\play.c +Line=288 +Flags=00001011 +Sublevel=3 + +[Breakpoint] +File=C:\users\crossover\My Documents\GitHub\fx4K\addin\lib\game\play.c +Line=275 +Flags=00001012 +Sublevel=2 diff --git a/addin/fx4K.dlw b/addin/fx4K.dlw index 3151a03..e435cff 100644 --- a/addin/fx4K.dlw +++ b/addin/fx4K.dlw @@ -2,14 +2,14 @@ [_1] Type=5 -Order=0 +Order=1 Top=15 Left=2235 Height=4740 Width=5565 State=0 Flags=00000020 -Setting=33:1:lib\game\play.c +Setting=129:1:lib\game\play.c OptionA=0 [_2] @@ -26,7 +26,7 @@ OptionB=15 [_3] Type=6 -Order=1 +Order=2 Top=4740 Left=7800 Height=6390 @@ -92,7 +92,7 @@ OptionA=0 [_9] Type=15 -Order=2 +Order=0 Top=4740 Left=2235 Height=6345 diff --git a/addin/fx4K.g1w b/addin/fx4K.g1w index 1699d33..4024f08 100644 --- a/addin/fx4K.g1w +++ b/addin/fx4K.g1w @@ -1,6 +1,6 @@ [DLSimProject] Name=fx4K -Version=00.01 +Version=00.02.0000 Model=:fx-9860G.dlm SourcePath=SRC MemoryPath=INIT diff --git a/addin/lib/game/graphics.c b/addin/lib/game/graphics.c index bffd4e6..509f41c 100644 --- a/addin/lib/game/graphics.c +++ b/addin/lib/game/graphics.c @@ -9,22 +9,22 @@ void draw_key_press_effect(unsigned char *key_state) ML_rectangle( 1, 64 - COLUMN_HEIGHT, COLUMN_WIDTH, 62, - 2, ML_XOR, ML_WHITE); + 2, ML_XOR, ML_TRANSPARENT); if (key_state[1]) ML_rectangle( 1 + COLUMN_WIDTH, 64 - COLUMN_HEIGHT, COLUMN_WIDTH * 2, 62, - 2, ML_XOR, ML_WHITE); + 2, ML_XOR, ML_TRANSPARENT); if (key_state[2]) ML_rectangle( 1 + COLUMN_WIDTH * 2, 64 - COLUMN_HEIGHT, COLUMN_WIDTH * 3, 62, - 2, ML_XOR, ML_WHITE); + 2, ML_XOR, ML_TRANSPARENT); if (key_state[3]) ML_rectangle( 1 + COLUMN_WIDTH * 3, 64 - COLUMN_HEIGHT, COLUMN_WIDTH * 4, 62, - 2, ML_XOR, ML_WHITE); + 2, ML_XOR, ML_TRANSPARENT); } diff --git a/addin/lib/game/play.c b/addin/lib/game/play.c index 4193281..6d21955 100644 --- a/addin/lib/game/play.c +++ b/addin/lib/game/play.c @@ -6,34 +6,69 @@ #include "play.h" #include "graphics.h" +unsigned char buffer[32]; +unsigned int key; + unsigned char wait_frame; short column_start_ptr[4], column_now_ptr[4]; short time; unsigned char key_state[4]; -unsigned short miss_count, good_count, perfect_count; +unsigned short miss_count, good_count, perfect_count, combo, max_combo; +float accuracy; short VISIBLE = 40; -unsigned int select_chart_speed() +void select_speed() { - unsigned int key; - ML_clear_vram(); - locate(6, 3); - Print((unsigned char*)"Chart Speed"); - locate(6, 5); - Print((unsigned char*)"1 2 [3] 4 5"); + locate(9, 2); + Print((unsigned char *)"Speed"); + locate(7, 3); + Print((unsigned char *)"[1] 2s"); + locate(7, 4); + Print((unsigned char *)"[2] 1.5s"); + locate(7, 5); + Print((unsigned char *)"[3] 1s"); + locate(7, 6); + Print((unsigned char *)"[4] 0.75s"); + locate(7, 7); + Print((unsigned char *)"[5] 0.5s"); + + ML_display_vram(); while (1) { GetKey(&key); + if (KEY_CHAR_1 <= key && key <= KEY_CHAR_5) + { + switch (key) + { + case KEY_CHAR_1: + VISIBLE = 80; + break; + case KEY_CHAR_2: + VISIBLE = 60; + break; + case KEY_CHAR_3: + VISIBLE = 40; + break; + case KEY_CHAR_4: + VISIBLE = 30; + break; + case KEY_CHAR_5: + VISIBLE = 20; + break; + default: + break; + } + break; + } } } - unsigned int pause() { - unsigned int key, i, j; + unsigned int i, j; for (i = 0; i <= 127; i++) for (j = 0; j <= 63; j++) @@ -56,12 +91,52 @@ unsigned int pause() } } +void display_result(unsigned char *chart_title) +{ + accuracy = 100 * ((float)perfect_count + (float)good_count / 2) / + (float)(perfect_count + good_count + miss_count); + + ML_clear_vram(); + + locate(1, 1); + Print(chart_title); + locate(1, 2); + Print(&chart_title[21]); + + locate(1, 3); + Print((unsigned char*)"---------------------"); + + locate(1, 4); + sprintf((char *)buffer, "ACCURACY : %.2f%%", accuracy); + Print(buffer); + locate(1, 5); + sprintf((char *)buffer, "MAX COMBO: %u", max_combo); + Print(buffer); + locate(1, 6); + sprintf((char *)buffer, "PERFECT : %u", perfect_count); + Print(buffer); + locate(1, 7); + sprintf((char *)buffer, "GOOD : %u", good_count); + Print(buffer); + locate(1, 8); + sprintf((char *)buffer, "MISS : %u", miss_count); + Print(buffer); + + ML_display_vram(); + + while (1) + { + GetKey(&key); + if (key == KEY_CTRL_EXE) + break; + } +} + void frame_timer() { wait_frame = 0; } - void note_state_machine(struct Note notes[2000]) { unsigned char i, score; @@ -85,6 +160,7 @@ void note_state_machine(struct Note notes[2000]) if (n + PERFECT + GOOD < time) { notes[column_now_ptr[i]].score = SCORE_MISS; + combo = 0; } } @@ -95,17 +171,20 @@ void note_state_machine(struct Note notes[2000]) key_state[i] == 1) { notes[column_now_ptr[i]].score = SCORE_GOOD; + combo++; } if (n - PERFECT <= time && time <= n + PERFECT && key_state[i] == 1) { notes[column_now_ptr[i]].score = SCORE_PERFECT; + combo++; } if (n + PERFECT + GOOD < time) { notes[column_now_ptr[i]].score = SCORE_MISS; + combo = 0; } } @@ -130,15 +209,13 @@ void note_state_machine(struct Note notes[2000]) } } - void play(unsigned char *file_path) { - unsigned int key, column; + unsigned int column; int i; int chart_file; FONTCHARACTER casio_file_path[32]; unsigned char chart_title[32], chart_artist[32]; - unsigned char buffer[32]; short chart_bpm, chart_note_num, song_length; short visible_note_start_ptr, visible_note_end_ptr; @@ -250,6 +327,8 @@ void play(unsigned char *file_path) if (key == KEY_CTRL_EXIT) return; + select_speed(); + //////////////// // Game start // //////////////// @@ -266,6 +345,8 @@ void play(unsigned char *file_path) miss_count = 0; good_count = 0; perfect_count = 0; + combo = 0; + max_combo = 0; while (1) { @@ -308,6 +389,7 @@ void play(unsigned char *file_path) 1, ML_BLACK, ML_BLACK); } + // Display note score sprintf((char *)buffer, "P %d", perfect_count); locate(14, 2); Print(buffer); @@ -317,13 +399,22 @@ void play(unsigned char *file_path) sprintf((char *)buffer, "M %d", miss_count); locate(14, 4); Print(buffer); + if (combo >= 5) + { + locate(14, 6); + Print((unsigned char *)"COMBO"); + locate(14, 7); + sprintf((char *)buffer, "[%d]", combo); + Print(buffer); + } draw_frame(); draw_key_press_effect(key_state); note_state_machine(notes); draw_progress_bar(time, song_length); - // Scoring + if (combo > max_combo) + max_combo = combo; ML_display_vram(); while (wait_frame) @@ -332,6 +423,10 @@ void play(unsigned char *file_path) KillTimer(1); time++; + if (time > song_length + 20 || IsKeyDown(KEY_CHAR_STORE)) // Game ends 0.5s after song ends + break; + + // Pause if (IsKeyDown(KEY_CTRL_EXIT)) switch (pause()) { @@ -347,4 +442,6 @@ void play(unsigned char *file_path) break; } } + + display_result(chart_title); } diff --git a/converter/Malody/Dream - Malody.mc b/converter/Malody/Dream - Malody.mc new file mode 100755 index 0000000..fc0f63a --- /dev/null +++ b/converter/Malody/Dream - Malody.mc @@ -0,0 +1,1810 @@ +{ + "meta": { + "cover": "", + "creator": "victorica", + "version": "KEY BEGINNER LV.2", + "time": 1454342618, + "id": 2576, + "mode": 0, + "song": { + "title": "DREAM", + "artist": "iowo", + "id": 978, + "source": "malody music select", + "org": { + "title": "", + "artist": "", + "source": "" + } + }, + "background": "bg.png", + "mode_ext": { + "column": 4 + } + }, + "time": [ + { + "beat": [ + 0, + 0, + 1 + ], + "bpm": 130, + "signature": 4 + } + ], + "note": [ + { + "sound": "song-bg.ogg", + "type": 1, + "offset": 429, + "beat": [ + 0, + 0, + 1 + ], + "column": 4 + }, + { + "beat": [ + 1, + 0, + 1 + ], + "column": 3 + }, + { + "beat": [ + 1, + 3, + 4 + ], + "column": 3 + }, + { + "beat": [ + 2, + 1, + 2 + ], + "column": 1 + }, + { + "beat": [ + 3, + 1, + 2 + ], + "column": 0 + }, + { + "beat": [ + 4, + 0, + 1 + ], + "column": 1 + }, + { + "beat": [ + 4, + 1, + 2 + ], + "column": 2 + }, + { + "beat": [ + 5, + 0, + 1 + ], + "column": 0 + }, + { + "beat": [ + 5, + 3, + 4 + ], + "column": 3 + }, + { + "beat": [ + 6, + 1, + 2 + ], + "column": 1 + }, + { + "beat": [ + 7, + 0, + 1 + ], + "column": 2 + }, + { + "beat": [ + 9, + 0, + 1 + ], + "column": 3 + }, + { + "beat": [ + 9, + 3, + 4 + ], + "column": 0 + }, + { + "beat": [ + 10, + 1, + 2 + ], + "column": 2 + }, + { + "beat": [ + 11, + 0, + 1 + ], + "column": 1 + }, + { + "beat": [ + 11, + 1, + 2 + ], + "column": 3 + }, + { + "beat": [ + 12, + 1, + 2 + ], + "column": 3 + }, + { + "beat": [ + 13, + 0, + 1 + ], + "column": 2 + }, + { + "beat": [ + 13, + 1, + 2 + ], + "column": 1 + }, + { + "beat": [ + 14, + 0, + 1 + ], + "column": 0 + }, + { + "beat": [ + 14, + 1, + 2 + ], + "column": 2 + }, + { + "beat": [ + 17, + 0, + 1 + ], + "column": 3 + }, + { + "beat": [ + 18, + 0, + 1 + ], + "column": 1 + }, + { + "beat": [ + 19, + 0, + 1 + ], + "column": 0 + }, + { + "beat": [ + 19, + 1, + 2 + ], + "column": 2 + }, + { + "beat": [ + 20, + 1, + 2 + ], + "column": 1 + }, + { + "beat": [ + 21, + 0, + 1 + ], + "column": 3, + "endbeat": [ + 24, + 0, + 1 + ] + }, + { + "beat": [ + 25, + 0, + 1 + ], + "column": 3 + }, + { + "beat": [ + 26, + 0, + 1 + ], + "column": 1 + }, + { + "beat": [ + 27, + 0, + 1 + ], + "column": 0 + }, + { + "beat": [ + 27, + 1, + 2 + ], + "column": 3 + }, + { + "beat": [ + 28, + 1, + 2 + ], + "column": 2 + }, + { + "beat": [ + 29, + 0, + 1 + ], + "column": 0, + "endbeat": [ + 31, + 0, + 1 + ] + }, + { + "beat": [ + 31, + 0, + 1 + ], + "column": 3, + "endbeat": [ + 33, + 0, + 1 + ] + }, + { + "beat": [ + 33, + 0, + 1 + ], + "column": 1 + }, + { + "beat": [ + 34, + 0, + 1 + ], + "column": 0 + }, + { + "beat": [ + 35, + 0, + 1 + ], + "column": 1 + }, + { + "beat": [ + 35, + 1, + 2 + ], + "column": 3 + }, + { + "beat": [ + 36, + 1, + 2 + ], + "column": 1 + }, + { + "beat": [ + 37, + 0, + 1 + ], + "column": 3, + "endbeat": [ + 40, + 0, + 1 + ] + }, + { + "beat": [ + 41, + 0, + 1 + ], + "column": 3 + }, + { + "beat": [ + 42, + 0, + 1 + ], + "column": 1 + }, + { + "beat": [ + 43, + 0, + 1 + ], + "column": 0 + }, + { + "beat": [ + 43, + 1, + 2 + ], + "column": 2 + }, + { + "beat": [ + 44, + 1, + 2 + ], + "column": 1 + }, + { + "beat": [ + 45, + 0, + 1 + ], + "column": 3, + "endbeat": [ + 47, + 0, + 1 + ] + }, + { + "beat": [ + 47, + 0, + 1 + ], + "column": 1, + "endbeat": [ + 49, + 0, + 1 + ] + }, + { + "beat": [ + 49, + 0, + 1 + ], + "column": 3 + }, + { + "beat": [ + 49, + 1, + 2 + ], + "column": 0 + }, + { + "beat": [ + 50, + 0, + 1 + ], + "column": 3 + }, + { + "beat": [ + 50, + 1, + 2 + ], + "column": 0 + }, + { + "beat": [ + 51, + 0, + 1 + ], + "column": 3 + }, + { + "beat": [ + 51, + 1, + 2 + ], + "column": 1 + }, + { + "beat": [ + 52, + 0, + 1 + ], + "column": 3 + }, + { + "beat": [ + 52, + 1, + 2 + ], + "column": 1 + }, + { + "beat": [ + 53, + 0, + 1 + ], + "column": 2 + }, + { + "beat": [ + 53, + 1, + 2 + ], + "column": 0 + }, + { + "beat": [ + 54, + 0, + 1 + ], + "column": 2 + }, + { + "beat": [ + 54, + 1, + 2 + ], + "column": 0 + }, + { + "beat": [ + 55, + 0, + 1 + ], + "column": 1 + }, + { + "beat": [ + 55, + 1, + 2 + ], + "column": 3 + }, + { + "beat": [ + 56, + 0, + 1 + ], + "column": 1 + }, + { + "beat": [ + 56, + 1, + 2 + ], + "column": 3 + }, + { + "beat": [ + 57, + 0, + 1 + ], + "column": 0 + }, + { + "beat": [ + 57, + 1, + 2 + ], + "column": 2 + }, + { + "beat": [ + 58, + 0, + 1 + ], + "column": 0 + }, + { + "beat": [ + 58, + 1, + 2 + ], + "column": 2 + }, + { + "beat": [ + 59, + 0, + 1 + ], + "column": 1 + }, + { + "beat": [ + 59, + 1, + 2 + ], + "column": 3 + }, + { + "beat": [ + 60, + 0, + 1 + ], + "column": 1 + }, + { + "beat": [ + 60, + 1, + 2 + ], + "column": 3 + }, + { + "beat": [ + 61, + 0, + 1 + ], + "column": 0 + }, + { + "beat": [ + 61, + 1, + 2 + ], + "column": 3 + }, + { + "beat": [ + 62, + 0, + 1 + ], + "column": 0 + }, + { + "beat": [ + 62, + 1, + 2 + ], + "column": 3 + }, + { + "beat": [ + 63, + 0, + 1 + ], + "column": 1 + }, + { + "beat": [ + 63, + 1, + 2 + ], + "column": 2 + }, + { + "beat": [ + 64, + 0, + 1 + ], + "column": 1 + }, + { + "beat": [ + 64, + 1, + 2 + ], + "column": 2 + }, + { + "beat": [ + 65, + 0, + 1 + ], + "column": 0 + }, + { + "beat": [ + 65, + 1, + 2 + ], + "column": 2 + }, + { + "beat": [ + 66, + 0, + 1 + ], + "column": 0 + }, + { + "beat": [ + 66, + 1, + 2 + ], + "column": 2 + }, + { + "beat": [ + 67, + 0, + 1 + ], + "column": 1 + }, + { + "beat": [ + 67, + 1, + 2 + ], + "column": 3 + }, + { + "beat": [ + 68, + 0, + 1 + ], + "column": 1 + }, + { + "beat": [ + 68, + 1, + 2 + ], + "column": 3 + }, + { + "beat": [ + 69, + 0, + 1 + ], + "column": 0 + }, + { + "beat": [ + 69, + 1, + 2 + ], + "column": 3 + }, + { + "beat": [ + 70, + 0, + 1 + ], + "column": 0 + }, + { + "beat": [ + 70, + 1, + 2 + ], + "column": 3 + }, + { + "beat": [ + 71, + 0, + 1 + ], + "column": 1 + }, + { + "beat": [ + 71, + 1, + 2 + ], + "column": 2 + }, + { + "beat": [ + 72, + 0, + 1 + ], + "column": 1 + }, + { + "beat": [ + 72, + 1, + 2 + ], + "column": 2 + }, + { + "beat": [ + 73, + 0, + 1 + ], + "column": 0 + }, + { + "beat": [ + 73, + 1, + 2 + ], + "column": 3 + }, + { + "beat": [ + 74, + 0, + 1 + ], + "column": 0 + }, + { + "beat": [ + 74, + 1, + 2 + ], + "column": 3 + }, + { + "beat": [ + 75, + 0, + 1 + ], + "column": 0 + }, + { + "beat": [ + 75, + 1, + 2 + ], + "column": 2 + }, + { + "beat": [ + 76, + 0, + 1 + ], + "column": 0 + }, + { + "beat": [ + 76, + 1, + 2 + ], + "column": 2 + }, + { + "beat": [ + 77, + 0, + 1 + ], + "column": 1 + }, + { + "beat": [ + 77, + 1, + 2 + ], + "column": 3 + }, + { + "beat": [ + 78, + 0, + 1 + ], + "column": 1 + }, + { + "beat": [ + 78, + 1, + 2 + ], + "column": 3 + }, + { + "beat": [ + 79, + 0, + 1 + ], + "column": 0 + }, + { + "beat": [ + 79, + 1, + 2 + ], + "column": 2 + }, + { + "beat": [ + 80, + 0, + 1 + ], + "column": 0 + }, + { + "beat": [ + 81, + 0, + 1 + ], + "column": 3 + }, + { + "beat": [ + 81, + 3, + 4 + ], + "column": 1 + }, + { + "beat": [ + 82, + 1, + 2 + ], + "column": 2 + }, + { + "beat": [ + 83, + 1, + 2 + ], + "column": 1 + }, + { + "beat": [ + 84, + 0, + 1 + ], + "column": 3 + }, + { + "beat": [ + 84, + 1, + 2 + ], + "column": 3 + }, + { + "beat": [ + 85, + 0, + 1 + ], + "column": 0 + }, + { + "beat": [ + 85, + 3, + 4 + ], + "column": 1 + }, + { + "beat": [ + 86, + 1, + 2 + ], + "column": 2 + }, + { + "beat": [ + 88, + 1, + 2 + ], + "column": 1 + }, + { + "beat": [ + 89, + 0, + 1 + ], + "column": 3 + }, + { + "beat": [ + 89, + 3, + 4 + ], + "column": 2 + }, + { + "beat": [ + 90, + 1, + 2 + ], + "column": 1 + }, + { + "beat": [ + 91, + 1, + 2 + ], + "column": 3 + }, + { + "beat": [ + 92, + 0, + 1 + ], + "column": 2 + }, + { + "beat": [ + 92, + 1, + 2 + ], + "column": 1 + }, + { + "beat": [ + 93, + 0, + 1 + ], + "column": 0, + "endbeat": [ + 93, + 3, + 4 + ] + }, + { + "beat": [ + 93, + 3, + 4 + ], + "column": 3, + "endbeat": [ + 94, + 1, + 2 + ] + }, + { + "beat": [ + 94, + 1, + 2 + ], + "column": 1, + "endbeat": [ + 96, + 0, + 1 + ] + }, + { + "beat": [ + 96, + 0, + 1 + ], + "column": 3 + }, + { + "beat": [ + 97, + 0, + 1 + ], + "column": 0 + }, + { + "beat": [ + 97, + 3, + 4 + ], + "column": 2 + }, + { + "beat": [ + 98, + 1, + 2 + ], + "column": 1 + }, + { + "beat": [ + 99, + 1, + 2 + ], + "column": 0 + }, + { + "beat": [ + 100, + 0, + 1 + ], + "column": 3 + }, + { + "beat": [ + 100, + 1, + 2 + ], + "column": 3 + }, + { + "beat": [ + 101, + 0, + 1 + ], + "column": 2 + }, + { + "beat": [ + 101, + 3, + 4 + ], + "column": 1 + }, + { + "beat": [ + 102, + 1, + 2 + ], + "column": 2 + }, + { + "beat": [ + 104, + 1, + 2 + ], + "column": 3 + }, + { + "beat": [ + 104, + 3, + 4 + ], + "column": 2 + }, + { + "beat": [ + 105, + 0, + 1 + ], + "column": 1 + }, + { + "beat": [ + 105, + 1, + 2 + ], + "column": 3 + }, + { + "beat": [ + 106, + 0, + 1 + ], + "column": 0 + }, + { + "beat": [ + 106, + 1, + 2 + ], + "column": 2 + }, + { + "beat": [ + 107, + 1, + 2 + ], + "column": 0 + }, + { + "beat": [ + 108, + 0, + 1 + ], + "column": 1 + }, + { + "beat": [ + 108, + 1, + 2 + ], + "column": 2 + }, + { + "beat": [ + 109, + 0, + 1 + ], + "column": 3 + }, + { + "beat": [ + 109, + 1, + 2 + ], + "column": 1 + }, + { + "beat": [ + 110, + 0, + 1 + ], + "column": 2 + }, + { + "beat": [ + 110, + 1, + 2 + ], + "column": 0 + }, + { + "beat": [ + 111, + 0, + 1 + ], + "column": 2 + }, + { + "beat": [ + 111, + 1, + 2 + ], + "column": 1 + }, + { + "beat": [ + 112, + 0, + 1 + ], + "column": 3 + }, + { + "beat": [ + 112, + 1, + 2 + ], + "column": 0 + }, + { + "beat": [ + 113, + 0, + 1 + ], + "column": 2 + }, + { + "beat": [ + 114, + 0, + 1 + ], + "column": 0 + }, + { + "beat": [ + 115, + 0, + 1 + ], + "column": 1 + }, + { + "beat": [ + 115, + 1, + 2 + ], + "column": 3 + }, + { + "beat": [ + 116, + 1, + 2 + ], + "column": 1 + }, + { + "beat": [ + 117, + 0, + 1 + ], + "column": 0, + "endbeat": [ + 120, + 0, + 1 + ] + }, + { + "beat": [ + 121, + 0, + 1 + ], + "column": 3 + }, + { + "beat": [ + 122, + 0, + 1 + ], + "column": 1 + }, + { + "beat": [ + 123, + 0, + 1 + ], + "column": 0 + }, + { + "beat": [ + 123, + 1, + 2 + ], + "column": 2 + }, + { + "beat": [ + 124, + 1, + 2 + ], + "column": 1 + }, + { + "beat": [ + 125, + 0, + 1 + ], + "column": 3, + "endbeat": [ + 127, + 0, + 1 + ] + }, + { + "beat": [ + 127, + 0, + 1 + ], + "column": 1, + "endbeat": [ + 129, + 0, + 1 + ] + }, + { + "beat": [ + 129, + 0, + 1 + ], + "column": 3 + }, + { + "beat": [ + 130, + 0, + 1 + ], + "column": 1 + }, + { + "beat": [ + 131, + 0, + 1 + ], + "column": 0 + }, + { + "beat": [ + 131, + 1, + 2 + ], + "column": 2 + }, + { + "beat": [ + 132, + 1, + 2 + ], + "column": 0 + }, + { + "beat": [ + 133, + 0, + 1 + ], + "column": 2, + "endbeat": [ + 136, + 0, + 1 + ] + }, + { + "beat": [ + 137, + 0, + 1 + ], + "column": 3 + }, + { + "beat": [ + 138, + 0, + 1 + ], + "column": 1 + }, + { + "beat": [ + 139, + 0, + 1 + ], + "column": 0 + }, + { + "beat": [ + 139, + 1, + 2 + ], + "column": 3 + }, + { + "beat": [ + 140, + 1, + 2 + ], + "column": 2 + }, + { + "beat": [ + 141, + 0, + 1 + ], + "column": 0, + "endbeat": [ + 143, + 0, + 1 + ] + }, + { + "beat": [ + 143, + 0, + 1 + ], + "column": 2, + "endbeat": [ + 145, + 0, + 1 + ] + }, + { + "beat": [ + 145, + 0, + 1 + ], + "column": 0 + }, + { + "beat": [ + 146, + 0, + 1 + ], + "column": 2 + }, + { + "beat": [ + 147, + 0, + 1 + ], + "column": 1 + }, + { + "beat": [ + 147, + 1, + 2 + ], + "column": 3 + }, + { + "beat": [ + 148, + 1, + 2 + ], + "column": 0 + }, + { + "beat": [ + 149, + 0, + 1 + ], + "column": 2, + "endbeat": [ + 152, + 0, + 1 + ] + }, + { + "beat": [ + 153, + 0, + 1 + ], + "column": 3 + }, + { + "beat": [ + 154, + 0, + 1 + ], + "column": 1 + }, + { + "beat": [ + 155, + 0, + 1 + ], + "column": 0 + }, + { + "beat": [ + 155, + 1, + 2 + ], + "column": 2 + }, + { + "beat": [ + 156, + 1, + 2 + ], + "column": 0 + }, + { + "beat": [ + 157, + 0, + 1 + ], + "column": 3, + "endbeat": [ + 159, + 0, + 1 + ] + }, + { + "beat": [ + 159, + 0, + 1 + ], + "column": 1, + "endbeat": [ + 161, + 0, + 1 + ] + }, + { + "beat": [ + 161, + 0, + 1 + ], + "column": 3 + }, + { + "beat": [ + 162, + 0, + 1 + ], + "column": 1 + }, + { + "beat": [ + 163, + 0, + 1 + ], + "column": 0 + }, + { + "beat": [ + 163, + 1, + 2 + ], + "column": 2 + }, + { + "beat": [ + 164, + 1, + 2 + ], + "column": 1 + }, + { + "beat": [ + 165, + 0, + 1 + ], + "column": 3, + "endbeat": [ + 168, + 0, + 1 + ] + }, + { + "beat": [ + 169, + 0, + 1 + ], + "column": 3 + }, + { + "beat": [ + 170, + 0, + 1 + ], + "column": 1 + }, + { + "beat": [ + 171, + 0, + 1 + ], + "column": 0 + }, + { + "beat": [ + 171, + 1, + 2 + ], + "column": 3 + }, + { + "beat": [ + 172, + 1, + 2 + ], + "column": 1 + }, + { + "beat": [ + 173, + 0, + 1 + ], + "column": 3, + "endbeat": [ + 177, + 0, + 1 + ] + }, + { + "beat": [ + 175, + 0, + 1 + ], + "column": 0, + "endbeat": [ + 177, + 0, + 1 + ] + } + ] +} \ No newline at end of file diff --git a/converter/fx4K/DREAM b/converter/fx4K/DREAM new file mode 100644 index 0000000..6fc3391 Binary files /dev/null and b/converter/fx4K/DREAM differ diff --git a/release/FX4K-SH3.G1A b/release/FX4K-SH3.G1A new file mode 100644 index 0000000..03fb2ab Binary files /dev/null and b/release/FX4K-SH3.G1A differ diff --git a/release/FX4K-SH4.G1A b/release/FX4K-SH4.G1A new file mode 100644 index 0000000..2a0ef8f Binary files /dev/null and b/release/FX4K-SH4.G1A differ