Преобразование MIDI-файла в исходное аудио с помощью программного синтезатора

Я пытаюсь динамически генерировать небольшой MP4 аудио + видео файл непосредственно из моего приложения Android.

Мой первоначальный план атаки:

  1. Пользователь вводит некоторые базовые данные песни (последовательность аккордов и т. Д.), И приложение создает файл MIDI.

  2. Система строит диаграммы аккордов для каждого аккорда, а с помощью MIDI-считывателя он генерирует массив кадров анимации, который синхронизирован с MIDI

  3. Преобразуйте MIDI в исходные аудио данные PCM <- этот вопрос SO относится к этой точке

  4. Применение необработанного звука к кадрам анимации – и кодирование аудио и видео кадров в MP4

  5. Предоставьте полученное видео MP4 пользователю со стандартными элементами управления воспроизведением.

Приложение уже создает MIDI-файл на основе пользовательских входов, включая темп, инструмент, заметки и т. Д. Эта часть выполняется легко, и файл MIDI генерируется правильно. Этот MIDI-плеер отлично воспроизводится на платформе MediaPlayer от Android. (шаг 1)

Кадры анимации также создаются правильно, считывая файл MIDI и перекрестно ссылаясь на список статических растровых изображений для каждого аккорда в последовательности. Эти кадры станут видео … но сначала будут без звука. (шаг 2)

Как вы можете видеть, проблемы с задержкой для Android MIDI для меня не так много, потому что я не создаю приложение синтезатора в реальном времени … Я просто хочу преобразовать MIDI в какой-то аудиоформат, который затем можно смешать В видео, которое уже приурочено к оригиналу MIDI. (шаг 3)


Проблема, с которой я столкнулся, – это шаг 3.

Я понимаю, что мне нужно использовать программный MIDI-синтезатор для получения фактического аудиовыхода, который будет создан из последовательности MIDI-событий. Однако, чтобы это правильно работало, стало серьезным препятствием. Я не забочусь о точном качестве получаемого звука, просто так, чтобы он соответствовал тому, что кто-то ожидал бы, если бы они использовали образцы General MIDI из универсального устройства (звуковые саунты Grava или шуточные звуки Sovinox и т. Д.).

Так…

  1. Android MIDI Lib

  2. Android Midi Driver, используя Sonivox EAS Library

Моя первая попытка заключалась в двух вышеупомянутых проектах … размалывать их таким образом, чтобы MIDI-файл мог быть преобразован в буферизированный буфер данных PCM … он еще не прошел так хорошо.

Миди-библиотека (1) читает MIDI-файл с прослушивателем в режиме реального времени и отправляет события в Midi Driver (2), который воспроизводит исходные данные PCM, созданные встроенным синтезатором.

(ПРИМЕЧАНИЕ. Несколько изменений было сделано для драйвера, чтобы весь буфер был сохранен и возвращался только после завершения чтения MIDI-файла. Это также означает, что весь процесс занимает определенное время, равное длине песни, чтобы преобразовать ее Потому что мы «слушаем» в режиме реального времени.)

Мне еще нужно, чтобы это работало, как я надеялся. Я хотел сохранить это как можно более простым и предпочитаю использовать проекты с открытым исходным кодом, если это вообще возможно. Было бы лучше, если бы он мог сделать это, не полагаясь на слушателей в режиме реального времени.


Некоторые другие библиотеки и инструменты, которые я рассматривал (но может быть переполнен):

  1. Чистая библиотека данных для Android

  2. Приложение MidiSheetMusic (с исходным кодом)

  3. Synthesis ToolKit в C ++ (STK)

  4. Музыкальный синтезатор для Android

  5. Crimson SoftSynth

ДАЖЕ БОЛЬШЕ КОНТЕНДЕРОВ (пока еще не сделано много исследований):

JFugue / нерешительность / дерзость / FluidSynth / Csound / jMusic / JSyn / Gervill / Русификатор / Едкое / LibGDX / JetPlayer / OpenSL-ES


Мои вопросы:

  • Я работаю по правильному пути с вышеупомянутыми проектами? Я относительно новичок в преобразовании MIDI-> PCM, поэтому я хочу убедиться, что я ничего не теряю.

  • Если нет, как мне перейти на преобразование MIDI-файла в какой-то аудиоформат, который затем может быть использован при создании MP4 (или в любом формате воспроизведения видео)?

  • Существуют ли другие проекты с открытым исходным кодом, которые могут быть полезны в этой задаче преобразования звуковых сигналов MIDI 2 с использованием Android?

  • И есть ли примеры такой задачи, уже написанной для использования на Android? (То есть уже портирован для использования с Android JNI и т. Д.),

Я надеюсь, что я полностью упустил что-то, что сделает это тривиальной задачей … мое предположение заключается в том, что это приведет к серьезному взлому и кунг-фу JNI.

Я открыт для того, чтобы идти по тяжелой дороге, если это то, что нужно. Будут оценены все советы.

Solutions Collecting From Web of "Преобразование MIDI-файла в исходное аудио с помощью программного синтезатора"

Я не являюсь пользователем Android, но я пробовал много способов генерировать WAV-файлы с MIDI, и я больше счастлив в этой задаче с FluidSynth, который, кажется, доступен как библиотека для Android, и это точка Этот другой вопрос StackOverflow: использование Fluidsynth для воспроизведения заметок от SoundFonts на Android .

Вам просто нужно знать о звуковых шрифтах (поиск в Интернете легко скажет вам) и выбрать хороший, который не слишком велик (в противном случае у вас может быть нехватка памяти).

Также проверьте, что звуковой шрифт охватывает все инструменты, которые вы хотите воспроизводить.