Projet de baccalauréat option informatique de Joshua Heitzler et Mario Padis
Nous sommes deux élèves du lycée franco-allemand de Freiburg et avons développé un programme en langage Python dans le cadre de nos épreuves d'option informatique du baccalauréat
Synthia est un synthétiseur virtuel qui peut émettre une variété de sons de timbre différent. La manipulation est possible par le clavier de l'ordinateur et le clavier de piano intégré dans l'interface graphique. De plus, on peut modifier les paramètres des ondes sonores grâce à des régulateurs linéaires et des boutons rotatifs qui se trouvent dans la partie superieure de l' inerface.
L'inspiration de créer un synthétiseur est venue assez rapidement après avoir reçu la tâche de construire un programme en langage Python pour le baccalauréat. Après la proposition de Joshua, un musicien et DJ brillant (et bruyant...!), de programmer un synthétiseur, Mario a toute de suite accepté et a reconnu le potentiel de Joshua et de son idée. Grass aux connaissances de physique et de musique électronique de Joshua et au savoir-faire informatique de Mario, ce chef-d'oeuvre a pu être réalisé...
En début de classe de première, après la conception de l'idée, beaucoup de challenges sont apparus. Ci-dessous ceux que nous avons réussi:
Tout d'abord se posait le problème de la communication avec la carte audio de l'ordinateur. Pour cela, nous avons trouvé le module Pyaudio, avec lequel on peut émettre et enregistrer des sons par Python. L'émission d' un son par Pyaudio se fait par un "stream" qu' on alimente de arrays (listes numpy) converties en float32. Ayant cette possibilité d'émettre des sons, nous avons rencontré notre deuxième grand problème.
Comme la carte son transmet directement les informations reçues en tension variable aux haut-parleurs, nous avons décidé de coder des "waves" (ondes) comme en musique électronique. Commenceant par la SAW (dent de scie), un son riche en harmoniques possédant un timbre assez artfificiel, nous avons ensuite construit les quatre waves principales (Sine, Saw, Square, Triangle), dont deux (Sine, Square) sont variables. Les deux autres ressemblent à des voyelles (et sont typiques de la musique électronique moderne).
En ce qui concerne l'interface graphique, nous avons repris le concept du clavier de piano sur l'écran. Un appui sur une touche du clavier lance une note d'une certaine fréquence. Grâce à cela, on peut jouer, seulement muni de la souris, des chansons comme 'Alle meine Entchen' ou 'Frère Jacques'. La programmation du clavier demandait également un effort non négligeable, puisqu'il s'agissait de faire comprendre à Synthia qu'un click dans une certaine zone du Canvas est en fait la demande de l'utilisateur de jouer une note précise.
Comme la musique n'est pas seulement constituée de notes joués, mais surtout de pauses, il nous était très important de pouvoir arrêter le son à un moment donné. Ce problème était un des plus difficiles à résoudre car notre émission de son se faisait par une boucle while (-> on ne pouvait donc pas lancer d'autres fonctions). En plus, Python 3.3 avec Tkinter n'a pas de évennements KEYDOWN et KEYUP. On a donc du trouver un petit détour avec des booléens et beaucoup de conditions ('if'). De cette manière, la "main_output_function" est seulement active et n´émet qu'un son quand une note est jouée.
Comme nous deux sommes des musiciens, nous aspirions à créer un programme similaire à un vrai synthétiseur, donc aussi polyphonique (capable de jouer plusieures notes en même temps). Comme support, nous avons utilisé le clavier de l'ordinateur, qui peut fonctionner comme un clavier de synthétiseur ou Piano ordinaire.
Nous avons appris à Synthia à jouer plusieurs notes simultanément. Comme il était nécessaire d'additioner toutes les 'listes' de notes joués avec Nupmy en conservant la 'période interne' de chaque note, il était nécessaire d'appliquer les cours de mathématiques (TSMP-théorie des nombres): Cet empêchement a longtemps posé problème, mais a pu être franchi de manière vivable.
On voit que les 3 sinus sont qu'en phase après 2 périodes de la courbe rouge, 5 périodes du sinus bleu et 9 périodes du de l'onde verte.
Mais numpy peut seulement additioner des listes de longueur identique - il est donc nécéssaire de répéter certaines ondes.
Le majeur problème se posait avec les régulateurs circulaires, car ceux-cis n'étaient pas prédéfini dans Tkinter. Nous devions donc les créer nous même avec des "zones de dessin" (Canvas). Pour "déssiner" ces régulateurs, nous devions insérer un cercle et une linie et modifier leurs coordonnées en fonction des actions apportés sur eux par l' utilisateur. Contrairement aux Buttons rotatifs, régulateurs linéaires étaient prédéfinis et donc facilement implémentable.
Comme chaque programme, Synthia aussi a des limites. On subit 3 limites principales.
Beaucoup de programmes ont la possibilité pour l'utilisateur de modifier la taille de la fenêtre dans laquelle ils sont placés. Synthia ne l'a pas, car on ne pouvait pas trouver une solution faisable qui respecte les proportions de Synthia. En plus, malgré nos efforts de représenter les composantes de manière relative à la taille de l'écran, finalement, pas tous les élements du GUI ont étés définis de telle manière.
Malheureusement, Synthia n'est pas très rapide quand il s'agit de générer les "waveslist", surtout pour les sons vocals. On doit alors accepter des petits temps d'attente et on ne peut pas modifier le son en direct. Peut-être, l'approche pour mettre à jour les "waveslist" n'est pas optimale, puisqu'elle nécéssite beaucoup de RAM.
Pour que les sons émis pas Synthia soient purs et sans interruption, l'utilisateur est appelé à désactiver la "répétition de touches" dans les paramètres de l'ordinateur. Autrement, si l'on reste appuyé sur une touche, elle va toujours relancer le son du début à un tacte rapide, ce qui cause des trébuchements. Nous avons expliqué à Synthia que lorsque l'utilisateur enfonce par exemple la touche 'a', et qu'elle reçoit donc le signal 'a', elle doit jouer la note Do(C). Or, quand l'utilisateur reste appuyé sur une touche quelconque, le système d'exploitation relance après un certain temps, dans des intervals assez court, la touche 'a'.
Joshua Heitzler & Mario Padis - Informatik (fakultativ) Abitur Franco-Allemand 2015 - Synthia