Hello and thanks for this really inspiring work! I've been studying your model and really like the idea of formulating note on and note off events in text and then using a language model to predict sequences--that seems more promising than using full numeric arrays for training!
I have just a quick question on some of the training data included here. I think I'm missing something, because it seems like there are far more note_on events than note_off events in the training data files. Take for example Bach_2PartInv_No1_in_C_BWV772.mid. The midi file looks great:
Here's the corresponding model input file within the notewise data tarball you included (piano_solo/note_range38/sample_freq4/bach/Bach_2PartInv_No1_in_C_BWV772.txt):
This prints (5464, 5297), which means there are a good number of notes that are pressed but never released. I used the following little routine to convert this string back to midi:
from collections import defaultdict
import mido, os
def string_to_midi(s, time_multiplier=140, velocity=70):
mid = mido.MidiFile()
mid.tracks.append(mido.midifiles.tracks.MidiTrack()) # create type 0 midi file
t = 0
for i in s.split():
message_type = 'note_on'
if i.startswith('wait'):
t += int(i.lstrip('wait')) * time_multiplier
continue
# process note
if i.startswith('end'):
i = i.replace('end', '')
message_type = 'note_off'
instrument = i[0]
note = int(''.join(i[1:])) + (3*12) # bump the note up a few octaves
# add the event to the midi file track
mid.tracks[0].append(mido.Message(message_type, note=note, velocity=velocity, time=t))
t = 0
return mid
mid = string_to_midi(s)
mid.save('sample-output.mid')
os.system('open {}'.format('sample-output.mid'))
This midi eventually gets populated with nearly all of the keys in the mode of the piece. I checked a few of the other training data files included in this repo using the same count method, and every one I checked seemed to have more note_on events than note_off events, which suggested that I must be missing something as your ultimate results are fantastic...
I saw that there's some logic to assign a static duration to note_on events that are never turned off in predicted data, but I didn't see any similar logic for handling unended notes in the training data. Am I missing something? Any pointers you can offer would be hugely appreciated!
Hello and thanks for this really inspiring work! I've been studying your model and really like the idea of formulating note on and note off events in text and then using a language model to predict sequences--that seems more promising than using full numeric arrays for training!
I have just a quick question on some of the training data included here. I think I'm missing something, because it seems like there are far more note_on events than note_off events in the training data files. Take for example Bach_2PartInv_No1_in_C_BWV772.mid. The midi file looks great:
Here's the corresponding model input file within the notewise data tarball you included (piano_solo/note_range38/sample_freq4/bach/Bach_2PartInv_No1_in_C_BWV772.txt):
This prints
(5464, 5297)
, which means there are a good number of notes that are pressed but never released. I used the following little routine to convert this string back to midi:This midi eventually gets populated with nearly all of the keys in the mode of the piece. I checked a few of the other training data files included in this repo using the same count method, and every one I checked seemed to have more note_on events than note_off events, which suggested that I must be missing something as your ultimate results are fantastic...
I saw that there's some logic to assign a static duration to note_on events that are never turned off in predicted data, but I didn't see any similar logic for handling unended notes in the training data. Am I missing something? Any pointers you can offer would be hugely appreciated!