На счёт его коммита: теперь он исправил то, что было у меня. LoopID для VGM я исправил неверно, начальное значение там 0xFF и оно устанавливается каждый трек заново. Из нового: FMWrite(CurBnk & 0x04, 0x22, ChnPat[0]); -> FMWrite(CurBnk & ~0x03, 0x22, ChnPat[0]);, значит больше каких-то банков будет поддерживаться. Про создание папки dumps вы знаете.
Он забыл добавить заголовочные файлы #include <direct.h> в main.c для _mkdir() и #include <string.h> в GemsPlay.c для memset(). Всё компилируется, но компилятор пишет предупреждения. В C++ наверно была бы ошибка, потому что в C функция без объявления по умолчанию int func() и допускается передавать аргументы в функцию с пустыми параметрами, из-за этого для C приходиться писать void func1(void), а не void func1(), чтобы компилятор сообщил об ошибке, если случайно переданы аргументы.
Я обновил код и сборку. Код практически совпадает, за исключением 2 грязных исправлений и второй проверки на GEMS 2.8, которая неизвестно даёт ли ложноположительный результат (тогда нужно убрать обязательно).
The problem with Comix Zone is unfortunately an emulation related. That particular instrument requires the YM2612 to be emulated at its native sample rate, 53267 Hz.
However due to the way GEMSPlay is written, it can only be emulated at 44100 Hz. (This is also what Gens usually does.)
Thus, the bug won't go away unless GEMSPlay gets a major rewrite regarding audio processing.
Это похоже не так, раз я одним делением исправил

Точнее, чтобы переписать код под эмуляцию от MAME потребуется
major rewrite. Этот коммит он не видел, очевидно.
Так и думал, что связано с частотой (53267 Гц), потому что в MAME rate передаётся как clock() / 72, а здесь 44100. Где clock() должен быть 7670454 (частота YM2612 NTSC), только вот это 7670454 / 72 == 106534, а 7670454 / 144 == 53267. Магическое число 144 встречалось в fm2612.c, как раз 144/32 == 4.5 (я исправил 4.4 на 4.5 в коде), только я не знаю почему 32.
Можете ему написать, чтобы посмотрел моё исправление в fm2612.c:
OPN->fn_max = (UINT32)( (double)0x20000 * freqbase * (1<<(FREQ_SH-10)) );на
OPN->fn_max = (UINT32)( (double)0x20000 * freqbase * (1<<(FREQ_SH-10)) / 4.5);В Genesis Plus GX код YM2612 основан на MAME, но у GP GX текущий код чище, без множителей частоты, так что наверно в другом месте идёт преобразование в конечную частоту. Но я мало разбирался и всё равно не пойму.
Bit 7 from the value for register $27 will be kept for now, because GEMSPlay aims at an accurate reproduction of the original GEMS sound engine and this bug is present in the original as well.
Поэтому я писал, что это "грязное исправление".