Outils pour utilisateurs

Outils du site


gnu:pyborg_midi

Du MIDI avec pyborg

Principe

L'idée est d'utiliser 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 OMax, mais c'est pas libre…

Pour cela, on utilise des 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 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.

gnu/pyborg_midi.txt · Dernière modification: 2017/04/11 15:13 (modification externe)