URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 2395
[ Назад ]

Исходное сообщение
"Конверция wav2midi, midi2wav + Timidity"

Отправлено mirya , 16-Дек-03 23:38 
  Цель этой нити - публичное обсуждение вышеуказанных алгоритмов. Я буду сюда кидать свои идеи. КТО МОЖЕТ! Подскажите - алгоритмы распознавания и софт (желательно opensource) по этой проблеме. Целевой язык конверторов - Java.

Содержание

Сообщения в этом обсуждении
"Конверция wav2midi, midi2wav + Timidity"
Отправлено mirya , 16-Дек-03 23:48 
План: я собираюсь вычавить алгоритм midi2wav из Timidity (C) и
  перекочать его в Java. Проблема в том, что Java не дает интерфейса
  для ввода выведенного МИДИ назад, чтобы использовать
  предустановленный софт (или хард - саундкарточку) для преобразования
  midi2wav, даже если карточка или соотв. ПО поддерживают такую
  возможность. Eric Welsh <ewelsh@ccb.wustl.edu>, что занимался
  оцифровкой муз. инструментов для известного набора GUS-патчей (см.
  ниже), к-рые были использованы в том же Timidity, мне на вопрос об
  использовании саундкарты для данной конверции ответил, что нужно
  взять шнур и подколючить вывод карты ко входу :/.
    Плюс, т.к. о софте и харде заказчика ничего не известно
  (осн. приницип программирования на Java - независимость от системы),
  то исходя из выше сказанного и того, что все найденные мною подобные
  решения основаны на собственном софтварном преобразовании, единственным
  выходом я вижу писать собсв. софтварный конвертор (фактически
  синтезатор) МИДИ:
    а). Кто ссылался на Java Sound API: его роль тут минимальна, разве
        что как удобная читалка-писалка форматов файлов.
    б). Софтварные "инструменты" хранятся в т.н. GUS-patches, у меня
        достаточно полный набор занимает 10M, его прийдется включить в пакет поставки.
    в). Конверция Timidity осложнена тем, что она UNIX'овая, у меня
        есть работающий бинарник (исполняемый файл) и исходники.
        Исходники кишат ошибками несовместимости, хотя мне и удалось
        закомпилировать ее под домашнюю FreeBSD-4.9 в отладочной инфой, программа
        усиленно выдает пустые wav'ы (только заголовок), компиляция
        нужна для отладки - выяснения логики (последовательности)
        работы этой программы.
/*
[Обращение к БСДшной братии]: у кого timidity-0.2i закомпилился, НАПИШИТЕ!!! Я брал исходники не из портов, а с офиц. сайта, кроме того, что они напутали с #include, gcc выдавал ошибку на такое:

static FILE *infp = stdin; // глобальный static - странный японский стиль

  насчет невозможности инициализации не-константой. В чем тут прикол?
*/
        Без отладки последовательность
        выполнения прийдется выяснять "руками", опираясь на текст
        исходников, это может быть долго.

    Далее: обратная конверция wav2midi сравнима с преобразованием
  растровой графики в векторную (надеюсь, такое сравнение понятно
  всем). Каждый инструмент миди есть приблизительно периодический
  график со всплеском вначале и затуханием к концу. В МИДИ-файле
  на него накладываются сила звука (это растягивает график по
  вертикали) и нота-частота (растягивает по горизонтали). Далее
  несколько таких кривых суммируются и получается график
  результирующего WAV. Обратная задача разложения этой кривой в
  несколько "инструментальных" кривых требует "угадывания" кол-ва и
  набора инструментов, частоты и громкости каждого из них. Особенно
  мешает частота, к-рая растягивает кривую по горизонтали. Без нее
  можно делать приближение, опираясь на то, что период графика
  инструмента постоянный. Так что в любом случае получиться ну оочень
  приближенный вариант конверции.
    Насчет квантирования (разбиения миди на малые временные отрезки) -
  это, конечно, увеличит качество, но при малых отрезках размер МИДИ
  файла будет расти как на навозе, причем МИДИ синтезатор будет просто
  захлебываться от частоты передачи комманд. При определенном пороге
  он вообще не будет успевать принимать комманды и музыка превратиться
  в набор отрывистых нот.


"Конверция wav2midi, midi2wav + Timidity"
Отправлено kpanic , 17-Дек-03 13:32 
Для конвертирования wav в midi попробуй использовать нейросети. Сеть обучается на чистых примерах из GUS патчей. Потом сеть _возможно_ сможет распознавать как растянутые по амплитуде, так и по частоте сэмплы. В этом случае не надо будет угадывать количество инструментов: при этом будут активироваться те выходы сети, на которые больше все похож текущий фрагмент.

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


"Конверция wav2midi, midi2wav + Timidity"
Отправлено kpanic , 17-Дек-03 13:38 
PS: обучение нейросети достаточно тормознутая вещь. Его лучше бы сделать не на Яве, а, например, на С. Сеть обучается один раз, а потом будешь юзать получившиеся веса из программы на Java.