J'essaie donc d'analyser une chanson MIDI en utilisant la bibliothèque Music21. Cette chanson contient des notes de durées variables, des accords et des silences. Je veux être capable d'analyser la chanson et de vérifier si l'événement MIDI est une note, et si oui, de stocker son numéro MIDI et sa durée (quart de longueur) dans une liste. Je veux également vérifier s'il s'agit d'un accord, et si c'est le cas, stocker l'accord et sa durée dans la liste.
Le format que j'ai décidé de donner à l'accord est essentiellement constitué de toutes les notes MIDI qui le composent, réunies par un "." A la fin, j'aimerais que la liste qui contient tous les accords, notes et durées ressemble à quelque chose comme ceci :
["note/chord1 duration1",
"note/chord2 duration2",
...]
Par exemple :
song =
["65 1.0", #(note, duration)
"65.71.66 0.5", #(chord, duration)
"59 2.0",
"59.60 1.5",
...]
Toute aide à ce sujet serait appréciée, ou toute explication sur ce qui ne va pas dans mon approche serait également appréciée.
Voici ce que j'ai déjà tenté. Le vrai problème se situe au niveau de la deuxième instruction elif de la boucle for ; j'obtiens des résultats étranges qui ne sont pas souhaités.
file = "song.mid"
midi_song = converter.parse(file)
print("Parsing %s" % file)
notes_to_parse = None
try: # file has instrument parts
s2 = instrument.partitionByInstrument(midi_song)
notes_to_parse = s2.parts[0].recurse()
except: # file has notes in a flat structure
notes_to_parse = midi.flat.notes
for element in notes_to_parse:
if isinstance(element, note.Note):
midi_number.append(str(element.pitch.midi) + " " + str(element.quarterLength))
elif isinstance(element, chord.Chord):
midi_chord_number.append(".".join(str(n.pitch.midi) for n in element) + " " + str(element.quarterLength))
elif isinstance(element, note.Rest):
notes.append(str(element.name) + " " + str(element.quarterLength))
La sortie devrait contenir la représentation numérique MIDI de la note ou de l'accord rencontré, mais il semble qu'elle duplique un grand nombre des mêmes notes :
['69.73.76',
'69.73.76',
'69.73.76 4/3',
'69.73.76 4/3',
'69.73.76 1.75',
'69.73.76 1.75',
'69.73.76 0.75',
'69.73.76 0.75',
'69.73.76 0.75',
'69.73.76 0.75',
'69.73.76 4/3',
'69.73.76 4/3',
'69.73.76 4/3',
'69.73.76 4/3',
'69.73.76 1.0',
'69.73.76 1.0',
'69.73.76 1.0',
'69.73.76 1.0',
'69.73.76 1.0',
'69.73.76 1.0',
'69.73.76 8/3',
'69.73.76 1.0',
'69.73.76 4/3',
'69.73.76 2.0',
'69.73.76 8/3',
'69.73.76 1.0',
'69.73.76 4/3',
'69.73.76 2.0',
'62.70 4/3',
'62.70 4/3',
'62.70 1.75',
'62.70 1.75',
'62.70 0.75',
'62.70 0.75',
'62.70 0.75',
'62.70 0.75',
'62.70 4/3',
'62.70 4/3',
'62.70 4/3',
'62.70 4/3',
'62.70 1.0',
'62.70 1.0',
'62.70 1.0',
'62.70 1.0',
'62.70 1.0',
'62.70 1.0',
'62.70 8/3',
'62.70 1.0',
'62.70 4/3',
'62.70 2.0',
'62.70 8/3',
'62.70 1.0',
'62.70 4/3',
'62.70 2.0',
'62.70 4/3',
'62.70 4/3',
'60.69 1.75',
'60.69 1.75',
'60.69 0.75',
'60.69 0.75',
'62.71 0.75',
'62.71 0.75',
'64.72 4/3',
'64.72 4/3',
'62.70 4/3',
'62.70 4/3',
'60.69 1.0',
'60.69 1.0',
'60.69 1.0',
'60.69 1.0',
'62.71 1.0',
'62.71 1.0',
'55.60 8/3',
'64.72.79 1.0',
'67.60 4/3',
'36.48 2.0',
'55.60 8/3',
'64.72.79 1.0',
'67.60 4/3',
'36.48 2.0',
'62.70 4/3',
'62.70 4/3',
'60.69 1.75',
'60.69 1.75',
'60.69 0.75',
'60.69 0.75',
'62.71 0.75',
'62.71 0.75',
'64.72 4/3',
'64.72 4/3',
'62.70 4/3',
'62.70 4/3',
'60.69 1.0',
'60.69 1.0',
'60.69 1.0',
'60.69 1.0',
'62.71 1.0',
'62.71 1.0',
'55.60 8/3',
'64.72.79 1.0',
'67.60 4/3',
'36.48 2.0',
'55.60 8/3',
'64.72.79 1.0',
'67.60 4/3',
'36.48 2.0',
'62.70 4/3',
'62.70 4/3',
'60.69 1.75',
'60.69 1.75',
'60.69 0.75',
'60.69 0.75',
'62.71 0.75',
'62.71 0.75',
'64.72 4/3',
'64.72 4/3',
'62.70 4/3',
'62.70 4/3',
'60.69 1.0',
'60.69 1.0',
'60.69 1.0',
'60.69 1.0',
'62.71 1.0',
'62.71 1.0',
'55.60 8/3',
'64.72.79 1.0',
'67.60 4/3',
'36.48 2.0',
'55.60 8/3',
'64.72.79 1.0',
'67.60 4/3',
'36.48 2.0']