This commit is contained in:
Bubobubobubobubo
2024-02-09 10:03:44 +00:00
parent 09837ea795
commit d954cacb11
170 changed files with 213 additions and 213 deletions

View File

@ -6,18 +6,18 @@
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#ffffff">
<link href="../_app/immutable/assets/0.dagaUCjZ.css" rel="stylesheet">
<link rel="modulepreload" href="../_app/immutable/entry/start.6eH0sfCC.js">
<link href="../_app/immutable/assets/0.irQoIe1C.css" rel="stylesheet">
<link rel="modulepreload" href="../_app/immutable/entry/start.LKmjm6I8.js">
<link rel="modulepreload" href="../_app/immutable/chunks/scheduler.aZRR5A_O.js">
<link rel="modulepreload" href="../_app/immutable/entry/app.MUzNn6Wd.js">
<link rel="modulepreload" href="../_app/immutable/entry/app.4UG9pbyD.js">
<link rel="modulepreload" href="../_app/immutable/chunks/preload-helper.0HuHagjb.js">
<link rel="modulepreload" href="../_app/immutable/chunks/index.kYoizZ4A.js">
<link rel="modulepreload" href="../_app/immutable/nodes/0.KyXS4JbA.js">
<link rel="modulepreload" href="../_app/immutable/nodes/9.g1YyXmWB.js">
<link rel="modulepreload" href="../_app/immutable/nodes/0.9erRrS7P.js">
<link rel="modulepreload" href="../_app/immutable/nodes/9.EjvK5Uv6.js">
<link rel="modulepreload" href="../_app/immutable/chunks/dynamic-import-helper.0gtGTknh.js">
</head>
<body data-sveltekit-preload-data="hover">
<div style="display: contents"> <div><div class="bg-neutral-800 dark:bg-base-300"><nav class="pl-8 py-2 md:flex md:justify-between md:items-center pr-8"><div class="flex items-center justify-between"><a href="/" class="website-title text-2xl font-bold bg-gradient-to-r from-orange-700 via-blue-500 to-green-400 text-transparent bg-clip-text animate-gradient" data-svelte-h="svelte-15xybd8">livecoding.fr</a> <div class="flex md:hidden" data-svelte-h="svelte-glwq61"><button type="button" class="text-gray-100 hover:text-gray-400 focus:outline-none focus:text-gray-400"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6"><path stroke-linecap="round" stroke-linejoin="round" d="M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5"></path></svg></button></div></div> <div class="flex-col mt-8 space-y-4 md:flex md:space-y-0 md:flex-row md:items-center md:space-x-10 md:mt-0 hidden"><a href="/evenements" class="mobile-menu-link" data-svelte-h="svelte-11zf95a">Évènements</a> <a href="/membres" class="mobile-menu-link" data-svelte-h="svelte-1a3do61">Membres</a> <a href="/outils" class="mobile-menu-link" data-svelte-h="svelte-ee0p45">Outils</a> <a href="/guides" class="mobile-menu-link" data-svelte-h="svelte-5misk3">Guides</a> <a href="/articles" class="mobile-menu-link" data-svelte-h="svelte-kglg6r">Articles</a> <a href="/reseaux" class="mobile-menu-link" data-svelte-h="svelte-6wk0bt">Réseaux</a> <a href="/ressources" class="mobile-menu-link" data-svelte-h="svelte-ziwryh">Ressources</a> <a href="/presse" class="mobile-menu-link" data-svelte-h="svelte-6fl78t">Presse</a> <a href="/contacts" class="mobile-menu-link" data-svelte-h="svelte-1skvj1i">Contact</a></div></nav></div></div> <main class="bg-gray-100 dark:bg-base-100"><div class="drawer lg:drawer-open"><input id="my-drawer-2" type="checkbox" class="drawer-toggle"> <div class="drawer-content space-y-4 flex flex-col lg:px-16 px-4 py-8"><article><h1>Introduction au live coding sur SuperCollider (II)</h1> <div class="pt-4 flex justify-between mb-12"><p class="inline font-bold">Publié le : 2023-24-12</p> <p class="inline font-bold">Auteur : Raphaël Maurice Forment</p></div> <div class="lg:px-24 md:px-12 content-center"><article><h2 data-svelte-h="svelte-1ukekoe">Introduction</h2> <h3 data-svelte-h="svelte-tla2tn">Le labyrinthe <strong>SuperCollider</strong></h3> <div style="margin-bottom:100px" data-svelte-h="svelte-u3kyqm"><br> <div><a href="https://www.instagram.com/p/CtHWU0fuOKd/"><img style="min-width: 200px;width:30%;height:auto;float:inline-end;padding-right:20px;margin-left:20px" src="/images/supercollider_meme.png"></a></div> <p>Si vous avez lu et suivi le premier article, tout est en place et vous devriez
<div style="display: contents"> <div><div class="bg-neutral-800"><nav class="pl-8 py-2 md:flex md:justify-between md:items-center pr-8"><div class="flex items-center justify-between"><a href="/" class="website-title text-2xl font-bold bg-gradient-to-r from-orange-700 via-blue-500 to-green-400 text-transparent bg-clip-text animate-gradient" data-svelte-h="svelte-15xybd8">livecoding.fr</a> <div class="flex md:hidden" data-svelte-h="svelte-glwq61"><button type="button" class="text-gray-100 hover:text-gray-400 focus:outline-none focus:text-gray-400"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6"><path stroke-linecap="round" stroke-linejoin="round" d="M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5"></path></svg></button></div></div> <div class="flex-col mt-8 space-y-4 md:flex md:space-y-0 md:flex-row md:items-center md:space-x-10 md:mt-0 hidden"><a href="/evenements" class="mobile-menu-link" data-svelte-h="svelte-11zf95a">Évènements</a> <a href="/membres" class="mobile-menu-link" data-svelte-h="svelte-1a3do61">Membres</a> <a href="/outils" class="mobile-menu-link" data-svelte-h="svelte-ee0p45">Outils</a> <a href="/guides" class="mobile-menu-link" data-svelte-h="svelte-5misk3">Guides</a> <a href="/articles" class="mobile-menu-link" data-svelte-h="svelte-kglg6r">Articles</a> <a href="/reseaux" class="mobile-menu-link" data-svelte-h="svelte-6wk0bt">Réseaux</a> <a href="/ressources" class="mobile-menu-link" data-svelte-h="svelte-ziwryh">Ressources</a> <a href="/presse" class="mobile-menu-link" data-svelte-h="svelte-6fl78t">Presse</a> <a href="/contacts" class="mobile-menu-link" data-svelte-h="svelte-1skvj1i">Contact</a></div></nav></div></div> <main class="bg-neutral-900"><div class="drawer lg:drawer-open"><input id="my-drawer-2" type="checkbox" class="drawer-toggle"> <div class="drawer-content space-y-4 flex flex-col lg:px-16 px-4 py-8"><article><h1>Introduction au live coding sur SuperCollider (II)</h1> <div class="pt-4 flex justify-between mb-12"><p class="inline font-bold">Publié le : 2023-24-12</p> <p class="inline font-bold">Auteur : Raphaël Maurice Forment</p></div> <div class="lg:px-24 md:px-12 content-center"><article><h2 data-svelte-h="svelte-1ukekoe">Introduction</h2> <h3 data-svelte-h="svelte-tla2tn">Le labyrinthe <strong>SuperCollider</strong></h3> <div style="margin-bottom:100px" data-svelte-h="svelte-u3kyqm"><br> <div><a href="https://www.instagram.com/p/CtHWU0fuOKd/"><img style="min-width: 200px;width:30%;height:auto;float:inline-end;padding-right:20px;margin-left:20px" src="/images/supercollider_meme.png"></a></div> <p>Si vous avez lu et suivi le premier article, tout est en place et vous devriez
maintenant être prêt à jouer. Lune des qualités mais aussi lun des défauts de <strong>SuperCollider</strong> est de ne
pas vous astreindre à suivre une route particulière concernant la manière dont il vous faut approcher la création sonore lorsque vous débutez. Le logiciel est extrêmement générique et chaque
utilisateur développe progressivement ses propres abstractions et une logique qui lui est propre. Il existe plusieurs dizaines de mécanismes
@ -40,7 +40,7 @@ est toutefois possible de développer une certaine expertise pour utiliser <stro
<span class="token operator">~</span>osc <span class="token operator">=</span> <span class="token punctuation">&#123;</span>LPF<span class="token punctuation">.</span><span class="token function">ar</span><span class="token punctuation">(</span>SinOsc<span class="token punctuation">.</span><span class="token function">ar</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">200</span><span class="token punctuation">,</span> <span class="token number">150</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">,</span> SinOsc<span class="token punctuation">.</span><span class="token function">ar</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token operator">/</span><span class="token number">4</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">range</span><span class="token punctuation">(</span><span class="token number">200</span><span class="token punctuation">,</span><span class="token number">2000</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">0.5</span><span class="token punctuation">&#125;</span><span class="token punctuation">;</span> <span class="token comment">// On remplace la source</span>
<span class="token operator">~</span>osc<span class="token punctuation">.</span><span class="token function">stop</span><span class="token punctuation">(</span>fadeTime<span class="token operator">:</span> <span class="token number">4</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Fade-out</span>
<span class="token operator">~</span>osc<span class="token punctuation">.</span>clear<span class="token punctuation">;</span> <span class="token comment">// On libère la mémoire</span></code><!-- HTML_TAG_END --></pre> <br> <p data-svelte-h="svelte-mlyqm">Même si tout reste assez primitif pour le moment, on peut déjà faire beaucoup de choses en suivant ce principe. Il est possible dutiliser nimporte quel algorithme audio et de le mettre à jour graduellement tout au long dune performance. Ce type de <em>live coding</em> centré autour de la musique à jour dun générateur sonore se prête plutôt bien à de la musique électro-acoustique, <em>ambient</em>, <em>noise</em>, etc.</p> <br> <h3 data-svelte-h="svelte-1t7im02">Les <code>Ndefs</code> : une autre manière de faire la même chose</h3> <br> <p data-svelte-h="svelte-ngon7m">La technique que nous utilisons avec <code>ProxySpace.push(s.boot)</code> <em>dissimule</em> lutilisation que nous faisons des <code>NodeProxy</code>. Cette fonctionnalité a été intégrée car elle permet de gagner du temps de frappe mais elle a pour désavantage de rendre plus difficilement perceptible ce que nous sommes réellement en train de faire. À première vue, il semble que <code>~a = 2</code> soit juste une assignation de variable comme dans un langage de programmation classique. Pourtant, il sagit dune opération qui crée/modifie un <code>NodeProxy</code>.</p> <br> <p data-svelte-h="svelte-f4v0jn">Nous occultons le fait que les variables globales de <strong>SuperCollider</strong> sont maintenant des <code>NodeProxy</code>. Il est possible de se passer entièrement de <code>Proxyspace.push</code> et de cet avantage/désagrément en utilisant les <code>Ndefs</code>. Il sagit dune préférence personnelle, presque dordre stylistique.</p> <br> <div class="alert bg-base-300 dark:bg-base-300"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" class="stroke-current shrink-0 w-6 h-6"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg> <span class="text-xl"><!-- HTML_TAG_START -->Pour être plus précis, <code>ProxySpace.push(...)</code> transforme le <em>scope</em> global en un <code>ProxySpace</code>. Seule les variables de <code>a</code> à <code>z</code> sont épargnées.<!-- HTML_TAG_END --></span></div> <br> <p data-svelte-h="svelte-l6ldcg">Le terme de <strong>NDef</strong> est un raccourci pour <em>Node Proxy Definition</em>. On retrouve du vocabulaire familier. Cest une autre manière de désigner exactement le même type dobjet que ce que nous manipulons depuis le début ! Seule la syntaxe diffère. Profitons-en quand même pour évoquer rapidement ce quest un <em>node</em> :</p> <br> <div class="pl-8 pt-4 pb-4 bg-base-300" data-svelte-h="svelte-19ar4er"><p><strong>Node:</strong> un <em>node</em> est un objet défini en interne par le serveur audio de <strong>SuperCollider</strong>. Un synthétiseur est un <em>node</em>, beaucoup dobjets présents sur le serveur sont des <em>nodes</em>. Il sagit dun objet générique utilisé pour une opération audio : contrôle ou synthétiseur. Cest un objet abstrait, quon ne manipule jamais directement. Les fonctions audio que nous venons dutiliser dans lexemple précédent sont des <em>nodes</em> que lon associe à un <em>proxy</em>. Un <em>node</em> tire ce nom du fait que ce sont des <em>noeuds</em> dans un graphe audio, des objets qui ont une position dans un graphe de traitement du signal.</p></div> <br> <p data-svelte-h="svelte-1i92p2x">Les <code>Ndefs</code> ont pour avantage de ne pas se propager dans lenvironnement local. Elles rendent tout un petit peu plus clair. Réécrivons lexemple précédent en utilisant uniquement des <code>Ndefs</code> :</p> <pre class="language-cpp"><!-- HTML_TAG_START --><code class="language-cpp"><span class="token function">Ndef</span><span class="token punctuation">(</span>osc<span class="token punctuation">,</span> <span class="token punctuation">&#123;</span>SinOsc<span class="token punctuation">.</span><span class="token function">ar</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">200</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">0.5</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// On associe une source à un NodeProxy, un double oscillateur</span>
<span class="token operator">~</span>osc<span class="token punctuation">.</span>clear<span class="token punctuation">;</span> <span class="token comment">// On libère la mémoire</span></code><!-- HTML_TAG_END --></pre> <br> <p data-svelte-h="svelte-mlyqm">Même si tout reste assez primitif pour le moment, on peut déjà faire beaucoup de choses en suivant ce principe. Il est possible dutiliser nimporte quel algorithme audio et de le mettre à jour graduellement tout au long dune performance. Ce type de <em>live coding</em> centré autour de la musique à jour dun générateur sonore se prête plutôt bien à de la musique électro-acoustique, <em>ambient</em>, <em>noise</em>, etc.</p> <br> <h3 data-svelte-h="svelte-1t7im02">Les <code>Ndefs</code> : une autre manière de faire la même chose</h3> <br> <p data-svelte-h="svelte-ngon7m">La technique que nous utilisons avec <code>ProxySpace.push(s.boot)</code> <em>dissimule</em> lutilisation que nous faisons des <code>NodeProxy</code>. Cette fonctionnalité a été intégrée car elle permet de gagner du temps de frappe mais elle a pour désavantage de rendre plus difficilement perceptible ce que nous sommes réellement en train de faire. À première vue, il semble que <code>~a = 2</code> soit juste une assignation de variable comme dans un langage de programmation classique. Pourtant, il sagit dune opération qui crée/modifie un <code>NodeProxy</code>.</p> <br> <p data-svelte-h="svelte-f4v0jn">Nous occultons le fait que les variables globales de <strong>SuperCollider</strong> sont maintenant des <code>NodeProxy</code>. Il est possible de se passer entièrement de <code>Proxyspace.push</code> et de cet avantage/désagrément en utilisant les <code>Ndefs</code>. Il sagit dune préférence personnelle, presque dordre stylistique.</p> <br> <div class="alert bg-neutral-600 border-none"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" class="stroke-current shrink-0 w-6 h-6"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg> <span class="text-xl text-white"><!-- HTML_TAG_START -->Pour être plus précis, <code>ProxySpace.push(...)</code> transforme le <em>scope</em> global en un <code>ProxySpace</code>. Seule les variables de <code>a</code> à <code>z</code> sont épargnées.<!-- HTML_TAG_END --></span></div> <br> <p data-svelte-h="svelte-l6ldcg">Le terme de <strong>NDef</strong> est un raccourci pour <em>Node Proxy Definition</em>. On retrouve du vocabulaire familier. Cest une autre manière de désigner exactement le même type dobjet que ce que nous manipulons depuis le début ! Seule la syntaxe diffère. Profitons-en quand même pour évoquer rapidement ce quest un <em>node</em> :</p> <br> <div class="pl-8 pt-4 pb-4 bg-base-300" data-svelte-h="svelte-19ar4er"><p><strong>Node:</strong> un <em>node</em> est un objet défini en interne par le serveur audio de <strong>SuperCollider</strong>. Un synthétiseur est un <em>node</em>, beaucoup dobjets présents sur le serveur sont des <em>nodes</em>. Il sagit dun objet générique utilisé pour une opération audio : contrôle ou synthétiseur. Cest un objet abstrait, quon ne manipule jamais directement. Les fonctions audio que nous venons dutiliser dans lexemple précédent sont des <em>nodes</em> que lon associe à un <em>proxy</em>. Un <em>node</em> tire ce nom du fait que ce sont des <em>noeuds</em> dans un graphe audio, des objets qui ont une position dans un graphe de traitement du signal.</p></div> <br> <p data-svelte-h="svelte-1i92p2x">Les <code>Ndefs</code> ont pour avantage de ne pas se propager dans lenvironnement local. Elles rendent tout un petit peu plus clair. Réécrivons lexemple précédent en utilisant uniquement des <code>Ndefs</code> :</p> <pre class="language-cpp"><!-- HTML_TAG_START --><code class="language-cpp"><span class="token function">Ndef</span><span class="token punctuation">(</span>osc<span class="token punctuation">,</span> <span class="token punctuation">&#123;</span>SinOsc<span class="token punctuation">.</span><span class="token function">ar</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">200</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">0.5</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// On associe une source à un NodeProxy, un double oscillateur</span>
<span class="token function">Ndef</span><span class="token punctuation">(</span>osc<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">play</span><span class="token punctuation">(</span>fadeTime<span class="token operator">:</span> <span class="token number">4</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// On lance le NodeProxy avec un fade-in</span>
<span class="token function">Ndef</span><span class="token punctuation">(</span>osc<span class="token punctuation">)</span><span class="token punctuation">.</span>fadeTime <span class="token operator">=</span> <span class="token number">4</span><span class="token punctuation">;</span> <span class="token comment">// On change le fadeTime général</span>
@ -78,7 +78,7 @@ comme <code>.set</code> et <code>.xset</code>.</p> <h2 data-svelte-h="svelte-grw
<script>
{
__sveltekit_qle9q0 = {
__sveltekit_edq7g9 = {
base: new URL("..", location).pathname.slice(0, -1),
env: null
};
@ -88,8 +88,8 @@ comme <code>.set</code> et <code>.xset</code>.</p> <h2 data-svelte-h="svelte-grw
const data = [{"type":"data","data":null,"uses":{}},null];
Promise.all([
import("../_app/immutable/entry/start.6eH0sfCC.js"),
import("../_app/immutable/entry/app.MUzNn6Wd.js")
import("../_app/immutable/entry/start.LKmjm6I8.js"),
import("../_app/immutable/entry/app.4UG9pbyD.js")
]).then(([kit, app]) => {
kit.start(app, element, {
node_ids: [0, 9],