добавление MIDI-аккордов в определенное время MetaMessage
У меня есть файл MIDI с маркером в виде мета-сообщений.
fname = "avm.mid"
mid = MidiFile(fname) # input file of type 0
metas = [m for m in mid.tracks[0] if m.is_meta]
Я сохранил время мета-маркера в списке "chordTimes". Первый мейкер (позиция аккорда) не начинается с 0. Я создаю новый файл MIDI:
mo = MidiFile(type =1)# output file
track = MidiTrack()
Теперь я просматриваю список желаемых аккордов и добавляю их в новый трек, который нужно добавить в mo.
for i in range(0, len(chords)-1):
chordInfo = chordMidiNotes(chords[i], extraBass= False)
chordNotes = chordInfo[0]
# append to track note on messages
if i != 0:
for note_value in chordNotes: # result has chord notes
track.append(Message('note_on', note=note_value, velocity=100, time=0))
else:
for j,note_value in enumerate(chordNotes): # result has chord notes
if j == 0:
track.append(Message('note_on', note=note_value, velocity=100, time=chordTimes[0]))
else:
track.append(Message('note_on', note=note_value, velocity=100, time=0))
# append to track note off messages
for k,note_value in enumerate(chordNotes): # result has chord notes
if k == 0:
track.append(Message('note_off', note=note_value, velocity=127, time=chordTimes[i+1]))
else:
track.append(Message('note_off', note=note_value, velocity=127, time=0))
# now adding track to output file
mo.tracks.append(mid.tracks[0])
mo.tracks.append(track)
mo.save("songWithChords.mid")
Но когда я его показываю, аккорды кажутся неправильными, в неправильном положении и выглядят намного длиннее (примерно в 3 раза), чем исходный. Я проверил заголовок вывода:
<meta message time_signature numerator=4 denominator=4 clocks_per_click=24 notated_32nd_notes_per_beat=8 time=0>,
Любая помощь будет принята с благодарностью.
1 ответ
Вы можете использоватьpretty_midi
илиmiditoolkits
или вы можете создать список заметок по абсолютному положению.
Атрибут времени вMessage
MIDI — это относительное время, что означает начало текущего события после «времени».