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' | ||
+ | |||
+ | Pour cela, on utilise des [[http:// | ||
+ | |||
+ | 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' | ||
+ | |||
+ | def output(self, | ||
+ | """ | ||
+ | Output a line of text. | ||
+ | """ | ||
+ | message = message.replace("# | ||
+ | print message | ||
+ | |||
+ | La lecture du son MIDI est faite par timidity : | ||
+ | |||
+ | midi(message) | ||
+ | os.system(' | ||
+ | |||
+ | 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, | ||
+ | midi.update_time(20) | ||
+ | midi.note_off(channel=0, | ||
+ | |||
+ | 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 = ' | ||
+ | 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, | ||
+ | midi.update_time(time) | ||
+ | midi.note_on(channel=my_channel, | ||
+ | time = time+duration | ||
+ | midi.update_time(time) | ||
+ | midi.note_off(channel=my_channel, | ||
+ | # 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={ | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | } | ||
+ | |||
+ | Il est possible de faire un dictionnaire qui suit un genre musical (traditionnel irlandais, tzigane) par le choix des notes et la [[http:// | ||
+ | |||
+ | Pour l' |