Разработка и ромхакинг > Инструменты
[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:
Навигация
Главная страница сообщений

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