Dessiner de la musique: danse du cercueil dans Pure Data

Programmation et mèmes


La programmation est un processus au bord de la science et de la créativité. Sans programme bien conçu, un ordinateur est une unité sans défense qui dépense de l'électricité. La plupart des spécialistes modernes travaillent avec des langages symboliques déclaratifs - ils créent des programmes à partir de commandes textuelles: simple - affectation, multiplication; et complexe - vérification des conditions, exécution de routines en boucle.

Mais tous les langages de programmation ne sont pas conçus pour résoudre les problèmes du système. Certains sont créés pour la formation, les présentations et les spectacles numériques. Lorsque les performances et les fonctionnalités disparaissent en arrière-plan, des solutions originales telles que l'environnement de programmation visuelle Pure Data voient le jour.

En 2020, la danse de la vidéo archivée de la cérémonie funéraire de l'agence Dada awu du Ghana est devenue le mème le plus populaire de Russie. Aujourd'hui, nous devons recréer étape par étape le légendaire thème musical Coffin Dance, en utilisant l'environnement de description sonore algorithmique Pure Data.

À propos de la programmation visuelle


Par programmation visuelle, il est habituel de comprendre le processus de description d'un programme pour un dispositif informatique à l'aide d'éléments graphiques fonctionnels. Ainsi, l'utilisation du concepteur de formulaires WPF dans l'environnement de développement Visual Studio peut être appelée programmation visuelle de l'interface. Les graphistes sont apparus avec les premiers ordinateurs personnels. Maintenant en cours d'informatique, Visual Pascal est étudié dans certaines écoles. et la moitié des améliorations standard de 1C peuvent être effectuées sans écrire de ligne de code.

Mais des environnements de programmation visuelle à part entière sont apparus plus tard. Lorsqu'il s'agit de créer un langage de programmation qui se compose uniquement de commandes graphiques, un certain nombre de difficultés se posent, à cause desquelles la fonctionnalité du langage lui-même doit être réduite.
Ainsi, plusieurs appels du même sous-programme dans différentes parties du code C ++ sont naturels pour le programmeur. Dans un environnement graphique, un appel de sous-programme peut être représenté, par exemple, par une flèche d'un objet dans le texte du programme principal vers un sous-programme d'objet, et lorsqu'il y a trop de telles flèches, le code graphique devient illisible. Les développeurs d'environnements de développement éducatif imposent souvent eux-mêmes une limite (sur le nombre d'appels, d'objets dans le programme, de variables utilisées) pour protéger l'utilisateur et rendre le processus de programmation visuelle plus visuel.
Un exemple d'un programme sanscrit simple:

image

Mais si vous vous distrayez de la programmation au sens large, vous pouvez trouver des problèmes appliqués importants qui sont résolus graphiquement plus facilement et plus efficacement qu'en symbolique. Une de ces tâches: une description des instruments virtuels. Dans les années 80 du siècle dernier, la plupart des enregistrements musicaux ont été réalisés en direct. Les synthétiseurs numériques étaient de qualité sonore inférieure aux instruments acoustiques, et les systèmes numériques véritablement «musicaux» étaient chers.

Tout a changé avec l'introduction de la technologie VST, introduite en 1996 comme une bibliothèque volumineuse pour travailler avec le son. La fonctionnalité VST nous a permis de décrire l'architecture de vrais synthétiseurs numériques, de processeurs d'effets et d'émuler très précisément leur travail sur ordinateur. Cependant, seule une équipe de programmeurs qualifiés et d'ingénieurs du son a pu construire une telle description. La question de la création d'instruments virtuels personnalisés restait ouverte.

Dans ces mêmes années, dans une tentative de vulgariser la synthèse sonore auprès des amateurs, le projet expérimental Pure Data est apparu - un environnement de développement visuel axé sur la description de synthétiseurs simples. Autour de Pure Data, un petit groupe de «fans» s'est formé qui a promu la programmation visuelle en FB, Youtube: ils ont écrit et traduit du matériel de formation, publié des exemples de synthétiseurs et des mixages de musique entiers sur un patch (c'est le nom du programme Pure Data par analogie avec les patchs des synthétiseurs matériels modulaires). ) Mais l'environnement n'a pas été largement diffusé dans le monde.

Bases de données pures


L'environnement de développement Pure Data peut être téléchargé gratuitement sur le site officiel. Le programme distribue l'open source et est disponible pour les utilisateurs de Windows, Linux et MacOS X. Installez et exécutez Pure Data. Dans le menu Fichier, créez un nouveau patch. La fenêtre d'édition suivante apparaîtra:

image

Le menu Put contient une liste d'objets graphiques à partir desquels nous ferons notre premier synthétiseur. Après avoir sélectionné l'élément approprié, l'élément est ajouté au champ graphique (Canvas) du patch actuel. Les éléments peuvent être modifiés (changer la signature, qui affecte leur comportement, ainsi que déplacés) et connectés par des lignes (en maintenant le bouton gauche de la souris sur l'une des sorties de l'objet source, en déplaçant le curseur sur l'entrée de l'objet de destination et en le relâchant). Pour un exemple, nous allons créer un élément de type "Object" avec la clé de nom et un élément de type "Number". Les entrées de l'élément sont surlignées en noir et sont situées au-dessus du cadre de l'élément lui-même, et les sorties sont en dessous. Connectez la sortie de l'objet clé à l'entrée de l'élément Number.
On a:

image

Pendant tout ce temps, nous étions en mode d'édition de patchs. Pour passer en mode exécution, allez dans le menu Édition et décochez l'élément Mode Édition. Le pointeur de la souris sur le contour doit passer de la main à la flèche. Appuyez maintenant sur n'importe quelle touche du clavier principal. Nous verrons comment la valeur de Number change lorsque vous appuyez dessus:

image

Analysons le résultat du patch. Après avoir attribué la clé de nom à l'objet, il a une sortie, mais aucune entrée. Un objet portant ce nom écoute le clavier et envoie un code clé à chaque fois qu'il est enfoncé lors de l'exécution. L'élément Number a une entrée et une sortie. Prenant un nombre en entrée, Number l'affiche à l'écran et envoie la même valeur à la sortie. Notez qu'après avoir relâché la clé, le numéro continue d'être affiché. Cela montre que les entrées conservent la dernière valeur qu'elles acceptent.

Revenez en mode édition et ajoutez un autre objet nommé sel 49. Il aura deux entrées et deux sorties. Cet objet envoie un signal à la première sortie chaque fois qu'une valeur arrive sur l'une des entrées et correspond à la valeur stockée sur l'autre entrée. Si l'entrée reçoit une valeur autre que celle accumulée, le signal est envoyé à la deuxième sortie. La première partie du nom sel spécifie le type d'objet, la seconde 49 - écrit la valeur par défaut pour la deuxième entrée. 49 est le code clé "1".

Un signal est un type de données spécial qui ne peut pas être simplement émis, par exemple, en envoyant Number à l'entrée. Mais à l'aide de signaux, vous pouvez "démarrer" le travail de certains éléments.

Revenez au menu Put et ajoutez l'élément Bang à notre patch. Connectez la sortie Number à la première entrée sel 49 et la première sortie sel 49 à l'entrée Bang. Nous recevrons le patch suivant:

image

Nous passerons à un mode d'exécution. En appuyant sur différentes touches, leurs codes apparaîtront. Lorsque vous appuyez sur la «touche spéciale» avec le code 49, l'objet sel génère un singal qui, lorsqu'il est enfoncé sur le bouton bang, le presse automatiquement: l'

image

objet bang génère un signal à sa seule sortie lorsqu'il est enfoncé en mode exécution, le signal ou la valeur arrive à l'entrée. Ajoutez un peu de son à notre projet. Pour que le patch fonctionne correctement avec les données audio, le menu Média doit avoir une coche en face de l'élément DSP On. Vous devrez également entrer dans le menu Paramètres Midi et installer le périphérique de sortie. Sous Windows:

image

Cliquez sur OK et revenez en mode édition. Pour travailler avec des signaux Midi, 2 éléments sont le plus souvent utilisés: les objets makenote et noteout. Ajoutez un tel objet et créez également plusieurs messages Message avec les valeurs suivantes:

image

Message est un élément de programmation visuelle avec un comportement complexe. Si le message est appelé un certain nombre, puis en cliquant sur le message ou à la réception d'un signal à son entrée, dans les deux cas, ce numéro et ce signal seront émis simultanément.

L'objet noteout, lorsqu'il reçoit la valeur à la première entrée, génère du son sur l'un des canaux MIDI. Le numéro de canal peut être indiqué explicitement dans le nom de l'objet (dans notre cas 1 - piano) ou transféré vers la troisième note d'entrée. La première entrée prend la hauteur en termes de midi: (60 - c'est à la première octave puis +1 - une augmentation d'un demi-ton, -1 - une diminution d'un demi-ton), et la seconde - une description de la note: volume, durée, nature de la production sonore.
L'objet makenote reçoit la hauteur tonale à la première entrée et au deuxième volume (0 - silence, 127 - volume maximum) traduit la hauteur tonale à la première sortie, et génère une description de note pour la deuxième note d'entrée sur la deuxième sortie. Les valeurs par défaut des première et deuxième entrées makenote sont spécifiées immédiatement après le nom de l'objet. Connectez les éléments comme indiqué sur la figure et passez en mode exécution:

image

lorsque vous cliquez sur un message, une note doit retentir correspondant à la hauteur du nom du message. 60 - note à, 62 - re, 67 - la. Maintenant en mode édition, connectez la première sortie du sélecteur (objet sel) avec le message 60. Ajoutez 2 sélecteurs supplémentaires avec les codes pour les touches 2 et 3 sur le clavier et obtenez le synthétiseur le plus simple:

image

Appuyez sur les touches 1 à 3 dans makenote pour envoyer un message avec la hauteur appropriée et une note retentit. Dans la section suivante, nous allons essayer de décrire une mélodie complexe qui sera jouée séquentiellement note par note lors de l'envoi d'un seul signal.

Recréer la danse du cercueil


La musique


Pour décrire une mélodie complexe, nous devons étudier 2 objets importants - métro et f, ainsi qu'un certain nombre d'objets auxiliaires. Prenons un exemple simple:

image

L'objet metro a deux entrées. Le premier signal est reçu. Tout signal autre que l'arrêt comprend un métronome. Pour désactiver, utilisez le signal de sortie du message avec l'arrêt de texte. La deuxième entrée, metro, reçoit un intervalle en millisecondes. Lorsque le métronome est activé, il enverra immédiatement un signal à sa seule sortie et le renverra toutes les n millisecondes. L'intervalle n peut être spécifié par la valeur par défaut dans le nom de l'objet ou transféré à la deuxième entrée. Après être entré en mode d'exécution, nous pouvons démarrer le métronome avec le bouton bang au-dessus et voir comment le bouton en dessous est pressé toutes les 0,4 secondes. En envoyant un message avec un nouvel intervalle, nous accélérerons ou ralentirons la fréquence d'envoi des signaux. Après l'envoi du message d'arrêt, la signalisation s'arrête.

Rappelez-vous la musique de Coffin Dance:


La mélodie principale peut être décrite par une séquence de 64 notes et pauses de la 8e durée, soit à 8 mesures en 4/4. Nous devons donc organiser l'envoi cyclique du 64e signal aux messages de note correspondants. Pour ce faire, utilisez l'objet f.

F - de float - représente une variable réelle. L'objet f a deux entrées. À la deuxième entrée, vous pouvez soumettre une valeur numérique (par exemple, à partir de la sortie du message ou de la sortie de Number), qui est écrite comme la valeur de la variable. La valeur par défaut est 0. Avec la première entrée et sortie, les choses sont un peu plus compliquées. Prenons un exemple:

image

Nous avons donc trouvé un lien magique entre les mèmes «Appuyez sur F pour rendre hommage» et «Danse du cercueil». Passons en mode exécution. Lorsque vous cliquez sur le message 3, la valeur sera écrite dans la variable objet f, mais en nombre, nous ne le verrons pas. Si vous soumettez le signal à la première entrée f avec le bouton bang, ce qui se passe en termes de données pures est une itération, à savoir:

  • La sortie f enverra la valeur actuelle de la variable (3)
  • L'objet + 5 recevra le numéro 3 sur la première entrée et renverra la somme de deux entrées 8 (ici, la valeur à la deuxième entrée est définie par défaut après le nom + objet d'addition)
  • L'objet% 40 recevra le nombre 8 sur la première entrée et renverra le reste de la division de la 8e par 40 (la valeur de la deuxième entrée est définie par défaut)
  • La variable f recevra la valeur (3 + 5)% 40 = 8 sur la deuxième entrée. L'itération est terminée

Ainsi, après la première itération, nous voyons la valeur 3 au numéro d'entrée et a une valeur réelle de 8 pour la variable f. À l'itération suivante, nombre obtiendra les huit précédemment enregistrés, et f augmentera de 5 et prendra la valeur 13. En ce qui concerne l'itération avec la sortie 38, nous obtenons la valeur (38 + 5)% 40 = 3 pour la variable f. Ainsi, les valeurs f et les valeurs de sortie seront répétées cycliquement. L'utilisation de l'addition et de la division modulo vous permet d'obtenir un cycle avec n'importe quelle période et n'importe quelle valeur pour les itérations.

Connectez la sortie du métronome à la première entrée f et réglez plusieurs sélecteurs et boutons sur la sortie f. Lancez le métronome et voyez comment les boutons s'allument tour à tour et après avoir automatiquement appuyé sur le dernier bouton, le cycle se répète. Pièce:

image

Pour que la boucle s'exécute à chaque fois à partir de la valeur 3, j'ai connecté la sortie du message d'arrêt à l'entrée du message 3 en envoyant la valeur initiale à f.

Décrivons la mélodie. Pour ce faire, créez un patch propre et décrivez le métronome à des intervalles de 230 (exactement 230 millisecondes durent une croche dans la mélodie) et un cycle de 64 notes. Pour sélectionner les valeurs, nous utilisons la variable f et le nouvel élément moses pour nous, dont la fonctionnalité sera décrite ci-dessous. Nous ajoutons également quelques objets makenote, messages avec notes, noteout avec les canaux 1 (piano) et 10 (batterie), et combinons les sélecteurs de moses de chaque itération avec les notes correspondantes. Obtenez le patch:

image

Comme vous pouvez le voir, avec la programmation visuelle, l'utilisation d'un grand nombre d'objets réduit la lisibilité du programme. En fait, un patch est une combinaison d'éléments simples. Considérez la "routine" suivante:

image

L'objet moses stocke un nombre sur la deuxième entrée, qui peut être défini par défaut. Si la première entrée reçoit un nombre inférieur à la valeur stockée de la deuxième entrée, alors un signal est envoyé depuis la première sortie de moïse, sinon le signal est envoyé depuis la deuxième sortie. Ainsi, la première sortie de moses 1 se comporte de la même manière que la première sortie de sel 0. Regardons un tas de + 63% 64. Cela vous permet de réduire les valeurs dans la boucle d'une unité. Si l'on a été entré, la sortie sera 0, pour l'entrée 0 la sortie sera 63 - nous obtiendrons un cycle de 64 éléments dans l'ordre inverse. Si nous connectons la sortie de ce bundle à l'entrée de la construction suivante + 63% 64 et connectons moses 1 à la sortie de chaque bundle, mais pour chacune des 64 valeurs possibles de f, exactement un moses enverra un signal à la première sortie. Donc, le nombre 7 doit être réduit 7 fois de 1,pour obtenir 0, le 7e Moïse 1 à l'itération 7 recevra 0 sur la première entrée et enverra un signal à la note correspondante. Si, pour 64 sélecteurs, vous devez modifier manuellement les valeurs par défaut des paramètres, les routines + 63% 64 moïse 1 peuvent être copiées et la connexion des sorties du% 64 précédent aux entrées + 63 obtient un sélecteur cyclique complexe à 64 positions.

Le patch de mélodie utilise la duplication d'objets noteout. Cette technique vous permet d'augmenter le volume en contournant la marque limite. Donc, si vous connectez le même makenote 67127 à 2 noteout 1, mais lors de l'envoi d'un signal depuis la première entrée makenote, la note la (code 67, première octave) sera jouée avec un volume de 127 * 2 = 254. Instruments MIDI dans Pure Data très silencieux, donc cette technique est utile pour créer des mélodies d'ensemble (dans notre cas, 2 pianos sont joués sur les canaux 1 et 5 et le kit de batterie 10 avec triple volume).

Pour décorer la simulation (le processus de déplacement des données entre les objets du code du patch lors de l'exécution), il est pratique d'utiliser des boutons dupliqués. Dans l'exemple ci-dessus, leurs objets à 6 coups ont une silhouette du bouton Lecture, qui est automatiquement mise en surbrillance lorsque le bouton de coup extrême est enfoncé à droite. Le traitement du signal Bang est un processus gourmand en ressources, mais dans la section suivante, nous allons placer toute une gamme de ces boutons et essayer de représenter une danse de la vidéo avec leur aide.

Animation


Pour l'animation, nous avons besoin des mêmes variables f, objets - opérateurs arithmétiques et métronome, ainsi que des sélecteurs. Cette fois, nous n'avons besoin que de 8 images, nous allons donc utiliser des objets sel. Créez un champ de 20x10 à partir des boutons de bang (nous utiliserons l'opération de copie). Après avoir placé le patch avec la mélodie au centre, nous obtenons la figure suivante:

image

Vous pouvez simplement connecter les sorties gauche de chaque sélecteur aux boutons qui doivent être enfoncés sur cette trame et envoyer le signal du métronome à l'entrée d'une nouvelle variable du cycle f. Mais cette approche a 2 défauts:

  • 0,23 sec par image - trop rapide pour notre danse. Et l'utilisation du deuxième métronome nous fera perdre le rythme: noteout et bang ont un retard différent en réponse au signal;
  • le bouton reste enfoncé pendant 0,05 seconde à partir du moment où le signal a été reçu, ce qui signifie que pendant les 0,18 secondes restantes, «l'écran» de l'animation sera vide et l'image dans la boucle clignotera.

Pour résoudre ces problèmes, nous utilisons la division. La construction suivante:

image

prend la valeur d'entrée f du cycle-mélodie principal. Après avoir divisé par 2, nous obtenons un ralentissement du changement de trame: pour 0 et 1, la trame 1 sera affichée, pour 2 et 3, la trame 2 et ainsi de suite. Pour chaque trame, un signal est toujours envoyé toutes les 0,23 seconde. Utilisons maintenant une autre boucle:

image

Pour se synchroniser avec la mélodie principale, un retard lui a été ajouté: le signal d'inclusion passe d'abord du sélecteur par le bouton puis seulement à la première entrée du métronome. Maintenant, si vous créez un bang et connectez sa sortie à tous les boutons de pixels d'une certaine image, alors l'image ci-dessus vous pouvez mettre en évidence l'image toutes les 0,046 secondes, ce qui est plus rapide que la fréquence de mise à jour des boutons, c'est-à-dire le cadre s'allumera en continu jusqu'à ce que le prochain cadre change. Un cycle de 5 itérations garantit que les images ne seront pas superposées, car 0,046 * 5 = 0,23 s - la période des sélecteurs d'images.

Lors de la création d'une animation, l'ordinateur plantait régulièrement, mais il était possible de dessiner 5 images différentes et de créer un cycle de 8 images dans l'ordre:

1 2 3 2 1 4 5 2

Le patch final avec Coffin Dance (de nombreux éléments décoratifs - boutons et commentaires ajoutés) en mode édition:

image

Il est à peine possible d'analyser le code source de la simulation dans cette image infernale, cependant le patch fonctionne correctement:

image

Dans le coin inférieur droit un compteur est utilisé pour arrêter automatiquement le joueur après le 121e Remarques. Initialement, une animation de 48x24 pixels était supposée, mais l'ordinateur l'a catégoriquement refusée avec un rugissement triste du refroidisseur et un redémarrage inattendu de Windows en mode sans échec. Le pixel art original 48x24 de l'artiste LikaLou joint à la fin de la vidéo. Donc, après 3 jours de «dessin de musique», nous avons Coffin Dance in Pure Data:


Conclusion


La programmation visuelle des mèmes est une activité amusante, même si elle prend beaucoup de temps et détruit parfois votre matériel. Même une telle tâche de danse funéraire apparemment simple nécessite une approche modulaire de la création d'un programme, une connaissance des caractéristiques non seulement du langage de mise en œuvre, mais aussi de l'environnement de développement.

En utilisant l'exemple de patch pour Coffin Dance, vous pouvez juger du niveau de développement de la programmation visuelle. Il existe des langages graphiques qui gèrent bien certaines tâches d'application, si les environnements de développement sont pratiques. Mais l'industrie de la programmation visuelle dans son ensemble en est à ses balbutiements.

Références


Site officiel de Pure Data
Bases de la programmation visuelle dans Pure Data A
propos du standard VST
Coffin Dance article sur Wikipedia
Coffin Dance dans Pure Data: vidéo originale

All Articles