2 votes

Comment puis-je itérer à travers un objet accord de music21 et ajouter chaque note de l'accord ensemble, et stocker l'accord entier dans une liste comme un seul élément ?

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']

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X