| Разработка и ромхакинг > Ромхакинг и программирование |
| конвертация аудио сэмплов и планы на треккер |
| << < (4/6) > >> |
| Sharpnull:
--- Цитата: SeregaZ от 03 Апрель 2020, 08:04:17 ---а как можно в 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:
ааааааааааааа :) останавливает проигрывание :) колбаса! по поводу PSG - вот тут ничего не скажу. я только примерную схему как там построение громкости, согласно инструменту, знаю. а вот тонкости с флагами... по идее прекращение звучание должно происходить когда согласно инструкциям - громкость достигла ноля. |
| Sharpnull:
На счёт переключения треков. В gemsplay_play() я ставлю PreparseGemsSeq(0); PlaySong(0);, т. е. SongNo = 0. Я оставил значение по умолчанию у FollowTrack = true (Follow Sequences), думал, что автоматическое переключение треков, но это только влияет на номер выбранного трека в консоли. Когда трек хочет переключиться, то переключается. AutoProgress = false по умолчанию, отвечает за переключение Song, симуляция переключения курсора и запуска воспроизведения, как если бы нажимал человек. Конец трека определяется как раз по CheckForSongEnd(), которую я изменил. В этой функции ещё неверный код установки битов: UINT8 ChnMask, но биты ставятся от 0 до 16, но это похоже совсем не важно. --- Цитата: SeregaZ от 03 Апрель 2020, 21:28:15 ---согласно инструкциям - громкость достигла ноля. --- Конец цитаты --- Дело в том, что мы вручную нажимаем/вызываем стоп и здесь происходит запись в FIFO cmdstopall (0x16), но движок ничего не делает с envelope, кроме отключения канала. А CheckForSongEnd() для GEMSPlay, пытается в нескольких местах определить, что конец трека. Поэтому такая проверка необходима. Если тишина, это ещё не значит, что трек закончился. Я даже не знаю когда GEMS треки останавливаются, наверно только от своих команд. Ещё интересно, что The Jester у VGM версии имеет продолжительность 5:09, но в GEMPlay не остановилось. Наверно без явной команды будет бесконечный повтор. |
| SeregaZ:
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:
--- Цитата: SeregaZ от 03 Апрель 2020, 23:24:17 ---100-150 килобайт на песню - многовато --- Конец цитаты --- "17 - The Jester.vgm" - 1,95 МБ, который я скачал :) --- Цитата: SeregaZ от 03 Апрель 2020, 23:24:17 ---переключение треков не нужно --- Конец цитаты --- Так и подумал, просто для информации. Обновил на github код и добавил сборку. |
| SeregaZ:
это видимо сэмплы - поэтому размер такой большой. их не посчитал :) |
| SeregaZ:
я окончательно разуверился в святости 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. |
| Sharpnull:
Нашёл такие заметки: 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:
то есть дело в ядре, а не самом коде драйвера? каким образом можно начать vgm логирование? в оригинальном коде в смысле. тыркаю v - пишет vgm включено, но после пишет в консоли сообщение что не могу открыть вгм файл чтоль... я к чему - если записать что именно там происходит, то есть сравнить показатели громкости и точно удостоверится что дело не в них. Добавлено позже: мне нравится :) нет этого вызывающего звука в начале. и я там смотрел гитхаб ВаллейБела - он два дня назад что-то правил. видимо с тем проигрыванием сэмпла фиксил, а на форуме не написал ничо :( |
| Sharpnull:
--- Цитата: SeregaZ от 06 Апрель 2020, 08:32:15 ---то есть дело в ядре, а не самом коде драйвера? --- Конец цитаты --- Не знаю, код эмуляции YM2612 выглядит очень похожим на тот, что в MAME, а он нормально эмулирует и собственно поддержка overflow есть, но вот переписанный драйвер (GEMSPlay) наверно что-то не учёл. Протестировал Ariel - The Little Mermaid, первый трек (Level 1, The Reef) там тоже исправился. --- Цитата: SeregaZ от 06 Апрель 2020, 08:32:15 ---каким образом можно начать vgm логирование? --- Конец цитаты --- Не знаю, может оно не работает. Там, кстати, есть код записи в wav, но нужно перекомпилировать. --- Цитата: SeregaZ от 06 Апрель 2020, 08:32:15 ---и я там смотрел гитхаб ВаллейБела - он два дня назад что-то правил --- Конец цитаты --- Жаль, что он раньше не добавил репозиторий (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:
ну тогда фиг с ним с этим 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:
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 у сэмплов неправильный. |
| SeregaZ:
по поводу 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:
--- Цитата: SeregaZ от 06 Апрель 2020, 22:16:02 ---возможно GEMSPlay не может определить какие именно там используются и скажем они были 3 байтные, а он пытается 2 байтами прочитать и посему сыплется. --- Конец цитаты --- Да, проверил. Он не смог определить в ваших вырезках, поэтому там и пишется Warning! GEMS Version Autodetection failed! (режим 2.8 не срабатывает и версия с 2 байтами по умолчанию), а когда запускаешь полный рип от того чувака, то ошибок нет в Comix Zone. Вот в Nightmare Circus (Beta) определить не получилось из того архива, но даже когда я установил режим 2.8, VGM хоть и без ошибок, но loop сэмплов остаётся неправильным. --------- Определение в DetectSeqType() из loader.c. |
| SeregaZ:
опля... а в библиотеке как? тоже автоопределение стоит? по идее надо чтоб трехбайтовые всегда были. так как это не оригинальные банки, а распакованные и собранные по новой. собираются по трехбайтовой схеме. |
| Sharpnull:
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:
ну пока-что ошибок не встречалось. все тыщу песен и спецэффектов конечно не проверял. теперь можно за трекер садится и пилить потихоньку :) Добавлено позже: эх... опять вылезло :) тарахтение какое-то добавляется. Nightmare Circus трек номер 019, 020. начало проигрывает нормально - а потом жужжание включается. в роме проигрывается нормально. (чтобы собрать в роме - следует в локальном списке выделить 019, а в списке песен в игре - самую первую строчку My\000\000.cfg и нажать кнопку >> произойдет перекидывание в тестовой ром мелодии. после правой кнопкой мышки на этом первом пункте и нажать собрать тестовой ром. при условии что путь до эмулятора был указан - откроется эмулятор с этим звуком.) это может быть как раз из-за трехбайтовой системы? просто ром то имеет 2.8 версию драйвера и следовательно играет верно. а библиотека сначала пытается определить и потом запускает. может быть что тут все-таки на 2 байта переключило? ну и вобще странно как-то. в этой мелодии, то есть спецэффекте, есть модуляция, но модуляция по сути заглушка там 00 00 00. следовательно модуляция никак не должна влиять на звук - ведь там нули... но если её отрубить, то звук кардинально меняется. это для меня разрыв шаблона :) это видимо правильно что оно так играет, но в мое понимание логики не укладывается. Добавлено позже: после собрания рома и запуске в эмуляторе - можно опять таки правой кнопкой на этом пункте My\000\000.cfg - открыть папку - перекинет в эту тестовую папку рома, в ней поднятся вверх по папкам до папки gemstest - в ней будут лежать собранные банки, которые можно в GEMSPlay тестировать. это заведомо верно собранные банки шеловским комбайном. то есть точно ошибки нет. мои же, которые может быть кривые - собираются в памяти. дамп не делается, но тут и правильные банки GEMSPlay некорректно завершает проигрывание. после останова счетчика проигрывания - это жужжание включается, а вот при проигрывании рома в эмуляторе - такого нет. Добавлено позже: в VGM дамп это жужжание не попадает. видимо потому что счетчик проигрывания заканчивается раньше жужжания и следовательно дальше дамп просто не пишется. |
| SeregaZ:
по тарахтению - по всей видимости это проблема Ch3mode. но и с самим инструментом там тоже что-то не все в порядке. как-то он не так читает... пойду еще поковыряю. Добавлено позже: итак. в этих треках в инструментах байт, в котором бит включения Ch3mode имеет значение $FF - то есть там включено все на свете. а вот что можно слать в этот регистр: https://www.smspower.org/maxim/Documents/YM2612#reg27 то есть варианты когда один 7 бит или 6 и 7 - это illegal - не правильные значения. нельзя ли чтоб dll отсекала 7 бит? а я пока пойду еще проверю может другие биты тоже там будут вызывать это тарахтение... Добавлено позже: ну вроде да, остальные биты не влияют на звучание и тарахтения нет. нужно отсечение 7 бита для этого значения. |
| Sharpnull:
--- Цитата: SeregaZ от 06 Апрель 2020, 23:51:15 ---модуляция по сути заглушка там 00 00 00. следовательно модуляция никак не должна влиять на звук - ведь там нули... но если её отрубить, то звук кардинально меняется. это для меня разрыв шаблона --- Конец цитаты --- Про это не знаю. --- Цитата: SeregaZ от 08 Апрель 2020, 01:12:41 ---нельзя ли чтоб 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:
я так понимаю мне второй вариант из архива нужен? там где gems 2.8 написано? его прикрутил к редактору - все замечательно и это тарахтение пропало :) надеюсь это точно последнее недразумение было. ValleyBell ничего так и не ответил. сейчас и вовсе на их сайт не пускает. или забанили за то что достал :) или просто висит. Добавлено позже: а нет, чото он правил. смотрю на гитхабе какие-то обновки. |
| Навигация |
| Главная страница сообщений |
| Следующая страница |
| Предыдущая страница |