Автор Тема: конвертация аудио сэмплов и планы на треккер  (Прочитано 5130 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5090
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #60 : 03 Апрель 2020, 21:17:15 »
а как можно в gemsplay номер трека указать?
В консольной стрелки вверх и вниз.

Исправил остановку. В ASM было правильно, а здесь в CLIPLOOP() сначала снимались флаги VTblPtr[VTBLFLAGS], а уже после проверялось на "fm - digital mode? [BIT #5]". В ASM в регистр сохранялось оригинальное значение флагов.
Заметил баг, который был в оригинале. Если играет сэмпл (который мы тестировали здесь) в полном треке The Jester, то остановка не останавливает счётчик времени, но звука нет. Это уже баг GEMSPlay, а не драйвера GEMS. В CheckForSongEnd():
for (CurChn = 0; CurChn < 4; CurChn ++)
{
if (pdata.psgenv[CurChn])
ChnMask ++;
}
Здесь проверяется регистр UINT8 psgenv[4]; ([0021] 24 envelope mode 0 = off, 1 = attack, 2 = decay, 3 = sustain, 4) и он почему-то равен 2 в последнем канале, что не даёт остановку (ChnMask должен быть = 0).
В CLIPLOOP() psgcom устанавливается в 4 ([0009]  0 command 1 = key on, 2 = key off, 4 = stop snd), как я понял, это значит что канал отключен(?). Если дополнить проверку - if (pdata.psgenv[CurChn] && pdata.psgcom[CurChn] != 4), то будет останавливаться, потому что после ручной остановки у каналов стоит 4 благодаря CLIPLOOP().
Я только предполагаю, что это не должно что-то испортить (автоматическое переключение трека, например). Пожалуй оставлю.
Протестируйте остановку и я, наконец, сделаю коммит. :)

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2536
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #61 : 03 Апрель 2020, 21:28:15 »
ааааааааааааа :) останавливает проигрывание :) колбаса!

по поводу PSG - вот тут ничего не скажу. я только примерную схему как там построение громкости, согласно инструменту, знаю. а вот тонкости с флагами...


по идее прекращение звучание должно происходить когда согласно инструкциям - громкость достигла ноля.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5090
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #62 : 03 Апрель 2020, 23:12:24 »
На счёт переключения треков.
В gemsplay_play() я ставлю PreparseGemsSeq(0); PlaySong(0);, т. е. SongNo = 0. Я оставил значение по умолчанию у FollowTrack = true (Follow Sequences), думал, что автоматическое переключение треков, но это только влияет на номер выбранного трека в консоли. Когда трек хочет переключиться, то переключается.
AutoProgress = false по умолчанию, отвечает за переключение Song, симуляция переключения курсора и запуска воспроизведения, как если бы нажимал человек. Конец трека определяется как раз по CheckForSongEnd(), которую я изменил.
В этой функции ещё неверный код установки битов: UINT8 ChnMask, но биты ставятся от 0 до 16, но это похоже совсем не важно.
согласно инструкциям - громкость достигла ноля.
Дело в том, что мы вручную нажимаем/вызываем стоп и здесь происходит запись в FIFO cmdstopall (0x16), но движок ничего не делает с envelope, кроме отключения канала. А CheckForSongEnd() для GEMSPlay, пытается в нескольких местах определить, что конец трека. Поэтому такая проверка необходима. Если тишина, это ещё не значит, что трек закончился. Я даже не знаю когда GEMS треки останавливаются, наверно только от своих команд.

Ещё интересно, что The Jester у VGM версии имеет продолжительность 5:09, но в GEMPlay не остановилось. Наверно без явной команды будет бесконечный повтор.

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2536
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #63 : 03 Апрель 2020, 23:24:17 »
VGM вручную сводят. GEMS, если там есть значение loop установлено как $7F - 127 - должно играть бесконечно. поэтому GEMSPlay не останавливается. в VGM же просто обрезали этот момент... или может сделали плавный fade out - затухание громкости для красивости. VGM не четкое копирование движка, а дамп значений регистров чипов во времени. да, там есть loop - но в GEMS все хитрее. если в VGM loop может быть одна штука для всей песни в целом, то GEMS может иметь различные loop для каждой своей дорожки. и мало того - еще и loop внутри loop. поэтому файлы драйвера весят совсем мало, а VGM 300 килобайт к примеру. посему XGM может и хорошо, что ничего конвертировать не надо - сразу бери готовые VGM и они подойдут почти без изменений - но размер... 100-150 килобайт на песню - многовато :)

Добавлено позже:
переключение треков не нужно. я просто думал таким образом можно отключать бесконечный loop для сэмпла, когда этот loop там используется. в смысле стоп нажал и такой сэмпл прекратил играть. в предыдущей версии оно продолжало играть после кнопки стоп. но раз оказалось проблема была в другом и она решена - тогда не нужно :)

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5090
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #64 : 04 Апрель 2020, 00:43:53 »
100-150 килобайт на песню - многовато
"17 - The Jester.vgm" - 1,95 МБ, который я скачал :)
переключение треков не нужно
Так и подумал, просто для информации.

Обновил на github код и добавил сборку.

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2536
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #65 : 04 Апрель 2020, 00:45:32 »
это видимо сэмплы - поэтому размер такой большой. их не посчитал :)

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2536
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #66 : 05 Апрель 2020, 22:59:35 »
я окончательно разуверился в святости ValleyBell'a :)

итак - Comix Zone. 003 трек - там есть момент цик цик цик в самом начале. звук не правильный. точно так-же играет в эмуляторе Gens, но это не верно. верно как во Fusion. дело в том, что GEMS должен прочитать включен ли Ch3mode в инструменте - специальный режим для 3 канала, когда частота ноты выставляется не только в двух регистрах, но и еще в дополнительных. как пример звук соник танка в Дюне.

так вот - в случае если у инструмента включен этот флаг Ch3mode - GEMS должна посылать эту дорожку в 3 канал. но там по всей видимости ошибка и шлет в первый свободный, как обычно GEMS делает динамическое свое перераспределение. но там должно быть четкое правило слать именно в 3 в этом случае. потому что никакой другой канал не умеет играть этот специальный режим.

начал вырезать и чот фигня какая-то... когда вся песня играет - нет этого цик цик цик. когда только 1 дорожка - цикает... скатина. по идее не должна будучи одна. ведь 3 канал в этом случае свободен.

Добавлено позже:
однако этот одиночный цик цик цик играет в 3 канале как и положено... но почему его не слышно когда играет весь трек? тупо не хватает места и поэтому он не проигрывается?

так. дело видимо в громкости. она в треке должна быть 15 - довольно тихая. однако при проигрывании в библиотеке по видимому не слушается этой самой громкости. громкость Total Level. управляется через регистры. значение из инструмента в 4 операторах + значение volume из мелодии.

Добавлено позже:
так. по всей видимости точно громкость. ром собирается изначально правильно. моя собиралка могла содержать ошибку, но нет. байт в байт одинаково собирает. значит дело точно в библиотеке.

громкость: три байта. через макрос.
$72 - флаг что это макрос.
$05 - volume
$xx - значение

так-же есть еще mastervolume - типа глобальная громкость для всех дорожек. не распространяется на PSG и на сэмплы. но FM можно регулировать.
$72 - флаг что это макрос
$04 - mastervolume
$xx - значение


в итоге громкость, в зависимости от алгоритма (параметр в инструменте) должна производить для от 1 до 4 операторов - подобное сложение:
громкость TL из оператора инструмента + volume + mastervolume. где-то в этом коде ошибка. и этот цик цик цик играет слишком громко.

Добавлено позже:
насколько я понимаю это глобальная переменная громкости:
static UINT8 MASTERATN;   // [15CF] master attenuation is 7 frac bits (0 = full volume)
то есть mastervolume

case 114: // 114 = seekrit codes [Is this supposed to be "secret codes"?]
{
UINT8 CurCode; // Register D
UINT8 CurVal; // Register E

CurCode = GETSBYTE(ChnCCB, CHBUFPTR); // get code
CurVal = GETSBYTE(ChnCCB, CHBUFPTR); // get value
switch(CurCode) // dispatch on code
{
case 4:
//seqatten:
MASTERATN = CurVal;
return 0x01; // [jp seqdelay]
case 5:
//seqchatten:
ChnCCB[CCBATN] = CurVal;
return 0x01; // [jp seqdelay]
чтение из кода мелодии обычной volume - для конкретного канала и общая mastervolume

внутри функции gems_loop тоже есть. это я не понимаю что и откуда берется. но предположим все верно. уж тем более что в том треке все равно нет команды для всех дорожек mastervolume. только volume для отдельной дорожки.
case 32:
//cmdmasteratn:
MASTERATN = GETCBYTE();
break;

функция NOTEON
noteon.atten = MASTERATN + ChnCCB[CCBATN]; // sum channel and master attenuations, limit to 127
if (noteon.atten >= 0x80)
noteon.atten = 127;
тут по видимому сложение мастерволум и обычной волум в дорожке, и проерка на превышение лимита значения громкости. 127 самое большое что может быть (то есть тихо, вовсе не будет слышно)

и дальше я не понимаю что происходит в функции WRITEFM
NoteAtt = ((CurData << 1) * noteon.atten) >> 8;понятно что здесь видимо происходит установка инструмента. но где определение параметра Algoritm инструмента? согласно алгоритму должно происходить определение в каких именно операторах следует производить изменение параметра Total Level - TL.

то есть должно быть что-то типа
Select Algorithm
  Case 0 to 3
    ; изменяется только 4 оператор TL
  Case 4
    ; изменяется 2 и 4 (но видимо из-за порядка операторов 1, 3, 2, 4 - видимо 3 и 4)
  Case 5, 6
    ; изменяется 2, 3, 4
  Case 7
    ; изменяются все 4 оператора
Endselect


Добавлено позже:
алгоритм в файле инструмента (39 байт. начиная с единицы, не с нуля. то есть первый байт - это 1, а не 0):
        Case 1 ; |??????tt| - type
        Case 2 ; |????ovvv| - LFO on, LFO value
        Case 3 ; |mm??????| - Channel 3 mode
        Case 4 ; |??fffaaa| - Feedback, Algorithm
        Case 5 ; |lraa?fff| - Left/Right, AMS, FMS
         
        ; дальше идут 4 оператора
        ; оператор 1 
        Case 6 ; |?dddmmmm| - Detune, Multiply
        Case 7 ; |?ttttttt| - TLevel
        Case 8 ; |rr?aaaaa| - Rate Scale, Attack
        Case 9 ; |a??ddddd| - AM, Decay
        Case 10 ; |???sssss| - Sustain
        Case 11 ; |ssssrrrr| - Sustain Level, Release
         
        ; тут я не уверен. наверное оператор 3
        Case 12 ; |?dddmmmm| - Detune, Multiply
        Case 13 ; |?ttttttt| - TLevel
        Case 14 ; |rr?aaaaa| - Rate Scale, Attack
        Case 15 ; |a??ddddd| - AM, Decay
        Case 16 ; |???sssss| - Sustain
        Case 17 ; |ssssrrrr| - Sustain Level, Release
         
        ; если предыдущий 3, то этот 2. но может порядок и не перепутан. и этот 3 на самом деле. 
        Case 18 ; |?dddmmmm| - Detune, Multiply
        Case 19 ; |?ttttttt| - TLevel
        Case 20 ; |rr?aaaaa| - Rate Scale, Attack
        Case 21 ; |a??ddddd| - AM, Decay
        Case 22 ; |???sssss| - Sustain
        Case 23 ; |ssssrrrr| - Sustain Level, Release
         
        ; оператор 4
        Case 24 ; |?dddmmmm| - Detune, Multiply
        Case 25 ; |?ttttttt| - TLevel
        Case 26 ; |rr?aaaaa| - Rate Scale, Attack
        Case 27 ; |a??ddddd| - AM, Decay
        Case 28 ; |???sssss| - Sustain
        Case 29 ; |ssssrrrr| - Sustain Level, Release
         
        ; там дальше должны идти
        ; 4 двухбайтовых параметры дополнительных частотв для регистров в случае работы Ch3mode.
         
        Case 38 ; параметр KeyOn - стартует звучание ноты. содержит в себе флаги операторов, какие будут включены

вот согласно алгоритму должны изменятся соответствующие параметры TLevel.
« Последнее редактирование: 06 Апрель 2020, 02:19:17 от SeregaZ »

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5090
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #67 : 06 Апрель 2020, 08:21:47 »
Нашёл такие заметки: https://github.com/ekeeke/Genesis-Plus-GX/blob/master/HISTORY.txt
Цитата
Genesis Plus GX release 080301 (Eke-Eke)
* added preliminary support of undocumented YM2612 bug: fixes soundtracks of Shaq Fu, Spiderman, Comix Zone, Ariel and some others
Genesis Plus GX release 080716 (Eke-Eke)
* improved YM2612 emulation (credits to Nemesis for his tests on real hardware):
  .implemented phase overflow emulation: improved fix for special music instrument used in Comix Zone, Flashback, Ariel, Shaq Fu...
И в fm2612.c написано:
Цитата
**  - implemented Detune overflow (Ariel, Comix Zone, Shaq Fu, Spiderman & many other games using GEMS sound engine)
В fm2612.c переменная fn_max используется при "phase overflow" (наверно "Detune overflow" тоже самое), если частота отрицательная, то прибавляется fn_max.
Задаётся она так:
OPN->fn_max = (UINT32)( (double)0x20000 * freqbase * (1<<(FREQ_SH-10)) );Я смог подобрать делитель fn_max, чтобы звучало похоже (число между 4.0 и 4.7), я остановился на 4.4:
OPN->fn_max = (UINT32)( (double)0x20000 * freqbase * (1<<(FREQ_SH-10)) / 4.4);freqbase - зависит от rate и clock и её нельзя изменить, чтобы всё не испортить. Код достаточно похож на последний код у MAME (https://github.com/mamedev/mame/blob/master/src/devices/sound/fm2612.cpp), так что можно сделать вывод, что именно в GemsPlay.c этого overflow не происходит.

Прикрепил сборку с грязным фиксом, описанном выше.

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2536
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #68 : 06 Апрель 2020, 08:32:15 »
то есть дело в ядре, а не самом коде драйвера? каким образом можно начать vgm логирование? в оригинальном коде в смысле. тыркаю v - пишет vgm включено, но после пишет в консоли сообщение что не могу открыть вгм файл чтоль... я к чему - если записать что именно там происходит, то есть сравнить показатели громкости и точно удостоверится что дело не в них.

Добавлено позже:
мне нравится :) нет этого вызывающего звука в начале.

и я там смотрел гитхаб ВаллейБела - он два дня назад что-то правил. видимо с тем проигрыванием сэмпла фиксил, а на форуме не написал ничо :(

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5090
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #69 : 06 Апрель 2020, 09:13:14 »
то есть дело в ядре, а не самом коде драйвера?
Не знаю, код эмуляции YM2612 выглядит очень похожим на тот, что в MAME, а он нормально эмулирует и собственно поддержка overflow есть, но вот переписанный драйвер (GEMSPlay) наверно что-то не учёл.
Протестировал Ariel - The Little Mermaid, первый трек (Level 1, The Reef) там тоже исправился.
каким образом можно начать vgm логирование?
Не знаю, может оно не работает. Там, кстати, есть код записи в wav, но нужно перекомпилировать.
и я там смотрел гитхаб ВаллейБела - он два дня назад что-то правил
Жаль, что он раньше не добавил репозиторий (https://github.com/ValleyBell/GEMSPlay/), иначе сделал бы форк. Он только 4 апреля добавил (https://api.github.com/repos/ValleyBell/GEMSPlay - created_at), но коммиты старые остались. Он поправил описание, его фиксы у меня есть, кроме INI, нужно будет сравнить. Исправления сэмплов у него нет. Я делал исправления для устранения предупреждений современного компилятора и некоторые другие, переносил файлы. Теперь можно запутаться.
Напишите ему, чтобы посмотрел этот коммит: https://github.com/infval/GEMSPlay/commit/5666573abce770956b3a7a804a69d221d1276598, для исправления. Мне лень делать pull request.
И можете написать про phase overflow и что я исправил некрасиво так в fm2612.c:
OPN->fn_max = (UINT32)( (double)0x20000 * freqbase * (1<<(FREQ_SH-10)) / 4.4);

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2536
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #70 : 06 Апрель 2020, 09:50:17 »
ну тогда фиг с ним с этим VGM. wav не пойдет. предполагалось что VGM файл я распарсю и поймаю где этот регистр с громкостью, точнее все 4 регистра для 3 канала и посмотрю их значения. соответствуют ли они формуле Total Level + Mastervolume + volume. и соответствуют ли изменения алгоритму инструмента. так смотрел файл VGM из Fusion. там вроде все в порядке. в Gens писать в VGM не умеет. там GYM - а он не такой точный как VGM. но в обоих случаях это как и положено был 3 канал. то есть ошибки с каналом нет. а вот получить дамп VGM из библиотеки не получилось, чтобы сравнить с ними. но меня все-таки волнует один момент: во всех моих ковыряниях показывало что нота одна и та-же. но в текстовом коде мелодии явно указано, что там две ноты:
Цитата
duration 3
 delay 6
 note $37
 note $35
 note $37
 note $35
 note $37
 note $35
 note $37

парсинг же мне выдает одну. причем откуда-то еще команда питч вылазить... хотя это я писал этот код в попытке запилить конвертер из VGM в GEMS - не исключено что напортачил, а портачить это для меня нормально... но все-таки странно почему нота одна и та-же. нет по переменного $35 - $37.


надо будет еще внимательно поковырять. видимо где-то я все-таки ошибся.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5090
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #71 : 06 Апрель 2020, 19:23:03 »
SeregaZ, про VGM запись. Нужно создать папку dumps рядом с GEMSPlay.exe. Воспроизводится нормально. Но в консоли написало один раз в треке Comix Zone:
Unknown event 75 on track 1
Unknown event 7C on track 4
Unknown event 7F on track 7
Unknown event 7D on track A
--------
Кстати, VB нужно ещё написать про UINT8 LoopID = 0; в void PreparseGemsSeq(UINT8 SongNo). Переменная LoopID не инициализируется, но используется.
--------
В PreparseGemsSeq() из loader.c как раз и выводится "Unknown event", обработки этих команд просто нет.
--------
В Nightmare Circus - The Jester много ошибок и loop у сэмплов неправильный.
« Последнее редактирование: 06 Апрель 2020, 20:10:43 от Sharpnull »

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2536
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #72 : 06 Апрель 2020, 22:16:02 »
по поводу Comix Zone - там используется переделанный GEMS драйвер. и видимо этим командам что-то да прикручено. я к сожалению не силен в дизасмах. в оригинальном драйвере: http://elektropage.ru/publ/o_prekrasnom/articles/gems_sound_driver/2-1-0-71 Величины с $73 до $7F не являются командами и драйвером не используются!

по поводу лупов для цирка вроде бы ничего такого незаметил... пойду поем и посмотрю :)

видимо надо сделать ремарку: в моем случае банки игр "распаковываются" в отдельные файлы мелодий, инструментов, модуляций и сэмплов. это делает r57shell'овский комбайн сплиттер. по идее он заточен под стандартный гемс. возможно для Comix Zone там просто игнорируются эти команды и поэтому ошибок я не заметил при распаковке. второй момент - сами GEMS банки бывают двух видов: 2 байтные и 3 байтные офсеты на сэмплы. возможно GEMSPlay не может определить какие именно там используются и скажем они были 3 байтные, а он пытается 2 байтами прочитать и посему сыплется. и после уже все это дело проигрывается по отдельным папкам на жестком диске, то есть редактор читает эту папку, все файлы в ней, выстраивает свои GEMS банки на 1 мелодию и это дело отправляется в библиотеку.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5090
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #73 : 06 Апрель 2020, 22:54:25 »
возможно GEMSPlay не может определить какие именно там используются и скажем они были 3 байтные, а он пытается 2 байтами прочитать и посему сыплется.
Да, проверил. Он не смог определить в ваших вырезках, поэтому там и пишется Warning! GEMS Version Autodetection failed! (режим 2.8 не срабатывает и версия с 2 байтами по умолчанию), а когда запускаешь полный рип от того чувака, то ошибок нет в Comix Zone. Вот в Nightmare Circus (Beta) определить не получилось из того архива, но даже когда я установил режим 2.8, VGM хоть и без ошибок, но loop сэмплов остаётся неправильным.
---------
Определение в DetectSeqType() из loader.c.

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2536
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #74 : 06 Апрель 2020, 23:02:43 »
опля... а в библиотеке как? тоже автоопределение стоит? по идее надо чтоб трехбайтовые всегда были. так как это не оригинальные банки, а распакованные и собранные по новой. собираются по трехбайтовой схеме.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5090
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #75 : 06 Апрель 2020, 23:42:04 »
SeregaZ, да, но сейчас посмотрел внимательнее, всё хитрее. Сначала попытка определить и в глобальную Gems28Mode записывает значение (пишется Warning, если не получилось), которое используется в VGM дампе. Но в STARTSEQ есть дополнительная проверка:
UINT8 stseqx[49]; // [0BBD] 33 byte scratch area for starting a sequence
...
DoGems28 = Gems28Mode;
if (stseqx[0] > 1) // [extra code to detect GEMS 2.8]
{
if (stseqx[3] <= 1 && stseqx[6] <= 1)
DoGems28 = 0x01;
}
Т. е. если даже определить не получилось как 2.8, есть возможность определить 2.8. Например, вырезанный Comix Zone определился как 2.8. Если бы эта проверка не сработала, то вообще была бы чушь и "Invalid command 126 found on Channel 10!".
По-хорошему, нужно было бы это значение записывать в глобальную Gems28Mode, чтобы VGM не ломался. Проверка DetectSeqType() запускается один раз на весь банк, если определился как 2 байтов, а встретил песню с 3 байтами (2.8), то ошибки не будет, наоборот уже не будет (банк 3 байта, а песня 2 байт). Не знаю, всегда ли будет срабатывать код в STARTSEQ, если всегда, то проблем быть не должно.

Стоит ли добавлять в библиотеку опцию с форсированием - даже не знаю.

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2536
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #76 : 06 Апрель 2020, 23:51:15 »
ну пока-что ошибок не встречалось. все тыщу песен и спецэффектов конечно не проверял. теперь можно за трекер садится и пилить потихоньку :)

Добавлено позже:
эх... опять вылезло :) тарахтение какое-то добавляется. Nightmare Circus трек номер 019, 020. начало проигрывает нормально - а потом жужжание включается. в роме проигрывается нормально. (чтобы собрать в роме - следует в локальном списке выделить 019, а в списке песен в игре - самую первую строчку My\000\000.cfg и нажать кнопку >> произойдет перекидывание в тестовой ром мелодии. после правой кнопкой мышки на этом первом пункте и нажать собрать тестовой ром. при условии что путь до эмулятора был указан - откроется эмулятор с этим звуком.)

это может быть как раз из-за трехбайтовой системы? просто ром то имеет 2.8 версию драйвера и следовательно играет верно. а библиотека сначала пытается определить и потом запускает. может быть что тут все-таки на 2 байта переключило? ну и вобще странно как-то. в этой мелодии, то есть спецэффекте, есть модуляция, но модуляция по сути заглушка там 00 00 00. следовательно модуляция никак не должна влиять на звук - ведь там нули... но если её отрубить, то звук кардинально меняется. это для меня разрыв шаблона :) это видимо правильно что оно так играет, но в мое понимание логики не укладывается.

Добавлено позже:
после собрания рома и запуске в эмуляторе - можно опять таки правой кнопкой на этом пункте My\000\000.cfg - открыть папку - перекинет в эту тестовую папку рома, в ней поднятся вверх по папкам до папки gemstest - в ней будут лежать собранные банки, которые можно в GEMSPlay тестировать. это заведомо верно собранные банки шеловским комбайном. то есть точно ошибки нет. мои же, которые может быть кривые - собираются в памяти. дамп не делается, но тут и правильные банки GEMSPlay некорректно завершает проигрывание. после останова счетчика проигрывания - это жужжание включается, а вот при проигрывании рома в эмуляторе - такого нет.

Добавлено позже:
в VGM дамп это жужжание не попадает. видимо потому что счетчик проигрывания заканчивается раньше жужжания и следовательно дальше дамп просто не пишется.
« Последнее редактирование: 07 Апрель 2020, 03:00:32 от SeregaZ »

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2536
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #77 : 08 Апрель 2020, 01:12:41 »
по тарахтению - по всей видимости это проблема Ch3mode. но и с самим инструментом там тоже что-то не все в порядке. как-то он не так читает... пойду еще поковыряю.

Добавлено позже:
итак. в этих треках в инструментах байт, в котором бит включения Ch3mode имеет значение $FF - то есть там включено все на свете.


а вот что можно слать в этот регистр:
https://www.smspower.org/maxim/Documents/YM2612#reg27

то есть варианты когда один 7 бит или 6 и 7 - это illegal - не правильные значения.

нельзя ли чтоб dll отсекала 7 бит? а я пока  пойду еще проверю может другие биты тоже там будут вызывать это тарахтение...



Добавлено позже:
ну вроде да, остальные биты не влияют на звучание и тарахтения нет. нужно отсечение 7 бита для этого значения.
« Последнее редактирование: 08 Апрель 2020, 01:45:29 от SeregaZ »

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5090
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #78 : 08 Апрель 2020, 05:02:35 »
модуляция по сути заглушка там 00 00 00. следовательно модуляция никак не должна влиять на звук - ведь там нули... но если её отрубить, то звук кардинально меняется. это для меня разрыв шаблона
Про это не знаю.
нельзя ли чтоб dll отсекала 7 бит?
Снимаю 7-й бит здесь:
//noteonfm3:
ChnPat = CHPATPTR + 1; // patch pointer + 1 (past type byte)
if (noteon.voice == 2) // channel 3 ?
{
ChnPat[1] &= 0x7F; // <<< Добавил >>>
Ch3ModeReg = ChnPat[1] | 0x15; // yes - add CH3 mode bits to DACME's reset cmd
FMWrgl(0x27, ChnPat[1] | 0x05); // KEEP TIMER A ENABLED AND RUNNING, but not reset
}
Там есть другие места где используется этот байт, вроде бы бит там не должен влиять, но если найти загрузку patch буфера, то можно всегда снимать 7-й бит. Интересно, что в эмуляции YM2612 похоже проверяются оба бита, как-то странно там.

Про Gems 2.8. В этих двух треках 019 и 020 не определяется как 3 байта совсем, на слух это не заметно. Значит не всегда срабатывает, возможно позже добавлю флаг в gemsplay_init(). Добавил сборку в которой, если не получилось определить в первой проверке, то ставится режим 2.8. Для теста.

Оставил деление на 4.4 для Comix Zone, но на GitHub я так и не добавил это исправление.

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2536
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #79 : 08 Апрель 2020, 05:26:32 »
я так понимаю мне второй вариант из архива нужен? там где gems 2.8 написано? его прикрутил к редактору - все замечательно и это тарахтение пропало :) надеюсь это точно последнее недразумение было. ValleyBell ничего так и не ответил. сейчас и вовсе на их сайт не пускает. или забанили за то что достал :) или просто висит.

Добавлено позже:
а нет, чото он правил. смотрю на гитхабе какие-то обновки.
« Последнее редактирование: 08 Апрель 2020, 05:35:08 от SeregaZ »

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5090
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #80 : 08 Апрель 2020, 05:40:37 »
я так понимаю мне второй вариант из архива нужен?
Да.
Забыл сказать, что это исправление с битами тоже "неправильное". Если движок GEMS пропускает 0xFF в железо, в нашем случае в эмуляцию звука, то так и должно быть и значит ошибка где-то ещё.

Добавлено позже:
а нет, чото он правил. смотрю на гитхабе какие-то обновки.
Да... Теперь нет второй проверки на Gems 2.8, но изменилась первая. Число 0x200000 теперь стало 0x80000 как в ASM. Jump для VGM.
Сэмплы исправил, увеличил размеры переменных, но не добавил смещение указателя DstAddr из-за которого был треск.
Исправил UINT16 ChnMask; о котором я говорил, но он всё равно не влиял.
И ещё есть новые фиксы.

Придётся проверять.

Добавлено позже:
Так. Он наверно не исправил, потому сам не проверил.
* DstAddr += SmplLeft; не добавил, без которого треск, мы "арию" в Nightmare Circus - The Jester отдельно слышали.
* UINT8 LoopID = 0; из loader.c не исправлен (для VGM).
* Зря он убрал вторую проверку:
DoGems28 = Gems28Mode;
if (stseqx[0] > 1) // [extra code to detect GEMS 2.8]
{
if (stseqx[3] <= 1 && stseqx[6] <= 1)
DoGems28 = 0x01;
}
В кривом (наверно) банке Nightmare Circus теперь все треки неправильные, потому что первая проверка срабатывает один раз и она не сработала, но дополнение к ней помогло определить в вырезанной дорожке 020, о которой говорил недавно.
* Сэмплы (DAC), которые не останавливались из-за CLIPLOOP(), не исправил, хотя там по ASM-коду понятно.
« Последнее редактирование: 08 Апрель 2020, 06:33:53 от Sharpnull »

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2536
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #81 : 08 Апрель 2020, 06:39:44 »
но главная интрига - это с той переменной 4.4?

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5090
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #82 : 08 Апрель 2020, 14:39:15 »
SeregaZ, проблема осталась как и со 2-м грязным фиксом - снятием 7-го бита. Я проверил, скомпилировав его код с github'а, на всякий случай.
Интересно, что код там лежит с нормализованным переносом (LF, а не CRLF как в Windows), из-за этого я не смог сделать апгрейд проекта с VC++6 до VS2019. Это если скачивать с github, а если клонировать проект, то преобразование идёт до CRLF.
Интересно, что новые коммиты теперь датируются не 7 апреля, а 4 апреля. Получается он ещё тогда исправил, но на github добавил только вчера.

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2536
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #83 : 08 Апрель 2020, 14:48:57 »
ну вчера еще не было. когда я смотрел - висело 11 коммитов. а вот когда седня зашел - уже смотрю 13. а даты да. странные. может создал, но на первое время было приватным? я сам только только на гитхабе зарегистрировался :) довольныыыыый... надеюсь оттуда файл со списком ссылок на гемс архивы брать при запросе из редактора. чтобы не вшивать в ехешку этот список намертво. хотя он там вшит будет - но сначала проверит есть ли доступ к онлайн списку. если нет - покажет вшитый.

а насчет грязного фикса - на том сайте с документацией по ym2612 указано что 7 бит в любом случае illegal. да и на слух вроде нормально - звучит так-же, как и без него, но до тарахтения. мне нравится :)

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5090
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #84 : 08 Апрель 2020, 15:37:40 »
может создал, но на первое время было приватным?
Скорее локально (на компьютере) сделал коммит, push на github 7 апреля (https://api.github.com/repos/ValleyBell/GEMSPlay - pushed_at: "2020-04-07T21:48:08Z", это по UTC).
на том сайте с документацией по ym2612 указано что 7 бит в любом случае illegal
Дело в том, как железо реагирует, а не что формально.
Если всё нормально до шума, и нужно просто его обрезать, то возможно дело в остановке трека, которого не происходит из-за этого бита.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5090
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #85 : 09 Апрель 2020, 21:36:56 »
Обновил github и сборку: https://github.com/infval/GEMSPlay/releases.
* Применил исправления от Valley Bell за исключением второй проверки на GEMS 2.8.
* Добавил функцию void gemsplay_set_gems28mode(int enabled);, чтобы включать GEMS 2.8 режим. Нужно вызывать перед gemsplay_play(), если передать 1 (или != 0 значение) - включение 2.8, если 0 - отключение. Но, так как я оставил вторую проверку, если программа определить режим как 2.8, то установка 0 или первое определение в gemsplay_init() не повлияют. По-хорошему нужно убрать вторую проверку, чтобы точно форсировать нужный режим, тогда придётся и в GEMSPlay плеер добавить такую команду.
* Добавил два "грязных" исправления с Comix Zone и Nightmare Circus (до этого в код не добавлял на github). Обернул их в макрос препроцессора #ifndef DISABLE_GEMSPLAY_DIRTY_FIXES, чтобы выделить и можно отключить во время компиляции, если добавить в настройки проекта.
Когда пытался разобраться в писке/шуме после конца трека, то попробовал передавать тишину после окончания трека, потому что там постоянно вызывается эмуляция YM2612, даже после завершения трека. Оказалось, что в треках только с DAC сэмплами, а точнее в какой-то игре NBA где только голос человека, определение остановки срабатывает раньше, при этом трек играет и пауза работает после неправильного определения конца, это влияет на автоматическое переключение треков (вкл. - клавиша 'A'). В принципе, если добавить ещё проверки, то можно определять конец точнее. Для вашей программы это не важно, так как вам не нужно знать конец.

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2536
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #86 : 10 Апрель 2020, 01:08:53 »
наконец он ответил:
I finally found some time and had a look at all the bug reports.
I also started a GitHub repository that contains the current version of the GEMSPlay source code. (There is no EXE release for now - might do one at a later date.)

DAC looping is fixed now (based on the original Z80 assembly source - had it already fixed when you posted a link to infval's repo)
Your "Select Algorithm" is done by doing bit checks on the CARRIERS variable. In Z80 ASM, this is faster then checking for 0..3, 4, 5..6 and 7 separately.
VGMs are written into a folder called "dumps" that must be in the current directory.
I just made a fix in the Git repo, so that the folder is created automatically when enabling VGM logging.
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.
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.
Thanks for posting infval's GEMSPlay repo, btw. It made me notice a few additional bugs left.
Feel free to invite him to the vgmrips IRC, in case he has questions about GEMSPlay or other GEMS related stuff.

About bugs in general:
Every software has bugs. The reason for such obvious bugs in GEMSPlay is just the lack of testing.
I lost interest in GEMS music shortly after finishing GEMSPlay. I went on to write SMPSPlay instead.
And apparently also nobody used GEMSPlay between 2013 and 2019, so the bugs weren't noticed until now.

теперь у него коммитов на один больше.

по поводу неверного окончания проигрывания - раньше я использовал длл для эмуляции чипа ym2612 - там проигрывание сэмплов было реализовано отдельной самодельной функцией. и в этой функции была проверка на тишину так сказать. если сэмпл играет, но в нем идет в течении пол секунды, наверное, тишина - $80 $80 $80 $80 $80 (или 0 0 0 0 для сэмплов другого формата)... то проигрывание отрубалось, даже не доиграв до конца. может быть здесь подобная система?

Добавлено позже:
ааааааа... перечитал еще раз более внимательно :) определение остановки работает верно. там дело в другом. в коде "мелодии" используется длительность ноты, сиречь сэмпла. но это больше сделано для сохранения темпа так сказать то есть чтобы мелодия не сбилась, потому что сэмпл не слушается параметра duration, а играет пока не проиграет.
получается что-то типа такого:
delay 5 ; пауза между событиями
duration 5 ; длительность ноты, но в данном случае сэмпла
sample (скажем он играл бы по времени как duration 10)
eos ; конец дорожки
то код определения конца трека сработал бы по времени после достижения duration 5, но сэмпл продолжил бы играть пока не доиграет.
« Последнее редактирование: 10 Апрель 2020, 02:27:17 от SeregaZ »

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5090
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #87 : 10 Апрель 2020, 04:20:48 »
На счёт его коммита: теперь он исправил то, что было у меня. 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.
Поэтому я писал, что это "грязное исправление".

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2536
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #88 : 10 Апрель 2020, 04:42:26 »
Поэтому я писал, что это "грязное исправление".
пофиг, главное что работает без явных глюков. да, может что-то где-то немного не верно звучит... но по сравнению с моими глючными самопальными художествами на эту тему - текущая версия dll просто космос.

я еще посмотрю в логах что GEMS в эмуляторе в этот регистр шлет. думаю может все-таки обрезает $FF из инструмента до $7F. плюс еще тестировал собранный ром в Gens и Fusion - в Gems играет как-то дважды чтоль. то есть два раза звук появляется, а во Fusion - только один. у нас как во Fusion - один :) полагаю что это правильно.

Добавлено позже:
значение так и остается $FF. я думал гемс его порежет. смотрел в VGM записи во Fusion. значит обрезки нет, и как-то эмуляторный чип реагирует по другому на этот 7 бит.
« Последнее редактирование: 10 Апрель 2020, 04:58:41 от SeregaZ »

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5090
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #89 : 10 Апрель 2020, 06:32:56 »
как-то эмуляторный чип реагирует по другому на этот 7 бит.
Меня тоже смущало, там проверка на 7 бит (0x80) встречается. Только сейчас поискал информацию "CSM mode auto key on ym2612" :) Например:
Цитата
CSM (illegal Mode)
This mode is will also switch the YM2612 in special mode
It was officially called “Illegal Mode” because it seems SEGA did not find any use of this or developers found it too hard to program...
CSM stands for COMPOSITE SINE WAVE MODELING aka early speech synthesis system
Интересно, как много игр с GEMS использовали CSM.
--------
Можно убирать 7-й бит, только если передаётся 0xFF или если установлены 7-й и 6-й биты одновременно, потому что так обычно не ставят, как я понял.
« Последнее редактирование: 10 Апрель 2020, 06:43:04 от Sharpnull »