 Et sans plus d'inquiétude, j'ai envie d'introduire Olivier Penanget. Il va parler d'un système de musique et de développement avec Python. Merci beaucoup. Salut! Donc, HUNG, en fait, c'est deux choses. Premièrement, c'est une librairie qui peut être utilisée de façon standard avec Python et Indépendante qui sert à faire du scripting musical ou du scripting audio et qui utilise CSUN comme moteur audio par enceau. Donc, je vais revenir sur CSUN et c'est aussi... oui? C'est bien HUNG. HUNG, c'était un cochon dinde qui est malheureusement mort. Et en fait, le nom, d'ailleurs, c'est Nathaniel qui a trouvé le nom, c'est pas moi. HUNG, c'est... j'avais un sample, j'enseigne à l'Université de Montréal et c'est un des samples que j'utilisais plus des années dans mes cours. Donc, c'est un peu standard. Finalement, mon cochon dinde était rendu assez célèbre. Donc, c'est une librairie et qui peut aussi être accompagnée d'une interface qui est tout simplement un éditeur écrit en WBX pour faciliter en fait l'écriture des scripts et la façon de jouer avec. Alors, pourquoi j'ai fait HUNG alors qu'il y a une panoplie d'environnement audio qui existe, donc CSUN, MAX, Super Collider et Compagnie, qui fonctionne tous très bien pour différents aspects. Je connais très bien CSUN, et CSUN, c'est un langage qui est mature, qui est complet, qui sonne très bien. Par contre, la syntaxe de CSUN est extrêmement rébarbative, en fait, viaillote. Donc, je voulais une façon d'écrire de la musique en ligne de code mais avec un langage agréable, c'est-à-dire Python. Donc, est-ce que vous connaissez un peu CSUN ou pas du tout? Donc, il y a vraiment peu d'un peu. Alors, petit exemple rapide de ce colère CSUN. Donc, CSUN fonctionne avec une structure orchestre-partition. Donc, dans la section orchestre ici, on définit des instruments, tous les instruments qu'on veut utiliser. Et ensuite, dans le score, en bas, on envoie des appels de notes. Par exemple, ici, I1, donc l'instrument I, je lui demande une note. Donc, si on veut beaucoup de notes, ce qui est fort possible dans une pièce, il faut écrire autant de lignes dans le score qu'on a besoin. Et personnellement, je trouvais ça drôlement pénible. Par contre, ça fonctionne très, très bien. Alors, l'idée de Hong c'était de faire une librairie qui n'était pas simplement un port direct de tous les opcodes CSUN qui existent, mais plutôt de créer une librairie qui facilite la vie. Donc, en fait, ça ne s'adresse pas nécessairement à des programmeurs aguerris. Ça s'adresse aussi à des gens qui commencent et qui ne veulent pas trop se casser la tête pour écrire du son. Donc, souvent, une fonction de Hong va écrire un bon morceau de code CSUN pour arriver au but ultime. Alors ici, on va, d'ailleurs, Firefox est ouvert, donc le code source est hébergé sur Google Code. Vous pouvez l'installer directement avec les sources, avec les conseils d'ailleurs, avec les instructions sont ici. Et il y a aussi des binaires pour Windows et OS X qui commencent à dater un petit peu. D'ici la fin de l'été, il va y avoir des binaires plus adaptes, mais de toute façon, comme vous aimez compiler vos trucs, vous allez y aller par les sources. Alors, ici, on va aller voir de quoi a l'air l'interface. Donc, c'est même pas le cochon d'ail en plus, j'avais pas de photos du dit cochon d'ail. Donc, d'entrée de jeu, vous ouvrez l'interface et si vous cliquez sur le bouton run, vous entendez Feu Hong. Et donc, en fait, ça ouvre sur un script par défaut qui est probablement le script le plus simple qu'on peut écrire avec Hong. Donc, qui fait jouer un son. Et le son par défaut, c'est Hong. Donc, l'interface, c'est un éditeur de texte en fait relativement standard, mais qui est conçu pour faciliter la vie, soit à l'écriture de scripts Python, en particulier avec la librairie Hong ou de scripts Cysand, aussi directement. Donc, il va avoir la colorisation de la syntaxe Cysand si votre fichier porte l'extension Cysand. Sinon, c'est une coloration Python avec, en prime, donc, toutes les fonctions qui appartiennent à Hong qui sont aussi colorées. Donc, ici, l'espace principal, c'est l'éditeur de texte où on écrit nos scripts. À gauche, on a la librairie elle-même, classée par catégorie. Donc, dans chaque menu, vous avez différentes fonctions. La librairie commence à s'étoffer pas mal. Il y a, en fait, il y a au-dessus de 200 fonctions disponibles, soit des sources, des effets, des contrôles, etc. Et donc, ici, vous avez un petit panel de documentation du moment que votre curseur est au-dessus d'une fonction. Vous avez tous les paramètres, par défaut, pour l'édite de fonctions. Donc, l'idée, c'était de donner, en fait, un template de base pour chaque fonction pour que ça puisse utiliser extrêmement simplement et vous pointer uniquement sur les paramètres dont vous avez besoin. Et ensuite, en-dessous, ici, est-ce que c'est plus clair si on le laisse en blanc, comme ça? Oui, et on va augmenter un petit peu. Donc, en bas, on a un interprèteur tout à fait standard. Et quand on fait jouer un script, en fait, toutes les commandes, toutes les lignes sont passées directement à l'interprèteur. Ce qui est un petit caprice, en fait, je voulais éventuellement pouvoir interagir avec le script qui est en cours. Donc, pour peu qu'on a prévu les choses comme il faut, on peut lancer le script et venir modifier des commandes directement par l'interprèteur. Alors, petit survol, rapide de la librairie. Donc, il y a plusieurs groupes qui servent plus ou moins. Les plus importants sont les sources où vous avez des générateurs de sons, c'est-à-dire, par exemple, les sendes qui vous permettent d'aller chercher n'importe quel son si on va prendre un son ou quelqu'un, disons ici. Il y a un autre classique et qu'on fait jouer. Ce qui va tuer le baseball majeur à Montréal, si le joueur il doit mourir à Montréal, c'est le baseball majeur. N'est-ce pas? Il y a une certaine teneur philosophique quand même. Vous allez aussi avoir des sons de synthèse, par exemple, le traditionnel sinus. Il y en a toutes sortes d'autres. Ensuite, vous allez avoir différents effets, par exemple, ici. En fait, des effets, j'ai séparé parce qu'il y en avait trop. Donc, les filtres sont dans leur classe à part. Tout ce qui est FFT se retrouve dans Spectral. Donc, il y a pas mal d'exploration à y avoir. Donc, il y avait quelques petits détails à régler, surtout dans la communication, en fait, Python 600. Donc, comment on gère le temps? Pour chaque fonction qui génère du son ou des contrôles, qui s'étend sur une certaine période, il y a toujours les paramètres, start-time et duration, disponibles, qui, par défaut, sont à zéro et non, c'est-à-dire que le son démarre au début de la performance. Et tant que la durée est à non, on va chercher la durée globale du script qu'on peut spécifier avec Set Global Durations, ce qui fait qu'on n'a pas à spécifier à chacune des fonctions qui nous sauvent de l'énergie. Ensuite, il y a la possibilité de jouer à l'infini. Donc, si la durée est de moins un, tant que je n'appuie pas sur stop, donc le son va continuer à rouler. Dans le cas où on se construit, par exemple, un synthé midi, on ne veut pas que le script arrête nécessairement, donc on veut pouvoir taper sur le clavier n'importe quand et que ça continue à rouler. Donc, c'est la gestion de la durée. Un peu de la même façon, la durée du nombre de canaux se fait avec une fonction qui s'appelle 7 channels. On peut l'appeler plusieurs fois, et ça va changer le nombre de canaux. Chaque fonction va générer un autre signal en fonction du nombre de canaux. Par défaut, on est à deux. Je pourrais dire huit, par exemple, et mon sinus pourrait être pané sur huit canaux, par exemple. Si je ne me trompe pas, on peut se rendre jusqu'à 64, qui est la limite de 602. Donc, si vous avez un son octo, par exemple, sur votre machine, vous le faites jouer en octo, vous pouvez le passer dans un filtre et chacun des canaux va être filtré donc indépendamment. Et ensuite, il y a un autre concept assez important, c'est-à-dire le temps réel, le temps différé. Donc présentement, évidemment, comme je n'ai pas de cartes de son avec huit sorties, si ça n'en aimera pas, en fait, on peut l'enlever. Présentement, si je fais run, le son est envoyé directement à la carte de son. Ce qui, dans ce cas-ci, me convient. Dans le cas où on travaille sur une pièce, c'est bien de pouvoir entendre instantanément ce qu'on fait. Éventuellement, on veut avoir un fichier son qui est le résultat de notre travail. Donc, tout ce qu'on a à faire, à la fonction start-se-send, qui est pratiquement toujours la dernière fonction, donc celle qui écrit tout le fichier se-send par en dessous et qui lance ses sandes, c'est-à-dire faire égal bout. Et là, en fait, je vais enlever le moins 1, par contre, je vais dire 10 secondes. Et là, si je fais run, j'entends tout rien. Le bouton est revenu à run, donc les calculs le plus vite qu'il peut calculer un sinus, ça n'a pas été très difficile. Et j'ai un merveilleux fichier son qui est généré qui est généré dans le dossier des sons qui s'appelle bout.if qui est mon sinus de 10 secondes. Oui. Oui, en fait, d'ailleurs, dès que quelque chose n'est pas clair, hésitez pas m'arrêter, ça va plus ça. Non, c'est que lorsqu'il y a eu des exemples, il y avait toujours une fabrication de ses sandes contre la séduction, à chaque fois. En fait, ses sandes étaient lancées tout simplement. Donc, il y a le fichier texte qui est construit. À chaque petit exemple que le bouton run, chaque fois qu'on passe sur le bouton run, le fichier texte est réécrit. Donc, tout le fichier ses sandes. Normal, écrire du texte, ce n'est pas une grosse job. Oui. Donc, en fait, ses sandes, lui, c'est un fichier du même type qu'on avait ici qui est généré automatiquement. Donc, il est un peu plus complexe qu'un script ses sandes normales que je voulais gérer toutes sortes de situations d'un coup. Donc, oui, à chaque fois, il y a un fichier qui est écrit, ses sandes est lancée avec le dix fichiers. Donc, dans ce cas-ci, ce n'est pas tellement pertinent. Dans un cas où on veut, on travaille sur une pièce et ce qu'on demande à la machine, c'est rendu trop difficile à faire en temps réel, il faut avoir une façon de ne pas être limitée et de pouvoir tout simplement compilé le son. D'ailleurs, j'ai fait tout ma musique de Diet de doctorat avec Hong et des pièces de cinq minutes prenaient une heure, une heure et demi à compilé, sauf qu'il n'y avait aucun sacrifice sur la qualité. La qualité restait très, très bonne. Il y avait juste le temps d'aller prendre une douche avant de pouvoir entendre. C'était une composition musicale? Oui, en fait, moi, j'ai un département j'ai étudié à l'Université de Montréal en composition électro-acoustique mais j'ai inclus honte dans ma thèse parce que j'ai passé tellement de temps qu'il fallait que je le justifie d'une façon ou d'une autre mais j'avais mon 45 minutes de musique à faire quand même. Donc, en fait, ici, on peut même, juste pour vous montrer si je viens disons que je prends moi du lot ici et que je le mets même en basse résolution c'est-à-dire avec un sampling rate de 22 kHz si je me trompe pas, il n'est pas capable de le jouer en temps réel. Donc, c'est Sound qui réussit pas à fournir les chunks d'audio assez rapidement donc ça s'accade. Mais du moment où je lui donne en fait, j'ai juste à me mettre à high. Quand je me mets à high, si je le fais jouer on pourrait attendre une heure et on aurait le fichier son qui est propre et sans bavure. Et là, on devrait avoir eu deux secondes, trois secondes, peut-être. Donc, ça s'accade. Donc ça, c'est un environnement qui, du moins, moi, me convenait pour travailler. Tout le long de mon travail, je pouvais en fait, d'ailleurs, ces pièces-là je les ai terminées sur un Mac Pro parce que ça prenait sur un processeur de 3 gigs ça marchait encore à 22 kHz. Quand je me mets à high par exemple, ma pièce est générée à 48 kHz en 24 bits. Donc, évidemment, j'en demande beaucoup plus à 6 sound, ils prennent son temps pour le faire ça marche très bien. Donc, quand on ouvre on que on se retrouve avec ça ici. Et là, où ça devient ça devenait intéressant, donc de non pas écrire du 6 sound, mais écrire du piton qui génère du 6 sound. Donc, il faut toujours regarder en tête que par en-dessous, c'est un fichier 6 sound qui est écrit. Donc, des fois, il y a des petites passes un peu étranges à écrire. Dans général, ça se fait assez bien. Donc, ici, je voulais avoir mon son qui est joué, mais plusieurs fois, si j'étais en 6 sound, faudrait que j'aille écrire toute une série d'événements. Ici, je peux tout simplement le passer ma fonction plaissant dans une boucle et dire par exemple le start time start time est égal à la valeur de ma boucle. Donc, à chaque seconde, j'ai le son qui démarrer et qui s'empêle en-dessous l'autre. Et déjà, si on vient voir le fichier 6 sound qui est généré, donc, ça apprit tout ça pour générer 6 fois un son, ce qui est extrêmement pénible à écrire. Surtout vu la syntaxe de 6 sound, qui ne rime pas à grand-chose de ce qu'on connaît comme langage de programmation. Et on est ici, l'interprétaire. C'est un interprétaire tout ce que le plus standard. Donc, j'ai accès à tous les modules. Donc, si je dis par exemple import random, je pourrais sans problème changer le pitch de chacune de mes instances pour une valeur aléatoire. Donc, disons qu'on dit uniforme entre 9 et 1.1. Et donc là, mes 6 sons qui jouent vont partir à un pitch différent. Et ça va être différent évidemment à chaque fois que je leur lance. Donc, quand je clique run, tout mon fichier est envoyé à l'interprétaire ligne par ligne. Donc, ça recommence. Là, les randoms seront forcément folliés maintenant. Donc, ça permet déjà d'utiliser Python pour la puissance algorithmique qui offre qui est de loin supérieur, qui est de loin supérieur à ce que 6 sons peuvent faire. Et d'ailleurs pour avoir fait énormément de max dans les 15 dernières années je suis arrivé à des trucs beaucoup plus complexes et bien beaucoup plus facilement en Python qu'en max. Un point de vue algorithmique. Donc, s'il y a une force à Python c'est pas mal celle-là. J'ai une petite question sur le sujet. Max, on voit que une programmation qui est plus visuelle, qui est plus orientée d'un dataflow qui a un langage traditionnel qui est en plus de développement informatique, procédiorable, classique. Je suis con de savoir si tu connais les deux en fait. Qu'est-ce qui, toi en tant que créateur, qu'artiste, qu'est-ce qui est plus propice à ta créativité ? Est-ce que un environnement où tu peux faire des boîtes et des liens entre les boîtes. Est-ce que ça, ça permet de commencer quelque chose plus facilement ? Ou est-ce que de commencer avec un editor de texte, de commencer à écrire quelque chose ? Quand j'ai commencé à faire du Python j'avais tendance à prototyper en max maintenant j'ai tendance à prototyper en Python. En fait, placer des boîtes et créer un petit bout de texte prendre la souris, connecter des fils, ça me tue. Je trouve que c'est d'une lenteur incroyable. Et plus ça devient compliqué évidemment, plus ça devient pénible de s'y retrouver. Donc ceci étant dit, j'aime max quand même, ça fonctionne très bien. Mais pour ce que je fais, moi le type de compos que je fais, qui sont principalement algorithmiques, je trouve que Python est beaucoup plus clair que max. Évidemment, pour faire du temps réel, si vous avez un Flutus qui joue et vous voulez juste me gagner son son, max reste quand même pas mal en haut de tout le monde. Ça répond à ta question. Ok, donc on a un petit exemple relativement simple ici. Si je voulais lancer, j'ai utilisé ma boucle pour changer le start time, donc pour qu'on entend les 6 qui démarrent, si j'avais voulu simplement changer un chorus, j'aurais pu utiliser en fait, non pas une boucle ici, mais une liste comme paramètre. Donc pratiquement tous les paramètres, sauf le art sur lequel je vais revenir, peuvent prendre une liste en paramètres et une va générer autant d'instances que nécessaire pour donner le résultat. Donc ici, à la variable pitch, je lui avais dit 0.5, 1 1.5 et 2. Donc j'ai 4 valeurs où vous va me générer 4 fois la lecture du son avec chacun des pitches qui sont ici réparties sur mes lectures. Donc ce qui permet d'écrire du code beaucoup plus compact que de tout faire à la mitaine. Et une chose qui est agréable avec les listes, en fait, c'est qu'on peut donner des listes de longueurs différentes aux différents paramètres et la fonction prend la plus grande liste pour générer le nombre d'instances et on boucle dans les autres pour combler les trous. Donc si je donne, par exemple, en panne 0 et 1, qui sont les deux extrêmes, ma première lecture à 0.5 de pitch, je vais utiliser 0, la deuxième va utiliser 1, la troisième va utiliser 0, je vais utiliser 1. Et je peux répartir mon signal. Donc je pourrais avoir plusieurs paramètres qui ont des listes avec toutes les longueurs différentes et là ça crée des croisements qui sont assez inédits par rapport à l'autre ce qui peut être très pratique. Donc maintenant il y a une autre chose pour ceux qui ne sont pas nécessairement ferrées en processing de l'audio. Tous les environnements ont toujours une boucle qui est la boucle audio donc le sampling rate dans ce cas-ci le son sort 44000 fois par seconde et un taux de contrôle qui est généralement un petit peu plus lent et qui permet donc de modifier des paramètres dans le temps sans que ça coûte trop cher en CPU. Donc si ça ne fait pas exception à la règle et dans le cas d'Aunk donc on peut utiliser je pourrais en fait on va prendre un exemple pour ça dans la librairie qui est ici le dernier dossier à l'époque où il n'y avait pas vraiment de manuel, j'avais essayé de faire un dossier d'exemple un peu sous format tutoriel pour simplifier la vie de ceux qui s'y mettaient donc si on prend le premier et qu'on regarde un générateur de sinus donc l'exemple 3 ici c'est l'utilisation des listes qui nous donne un accord et l'exemple 4 ici on voit une fonction random h qui est un random donc qui change c'est un random avec un sample and all qui change à une fréquence donnée et j'ai été donc je l'ai envoyé sur un boss qui s'appelle pit et pit c'est complètement c'est un choix personnel en fait ça peut être absolument n'importe quoi et tout ce qui est part d'un paramètre boss d'une fonction de contrôle peut être utilisé sur un paramètre dans sa version var donc ici pitch var c'est une ouverture sur un canal de contrôle c'est à dire multiplier ma valeur de pitch donc dans ce cas-ci j'ai mon accord et chacune des notes va être multipliée par le random qui envoie sur le canal pit et chaque note va être multipliée par cette valeur puisque ici j'ai une seule valeur donc j'ai pas envoyé plus d'une valeur dans une liste alors toutes mes sinuses vont utiliser le même random ça irait mieux si je fais jouer le bon exemple donc la vitesse c'est 2 hertz donc deux fois par seconde je pêche une nouvelle valeur qui vient multiplier mes fréquences et là où ça peut devenir plus puissant c'est en donnant une liste à mon boss du random dans ce cas-ci une liste de 3 valeurs je vais générer 3 randoms indépendants avec leur propre vitesse puisque je passe une liste aussi au paramètre rate et cette liste-là je l'envoie dans mon pitch var et donc là chacune de mes valeurs ici va être multipliée par son random propre et ça nous donne ceci et donc là si on fait fi de l'enveloppe j'ai 2 lignes pour générer une séquence de notes qui commence à être relativement évolué et qu'on pourrait donner une grande liste ça du coup ça le fichier c'est simple ou c'est lui en termes non quand j'ai fait run ici mon fichier il a changé donc ici j'ai mes canaux de contrôle donc 3 pips qui sont ouvertes j'ai mes 3 instruments de random mon assiataire qui lui est lancé 3 fois dans la partition avec chacun pointant sur le bon canal donc évidemment ça donne du code un peu étrange à lire du code sissande dans ce cas si non dans ce cas si on peut rien faire et d'ailleurs c'est un des points faibles de sissande c'est surtout assez difficile d'interagir directement il y aurait moyen par exemple d'utiliser une fonction qui reçoit du OSC et d'envoyer du OSC par l'interprétaire ce qui est un peu ordinaire j'ai contourné le problème avec différentes solutions donc dans les spécificités même des fonctions de Oum il y a une autre chose donc c'est quand on veut passer d'une fonction à l'autre si par exemple on veut traiter du son ici si on prend l'exemple 10 qui est l'exemple sur les effets donc j'ai ma fonction plaissant qui va jouer mon cochon d'indes et là au lieu de laisser le paramètre out à DAC qui est sa valeur par défaut donc digit out ou analog converter ça s'envoie directement aux parleurs et je lui donne ça c'est des vieux exemples je priorise les strings mais si vous rentrez un chiffre il va être converti en strings de toute façon donc ici je lui donne comme out un canal de communication qui s'appelle 1 et je le récupère donc tous les effets ont un paramètre input je le récupère dans ce cas-ci dans une réverbe et c'est ma réverbe elle que j'envoie je ne touche pas à son paramètre out qui est à DAC donc c'est la réverbe qu'on va entendre et non le son original ce qui nous donne ceci donc il n'y a rien qui m'empêcherait de prendre la sortie de ma réverbe donc son paramètre out l'envoyer sur un autre boss de le passer à un autre effet et de faire toute ma séquence donc ici vous avez quelques effets donc le 2 c'est un harmoniser donc on crée un accord donc évidemment si on a un son avec un pitch l'accord est plus joli ou le 3 une banque de résonataire donc en fait tout ça tout ça s'écrit de façon assez compact si on fait fi de la liste d'exemple c'est une histoire de 3-4 lignes des fois pour arriver un résultat sonore qui est déjà un minimum intéressant donc c'était un début de hoome qu'en fait de rendre les choses relativement simples même si on peut s'étendre et que ça devienne très compliqué donc il n'y a rien qui vous empêche de créer vos propres classes vos propres modules de fonctions qui les importent dans votre script et là votre projet peut devenir immense si vous le voulez c'est un choix qui est libre ça va jusqu'à maintenant donc là on a vu une ligne après l'autre et le résultat sort il y a divers environnements que j'ai appelés fortes d'un meilleur mot qui implique beaucoup plus de code par en dessous et qui facilite la vie pour créer des structures complexes la plus attrayante je suppose c'est le fait de pouvoir utiliser un clavier midi donc de se construire un synthé midi très simplement et tout ce qui est polyphonie fader de volume pitch band tout ça est pris en compte par ongles lui-même donc ici dans les exemples le numéro 15 en fait le numéro 15 ne fait que récupérer des contrôleurs et d'ailleurs j'ai aucune idée pourquoi j'ai mis ces numéros de contrôleurs là plus que c'est pas les mises donc si je prends ça ici ça correspond au 3 premiers potentiellement être de mon clavier et donc en fait c'est encore le son de cochondagne passé dans des raisonnateurs mais là je peux contrôler mes raisonnateurs donc j'ai le feedback par exemple le pitch le filtre donc relativement simple à utiliser donc midi c'était elle si il y a un périphérique midi de brancher sur votre machine si ça ne le trouve assez facilement sinon il y a une fonction pour pointer spécifiquement sur un périphérique en particulier évidemment si vous n'avez rien de midi de brancher et que vous lancez un strip qui attend du midi il va falloir s'attendre à ce que ce soit puâche parce qu'il n'y a rien pour alimenter ses besoins donc ici c'était de simplement récupérer des contrôleurs midi alors on peut carrément se construire un synthé et là tout ce que j'ai appelé environnement commence par begin donc dans ce cas-ci begin midi-synth et mon synthé se termine quand on croise la fonction end midi-synth donc tout ce qui entre les deux va répondre au touche du clavier donc l'exemple 1 c'est de la façon de séquence avec une corde pincée donc maintenant je l'ai lancé avec moyen une durée puisque je ne veux pas que le script arrête je ne veux pas que 600 en arrête de calculer des échantillons et il ne se passe rien tant que je ne demande pas une note au clavier et là je peux lui en demander plusieurs c'est 600 qui gère la polyphonie par en dessous d'ailleurs le pitch bend est mappé automatiquement tout comme le volume et donc la chute aussi vous pouvez la spécifier dans la fonction begin midi-synth et là la seule limite que vous avez c'est en termes de processeur désolé donc il faut croire qu'une modulation de fréquence fait une corde pincée c'est pas suffisamment coûteux pour apparaître le processeur donc on a du choix pas mal parce que la fonction end midi-synth a son propre paramètre out donc tout ce qui est à l'intérieur du synthé midi reste à l'intérieur donc si vous faites des envois de contrôle des envois d'audio à l'intérieur ça communique pas avec l'extérieur ça se passe uniquement dans le synthé et le son global du synthé lui vous pouvez le récupérer pour le traiter par la suite si ça vous chante c'est ce qu'on fait ici dans l'exemple 3 donc mon synthé je l'envoie sur un boss qui s'appelle Synth que je récupère dans une réverbe et là maintenant donc 3 quand je tape sur une touche il n'y a que le son de cochondagne qui est eu donc ce qui est très peu coûteux de lire un son et tout le son global en fait du synthé passe dans la réverbe qu'est ce qu'il y a il y a toutes sortes de features de synthé midi par exemple ici l'exemple 17 on peut splitter le keyboard en différentes régions et assigner différents processus donc ici non pas ça ça j'ai mon begin midi synth à l'intérieur j'ai un split keyboard où je lui donne un range de notes donc de 0 à 59 tout ce qui vient jusqu'au prochain split keyboard va répondre aux notes qui sont dans ce dans ce registre là et ensuite j'ai une autre fonction split keyboard qui définit en fait le reste du clavier et j'ai un autre processus qui va répondre à ces notes là donc ici et là donc là ici je suis au-dessus de la note 60 et ici je suis en dessous et en plus voilà donc ici je suis à la jonction des deux il n'y a absolument rien qui vous empêche de définir un processus pour chacune des notes du clavier si ça vous tente ça génère un score 600 de 3000 lignes peut-être mais ça marche très bien donc pourquoi sans privé il y a la même chose donc on peut splitter la velocité mais je vais essayer d'aller un petit peu plus vite donc on va quitter le midi oh non parce que j'en ai beaucoup donc en fait ici vous pouvez ouvrir plusieurs scripts en même temps et vous pouvez aussi en faire jouer plusieurs donc par exemple ici j'ai mon untitle qui joue plusieurs fois un son mon sinus qui fait une petite mélodie et dans les effets qu'est ce que j'ai j'ai une banque de raisonnateurs et donc il y a un short cut donc soit qu'on fait run avec pomme R ou qu'on fait run all et là les trois scripts vont partir en même temps et on peut les arrêter en même temps aussi donc en fait j'ai essayé d'approcher un peu l'idée de live coding où on peut écrire trois quatre lignes où on va nous ficher on écrit trois quatre lignes où on peut le faire jouer et revenir interagir avec le premier ça doit pas être évident à gérer on de fly mais bon c'est possible ensuite il y a un autre environnement qui est assez sympathique qui est là c'est cancer plus précisément c'est un step sequencer donc un espèce de big box encore là begin sequencer end sequencer et il y a un petit exemple qui a été en fait le proof of concept de hoon que quand on a entendu ce script-là fonctionnait la première fois on a fait waouh il y a un potentiel c'est cheesy à mort mais c'est agréable à écouter donc ici j'ai défini des tables de rythme, des tables de pitch et c'est le séquenceur lui-même qui boucle donc il avance d'une barreur à l'autre qui revient et ça j'ai utilisé beaucoup les séquenceurs pour faire de la musique algorithmique ça marche drôlement bien et juste ici je vais faire un petit extrait d'une pièce qui est de la synthèse vocale passée dans des séquenceurs donc c'est pas extrêmement compliqué de gérer le moment où on change de table de fréquence, le moment où on change les tables de rythme tout ça peut se faire, tout ça ça devient du code piton donc c'est relativement simple de gérer et il y a moyen d'organiser les trucs pour donner des choses assez intéressantes 19 minutes dans l'optique pour répondre aussi à une question de tantôt où on veut pouvoir interagir plus facilement il y a un autre environnement qui s'appelle Python Inst en fait on crée un instrument sissande qui attend des événements de piton pour jouer et le plus simple en fait l'exemple le plus simple ça serait, ah bah tiens je prends l'interprèteur donc ici j'ai begin Python Inst et end Python Inst et entre les deux tout ce que j'ai mis c'est un sond de fond donc un son de piano qui sonne pas très bien d'ailleurs mais je voulais pas que ça pèse lourd dans les sources et plus loin donc je me suis défini une fonction qui contient la fonction send event donc qui envoie un événement de piton qui l'envoie sissande pour demander une note et cette fonction là ici elle est appelée par une horloge qui est un objet créé avec pattern on lui donne un tempo une rythmique et la fonction qu'on veut appeler et cette fonction là est appelée de façon périodique par l'horloge pour envoyer des notes parce que si ma fonction en fait mon horloge ici utilise une variable qui s'appelle tempo et elle maintenant j'ai le droit d'aller la changer dans l'interprèteur tout comme les deux facteurs de transposition donc si je lance le script donc il y a deux voies donc deux variations sur une pièce de bac ici je pourrais dire finalement je veux que ça soit plus lent et je viens de modifier la vitesse de mon horloge ou je veux avoir une transposition TR1 un octave au dessus etc et c'est d'ailleurs on peut aller relativement vite non disons tempo .05 et là ici ça c'est une horloge piton qui roule donc le timing si vous utilisez le step sequencer c'est ces centres qui gèrent le temps donc c'est arché précis si vous utilisez les patterns c'est des horloges pitons donc il faut vivre avec le fait que piton envoie son message quand il peut quand il veut, quand il peut donc ça peut décaler un petit peu mais sur des bonnes machines j'ai pas vu vraiment de problèmes avec ça et sinon autre environnement qui est plus ou moins environnement mais que j'ai appelé de la même façon c'est tout ce qui est interface graphique et comment j'ai appelé ça ici GUI donc ici on a begin GUI et end GUI et entre les deux vous avez des menus multi slider spin button, des toggle petit exemple simple en fait qui est pratiquement le même exemple que celui-là mais avec une interface est-ce que c'est 25 donc ici j'ai la même série de notes encore de bac mais là maintenant le script ne démarre pas quand je le lance il attend de recevoir le play donc pour partir le horloge j'ai mes deux facteurs de transposition et mon tempo et ça c'est une chose qui est pas mal bien donc pour tous ceux qui ont fait de l'interface graphique vous savez que c'est relativement pénible à coder mais ici tout est fait par en dessous et en général vous avez une fonction à appeler pour créer votre slider donc vous créez votre frame et ensuite vous avez une ligne à taper pour chacun des objets d'interface graphique que vous voulez utiliser donc c'est extrêmement simple et end GUI vous lui passez le frame GUI qui se charge de l'afficher simplement et ici si on regarde un objet qui est un petit peu plus évolué donc qui est un multi slider ici donc et là lui envoie la liste des valeurs donc ici je peux jouer avec donc c'est tout simplement du noise dans un filtre et j'ouvre les différentes bandes qui marchent plutôt bien il faut juste que je règle le code des trous qui se créent quand on glisse trop vite oui c'est le clientèle de l'aghésion entre le contrôleur midi puis il y avait le contrôleur midi avec un bus qui était réinjecté après dans les santé c'est ça ? ben en fait dans le code des contrôleurs où il y a une fonction soit des contrôleurs qu'on affecte un bus un bus et ça s'en va où on veut ensuite est-ce que tu peux faire le majeur avec les composants d'interface par exemple avoir une partie de tes contrôleurs qui sont graphiques et une partie qui sont physiques ? ah ben oui on peut mixer tout ce qu'on veut on peut faire un synthé midi et il y a une partie des contrôle du synthé qui se fait avec une interface graphique si on veut en fait dans le code l'interface graphique qui est ici ça envoie dans le code du filtre c'est moins évident mais si on regarde et ça c'est du piton aussi donc dans ce cas-ci c'est du piton donc il se passe pas grand chose mais il y a la gestion du OSC qui est implémentée dans les deux sens donc l'interface graphique en général est-ce que j'en ai une euh ou est-ce ou est-ce que j'ai reçu sliders donc ici voilà send OSC control slide c'est une fonction qui est appelée par mon interface graphique donc chaque objet d'interface appelle une fonction et dans ce cas-ci la valeur de mon slider je l'envoie avec un part OSC assissande et ensuite ici donc dans mon script sissande sur un bus quelconque et que j'applique n'importe où donc d'ailleurs l'OSC receve ça peut venir de n'importe où on l'a fait de plusieurs machines on l'a fait dans le pocket pc qui qui utilise piton et qui contrôlait ong sur ma machine ça marche impeccable ong peut même envoyer du son en UDP sauf que je connais pas beaucoup d'affirments qui reçoivent du son en UDP donc en général ong qui s'envoie du son à lui-même ou max pour savoir du son donc on peut envoyer du son à max alors est-ce qu'il y a d'autres questions par rapport à ong oui en fait quand on fait run ça écrit le fichier sissande et ça lance sissande aussi avec le fichier lui-même on tient tout ce qu'il faut pour que sissande réagisse au clavier midi chaque fois qu'on fait run on recrit le fichier en fait ong tout ce que ça fait c'est que ça écrit du texte grosso modo ça écrit du texte qui est conçu pour que sissande réagisse bien c'est pratiquement tout ce que ça fait oui oui tout simplement parce que par exemple les méthodes sont toutes les méthodes qui ont des prises ou surtout des strings pour ensuite les recompiler parce que peut-être que des choses vont apparaître avant ou après en le fichier en fait j'ai peut-être une dizaine de dictionnaires qui accumulent les strings tout le long qu'on passe à travers le script et qui replace les choses dans l'ordre par la suite chaque canal de contrôle doit être initialisé au départ donc moi j'accumule tout le texte j'accumule le nombre de canons que j'ai besoin et ça ça va s'écrire en premier donc c'est de la gestion de strings je ne peux pas vraiment déjoindre en fait j'écris ligne par ligne dans un fichier texte oui donc là on a perdu on a perdu le compteur ça prend le password donc en fait il me restrait deux choses j'avais pensé vous faire jouer une pièce qui a été construite entièrement entièrement dans ong qui dure 5 minutes donc on a le temps et il y a un autre petit chose que je voudrais vous parler après donc voilà ici ça fait 5 minutes je crois oui c'est un script ong c'est celui que j'ai essayé de lancer tantôt puis qui s'est mis à crachoter parce que c'est trop lourd mais c'est la version générée donc j'ai pas retouché après donc en général j'essaie de faire en sorte que ce qui sort de s'il s'end c'est le produit fini ça c'est un peu parce que je suis teteux ça vous êtes pas obligé de faire ça mais j'aime bien que mon script vive tout seul je sais pas c'est loin de qui tombe mais c'est un peu du processus de composition c'est-à-dire de quelle manière de quelle manière que tu as organisé ok bah oui je peux vous montrer les stratégies tout de suite après c'est moi ok donc je vous fais jouer ça 5 minutes on veut de la stéréo quand même on va tester on a de la stéréo donc ici c'est le script qui a généré qui a généré la pièce et des gens de stratégie que j'ai utilisé avec ong que j'ai mes variables donc au départ qui déterminent de quelle façon je veux travailler donc la résolution j'ai le choix entre l'eau et ailles et un peu partout dans le code j'ai une condition donc si je suis à l'eau je baisse le sampling rate pour décharger un peu le processeur en général je vais aussi changer le type de reverb voilà ici donc quand je suis à l'eau j'utilise une reverb cheap qui coûte pas cher et quand je me mets à ailles j'utilise une reverb qui a beaucoup plus de gueule et à la toute fin donc quand je suis à l'eau j'écoute en temps réel donc start 600 est vide et quand je suis à ailles je dis à 600, vas-y tu calcules donc ça c'est je suis automatisé pas mal partout toutes ces pièces là ont été composées en octo dans un studio habite aux parleurs mais je voulais pouvoir travailler chez moi aussi donc j'ai une variable channel qui me permet de passer facilement donc de 8 à 2 donc partout où j'ai de la panne dans le code je me réfère à cette variable là pour savoir finalement est-ce que je suis à l'université ou je suis chez nous pour pouvoir travailler et donc en général même chose c'est le total et ici le nombre de voix donc en fait ce qui se passait c'est dans cette pièce là il y a un encheveint roman de voix de synthèse et de distorsion qui sont appliquées sur une ou plusieurs voix et en fait tous en voix un dans l'autre et ici je détermine donc combien j'ai de module voix distorsion donc je pourrais essayer la même pièce avec 40 voix 40 distorsions probablement que ça donnerait de la bouillie puis ce serait moins intéressant mais donc en général j'essaie de pas trop toucher au code qui est en dessous puis de juste changer de 3 petits trucs en haut pour pouvoir régénérer et il y a beaucoup en fait le import random et partout dans mes scripts donc je laisse beaucoup de place à l'aléatoire en fait quand je compose ma musique oui j'ai vu ta musique quand j'ai perdu en fait présentement ma musique existe pas mal juste sur cette machine en fait je pensais la se tuer mais sur l'unette éventuellement ma genre d'activité qui ne me fascine pas il y a le code sur le sol oh boy je pourrais envoyer le code sur pourquoi pas bah éventuellement en fait mon idée d'ailleurs sur le site de google code j'aimerais bien éventuellement il y a environ 300 downloads ce qui commence à être pas si mal mais si ça démarre ça serait le fun qu'il y ait une banque en fait une banque de scripts qui existe quelque part ou n'importe qui peut se référer pour avoir des exemples de type de processus est-ce que j'ai 4 minutes encore il y a un petit truc c'est que là présentement on est dans Hong lui-même à 5h40 donc on est dans l'environnement graphique de Hong mais Hong s'utilise très bien en tant que librairie donc dans le code source il y a un script il y a un setup.py donc vous pouvez installer la librairie directement dans les sources de Python et ça fait en sorte que dans n'importe quel projet ça devient très facile donc d'importer la librairie d'avoir un type de code qui réagit à votre programme quelconque et si ces centres sont installés sur la machine ça fonctionne très bien et j'ai commencé à l'utiliser de cette façon-là j'ai fait un logiciel qui s'appelle SoundGrain ici qui est donc une application compilée avec pyhap et en compilant l'application donc Hong est inclus directement dans l'exécutable donc il ne reste qu'à installer 600 et ça fonctionne et ici c'est un autre bidule fait en Python avec WX et en fait j'explorais le dessin le dessin du trajectoire alors ici par exemple en fait je vais charger un son on va reprendre notre philosophe Roger Brulot et donc ici j'ai le son et je peux dessiner une trajectoire quelconque et il y a une petite boule qui se promène dessus et la position XY de la petite boule est envoyée à ces centres continuellement et donc en X j'ai la position dans le son et en Y dans ce cas-ci j'ai le pitch lui-même et si je démarre l'audio on peut s'amuser et on peut déplacer notre truc mais on peut dupliquer et bon l'idée c'était juste à démontrer qu'on peut utiliser en fait le code onc dans cette histoire-là ça fait peut-être assez un fichier sans ligne peut-être maximum c'est la gestion de trajectoire et il y a différents types donc on peut, on a un truc qui osse comment comment délivre donc ou il y a le cercle et donc ici on a quelques types de modules qui sont des tout petits bouts de code onc qui sont rechargés au moment où on fait start audio donc si on en prend un autre par exemple fft reader c'est sensiblement la même chose mais ça va lire, ça va lire un buffer fft et donc voilà tout ça pour dire que c'est relativement simple d'utiliser onc pour construire une application qui génère du son sans avoir à réécrire tout ce qui a été écrit pour le son donc comme c'est sound se lance en ligne de commande en fait c'est sound c'est pas un lechet avec une interface graphique c'est juste un lechet en ligne de commande en simple de l'intégrer à n'importe quel projet d'ailleurs Soundgrain est aussi sur google code si ça vous intéresse ici Soundgrain donc il est disponible pour l'instant si je me trompe pas il n'y a que le binaire il n'y a que le binaire OS 10 mais les sources fonctionnent sur Windows et Linux sans problème alors voilà c'est tout pour moi ça y est