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