Outils pour utilisateurs

Outils du site


gnu:pyborg_midi

Différences

Ci-dessous, les différences entre deux révisions de la page.


gnu:pyborg_midi [2024/02/09 17:10] (Version actuelle) – créée - modification externe 127.0.0.1
Ligne 1: Ligne 1:
 +====== Du MIDI avec pyborg ======
  
 +===== Principe =====
 +
 +L'idée est d'utiliser [[https://gna.org/projects/pyborg|Pyborg]] et l'implémentation des chaîne de Markov pour faire de la musique, voire évoluer vers de la composition automatique. Cela existe déjà avec [[http://recherche.ircam.fr/equipes/repmus/OMax/|OMax]], mais c'est pas libre...
 +
 +Pour cela, on utilise des [[http://www.mxm.dk/products/public/pythonmidi/download|librairies python]] appelées midi pour manipuler le midi. Des exemples sont fournies dans le paquet.
 +
 +Dans un premier temps, on va simplement superposer une musique à la réponse du robot. Cette réponse musicale sera corrélée à la phrase.
 +
 +===== Dans le code de pyborg =====
 +
 +
 +Pour l'instant, pyborg est utilisé en mode hors ligne ; rien n'est modifié de son comportement. On ajoute simplement une brique supplémentaire lors de l'affichage de la réponse :
 +
 +  def output(self, message, args):
 + """
 + Output a line of text.
 + """
 + message = message.replace("#nick", args)
 +  print message
 +
 +La lecture du son MIDI est faite par timidity :
 +
 + midi(message)
 + os.system('timidity message.mid')
 +
 +La musique dure entre 10 et 15 secondes.
 +
 +===== Création du fichier MIDI =====
 +
 +
 +La création du son peut se faire avec plusieurs paramètres.
 +Code simple pour créer une note en python :
 +  midi.update_time(0)
 +  midi.note_on(channel=0, note=0x01)
 +  midi.update_time(20)
 +  midi.note_off(channel=0, note=0x01)
 +
 +Nous avons donc 3 paramètres : la durée par le début et la fin de la note, le canal et la note.
 +
 +Avec la réponse de pyborg nous avons un nombre de mots, et pour chaque mot, un nombre de lettres ainsi que chaque lettre, évidemment.
 +
 +Nous pouvons répartir les paramètres ainsi : 
 +  * le nombre de mots de la réponse est le canal utilisé (entre 2 et 10, environ)
 +  * le nombre de lettre pour chaque mot est la durée du son (entre 1 et 8, environ)
 +  * chaque lettre est une note
 +
 +Chaque mot correspond à une suite de notes de la même longueur.
 +
 +===== le code =====
 +
 +la fonction dans un clone de pyborg-linein.py :
 +
 +  def midi(message):
 + """
 + Create a MIDI file from the message
 + """
 + out_file = 'message.mid'
 + midi = MidiOutFile(out_file)
 + # midi framework
 + midi.header()
 + midi.start_of_track()
 + # midi parameters and musical events
 + words = message.split()
 + my_channel = len(words)
 + for word in words:
 + time = 0
 + duration = len(word)
 + for letter in word:
 + my_note = convert.get(letter,0x40)
 + midi.update_time(time)
 + midi.note_on(channel=my_channel, note=my_note)
 + time = time+duration
 + midi.update_time(time)
 + midi.note_off(channel=my_channel, note=my_note)
 + # midi framework
 + midi.update_time(0)
 + midi.end_of_track()
 + midi.eof()
 +
 +===== Les dictionnaires =====
 +
 +Exemple de dictionnaire simple, à augmenter avec les majuscules et les caractères spéciaux :
 +
 +  # dictionnary for conversion
 +  convert={
 + 'a' : 0x10,
 + 'b' : 0x11,
 + 'c' : 0x12,
 + 'd' : 0x13,
 + 'e' : 0x14,
 + 'f' : 0x15,
 + 'g' : 0x16,
 + 'h' : 0x17,
 + 'i' : 0x18,
 + 'j' : 0x19,
 + 'k' : 0x20,
 + 'l' : 0x21,
 + 'm' : 0x22,
 + 'n' : 0x23,
 + 'o' : 0x24,
 + 'p' : 0x25,
 + 'q' : 0x26,
 + 'r' : 0x27,
 + 's' : 0x28,
 + 't' : 0x29,
 + 'u' : 0x30,
 + 'v' : 0x31,
 + 'w' : 0x32,
 + 'x' : 0x33,
 + 'y' : 0x34,
 + 'z' : 0x35,
 +  }
 +
 +Il est possible de faire un dictionnaire qui suit un genre musical (traditionnel irlandais, tzigane) par le choix des notes et la [[http://fr.wikipedia.org/wiki/Fr%C3%A9quence_d%27apparition_des_lettres_en_fran%C3%A7ais|fréquence des lettres]] dans la langue française afin de déterminer quelles sont les notes principales.
 +
 +Pour l'instant, la ponctuation n'est pas prise en compte.