def testText(self): #import pdb; pdb.set_trace() text = "2016(C) MCW" MyMIDI = MIDIFile(1) MyMIDI.addText(0, 0, text) MyMIDI.close() payload_encoded = text.encode("ISO-8859-1") payloadLength = len(payload_encoded) payloadLengthVar = writeVarLength(payloadLength) data = Decoder(MyMIDI.tracks[1].MIDIdata) self.assertEqual(MyMIDI.tracks[1].MIDIEventList[0].type, 'Text') self.assertEqual(data.unpack_into_byte(0), 0x00) # time self.assertEqual(data.unpack_into_byte(1), 0xff) # Code self.assertEqual(data.unpack_into_byte(2), 0x01) # Subcode index = 3 for i in range(len(payloadLengthVar)): self.assertEqual(data.unpack_into_byte(index), payloadLengthVar[i]) index = index + 1 for i in range(len(payload_encoded)): if sys.version_info < (3, ): test_char = ord(payload_encoded[i]) else: test_char = payload_encoded[i] self.assertEqual(data.unpack_into_byte(index), test_char) index = index + 1
class Midi: """Musique midi""" def __init__(self, partition, titre, tempo): # Définition des paramètres MIDI. piste = 0 temps = 0 self.tempo = tempo / 2 self.sortiemidi = MIDIFile(1, file_format=1) # Nom de la piste. self.sortiemidi.addTrackName(piste, temps, sansaccents(titre)) # Tempo. self.sortiemidi.addTempo(piste, temps, self.tempo) # Instrument (74 : flûte). self.sortiemidi.addProgramChange(piste, 0, temps, 74) self.traiter_partition(partition, piste, temps) def traiter_partition(self, partition, piste, temps): """Création des évènements MIDI""" transposition = partition.transposition channel = 0 volume = 127 for mot in partition: for i, syllabe in enumerate(mot): syl = str(syllabe) if i + 1 < len(mot): syl = syl + '-' for j, note in enumerate( notes for notes in syllabe.musique if isinstance(notes, Note) ): pitch = note.hauteur + transposition duree = int(note.duree) self.sortiemidi.addTempo( piste, temps, (self.tempo * duree / note.duree) ) self.sortiemidi.addNote( piste, channel, pitch, temps, duree / 2, volume ) if j == 0: self.sortiemidi.addText( piste, temps, syl ) temps += duree / 2 def ecrire(self, chemin): """Écriture effective du fichier MIDI""" with ( open(sys.stdout.fileno(), 'wb') if chemin == '-' else open(chemin, 'wb') ) as sortie: self.sortiemidi.writeFile(sortie)
class Midi: """Musique midi""" def __init__(self, partition, titre, tempo): # Définition des paramètres MIDI. piste = 0 temps = 0 self.tempo = tempo / 2 self.sortiemidi = MIDIFile(1, file_format=1) # Nom de la piste. self.sortiemidi.addTrackName(piste, temps, sansaccents(titre)) # Tempo. self.sortiemidi.addTempo(piste, temps, self.tempo) # Instrument (74 : flûte). self.sortiemidi.addProgramChange(piste, 0, temps, 74) self.traiter_partition(partition, piste, temps) def traiter_partition(self, partition, piste, temps): """Création des évènements MIDI""" transposition = partition.transposition channel = 0 volume = 127 for mot in partition: for i, syllabe in enumerate(mot): syl = str(syllabe) if i + 1 < len(mot): syl = syl + '-' for j, note in enumerate(notes for notes in syllabe.musique if isinstance(notes, Note)): pitch = note.hauteur + transposition duree = int(note.duree) self.sortiemidi.addTempo(piste, temps, (self.tempo * duree / note.duree)) self.sortiemidi.addNote(piste, channel, pitch, temps, duree / 2, volume) if j == 0: self.sortiemidi.addText(piste, temps, syl) temps += duree / 2 def ecrire(self, chemin): """Écriture effective du fichier MIDI""" with (open(sys.stdout.fileno(), 'wb') if chemin == '-' else open( chemin, 'wb')) as sortie: self.sortiemidi.writeFile(sortie)