| Разработка и ромхакинг > Инструменты |
| [NDS] KORG M01 Music Workstation - извлечение созданной музыки |
| (1/1) |
| HayaoYokogawa:
Сабж. Собственно, KORG M01 - не совсем игра, но она вышла уже давненько на DS и является вполне неплохой, на мой взгляд, музыкальной станции (на самом деле "эмулятор" реально существовавшего синтезатора/музыкальной станции в 80-х). Вот в чем проблема, пусть и скорее надуманная, но вполне меня волнующая - мне хочется извлечь хоть что-то похожее на "готовый" файл из сохранения, чтобы попробовать перенести это в FLStudio; хотя бы чуточку проще, чем вручную пересоздавать мелодию в ФЛ. Возможно ли? Кто что думает? ЗЫ. В теории там должно быть что-то похожее на отдельные файлы, ибо в этом "синтюке" есть возможность обмениваться музыкой между ДСками. |
| SILENT_Pavel:
--- Цитата: HayaoYokogawa от 26 Ноября 2014, 13:55:52 ---Возможно ли? Кто что думает? ЗЫ. В теории там должно быть что-то похожее на отдельные файлы, ибо в этом "синтюке" есть возможность обмениваться музыкой между ДСками. --- Конец цитаты --- Не очень знаком со спецификой NDS, но кое что изучал по вытаскиванию трекерной музыки из некоторых пс1 игр. Нужно уточнить игра сохраняет эти мелодии куда-то? В ндс внутреняя память или сохранения игр на внешней карте памяти? Или ты вообще на пк эмуляторе играешь? Если на пк - опять же что из себя представляет файл сохранения? |
| HayaoYokogawa:
--- Цитата: SILENT_Pavel от 27 Ноября 2014, 14:29:13 ---Не очень знаком со спецификой NDS, но кое что изучал по вытаскиванию трекерной музыки из некоторых пс1 игр. Нужно уточнить игра сохраняет эти мелодии куда-то? В ндс внутреняя память или сохранения игр на внешней карте памяти? Или ты вообще на пк эмуляторе играешь? Если на пк - опять же что из себя представляет файл сохранения? --- Конец цитаты --- Эмулятор эмулирует, но звуки/сэмплы не воспроизводит корректно. Мелодии сохраняются в файле сохранения, то есть отдельно. Файл сохранения - sav, с консоли Добавлено позже: Ну что, спустя 11 лет я сообразил, как извлечь мидяшки из DS-версии, используя 3DS-версию, эмулятор и HEX-редактор! :wow: Изложить метод попробую попозже, пока настолько тут в шоке от своей гениальности (шутка юмора, конечно), что мозг резко перестал варить :lol: |
| SeregaZ:
не в курсе про эти ваши NDS'ы... но предположил бы что по идее должен быть способ записывать в вгм файл звук с сей приблуды. Добавлено позже: эм... походу нет. полистал - вроде не фм синтез. тогда не очень чтобы уж заработает сей метод :) |
| HayaoYokogawa:
--- Цитата: SeregaZ от 24 Апреля 2025, 17:06:30 ---не в курсе про эти ваши NDS'ы... но предположил бы что по идее должен быть способ записывать в вгм файл звук с сей приблуды. Добавлено позже: эм... походу нет. полистал - вроде не фм синтез. тогда не очень чтобы уж заработает сей метод :) --- Конец цитаты --- Ну, пока вкратце, с картинками и более подробно потом: Я использовал KORG M01 Music Workstation на DSLite с флешкариком, так что сохранить все свои музыкальные опусы мне удалось в виде .sav, которые генерит сам флешкарик. Году в 2016 Korg выкатил версию этой музыкальной станции для 3DS, где допилили много чего, но самый важный пункт - экспорт музыки в формат MIDI на флешку. Как я купил 3DS, я сразу скачал и попробовал воспользоваться плюшкой передачи композиции по Wi-Fi, но версии DS и 3DS просто друг друга не видят никак. Так что я про это снова забыл, пока на днях тут не посочинял на DS и вдруг сообразил, что если б я сделал это на 3DS, то я б этот опус экспортнул в МИДИ и уже добил бы в условном фрутилупсе. Сегодня я так репу почесал и подумал - а чего б мне не поглядеть, как сейвы DS и 3DS версии выглядят в хекс редакторе? Запулил и что я вижу - формат практически идентичен, за исключением того, что на 3DS это все раздельными файлами, а сейв с DS, конечно, единой кучей. 3DS версия генерит файл со списком и файлы с самой музыкой в сыром виде. Файл со списком содержит, собственно, список - идет название мелодии, дальше через стопку байт длина этой композиции. Заголовок самой композиции между версиями отличается лишь тем, что в 3DS версии один кусочек заголовка зачем-то продублирован. Попробовав втупую скопировать блок из DS сейва, я получил кукиш и где-то через час битья головой об стену я допер, какой длины должен быть паддинг, забил нулями до нужного размера и вуаля - 3DS версия подхватила композицию и открыла без проблем. К моему счастью пересчитывать чексуммы и прочее мне не пришлось :lol: Ну а открывающуюся песню 3ds версия может экспортировать на флешку в миди формате и дальше делай с ним, что хочешь - а именно это мне и надо :) Добавлено позже: А вот не зря я про "гениальность" пошутил - что-то план с паддингом не так-то прост оказался, собака где-то чуть в другом месте зарыта. Как-то проковырявшись часа 3 я еще одну композицию-то выкопал, а все остальное так просто не выносится. Прошу пардону, что говорю загадками и без файлов, уже спать собираюсь, завтра свои наблюдения точно уже с картинками и файлами покажу. |
| HayaoYokogawa:
Все, победил, дело было не в бобине :lol: Если что, я в этом смыслю мало, поэтому могу криво использовать термины - если что, поправьте. В общем, суть заново и теперь уже с картинками и пояснениями: Есть KORG M01 Music Workstation для NDS и есть KORG M01D Music Workstation для 3DS. Существенное отличие первого от второго в том, что второй умеет экспортировать все, что вы там намузицировали, в формат MIDI для дальнейшей доработки. Еще 10+ лет назад я там намузицировал всякого барахла, которое бы хотелось сохранить, местами поправить и перезаписать уже в более цивильном виде. Сидеть и заново все ноты набивать ручками ну очень лень. И есть проблема - композиции меж собой передавать могут только соответствующие друг другу версии, то бишь с DS только на DS и 3DS только на 3DS. Вчерашний вечер и сегодняшние полдня я потратил на то, чтоб выяснить, есть ли какая-то возможность воткнуть песни из версии DS в версию 3DS, чтоб потом можно было это экспортировать в MIDI и первый заход в файлы сохранений показал, что формат в обеих версиях идентичен, но есть нюанс и про эти нюансы я сейчас расскажу. Для трансплантации композиций нам потребуется: • HxD или любой другой удобный hex-редактор; • Citra - мумулятор 3DS. Как такое провернуть с помощью 3DS натуральной пока для меня загадка, ибо на 3DS сохранения зашифрованы; • Сохранение от KORG M01 на DS - в моем случае это файл с флеш-картриджа. • Ну, и, конечно, сам KORG M01D в виде рома. Сначала ставим KORG в Citra, запускаем, тыкаем в PLAY, S-01 (для удобства) и YES, после чего сразу сохраняем пустую композицию - это нужно для того, чтоб создались файлы, в которые мы будем подсовывать свои данные. Дальше открываем проводник и идем по адресу: --- Код: ---%appdata%\Roaming\Citra\sdmc\Nintendo 3DS\00000000000000000000000000000000\00000000000000000000000000000000\extdata\00000000\00000F16\user --- Конец кода --- Видим два файла: • M01Dn_00000000 - здесь хранится список композиций; • M01Dn_00100000 - а это уже сама композиция. Цифры в зависимости от выбранного положения могут отличаться, но это пока неважно - у нас сначала будет именно 00100000. Теперь открываем HxD, в HxD открываем оба новых файла из Citra, и открываем сейв с DS, где хранятся наши композиции. В файле сейва от DS список продублирован дважды (не знаю, зачем) и файл начинается с него. Длина каждого элемента в списке - 28h байт, первые 8 под название, через 19 байт записана длина композиции в байтах в обратном порядке (little endian то бишь), в нашем случае длина 6CD0h. Запоминаем. Дальше листаем вниз до нужной композиции (перед первой композицией первые 4 байта в ASCII виде будут строчкой BFBA) - все композиции в сейве для DS стартуют с кратных 1000h позиций. Выделяем нужное количество байт - в данном случае 6CD0h байт. Что удобно - конец файла всегда выглядит одинаково. Дальше переходим в открытый M01Dn_00100000, выделяем все и вставляем скопированное, удаляя все, что было до этого. Теперь веселая часть - нужно отредактировать заголовок в песне, чтоб потом Korg в эмуляторе смог его прочесть. Для этого переходим в начало файла (для удобства лучше файл сохранить, чтоб изменения были виднее) и сначала по адресу 1F0h приводим строчку к этому виду: --- Код: ---73 6F 6E 67 00 00 00 00 00 00 00 00 73 6F 6E 67 --- Конец кода --- Важное уточнение: не убираем и заменяем по тому адресу, а именно дописываем еще один song и 8 нулей - сразу после song идет 4 байта с длиной композиции после заголовка Затем пятый байт в самом начале с 04 изменяем на 05. Далее снова выделяем всю композицию, исключив первые 4 байта - это чексумма и ее нужно пересчитать. В HxD жмем Анализ > Контрольные суммы..., выбираем Checksum-32 и жмем ОК. Снизу появится окошко с посчитанной суммой. Эту сумму мы берем и вписываем в первые 4 байта взамен старой суммы (не забывая про обратный порядок байтов) и сохраняем. Перед закрытием смотрим размер файла в hex-виде, эту цифру запоминаем и закрываем. Теперь переходим к M01Dn_00000000. Ищем S-01 и подставляем свой размер файла. Сохраняем, закрываем. Все готово. Снова переходим в эмулятор - если он был все это время открытый, то не забываем сначала перезапустить игру. Открываем файл в эмуляторе, надеемся на чудо, ибо я до этого всего допер случайно. Если открылся, то чудесно. Выходим в главное меню, тычем MIDI FILE EXPORT, выбираем свою композицию и вот здесь забираем свой m01d.mid --- Код: ---%appdata%\Roaming\Citra\sdmc\private\Nintendo 3DS\app\JKRE --- Конец кода --- который потом можно использовать уже в рабочих станциях типа FL Studio :cool: Добавлено позже: Теперь осталось только понять, по какому такому волшебству у меня вчера без правильной чексуммы открылись файлы. Хотя, если б не открылись, то я б так и не догадался, что и где менять (и далеко не факт, что я все правильно догадался, иногда все равно не подхватывает) |
| Valet2:
Ты мегамонстр! Теперь хочется послушать, что там ты намузицировал. |
| HayaoYokogawa:
Почесав репу, решил, что возня эта ручная с байтами меня не радует и в целом заметив некоторый успех обращения форумчан к ИИ для создания скриптов, захотел успех повторить сам. В целом на то, чтоб убедить DeepSeek сделать то, что мне надо, потребовалось часа три, но я хочу заметить, что мой опыт программирования на питоне равен полному нулю. Скрипт определенно требует полировки и доработки, чистки в конце концов, но он работает и выплевывает то, что нужно. Теперь достаточно скормить скрипту .sav с флеш-картриджа* или эмулятора* и на выходе получим папку с уже оформленными и порезанными песнями как в простом виде, так и для прямого подсовывания в эмулятор Citra. Если скрипту что-то не понравится, он ругнется. Используем так: --- Код: ---python korg_m01_extractor.py <сохранка.sav/.bin> --- Конец кода --- Сгенерируется две папки - songs и M01Dn_00000000. В папке songs песни с названиями, извлеченными из сохранения, уже подготовленные должным образом для всовывания в 3DS версию. В папке M01Dn_00000000 все то же самое, но с правильно сгенерированным списком и названиями. Содержимое папки копируем и вставляем по следующему пути с заменой: --- Код: ---%appdata%\Roaming\Citra\sdmc\Nintendo 3DS\00000000000000000000000000000000\00000000000000000000000000000000\extdata\00000000\00000F16\user --- Конец кода --- Дальше эмулятор перезапускаем и радуемся перенесенным песням в 3DS версию. * я не уверен, что все флеш-картриджи и эмуляторы создают сейвы одинаково, поэтому есть ненулевая вероятность, что скрипт не заработает, если структура сейва будет отличаться UPD: обратил внимание, что на файлах сейва, где присутствуют пустые песни, скрипт зависает (хотя и корректно создает другие файлы), завтра добавлю пару проверок, чтобы он завершался корректно. |
| HayaoYokogawa:
В процессе допиливания скрипта выяснил, что, в отличие от 3DS-версии, размер композиции в версии для DS ограничен ~48КБ (против ~72КБ) и композиции разнесены в сейве на C000h, начиная с 1000h. Скрипт допилен, теперь скрипт игнорирует пустые невалидные записи, проверяет наличие концовки и не виснет, если между валидными записями есть пустые песни. Добавлено позже: Ну конечно же, как только я начинаю разгребать структуру файла, я узнаю, что мой метод поиска конца файла некорректен. Скрипт позже допилю, чтобы убрать проверку по последним байтам, а то если кто-то вдруг что-то заполнит в последнем 99 паттерне, то скрипт будет ругаться, что файл неверной структуры :-\ |
| HayaoYokogawa:
Спешу представить вашему вниманию скрипт, который теперь берет композицию в сыром виде и сразу выплевывает рабочий МИДИ-файл - теперь не нужно запускать . В отличие от результата, который выплевывает официальный метод KORG в KORG M01D на 3DS, мой скрипт (написанный целиком и полностью ИИ, но все инфу по структуре файла, естественно, получал я сам) сразу назначает приблизительный инструмент и файл становится относительно слушабельным. Пока что барабаны назначает относительно рандомно (и вообще думаю сделать момент с назначением барабанов отключаемым), но планирую допилить скрипт, добавив более подробный список инструментов для назначения соответствий. Для запуска потребуется питон и библиотека MIDIUtil. --- Код: ---pip install midiutil --- Конец кода --- Используем так: --- Код: ---python korg2mid-v2.py <inputfile> <outputfile.mid> --- Конец кода --- Пока что понимает песни только в формате 3DS и только в раздельном виде, а там смещения слегка отличаются, но думаю допилить скрипт так, чтобы он мог делать сразу обе вещи - и конвертить в формат для 3DS, и MIDI выплевывать - ну вдруг кому на 3DS* захочется сконвертить-допилить мотивчик * буду благодарен, если меня кто ткнет носом в то место, где рассказывают о расшифровке-зашифровке файлов сохранений для 3DS - если, конечно, это вообще возможно |
| HayaoYokogawa:
Сага "Тупой и еще тупее варганят скрипт" (это я и нейросеть, конечно же) продолжается - с горем пополам научил скрипт переназначать барабаны в соответствии с выбранным банком и набором звуков (соответствия сочинял сам ИИ, в большинстве случаев должно подойти), но скрипт пока не выложу, потому что хочу доделать момент с более точным назначением инструментов, а скрипт по преобразованию в формат 3DS встроить в скрипт с конвертером, чтоб сразу сырой файл с DS он преобразовывал в набор готовых MIDI. Возможность конвертировать файлы с 3DS в MIDI сами по себе, конечно же, оставлю (а перед этим погуглю про расшифровку сейвов), но в большей степени имхо для владельцев 3DS нет такой сверхнужды получать сразу готовый файл :neznayu: |
| HayaoYokogawa:
Самое сложное позади - пятый (нет) вариант скрипта теперь сразу выплевывает всю пачку MIDI, если скормить ему сейвфайл (с расширением .sav) от DS и заодно конвертит на случай, если кому-то надо запихать в эмулятор/3DS :cool: По большому счету осталось все это дело отполировать и привести к более приличному виду и вручную поправить все подстановки инструментов, ибо местами ИИ навыдумывал лютой дичи, плюс выяснилось, что, хоть и при генерации MIDI используется корректный инструмент, выплевывается MIDI с инструментом c ID+1, из-за чего появляются какие-то дикие скрипки вместо бас-гитар , например :-\ |
| HayaoYokogawa:
Каким-то образом я забыл запостить здесь уже допиленный вариант с интерфейсом, который уже не такой допиленный, потому что я тут разбираюсь с Клодом и ожидаемо скрипт хоть и работал, но с некоторыми некритичными глюками. Параллельно добавил свистелки и перделки, сопоставление инструментов и барабанов более точное, прикручен взад парсинг эффектов (от которого толку будто бы и нет), добавлен piano roll, возможность прослушать результат перед экспортом, сменить назначенный инструмент на любом канале (кроме барабанов) квота на сегодня кончилась, потом допилю. Конвертер жрет как сейвы из 3DS версии - песни там хранятся отдельно, так и дамп сейва с DS-версии - можно выбирать любые композиции для экспорта, хоть все, хоть половину, хоть один. Экспорт в сыром виде на предмет переноса песен из DS в 3DS версию теперь опционален. Имейте ввиду, что реальная 3DS сейвы шифрует - как расшифровать хз, я этим вопросом не озадачивался. Требуется Python 3+, MIDIUtil, Pygame для запуска. Кто-то просил образец моего музицирования - приложу свой "взгляд" на Pleasure of Tension из Snatcher, который, страшно сказать, я делал еще в 2011 году. Не более, чем набросок :neznayu: |
| Moonsiner:
Забавно, ФЛ 2025 все треки перенаправляет в свой Flex и автоматом распределяет подходящие инструменты. ) даже ударный кит. ...но имхо, конечно я бы времени не терял, сразу начинал в ФЛ. У меня портативно даже с мобильной FL плохо идёт. Музыку приятней писать на стационарке. |
| HayaoYokogawa:
--- Цитата: Moonsiner от 25 Июля 2026, 22:05:07 ---Забавно, ФЛ 2025 все треки перенаправляет в свой Flex и автоматом распределяет подходящие инструменты. ) даже ударный кит. ...но имхо, конечно я бы времени не терял, сразу начинал в ФЛ. У меня портативно даже с мобильной FL плохо идёт. Музыку приятней писать на стационарке. --- Конец цитаты --- Ну, чтоб это произошло, нужно было при экспорте канал назначить :) Насчет "не терял времени" - ну, в 2011 году не было портативного фрутика, а в кармане у меня был Nokia E72. Вопрос в сохранении своего музыкального барахла в юзабельном виде. Очень нишевая нужда, конечно, но она есть. Мобильный фрутик мне не очень понравился, не такой удобный, еще и тормозный. А теперь у меня есть айпад и GarageBand, можно набросочки в удобном месте делать, а потом ручками доводить уже на игрушке посерьезнее (так и сделал со Spice Trip, айпад тоже неплохо инструменты назначил). И, кстати, на телефонах старых мидяшки с М01 звучат как дома :) Версия 2.0 Больше свистелок и больше перделок: - предпросмотр композиции перед экспортом - переназначение каналов перед экспортом (кроме барабанов) - дополнительно для проверки положил еще одну свою попытку подобрать тему из Star Control 2, года эдак с 2014-2015 Я тут репу почесал вчера и понял, что фигня это все с питоном - надо делать веб-приложение :lol: Добавлено позже: Веб-приложение сделать получилось, но пока испытываю некоторые траблы с воспроизведением МИДИ в браузере, а токены кончились :lol: И на мобиле стремновато выглядит :lol: Выложу потом допиленный html файл, хостите где хотите. :) |
| Moonsiner:
HayaoYokogawa, а, точно, там был выбор этих канальчиков.) Забавно, что она их не абы куда, а именно во флекс, этот свой новый. Он кстати как продвинутый сэмплюк очень даже неплох, особенно крякнутый со всеми библиотечками. о я в Garage band не работал, но пару лет во времена аймака сидел в Logic Pro X, она по ощущениям как его супер-полная версия.) Много там чего натворил, пока учился, и на ФЛ вернулся уже практически во всеоружии.) Насчет сохранений именно проектов и их миди-начинки - у ФЛ наверное идеальная обратная совместимость. Я открывал вот в этой 2025 какое-то старьё года аж 2013-го - пошло как родное. Так что если на долгие лета, то это лучше к ней. И почему это барахло? Давай-ка дописывай кавер на Снэтчера, не бросай.) Игра редкая, кавера ещё дефицитней. |
| HayaoYokogawa:
Веб-версия beta Проигрывание в браузере не работает :neznayu: Но конвертация работает, отображение нормальное как на мобилке, так и на пеке. Пользуйтесь, хостите, где хотите. :) Воспроизведение попробую разобрать как-нибудь попозже --- Цитата: Moonsiner от 26 Июля 2026, 15:59:54 ---о я в Garage band не работал, но пару лет во времена аймака сидел в Logic Pro X, она по ощущениям как его супер-полная версия.) Много там чего натворил, пока учился, и на ФЛ вернулся уже практически во всеоружии.) Насчет сохранений именно проектов и их миди-начинки - у ФЛ наверное идеальная обратная совместимость. Я открывал вот в этой 2025 какое-то старьё года аж 2013-го - пошло как родное. Так что если на долгие лета, то это лучше к ней. И почему это барахло? Давай-ка дописывай кавер на Снэтчера, не бросай.) Игра редкая, кавера ещё дефицитней. --- Конец цитаты --- Pleasure of Tension довольно короткая, там особо и не разгонишься. Плюс я как-то разучился с барабанами экспериментировать :lol: Да и в Снетчере (Sega CD) есть другая тема, которую я б хотел осилить, Faded Memories ;) |
| Moonsiner:
--- Цитата: HayaoYokogawa от 26 Июля 2026, 16:32:42 ---Плюс я как-то разучился с барабанами экспериментировать --- Конец цитаты --- Это нужна оптимальная драммашинка, чтоб без гемора. Бери старую-добрую FPC в FL - идеальнейший вариант в т.ч. для экспериментов, и если набираешь прям чисто свой сет. 32 мультисэмпловых позиции - за глаза, никогда по максимуму её не юзал. Прям в ней же и по микшеру раскидываешь, и правишь сходу, если подрезать сэмпл и т.д, и всё что угодно. У меня доходило до того, что даже тырил-записывал сэмплы из другой машины и проставлял в FPC - настолько мне в ней удобно. |
| HayaoYokogawa:
--- Цитата: Moonsiner от 26 Июля 2026, 19:13:19 ---Это нужна оптимальная драммашинка, чтоб без гемора. Бери старую-добрую FPC в FL - идеальнейший вариант в т.ч. для экспериментов, и если набираешь прям чисто свой сет. 32 мультисэмпловых позиции - за глаза, никогда по максимуму её не юзал. Прям в ней же и по микшеру раскидываешь, и правишь сходу, если подрезать сэмпл и т.д, и всё что угодно. У меня доходило до того, что даже тырил-записывал сэмплы из другой машины и проставлял в FPC - настолько мне в ней удобно. --- Конец цитаты --- Да не в этом суть, суть в рисунке барабанной партии :blush: Тем временем Веб-версия 1.0 • Все свистелки и перделки, что указаны выше, но теперь с рабочим предпросмотром; • Предпросмотр работает как и без подгрузки SF2 саундфонта (примитивные бип-буп), так и с ним (не примитивные бип-буп); • Вывод звука реализован через js-synthesizer и FluidSynth - можно положить рядом, чтоб не надеяться на то, что ссылки будут работать вечно; --- Код: ---mkdir vendor curl -o vendor/jszip.min.js https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js curl -o vendor/js-synthesizer.min.js https://cdn.jsdelivr.net/npm/js-synthesizer/dist/js-synthesizer.min.js curl -o vendor/libfluidsynth-2.4.6.js https://cdn.jsdelivr.net/npm/js-synthesizer/externals/libfluidsynth-2.4.6.js --- Конец кода --- • Рядом можно захостить и SF2, чтоб предпросмотр работал сразу из коробки - просто положите рядом любой sf2 и обзовите его "soundfont.sf2" • Пасхалочка/тест: жмакаем Preview без загрузки - слушаем сырой файл, сконверченный на лету. В архив положил маленький саундфонт на базе виндового и предзагруженные библиотеки. Добавлено позже: Ой, прошу пардону. Почему-то при загрузке с сервера воспроизведение не работает или работает через известное место, локально работает нормально. Починю и загружу заново Заменил файл, теперь все должно работать как надо :thumbup: |
| Навигация |
| Главная страница сообщений |