Documentation Midi

Sur cette page tu trouveras comment installer le logiciel fluidsynth et la librairie Prettymidi pour manipuler des fichiers sons avec google colab

Installation et lecteur audio

Installation de Fluidsynth et PrettyMidi

Nous allons installer le logiciel fluidsynth, un synthĆ©tiseur que l’on peut contrĆ“ler avec une librairie python, capable de lire des fichiers midi sur la machine virtuelle de colab, ainsi que la librairie PrettyMidi qui permet de manipuler facilement des fichiers Midi

Ɖtape 1 : Installation du logiciel Fluidsynth

La machine virtuelle de google colab fonctionne sur un noyau linux on peut donc installer certains logiciels comme on le ferait sur un terminal linux. La seule diffĆ©rence est que tu vas pouvoir l’Ć©crire directement dans le code.

La commande suivante permet de faire cette installation. Attention Ƨa peut prendre un petit peu de temps.

!sudo apt install -y fluidsynth
Ɖtape 2 : Installation des librairies fluidsynth et prettymidi

On va maintenant installer les librairies Ć  l’aide de pip

ExƩcute les commandes suivantes.

Le –upgrade, permet de forcer les mises Ć  jours de la librairie, au cas où une version prĆ©cĆ©dente aurait Ć©tĆ© installĆ© avec le logiciel.

!pip install --upgrade pyfluidsynth
!pip install pretty_midi

Lecteur de fichier audio

Google Colab ne sait pas lire les fichiers midi, afin de ne pas avoir à télécharger les résultats à chaque fois, on va convertir les fichiers en .wav avec fluidsynth et les lire directement dans notre console, grâce au lecteur Audio intégré dans la librairie.

Voici le code d’une petite fonction qui permet de lire un fichier midi.

Elle prend en paramĆØtres :

  • obligatoire : le fichier midi (dĆ©jĆ  ouvert avec PrettyMidi)
  • optionnel : le taux d’Ć©chantillonnage (rate) de lecture
from IPython.display import Audio
def display_audio(fichier_midi, rate = 16000):
  musique = fichier_midi.fluidsynth(rate)
  return Audio(musique, rate=rate)

Ouvrir et Ʃcouter le fichier midi

import pretty_midi
chemin_fichier = "/content/Animaniac.mid"
midi = pretty_midi.PrettyMIDI(chemin_fichier)
display_audio(midi)

BibliothĆØques de fichiers midi

Si tu as besoin de trouver des fichiers midi pour tester ton lecteur, voici quelques sites où tu pourras trouver des fichiers midi :

Lire et Ʃcrire un fichier midi

Voici le lien vers la documentation de la librairie Pretty_Midi

En rĆ©sumĆ©, un fichier midi est une liste d’instruments avec leurs partitions pour chaque instrument. Tu vas pouvoir accĆ©der Ć  chaque instrument et chaque ensemble de notes.

Lister les instruments

L’attribut instruments contient la liste des instruments
fichier.instruments
Un instrument est composĆ© de plusieurs attributs :
  • program : le numĆ©ro de l’instrument de rĆ©fĆ©rence
  • is_drum : est-ce que l’instrument est une percussion (les percussions ne jouent pas les mĆŖmes notes)
  • name : le nom commun de l’instrument
  • notes : la liste des notes jouĆ©es par l’instrument
 
Comme n’importe quelle liste en Python, il est possible d’accĆ©der Ć  chacun des instruments de la liste
fichier.instruments[0]

La fonction program_to_instrument_name() permet de rĆ©cupĆ©rer le nom complet de l’instrument Ć  partir de son programme.

pretty_midi.program_to_instrument_name(instrument.program)

Afficher les notes d’un instrument

Pour lire les notes d’un instrument, il suffi d’accĆ©der Ć  l’attribut notes :

notes = instrument.notes
1ere_note = instrument.notes[0]

Lire une note

Une note est composƩ de plusieurs attributs :
  • start : le temps ou dĆ©bute la note (en secondes)
  • end : le temps ou s’arrĆŖte la note (en secondes)
  • pitch : la hauteur de la note ( est-ce que c’est un Do ou un Fa)
  • velocity : la force avec laquelle la note est jouĆ©e
  • duration : la durĆ©e de la note

On peut transformer le pitch d’une note en son nom (en Ć©criture anglaise) avec la fonction  note_number_to_name

pretty_midi.note_number_to_name(note.pitch)

Voici un schĆ©ma qui illustre les diffĆ©rentes reprĆ©sentation d’une note


 

Ā 

Pour lire plusieurs notes, sers toi de la liste python. Ajoute deux points : devant l’index pour lui dire de lire « jusqu’Ć  XĀ Ā»

note_cinq = instrument.notes[:5]
Ā 
Ā 

CrƩer un instrument

Pour crƩer un instrument on utilise le constructeur Instrument et le numƩro du programme :

instrument = pretty_midi.Instrument(19)
Tu peux trouver une liste d’instruments ici : https://soundprogramming.net/file-formats/general-midi-instrument-list/
Ā 
Ā 

CrƩer une note

Pour crƩer une note on utilise le constructeur Note et ses diffƩrents attributs : start, end, pitch, velocity :

note = pretty_midi.Note(velocity=70,pitch=60,start=0.5,end=1.7)

CrƩer le fichier Midi

Pour crƩer un nouveau fichier midi il suffit de :

  1. Créer une note ou la liste des notes complètes
  2. CrƩer un instrument
  3. Lui assigner la liste des notes ou ajouter les notes une par une avec la fonction append
  4. CrĆ©er l’objet Midi
  5. Ajouter l’instrument Ć  la liste des instruments du fichier avec la fonction append
  6. Utiliser la fonction write pour Ʃcrire le fichier en spƩcifiant son nom

mon_do = pretty_midi.Note(start=1.5, end=5.5, pitch=48, velocity=40)
mon_orgue = pretty_midi.Instrument(26)
mon_orgue.notes.append(mon_do)
mon_midi = pretty_midi.PrettyMIDI()
mon_midi.instruments.append(mon_orgue)
mon_midi.write('do.midi')
display_audio(mon_midi)
 
 

Midi et pandas

Transformation du morceau en un tableau pandas

Pour manipuler ton fichier MIDI et le transformer en tableau pandas, tu devras :

Importer pandas

import pandas as pd

CrƩer une fonction rƩcupƩrant les instruments et les notes

def midi2pandas(midi):
  instrument = midi.instruments[0] 
  df_notes = {'start':[], 'end':[], 'pitch':[], 'velocity':[], 'duration':[]}

Boucler pour ajouter toutes les valeursĀ 

Ā  for note in instrument.notes:
df_notes['duration'].append(note.duration)  
df_notes['start'].append(note.start)  
df_notes['end'].append(note.end)  
df_notes['pitch'].append(note.pitch)  
df_notes['velocity'].append(note.velocity)

Ā 

Ā   return pd.DataFrame(df_notes)

CrƩer un graphe sous forme de rouleau de piano

Pour afficher un rouleau de piano tu auras besoin des librairies matplotlib et numpy

from matplotlib import pyplot as plt
import numpy as np

CrƩer une fonction rƩcupƩrant les donnƩes des notes de ton morceau musical. Dans celle-ci on va :

  • DĆ©finir la taille du graphe
  • CrĆ©er nos paires de valeurs e X et Y pour dĆ©finir la durĆ©e sur un axe, et les notes sur l’autre
  • CrĆ©er la courbe Ć  tracer
  • Donner une lĆ©gende aux axes
Exemple de code de la fonction :
def rouleau_piano(data, compteur=None):
  plt.figure(figsize=(20,4))
  x = np.stack([data['start'],data['end']])
  y = np.stack([data['pitch'],data['pitch']])
  plt.plot(x,y,color="b",marker=".")
  plt.xlabel('DurƩe')
  plt.ylabel('Pitch')
plt.title('rouleau de piano') rouleau_piano(df_trie)

Ajouter un compteur :

Tu peux ajouter un compteur pour avoir uniquement les xxx premiĆØres notes sur ton graphe.

Pour ce faire, ajoute le compteur dans la courbe de ton tracer

Ā  plt.plot(x[:compteur,:compteur],y[:compteur,:compteur],color="b",marker=".")

Et appelle ta fonction en notant le nombre de notes que tu veux afficher

rouleau_piano(df_trie,50)

Tu peux Ʃgalement ajouter un titre Ơ ton graphe qui affiche le compteur pour lƩgender ton graphe.

En utilisant une condition, cela te permet de laisser ta fonction avec un compteur sur None, et choisir si tu souhaites avoir le morceau entier ou qu’une partie, lors des appels de ta fonction.

Ā  if compteur :
titre = f"les {compteur} premiĆØres notes"

else : titre = « le morceau entierĀ Ā» compteur = len(data[‘pitch’])

Ā 

Glossaire

Duration

Dans la bibliothĆØque PrettyMIDI, l’argument duration est utilisĆ© pour spĆ©cifier la durĆ©e d’une note MIDI. Cet argument est prĆ©sent dans la classe Note() de la bibliothĆØque, et permet de dĆ©terminer pendant combien de temps une note sera jouĆ©e dans une sĆ©quence MIDI.

End

L’argument end fait rĆ©fĆ©rence au moment où une note MIDI se termine dans une sĆ©quence MIDI. C’est un paramĆØtre utilisĆ© pour spĆ©cifier la fin d’une note. Cet argument est utilisĆ© dans la classe Note() pour dĆ©terminer la durĆ©e pendant laquelle la note est jouĆ©e.

Pitch

Dans la bibliothĆØque PrettyMIDI, le terme « pitchĀ Ā» fait rĆ©fĆ©rence Ć  la hauteur d’une note MIDI. En musique, la hauteur d’une note est gĆ©nĆ©ralement associĆ©e Ć  sa frĆ©quence fondamentale, et dans le contexte MIDI, cette hauteur est reprĆ©sentĆ©e par un nombre entier compris entre 0 et 127.

Dans PrettyMIDI, l’attribut pitch est un paramĆØtre utilisĆ© pour spĆ©cifier la hauteur d’une note. Il s’agit d’un nombre entier reprĆ©sentant le numĆ©ro de note MIDI correspondant Ć  la hauteur souhaitĆ©e.

Start

L’argument start est associĆ© Ć Ā  la classe Note() dans PrettyMIDI. IlĀ se rĆ©fĆØre au moment où cette note commence dans la sĆ©quence MIDI.

StepĀ 

Le step est utilisĆ© pour calculer l’Ć©cart entre le moment de dĆ©but (start) de chaque note et le moment de dĆ©but de la note suivante. Cette diffĆ©rence permet d’avoir une donnĆ©e supplĆ©mentaire pour laisser notre IA gĆ©nĆ©rer des notes capables de se chevaucher et amĆ©liorer le rendu mĆ©lodique du rĆ©sultat obtenu.

Taux d’Ć©chantillonnage (rate)

Il s’agit du nombre d’Ć©chantillons audio prĆ©levĆ©s par seconde lors de la numĆ©risation d’un signal audio analogique. C’est une mesure technique liĆ©e Ć  la reprĆ©sentation numĆ©rique d’un signal audio. Le taux d’Ć©chantillonnage est mesurĆ© en hertz (Hz) et indique la frĆ©quence Ć  laquelle les points de mesure sont pris par seconde.

Tempo

Le tempo, se rapporte Ć  la vitesse ou Ć  la cadence d’une composition musicale. C’est le nombre de battements par minute (BPM) et indique la rapiditĆ© ou la lenteur perƧue de la musique. Le tempo est une caractĆ©ristique musicale expressive qui influence la sensation rythmique d’une partition.

Velocity

L’argument velocity est utilisĆ© pour spĆ©cifier la vĆ©locitĆ© d’une note MIDI. La vĆ©locitĆ© reprĆ©sente la force ou l’intensitĆ© avec laquelle une note est jouĆ©e. Elle est souvent associĆ©e Ć  la force physique avec laquelle une touche est enfoncĆ©e sur un clavier ou Ć  la pression exercĆ©e sur un pad de batterie Ć©lectronique.

Retour en haut