Как векторизовать миди-вход?

Я хочу создать модель LSTM (с использованием Keras), которая будет обучаться музыке, но мне трудно векторизовать миди-вход. Я попытался использовать библиотеку 'Mido' в Python, откуда я смог извлечь данные в следующем формате:

note_on channel=0 note=72 velocity=50 time=0
note_on channel=0 note=38 velocity=50 time=0.1171875
note_off channel=0 note=80 velocity=0 time=0.1171875
note_off channel=0 note=41 velocity=0 time=0

Я превращаю его в массив

[note_number, velocity, time]

где скорость обозначает скорость и является ли она note_on \ note_off. Теперь проблема в том, как мне кормить время здесь, я имею в виду время в тиках (я думаю). Как мне преобразовать эти тики в секунды, и как я передам этот массив в последовательную модель, как я снова преобразую время в тики из выходных данных?

1 ответ

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

Показанные вами значения времени не могут быть тиками. Тики должны быть целочисленными значениями. Не видя ваш код, я не знаю, каковы эти значения, но я предполагаю, что Mido конвертируется в секунды.

Тики, как правило, основаны на квартальных нотах, а не на времени. Длина во времени четвертной ноты (и, следовательно, тактов) зависит от текущего темпа, который устанавливается мета-событием Set Tempo.

Я думаю, что вы выиграете от времени, потраченного на лучшее понимание файлов MIDI Документация Mido по файлам MIDI - хорошее место для начала. Существует множество объяснений MIDI-файлов (таких как этот).

Надеюсь, это поможет вам на правильном пути. Если у вас по-прежнему возникают проблемы, опубликуйте новый вопрос с примером кода Minimal, Complete и Verifiable, который иллюстрирует вашу проблему.

Другие вопросы по тегам