Разработка и ромхакинг > Ромхакинг
обсуждение конвертерa музыки для Dune MIDI2DUNE [SMD]
<< < (6/7) > >>
SeregaZ:
пытаясь перенести как можно близко звучание дефлемаска в GEMS все время натыкаюсь на тупики. и таких тупиков уже накапливается прилично. думаю надо их записать наконец в кучу.

1. лимит количества модуляций и инструментов в их банках. я думал там 255. ибо 1 байт... но видимо там реально байт .b тип. то есть от -127 до 127. то есть 127 штук. пока предполагается что решаться эта проблема будет увеличением количества самих банков GEMS. как типа Мортал Комбат 3 например - там два комплекта банков GEMS. но вроде как можно больше. то есть предполагается 1 песня - 1 банк GEMS.

тут ведь как - если песенка простая и без наворотов, то может и хватит одного набора с лимитом по 127 штук для всех песен игры... но так получилось, что у нас совсем без тормозов композитор :) он использует возможности Дефлемаска на всю катушку. вот например одна из его любимых вещей - использование стерео. если для RRR драйвера это не проблема - тыркай флаг левый, правый, стерео и все дела, то для GEMS это целая история - ведь флаг в какой колонке данной дорожке играть зашит в самом инструменте. выходит если песня использовала где-то для каких-то инструментов этот эффект, то надо умножать все эти "стерео" инструменты на 3. то есть отдельно инструмент с левым включенным каналом, отдельно с правым и отдельно с обоими. а сейчас еще докучи мы выяснили что для организации еще там какого-то эффекта - вибрато чтоль - можно еще менять параметр AMS или FMS... ему то легко сказать что он нужен - тыркнул в дефлемаске и вбил какой эффект нужен. а у меня мозг взрывается. если прикручивать изменение этого параметра, то количество инструментов опять таки увеличится. а если еще и учитывать эту стерео чехарду, то увеличится в разы. было бы хорошо, если в GEMS можно было бы изменить тип параметра с однобайтового .b на двух байтовый .u (от 0 до 65 тысяч), либо на худой конец на .w (от минус 30 тыщ до плюс 30 тыщ сколько-то там)

2. в связи с указанными выше сложностями - было бы хорошо добавить в GEMS команды для управления этих самых параметров AMS или FMS и переключение стерео канала. по примеру как работает команда громкости. хотя пример не очень, ибо громкость 1 параметр. пиши новую громкость и проблем нет. а вот в случае с со стерео и этим вибрато - этот параметр содержит в себе флаги других параметров. выходит надо "помнить" оригинальное значение, а после вписывать в него нужные биты и только потом слать в регистр.

3. в одной из, находящихся в разработке, песен есть мой самый любимый момент в конце. ну и сконвертировался он не верно. сегодня засел за выискивание причины... и расстроился. рассказываю с самого начала: есть в дефлемаске эффект 03. типа идет нота С (до) а потом нота С# (до диез) и вот она идет с указанием эффекта 03. это означает, что нота С играет как обычная нота, а когда доходит до начала проигрывания ноты С# - то прекращения проигрывания ноты С не происходит. она продолжает играть, просто начинает перетекать слайдом в ноту С# с какой-то скоростью, указанной в параметре этого эффекта 03. и это еще может быть совсем не конец, а потом может быть, скажем, третья нота, четвертая... и так до посинения, как музыкант решит. я проклял все на свете рожая алгоритм, который бы все это учитывал. достал всех, кто плюс минус в этой теме. опросил всех своих консультантов... ну с горем пополам родил, и ходил довольный пару дней. до сегодняшнего дня, пока не начал разбираться почему в конце той песни вылез затык. так вот этот эффект 03 для RRR не представляет никакой проблемы - так как там есть своя встроенная команда в драйвере. для GEMS же было два пути воспроизведения этого эффекта - создания модуляции - последовательность инструкций по изменению частоты ноты во времени или же бомбить дорожку песни кучей команд pitch, через какие-то промежутки. вот я значит делал первый вариант, через создание модуляций. и причина оказалась в том, что драйвер GEMS оказывается совсем не расчитан на большое количество событий в этом файле модуляции. там лимит всего в 10 вариантов. на 11 модуляция тупо зависает. я понятия не имел, что там есть лимит. но скорей всего это не лимит в 10 событий - это скорей всего баг драйвера, так как в оригинальном программном обеспечении GEMS для модуляции предусмотрено как минимум 20 событий. после 20 там просто уже не реагирует кнопка добавления сегментов. то есть нужна починка этого момента в драйвере, а лучше бы увеличение лимита как минимум до 40. а лучше бы до посинения. но я понятия не имею какие там ограничения. по идее раз оно так упирается в этот лимит 10 - там видимо заранее предустановлен массив из 10 ячеек, куда вносятся данные. может быть он 10 потому что лимит памяти, а может просто чтоб быстрей драйвер работал - я не знаю. но хотелось бы чтоб оно было как минимум 40 - самое большое значение, какое встретилось в тех разрабатываемых песнях.

можно конечно переделать систему с модуляций на спам команд pitch в самой дорожке песни, но размер песни раздуется до космических высот и памяти может не хватить. а вторая проблема - математика. рожая математику для 03 эффекта - я чуть не умер, а переделывать математику под такой вариант точно помру к черту. я так радовался эффекту затухания громкости или наоборот нарастания - который получилось реализовать и просчитать это было сложно, то эта переделка испортит все уже отлаженное. прям расстройство в общем.
SeregaZ:
итак, как выяснилось этот самый злосчастный GEMS, имеет буфер для модуляций. и всего 128 байт. это причем на все модуляции, а предусмотрено что этих самых модуляций может быть 4 штуки максимум одновременно. то есть итого 128 / 4 = 32. а 32 байта это, напомню, 2 байта стартовый питч, 1 байт счетчик, 2 байта скорость .w типа, то есть от минус тридцать тыщь сколько то до плюс трыдцать тыщ сколько то. то есть 32 байта это как раз 10 сегментов - и вот она причина глюка. эх... там бы чуток пустого места в памяти и можно было бы увеличить этот самый буфер и хотелось бы до 128 байт для каждой из четырех модуляций, итого 512 байт... но увы.

значит придется рожать систему со спамом команд pitch. так не хочется портить уже отлаженный код конвертера  :'(

думаю на днях засяду. в итоге обычные эффекты дефлемаск 01, 02, Е1, Е2 оставлю как есть. а вот для 03 эффектов будет проверятся сколько памяти это будет занимать. если в пределах 32 байт - оставлять модуляцию. и причем возможно что 29 байт, а не 32. ибо нужно еще будет исследовать как поведет себя модуляция с 10 сегментами, но фактически без последнего нуля - то есть конца модуляции. возможно там вылезет глюк. посему это возможно 29 байт лимит будет. так вот а если больше, то бомбить командами pitch. так-же если это был сложный случай, то есть начинался каким-то из эффектов 01, 02, Е1, Е2, но потом бац и перетек в 03. там тоже смотреть размер и если превышает - перерисовывать всё командами pitch. но уже голова начинает болеть... ведь надо будет предусмотреть еще и громкость, а именно когда эта самая громкость может изменятся посередине звучания ноты. вобщем все плохо :)
SeregaZ:
музыканты... начинаю вас ненавидеть :) для программиста, после всех этих танцев с бубном, стало звучать ааааафигенно! но музыканту подавай эффект вибрато. ибо вся песня натыкана этими... вибраторами... в принципе это не сложно. получается эффект болтается от текущей ноты плюс минус одну ноту с какой-то скоростью. но использование модуляции сразу отпадает, потому как там явно не будет влезать в этот самый лимит 32 байт... значит команды pitch. а это опять таки увеличение размера памяти для мелодии, что может не хватить. но главное это второй негативный момент - самый отвратный, то как указано на скрине в самом вверху, там где я ною и развожу сопли, что дефлемаск хочет меня окончательно добить - стартует эффект E1, то есть нота уже куда-то начинает перетекать от изначальной, в середине ноты стартует вибрато (04 эффект), потом включается перетекание в другую ноту (эффект 03). ааааааааааа... я тогда плевался, а сейчас и вовсе отказываюсь об этом думать. даже от только обдумывания уже голова болит, то уж тут говорить про реализацию... но думаю если эффект 04 будет попадаться вместе со стартом ноты, то думаю можно будет сделать. так сказать хотя бы частичную поддержку эффекта вибрато. наверное засяду на неделе за этот допил.

еще он спрашивал про какое-то там детуне. в смысле так то я знаю что это один из параметров инструмента, но по видимому он переключается каким-то из эффектов в дефлемаске. проблема то в чем - в GEMS нет такого переключателя. этот параметр переключается в самом инструменте. получается что если мне надо изменить этот самый детун, то надо клонировать инструмент, менять этот параметр и использовать уже этот новый инструмент для этого фрагмента. на словах то все понятно и можно сделать... однако такое клонирование инструментов у меня уже есть - на эффекте 08, а это эффект переключение стерео канала. типа хочешь в левой колонке играть будет, хочешь в правой... и я уже тогда был не в восторге от этой идеи, когда увеличивается количество используемых инструментов. их по всей видимости 127, хотя я думал что хотя-бы 255. (а именно 127 - это потому что пустые слоты в досовском софте GEMS для инструментов подготовлены именно в количестве 127 и причем это под все инструменты всего GEMS банка, то есть всех песен). и тогда, учитывая эти детуны, а их там 7 штук помница, плюс еще на каждый вариант по 3 инструмента стерео, левый и правый - ааааааааа... это никакого лимита не хватит даже на одну песню. поймать бы этих праграмистоф сраных, что GEMS ваяли, так как обматерить что все эти вещи не предусмотрели...
SeregaZ:
понадобилось приложить к форуму конвертер... посему апаю свою тему :) вобщем теперь конвертер стал еще череззаднепроходный. если раньше из миди в гемс конвертировало, то теперь сначала из миди в дефлемаск, после что-то там можно было поправить, и только потом уже из дефлемаска в гемс.

выбирать при конвертировании из миди в дефлемаск систему 32. потому как конвертер из дефлемаска в гемс заточен именно под 32. 128 система конечно круче, но конвертирование там хуже. посему 32.
SeregaZ:
оказалось банки какой-то из буржуев тоже выковыривал для своих каких-то дел :) посему обновляю базу теми играми, которых не было. это еще не все. архив еще полистаю что там есть, чего здесь нет. напоминаю скачивать их не нужно. они будут в списке редактора для однокликового вставливания в игру. сам лист, к сожалению, пока вшит в программу... хостинг я так и не завел, чтобы этот список обновлялся онлайново. ну пока так. причем там в списках есть для 32х системы, а не только мега драйва.
SeregaZ:
пока-что последние какие у меня есть. в планах правда еще аркадный рестлинг и мк3 надо чуть переделать, чтобы два комплекта банков уместить в один и правильно распаковать. сейчас в базе мк3 несколько обрезанный.
SeregaZ:
несмотря что вроде как с вами больше не играю, но база то онлайновая здесь лежит. а тут чот втемяшилось МК3 обновить. раньше был только один банк с переразжатыми сэмплами из DPCM 4bit в PCM 8bit. сейчас сэмплы опять так-же расжаты в 8бит для совместимости с другими GEMS играми, ноооо наконец-то дотулил туда второй банк. начиная со 128 номера это слоты второго банка.
SeregaZ:
ну и тада чтоб два раза не ходить - WWF рестлинг аркаде как его там... по той-же схеме. оба банка, начиная со 125 слота, плюс разжатые сэмплы в 8 бит для совместимости.
SeregaZ:
на случай если дети сами не смогут - надо залить для онлайн базы.
Razor:
Для онлайн базы теперь ещё надо из прототипа Дюнки добавить треки :)

https://hiddenpalace.org/Dune:_The_Battle_for_Arrakis_(prototype)
SeregaZ:
эм... мне пустую страницу показывает. предлагает её заполнить. ссыль на ром я не вижу. это первое. а второе - ты уверен что в прототипе тоже был GEMS? а то может там какой другой движок...

Добавлено позже:
а... ясно. кое кто криворукий блин... ссылку то надо было через тег вешать. форум скобку не заурлил.
SeregaZ:
звук соника нравится больше, чем в релизной версии.
Razor:
Запихал к себе в Razor Missions музыку из прототипа ради истории  ;)
Turbo2000:
Привет, а онлайн базу каким образом формировали?
Есть исходные коды или библиотеки для получения GEMS, понимаю, что уже все извлечено, но было бы интересно покопаться.
SeregaZ:
основная статья о драйвере звука GEMS: http://elektropage.ru/publ/o_prekrasnom/articles/gems_sound_driver/2-1-0-71
конечно без деталей, но в общем понятно что там творится.

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

сам искать эти банки не умею - я ж не ромхакер :) пользовался тремя путями.
1. под сполером гражданина Megaplex указаны множество игр с адресами. оставалось их вытащить из игры и скормить шелловскому комбайну-сплиттеру для распаковки. http://elektropage.ru/forum/7-68-3#2624
2. товарищ ValleyBell сделал GEMSScanner - он бывает находит и вытаскивает из игр банки, но много где ничего не находит.
3. есть ссыль на архив My GEMS Rips... но ссыль я потерял :(((( там буржуйский товарищ выложил банки GEMS кучей к куче игр. причем даже различных билдов одной и той-же игры. видимо тут: https://hcs64.com/mboard/forum.php?showthread=43020

понятно что некоторые игры имеют не стандартный драйвер и на обычной козе там не подъехать. как то МК3 например. но в общем и целом основная часть игр распаковывается вполне себе.

это что касается банков самих, а их распаковка - деление на нотные листы, сэмплы, модуляции и инструменты - там можно пойти по обратному пути. то есть посмотреть что распаковывает шелловский комбайн-сплиттер - то есть создает именно что отдельные копии сэмплов, инструментов и так далее - и смотреть как они расположены внутри банка. типа инструмент FM 39 байт чтоль... вот смотрим, скажем 00 инструмент, копируем его данные и ищем в банке инструментов. а потом уже делаем выводы как система его находит - то есть в заголовке типа там смещения указаны и все такое, и только потом уже эти самые 39 байт инструмента... и так далее и тому подобное. с нотным листом конечно посложнее, но в той первоначальной статье на электропейдже все в принципе понятно расписано.

не ходить на сайт электропейджа без адблокера в браузере! иначе реклама задолбает.

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

с самим кодом эмуляторов чипов ямахи и псж - я без малейшего понятия как эта магия происходит. я не понимаю как этот самый звук формируется :) мне помогли. ямаха - была opn.dll библиотека, сделанная буржуйским товарищем ValleyBell, она правда содержала ошибки, которые смог найти и поправить r57shell и вообще использовалась для какой-то ValleyBell'ной программы... я использовал не по назначению. PSG часть код давал для веб браузера тоже легендарный товарищ Shiru. а этот код в свою очередь потом на форуме моего языка программирования конвертировал буржуйский товарищ wilbert, но и то он использовал частично asm, который мой PureBasic поддерживает, и в результате я там, даже видя код - нихрена не понимаю что происходит. может чистый PB было бы более понятно, но работает и то хорошо. и это были лишь эмуляторы звуковых чипов. сама организация проигрывания делалась мной, но только по мотивам драйвера... приблизительно как это должно работать. понятно что криво-косо, но это было лучше, чем вообще никак. далее у товарища ValleyBell была замечательная программа GEMSPlay, которая в свою очередь была написана по мотивам SMPSPlay другого автора... не суть. она была в качестве консольной программы и могла проигрывать банки GEMS на винде. для моей задачи она не очень подходила... но зато там был открытый исходный код, который здесь на форуме товарищ Sharpnull переписал на свой язык, опять таки понаходил кучу ошибок и поправил, а еще сделал не как консольную - а как dll, которую можно подключить к своей программе. там уже изначально вшиты и оба чипа ямаха и псж, и сам драйвер. получается мне оставалось только формировать GEMS банки, посылать их как образы памяти в библиотеку и она начинала играть. и тут максимально приближено к оригиналу как на приставке бы оно играло. и это куда круче моей глючной самоделки.

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

по ямахе - о регистрах чипа. то есть какие регистры за что отвечают и как заставить их петь: http://www.smspower.org/maxim/Documents/YM2612

по PSG не помню была ли подобная подробная статья... но я на что-то ориентировался. точно помню. кажется эта: https://www.smspower.org/Development/SN76489

Добавлено позже:
про эту библиотеку: https://github.com/infval/GEMSPlay

про формирование банков GEMS, с описанием в картинках структуры банков: https://github.com/SeregaZ2004/GEMSReader
Turbo2000:
Огромное спасибо за развернутый ответ  ^_^
Turbo2000:
Сергей, здравствуйте!
Вы не знаете, корректно ли работает конвертер Gems в Midi?
Или не существует такого конвертера, который может учесть все команды, интересует только статическая музыка (в смысле, не интересуют динамические смены темпа и так далее).
SeregaZ:
без понятия о чем речь. vgm 2 midi вроде бы есть... что-то я такое припоминаю ValleyBell делал. а вот с драйвером наврядли кто-то заморачивался, чтоб его в миди переводить. проблема то в чем: длины дорожек в GEMS могут быть разные, а в миди нет - только одинаковые. типа скажем для барабанов в GEMS записали 4 такта, а в конце влепили зацикливание и эта дорожка так и будет проигрывать эти 4 такта, прыгая назад и проигрывая сначала. а дорожка 2 может быть скажем 100 тактов играть, дорожка 3 - 50 тактов... миди же подавай чтоб все дорожки были одинаковой длины. в этом плане vgm файлы с мелодиями дюны или любой другой игры - более приближены к миди, так как все дорожки там пишутся одинаковой длины.
Turbo2000:

--- Цитата: SeregaZ от 04 Апрель 2023, 20:42:50 ---без понятия о чем речь. vgm 2 midi вроде бы есть... что-то я такое припоминаю ValleyBell делал. а вот с драйвером наврядли кто-то заморачивался, чтоб его в миди переводить. проблема то в чем: длины дорожек в GEMS могут быть разные, а в миди нет - только одинаковые. типа скажем для барабанов в GEMS записали 4 такта, а в конце влепили зацикливание и эта дорожка так и будет проигрывать эти 4 такта, прыгая назад и проигрывая сначала. а дорожка 2 может быть скажем 100 тактов играть, дорожка 3 - 50 тактов... миди же подавай чтоб все дорожки были одинаковой длины. в этом плане vgm файлы с мелодиями дюны или любой другой игры - более приближены к миди, так как все дорожки там пишутся одинаковой длины.

--- Конец цитаты ---

Отлично, спасибо за объяснения, в общем все подводные в том, что там дорожки разной длины + лупы.
Turbo2000:
Привет, если кому-нибудь надо, то переделал немного API, теперь можно одновременно играть несколько GEMS дорожек.


--- Код: --- GEMSPlaySystem_PlayMusic(0x3);

SDL_PauseAudio(0);
is_playing = true;

/* wait until we're don't playing */
while (is_playing)
{
SDL_Delay(100);

SDL_Delay(rand() % 1000 + 3000);

for (int i = 0; i < sound_channels; ++i)
{
GEMSPlaySystem_PlaySound(35 + i, i);
SDL_Delay(100);
}
}

--- Конец кода ---

Теперь не зависит от потока под воспроизведение аудио, и возможно, от windows, надо проверять.

--- Код: --- const size_t samples_count = len / 4;
GEMSPlaySystem_UpdateMusic(reinterpret_cast<unsigned short*>(buffer), samples_count);

for (int sound_channel = 0; sound_channel < sound_channels; ++sound_channel)
{
GEMSPlaySystem_UpdateSound(sound_channel, reinterpret_cast<unsigned short*>(sound_buffer), samples_count);

for (int sample_index = 0; sample_index < samples_count * 4; ++sample_index)
{
buffer[sample_index] += sound_buffer[sample_index] / 2;
}
}

--- Конец кода ---


Навигация
Главная страница сообщений
Следующая страница
Предыдущая страница

Перейти к полной версии