Автор Тема: [NDS] KORG M01 Music Workstation - извлечение созданной музыки  (Прочитано 4175 раз)

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

Оффлайн HayaoYokogawa

  • Пользователь
  • Сообщений: 2184
  • Пол: Мужской
  • большой и толстый розовый динозавр
    • Просмотр профиля
Сабж.

Собственно, KORG M01 - не совсем игра, но она вышла уже давненько на DS и является вполне неплохой, на мой взгляд, музыкальной станции (на самом деле "эмулятор" реально существовавшего синтезатора/музыкальной станции в 80-х).
Вот в чем проблема, пусть и скорее надуманная, но вполне меня волнующая - мне хочется извлечь хоть что-то похожее на "готовый" файл из сохранения, чтобы попробовать перенести это в FLStudio; хотя бы чуточку проще, чем вручную пересоздавать мелодию в ФЛ.
Возможно ли? Кто что думает?

ЗЫ. В теории там должно быть что-то похожее на отдельные файлы, ибо в этом "синтюке" есть возможность обмениваться музыкой между ДСками.

Оффлайн SILENT_Pavel

  • Пользователь
  • Сообщений: 2732
    • Youtube
    • Просмотр профиля
Возможно ли? Кто что думает?

ЗЫ. В теории там должно быть что-то похожее на отдельные файлы, ибо в этом "синтюке" есть возможность обмениваться музыкой между ДСками.
Не очень знаком со спецификой NDS, но кое что изучал по вытаскиванию трекерной музыки из некоторых пс1 игр. Нужно уточнить игра сохраняет эти мелодии куда-то? В ндс внутреняя память или сохранения игр на внешней карте памяти? Или ты вообще на пк эмуляторе играешь? Если на пк - опять же что из себя представляет файл сохранения?

Оффлайн HayaoYokogawa

  • Пользователь
  • Сообщений: 2184
  • Пол: Мужской
  • большой и толстый розовый динозавр
    • Просмотр профиля
Не очень знаком со спецификой NDS, но кое что изучал по вытаскиванию трекерной музыки из некоторых пс1 игр. Нужно уточнить игра сохраняет эти мелодии куда-то? В ндс внутреняя память или сохранения игр на внешней карте памяти? Или ты вообще на пк эмуляторе играешь? Если на пк - опять же что из себя представляет файл сохранения?

Эмулятор эмулирует, но звуки/сэмплы не воспроизводит корректно. Мелодии сохраняются в файле сохранения, то есть отдельно. Файл сохранения - sav, с консоли

Добавлено позже:
Ну что, спустя 11 лет я сообразил, как извлечь мидяшки из DS-версии, используя 3DS-версию, эмулятор и HEX-редактор!  :wow:
Изложить метод попробую попозже, пока настолько тут в шоке от своей гениальности (шутка юмора, конечно), что мозг резко перестал варить  :lol:
« Последнее редактирование: 26 Апрель 2025, 22:12:38 от ghostdog3 »

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2656
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
не в курсе про эти ваши NDS'ы... но предположил бы что по идее должен быть способ записывать в вгм файл звук с сей приблуды.

Добавлено позже:
эм... походу нет. полистал - вроде не фм синтез. тогда не очень чтобы уж заработает сей метод :)
« Последнее редактирование: 24 Апрель 2025, 17:12:54 от SeregaZ »

Оффлайн HayaoYokogawa

  • Пользователь
  • Сообщений: 2184
  • Пол: Мужской
  • большой и толстый розовый динозавр
    • Просмотр профиля
не в курсе про эти ваши 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 я еще одну композицию-то выкопал, а все остальное так просто не выносится. Прошу пардону, что говорю загадками и без файлов, уже спать собираюсь, завтра свои наблюдения точно уже с картинками и файлами покажу.
« Последнее редактирование: 26 Апрель 2025, 22:12:57 от ghostdog3 »

Оффлайн HayaoYokogawa

  • Пользователь
  • Сообщений: 2184
  • Пол: Мужской
  • большой и толстый розовый динозавр
    • Просмотр профиля
Все, победил, дело было не в бобине  :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:

Добавлено позже:
Теперь осталось только понять, по какому такому волшебству у меня вчера без правильной чексуммы открылись файлы. Хотя, если б не открылись, то я б так и не догадался, что и где менять (и далеко не факт, что я все правильно догадался, иногда все равно не подхватывает)
« Последнее редактирование: 25 Апрель 2025, 17:10:43 от HayaoYokogawa »

Оффлайн Valet2

  • Пользователь
  • Сообщений: 687
    • Просмотр профиля
Ты мегамонстр! Теперь хочется послушать, что там ты намузицировал.

Оффлайн HayaoYokogawa

  • Пользователь
  • Сообщений: 2184
  • Пол: Мужской
  • большой и толстый розовый динозавр
    • Просмотр профиля
Почесав репу, решил, что возня эта ручная с байтами меня не радует и в целом заметив некоторый успех обращения форумчан к ИИ для создания скриптов, захотел успех повторить сам. В целом на то, чтоб убедить 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: обратил внимание, что на файлах сейва, где присутствуют пустые песни, скрипт зависает (хотя и корректно создает другие файлы), завтра добавлю пару проверок, чтобы он завершался корректно.
« Последнее редактирование: 30 Апрель 2025, 22:54:03 от HayaoYokogawa »

Оффлайн HayaoYokogawa

  • Пользователь
  • Сообщений: 2184
  • Пол: Мужской
  • большой и толстый розовый динозавр
    • Просмотр профиля
В процессе допиливания скрипта выяснил, что, в отличие от 3DS-версии, размер композиции в версии для DS ограничен ~48КБ (против ~72КБ) и композиции разнесены в сейве на C000h, начиная с 1000h.

Скрипт допилен, теперь скрипт игнорирует пустые невалидные записи, проверяет наличие концовки и не виснет, если между валидными записями есть пустые песни.

Добавлено позже:
Ну конечно же, как только я начинаю разгребать структуру файла, я узнаю, что мой метод поиска конца файла некорректен. Скрипт позже допилю, чтобы убрать проверку по последним байтам, а то если кто-то вдруг что-то заполнит в последнем 99 паттерне, то скрипт будет ругаться, что файл неверной структуры   :-\
« Последнее редактирование: 01 Май 2025, 14:26:52 от HayaoYokogawa »

Оффлайн HayaoYokogawa

  • Пользователь
  • Сообщений: 2184
  • Пол: Мужской
  • большой и толстый розовый динозавр
    • Просмотр профиля
Спешу представить вашему вниманию скрипт, который теперь берет композицию в сыром виде и сразу выплевывает рабочий МИДИ-файл - теперь не нужно запускать .

В отличие от результата, который выплевывает официальный метод KORG в KORG M01D на 3DS, мой скрипт (написанный целиком и полностью ИИ, но все инфу по структуре файла, естественно, получал я сам) сразу назначает приблизительный инструмент и файл становится относительно слушабельным.
Пока что барабаны назначает относительно рандомно (и вообще думаю сделать момент с назначением барабанов отключаемым), но планирую допилить скрипт, добавив более подробный список инструментов для назначения соответствий.

Для запуска потребуется питон и библиотека MIDIUtil.
pip install midiutil
Используем так:
python korg2mid-v2.py <inputfile> <outputfile.mid>
Пока что понимает песни только в формате 3DS и только в раздельном виде, а там смещения слегка отличаются, но думаю допилить скрипт так, чтобы он мог делать сразу обе вещи - и конвертить в формат для 3DS, и MIDI выплевывать - ну вдруг кому на 3DS* захочется сконвертить-допилить мотивчик

* буду благодарен, если меня кто ткнет носом в то место, где рассказывают о расшифровке-зашифровке файлов сохранений для 3DS - если, конечно, это вообще возможно

Оффлайн HayaoYokogawa

  • Пользователь
  • Сообщений: 2184
  • Пол: Мужской
  • большой и толстый розовый динозавр
    • Просмотр профиля
Сага "Тупой и еще тупее варганят скрипт" (это я и нейросеть, конечно же) продолжается - с горем пополам научил скрипт переназначать барабаны в соответствии с выбранным банком и набором звуков (соответствия сочинял сам ИИ, в большинстве случаев должно подойти), но скрипт пока не выложу, потому что хочу доделать момент с более точным назначением инструментов, а скрипт по преобразованию в формат 3DS встроить в скрипт с конвертером, чтоб сразу сырой файл с DS он преобразовывал в набор готовых MIDI.
Возможность конвертировать файлы с 3DS в MIDI сами по себе, конечно же, оставлю (а перед этим погуглю про расшифровку сейвов), но в большей степени имхо для владельцев 3DS нет такой сверхнужды получать сразу готовый файл  :neznayu:

Оффлайн HayaoYokogawa

  • Пользователь
  • Сообщений: 2184
  • Пол: Мужской
  • большой и толстый розовый динозавр
    • Просмотр профиля
Самое сложное позади - пятый (нет) вариант скрипта теперь сразу выплевывает всю пачку MIDI, если скормить ему сейвфайл (с расширением .sav) от DS и заодно конвертит на случай, если кому-то надо запихать в эмулятор/3DS  :cool:

По большому счету осталось все это дело отполировать и привести к более приличному виду и вручную поправить все подстановки инструментов, ибо местами ИИ навыдумывал лютой дичи, плюс выяснилось, что, хоть и при генерации MIDI используется корректный инструмент, выплевывается MIDI с инструментом c ID+1, из-за чего появляются какие-то дикие скрипки вместо бас-гитар , например  :-\