Я хочу преобразовать последовательность нот (определенную по времени, продолжительности, высоте тона) в аудио-файл. Для этого я подумал сначала создать midi, а затем скомпилировать его в wav - это путь к go.
Я довольно новичок в обработке аудио и MIDI-файлах, поэтому, хотя я прочитал несколько учебных пособий, возможно, я не понял суть.
Редактировать: я нашел проблема, см. решение ниже.
В чем проблема
Запись заметок в определенное время c с определенной продолжительностью c через python MIDIUtil
не работает должным образом. Фактически, время в секундах, в которое размещается нота, сильно зависит от ударов в минуту на дорожке, хотя я думаю, что я учел удары в минуту при преобразовании времени ноты в такт MIDI в четвертных нотах.
Что я пробовал
Я создаю MIDI-трек с заданным бит / мин. Затем я конвертирую время события заметки через t_{quarter} = t_{seconds} * bpm/60
Пример
Я пишу со следующим кодом две заметки, последняя в t = 5 секунд с продолжительностью 1 с; то есть я ожидаю MIDI-файл продолжительностью 6 секунд. Но при bpm = 600 длина файла составляет 14 с. При 100 ударов в минуту это почти ожидаемые 6 с.
Вот мой код
from midiutil import MIDIFile
def convert_seconds_to_quarter(time_in_sec, bpm):
quarter_per_second = (bpm/60)
time_in_quarter = time_in_sec * quarter_per_second
return time_in_quarter
def write_test_midi():
bpm = 600
MyMIDI = MIDIFile(1)
MyMIDI.addTrackName(track=0, time=0, trackName="Sample Track")
MyMIDI.addTempo(track=0, time=0, tempo=bpm)
MyMIDI.addNote(track=0, channel=0, pitch=60,
time=convert_seconds_to_quarter(1, bpm),
duration=convert_seconds_to_quarter(1, bpm), volume=100)
MyMIDI.addNote(track=0, channel=0, pitch=60,
time=convert_seconds_to_quarter(5, bpm),
duration=convert_seconds_to_quarter(1, bpm), volume=100)
with open("/tmp/output.mid", 'wb') as binfile:
MyMIDI.writeFile(binfile)
Дополнительная информация
Шестнадцатеричное содержимое файла с bpm=100
:
ADDRESS 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f ASCII
00000010 4d 54 68 64 00 00 00 06 00 01 00 02 03 c0 4d 54 MThd..........MT
00000020 72 6b 00 00 00 0b 00 ff 51 03 09 27 c0 00 ff 2f rk......Q..'.../
00000030 00 4d 54 72 6b 00 00 00 28 00 ff 03 0c 53 61 6d .MTrk...(....Sam
00000040 70 6c 65 20 54 72 61 63 6b 8c 40 90 3c 64 8c 40 ple.Track.@.<d.@
00000050 80 3c 64 a5 40 90 3c 64 8c 40 80 3c 64 00 ff 2f .<d.@.<d.@.<d../
00000060 00 00 00 00 .
Содержимое файла с bpm=600
:
ADDRESS 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f ASCII
00000010 4d 54 68 64 00 00 00 06 00 01 00 02 03 c0 4d 54 MThd..........MT
00000020 72 6b 00 00 00 0b 00 ff 51 03 01 86 a0 00 ff 2f rk......Q....../
00000030 00 4d 54 72 6b 00 00 00 29 00 ff 03 0c 53 61 6d .MTrk...)....Sam
00000040 70 6c 65 20 54 72 61 63 6b cb 00 90 3c 64 cb 00 ple.Track...<d..
00000050 80 3c 64 81 e1 00 90 3c 64 cb 00 80 3c 64 00 ff .<d....<d...<d..
00000060 2f 00 00 00 /.
Решение
Код, функция преобразования и файлы, которые я разместил, верны. Проблема была в плеере VL C, который я привык слушать миди.