====== 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.