<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Supercollider on Mads Kjeldgaard — Composer and Sound Artist</title><link>https://madskjeldgaard.dk/tags/supercollider/</link><description>Recent content in Supercollider on Mads Kjeldgaard — Composer and Sound Artist</description><generator>Hugo</generator><language>en</language><lastBuildDate>Wed, 08 Oct 2025 18:24:40 +0200</lastBuildDate><atom:link href="https://madskjeldgaard.dk/tags/supercollider/index.xml" rel="self" type="application/rss+xml"/><item><title>Hyphal</title><link>https://madskjeldgaard.dk/portfolio/hyphal-for-mechanized-organ/</link><pubDate>Mon, 01 Sep 2025 00:00:00 +0000</pubDate><guid>https://madskjeldgaard.dk/portfolio/hyphal-for-mechanized-organ/</guid><description>&lt;p&gt;‘Hyphal’ is a piece of algorithmic music for mechanically controlled pipe organs, commissioned by Gamut INC for &lt;a href="https://gamutinc.org/aggregate/"&gt;Aggregate Festival&lt;/a&gt;, premiering at the &lt;a href="https://en.wikipedia.org/wiki/Kaiser_Wilhelm_Memorial_Church"&gt;Kaiser-Wilhelm-Gedächtniskirche in Berlin&lt;/a&gt; in 2025.&lt;/p&gt;
&lt;p&gt;This piece was composed during a stay in the Pyrenees mountains on the border between France and Spain where I spent a lot of time in a mountain valley with an overwhelmingly lush microclimate. Where it seemed that out of every crack or orifice in the landscape, plants and flowers of all kinds would emerge, as if to collectively scream &amp;ldquo;I am alive!&amp;rdquo;&lt;/p&gt;</description></item><item><title>Empty Cloud</title><link>https://madskjeldgaard.dk/portfolio/empty-cloud/</link><pubDate>Thu, 13 Feb 2025 00:00:00 +0000</pubDate><guid>https://madskjeldgaard.dk/portfolio/empty-cloud/</guid><description>&lt;h3 id="an-enormous-cycle-of-minimalist-ambient-background-music-composed-in-48-parts-spanning-12-hours-taking-you-on-a-peaceful-stroll-around-the-circle-of-fifths-released-by-exformal-records-to-read-more-and-listen-to-the-release-go-here"&gt;An enormous cycle of minimalist, ambient background music composed in 48 parts, spanning 12 hours, taking you on a peaceful stroll around the circle of fifths. Released by &lt;a href="https://exformal.art"&gt;Exformal Records&lt;/a&gt;. To read more and listen to the release, &lt;a href="https://exformal.art/releases/mads-kjeldgaard-empty-cloud/"&gt;go here&lt;/a&gt;.&lt;/h3&gt;
&lt;p&gt;The music of Empty Cloud was written and composed specifically to be played in the background in a room, quietly, or at least ideally at a barely audible volume. It’s music that’s just there, plain and simple, and if you forget about it, it’s fine, don’t worry, it will let itself be known when it needs to.&lt;/p&gt;</description></item><item><title>Musik for virtuelle orgler</title><link>https://madskjeldgaard.dk/portfolio/musikforvirtuelleorgler/</link><pubDate>Sun, 09 Jun 2024 00:00:00 +0000</pubDate><guid>https://madskjeldgaard.dk/portfolio/musikforvirtuelleorgler/</guid><description>&lt;p&gt;A collection of algorithmic music written for virtual organs – that is, musical structures based on simple mathematics and probabilities and organised in ever-evolving patterns of ungraspable and unrelenting melodies and chord progressions. All the pieces were produced using programming languages and very accurate software models of pipe organs.&lt;/p&gt;
&lt;p&gt;Composed, mixed and mastered by Mads Kjeldgaard.&lt;/p&gt;
&lt;p&gt;Design: Tony Lugo.&lt;/p&gt;
&lt;p&gt;Released by &lt;a href="https://superpang.bandcamp.com/"&gt;SuperPang&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mads-kjeldgaard.bandcamp.com/album/musik-for-virtuelle-orgler"&gt;Click here to hear more&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Workshop: Composing 3D music using SuperCollider and ambisonics</title><link>https://madskjeldgaard.dk/old-blog/envelope-festival-3d-composition-workshop/</link><pubDate>Thu, 22 Sep 2022 00:00:00 +0000</pubDate><guid>https://madskjeldgaard.dk/old-blog/envelope-festival-3d-composition-workshop/</guid><description>&lt;p&gt;&lt;img src="https://madskjeldgaard.dk/img/small/envelopebanner.jpg" alt="Banner for the workshop"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Date: 1st of October&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Place: LMTA Musical Innovation Studies Centre, Vilnius, Lithuania&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Price: Free&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Workshop material: &lt;a href="https://github.com/madskjeldgaard/workshop-materials-3d-music-supercollider"&gt;Download on Github&lt;/a&gt; (will be available from the day of the workshop)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Address: Gedimino pr. 42 LT-01110 Vilnius, Lithuania&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As part of the &lt;a href="https://www.envelopefestival.com/mads-kjeldgaard"&gt;Envelope Festival&lt;/a&gt;, an immersive sound festival happening from September 10 till October 29 in the Baltic-Nordic region in person and online, I will be teaching a workshop on how to write algorithmic music for 3D sound systems (ambisonics) using SuperCollider.&lt;/p&gt;</description></item><item><title>Parallel processing in SuperCollider using SuperNova</title><link>https://madskjeldgaard.dk/old-blog/supernova-intro/</link><pubDate>Thu, 10 Feb 2022 09:20:36 +0100</pubDate><guid>https://madskjeldgaard.dk/old-blog/supernova-intro/</guid><description>&lt;p&gt;The SuperCollider sound server &lt;code&gt;scsynth&lt;/code&gt; is one of the most finely tuned and efficient synthesis engines out there. For most people on most modern computers, they will rarely meet limitations in terms of effeciency.&lt;/p&gt;
&lt;p&gt;That said, &lt;code&gt;scsynth&lt;/code&gt; does have one potential for optimization: Parallelization. And this is where &lt;code&gt;supernova&lt;/code&gt; comes into the picture.&lt;/p&gt;
&lt;p&gt;The original &lt;code&gt;scsynth&lt;/code&gt; sound server in SuperCollider, like lots of other audio software, runs on one core and so your computer&amp;rsquo;s single core performance is a big limitation for the possibilities of &lt;code&gt;scsynth&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Neovim as a SuperCollider IDE</title><link>https://madskjeldgaard.dk/old-blog/neovim-as-sc-ide/</link><pubDate>Wed, 02 Feb 2022 14:01:46 +0100</pubDate><guid>https://madskjeldgaard.dk/old-blog/neovim-as-sc-ide/</guid><description>&lt;p&gt;&lt;img src="https://madskjeldgaard.dk/img/full/scideneovim.png" alt="neovim in action"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://supercollider.github.io/"&gt;SuperCollider&lt;/a&gt; is my favourite programming language for music and sound and I use it all the time. The programming language comes with an IDE that is quite capable, but I for one prefer doing all of my coding in one editor (sometimes I write C++, lua and SuperCollider in one and the same project and this allows me to do it in just one editor instance) and that editor for me is NeoVim. The advantages of (Neo)Vim are many but for me the primary ones are that it is a keyboard centric tool, it&amp;rsquo;s lightweight, it is highly configurable and it works &lt;em&gt;everywhere&lt;/em&gt;.&lt;/p&gt;</description></item><item><title>Tutorial: How to write plugins for SuperCollider using C++</title><link>https://madskjeldgaard.dk/old-blog/supercollider-server-plugin-tutorial/</link><pubDate>Thu, 18 Mar 2021 22:09:08 +0100</pubDate><guid>https://madskjeldgaard.dk/old-blog/supercollider-server-plugin-tutorial/</guid><description>&lt;p&gt;My amazing &lt;a href="https://notam.no"&gt;workplace&lt;/a&gt; allowed me time during the Covid-19 lockdowns in Oslo to spend time improving my C++ and DSP skills. The result of this is a bunch of plugins for SuperCollider, &lt;a href="https://github.com/madskjeldgaard/mkplugins"&gt;some of which are already released&lt;/a&gt; as well as a trunk of Notam plugins that are to be announced.&lt;/p&gt;
&lt;p&gt;The process of creating server plugins (aka UGens) for SuperCollider is one of the most fun and gratifying ways one can experiment with DSP and C++ in my opinion. That said, getting started with it was a difficult task for me since the different resources on the process of creating plugins for SuperCollider were either spotty or out of date and did not include some of the best practices involved in creating high quality plugins.&lt;/p&gt;</description></item><item><title>Automatically build, compile and release SuperCollider plugins using Github Actions</title><link>https://madskjeldgaard.dk/old-blog/how-to-gh-action/</link><pubDate>Wed, 03 Mar 2021 18:22:34 +0100</pubDate><guid>https://madskjeldgaard.dk/old-blog/how-to-gh-action/</guid><description>&lt;p&gt;Since the main SuperCollider github repository moved to using Github Actions to automatically build, compile and release cross platform, I felt intrigued to use the same technology to do the same for SuperCollider plugins.&lt;/p&gt;
&lt;p&gt;There is a number of amazing SuperCollider plugin repositories on Github - a lot will demand that the user compiles the sourcecode themselves to use the plugins. For people used to CMake and/or a Linux-ey workflow of compiling, this is not a big problem but for a lot of others (most people perhaps), it really is a doorstopper.&lt;/p&gt;</description></item><item><title>A midi controller in a box of screws</title><link>https://madskjeldgaard.dk/old-blog/master-volume/</link><pubDate>Sat, 06 Feb 2021 21:16:09 +0000</pubDate><guid>https://madskjeldgaard.dk/old-blog/master-volume/</guid><description>&lt;p&gt;&lt;img src="https://madskjeldgaard.dk/img/full/screws1.jpg" alt="box of screws controller"&gt;
&lt;img src="https://madskjeldgaard.dk/img/full/screws2.jpg" alt="box of screws controller"&gt;&lt;/p&gt;
&lt;p&gt;I recently built version 2 of a &amp;ldquo;master volume control&amp;rdquo; midi controller that I had made before. This version is slightly improved on the former, the main improvement being that if you press the button while booting the device it goes into 14 bit midi mode (leveraging 13 of the Teensy&amp;rsquo;s bits for this) to allow high resolution on the potentiometer&amp;rsquo;s input.&lt;/p&gt;
&lt;p&gt;The controller is very cheap and simple to make.
It revolves around the wonderful and cheap (11$) Teensy LC.&lt;/p&gt;</description></item><item><title>Helpful SuperCollider plugin macros</title><link>https://madskjeldgaard.dk/old-blog/helpful-sc-plugin-macros/</link><pubDate>Fri, 13 Nov 2020 21:38:31 +0100</pubDate><guid>https://madskjeldgaard.dk/old-blog/helpful-sc-plugin-macros/</guid><description>&lt;p&gt;This is a transcription of Dan Stowell&amp;rsquo;s very helpful table in the SuperCollider Book (MIT), slightly edited and transcribed for the &amp;ldquo;new&amp;rdquo; c++ style for writing plugins. It contains &lt;em&gt;some&lt;/em&gt; of the macros available when writing UGens/Plugins in c++ in SuperCollider.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/supercollider/example-plugins"&gt;This repo contains example code&lt;/a&gt; for writing plugins in both the &amp;ldquo;old&amp;rdquo; and &amp;ldquo;new&amp;rdquo; style which I found helpful in understanding this subject.&lt;/p&gt;
&lt;p&gt;Also check out this &lt;a href="https://github.com/supercollider/cookiecutter-supercollider-plugin"&gt;cookiecutter template for generating plugins&lt;/a&gt; and the &lt;a href="http://doc.sccode.org/Reference/ServerPluginAPI.html"&gt;Server Plugin API&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Esp32 Simple Osc Receiver</title><link>https://madskjeldgaard.dk/old-blog/esp32-simple-osc-receiver/</link><pubDate>Mon, 09 Nov 2020 16:29:19 +0100</pubDate><guid>https://madskjeldgaard.dk/old-blog/esp32-simple-osc-receiver/</guid><description>&lt;p&gt;&lt;img src="https://madskjeldgaard.dk/img/full/esp32-bb.jpg" alt="breadboarded esp32"&gt;&lt;/p&gt;
&lt;p&gt;Lately I have started experimenting with the very cheap and powerful &lt;a href="https://docs.espressif.com/projects/esp-idf/en/latest/esp32/"&gt;ESP32 microcontrollers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Today I made a simple example of a firmware which receives OSC from a computer and then blinks the on-board LED according to the incoming message and I packaged it all as an easy to clone/copy/use &lt;a href="https://github.com/madskjeldgaard/esp32-receive-osc-simple"&gt;platformio project (mostly for myself)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The firmware uses &lt;a href="https://github.com/CNMAT/OSC"&gt;CNMAT&amp;rsquo;s OSC library&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt; &lt;span style="color:#75715e"&gt;&amp;#34;Arduino.h&amp;#34;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt; &lt;span style="color:#75715e"&gt;&amp;#34;WiFi.h&amp;#34;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt; &lt;span style="color:#75715e"&gt;&amp;lt;OSCMessage.h&amp;gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;WiFiUDP Udp; &lt;span style="color:#75715e"&gt;// A UDP instance to let us send and receive packets over UDP
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; LED_BUILTIN &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Options
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; update_rate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;16&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Network settings
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; ssid[] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;wifiname&amp;#34;&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// your network SSID (name)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; pass[] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;wifipassword&amp;#34;&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// your network password
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;unsigned&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; localPort &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;8888&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// local port to listen for OSC packets
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;setup&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pinMode(LED_BUILTIN, OUTPUT);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/* setup wifi */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; WiFi.begin(ssid, pass);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (WiFi.status() &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; WL_CONNECTED) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; delay(&lt;span style="color:#ae81ff"&gt;500&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Udp.begin(localPort);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ledtoggle&lt;/span&gt;(OSCMessage &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;msg) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;switch&lt;/span&gt; (msg.getInt(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; digitalWrite(LED_BUILTIN, LOW);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; digitalWrite(LED_BUILTIN, HIGH);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;receiveMessage&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; OSCMessage inmsg;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; size &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Udp.parsePacket();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (size &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (size&lt;span style="color:#f92672"&gt;--&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; inmsg.fill(Udp.read());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;inmsg.hasError()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; inmsg.dispatch(&lt;span style="color:#e6db74"&gt;&amp;#34;/led&amp;#34;&lt;/span&gt;, ledtoggle);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//else { auto error = inmsg.getError(); }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;loop&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; receiveMessage();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; delay(update_rate);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And here is some SuperCollider code to play around with:&lt;/p&gt;</description></item><item><title>Working with 14bit Midi using a Teensy microcontroller and Supercollider</title><link>https://madskjeldgaard.dk/old-blog/14bit-midi-teensy-supercollider/</link><pubDate>Wed, 21 Oct 2020 15:48:28 +0200</pubDate><guid>https://madskjeldgaard.dk/old-blog/14bit-midi-teensy-supercollider/</guid><description>&lt;p&gt;&lt;img src="https://madskjeldgaard.dk/img/full/14bitteensybb.jpg" alt="Teensy on a breadboard"&gt;&lt;/p&gt;
&lt;p&gt;Lately I have been experimenting with 14bit MIDI and found it to be a huge revelation for my work with SuperCollider. Often, the regular data range of MIDI (0-127) is way too choppy and coarse for nice interactions with your systems and instruments in SuperCollider, but 14 bit MIDI provides a resolution of 16384 steps which is great. This is actually achieved quite cleverly by combining two MIDI CC signals in to one.&lt;/p&gt;</description></item><item><title>Networked audio using Raspberry Pi 4 (zita-njbridge and SuperCollider)</title><link>https://madskjeldgaard.dk/old-blog/raspi-zita-njbridge/</link><pubDate>Sun, 03 May 2020 10:17:27 +0200</pubDate><guid>https://madskjeldgaard.dk/old-blog/raspi-zita-njbridge/</guid><description>&lt;p&gt;&lt;img src="https://madskjeldgaard.dk/img/small/raspi-and-cheap-usb-interface.jpg" alt="raspberry pi with a 1$ usb sound interface"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://jackaudio.org/"&gt;Jack&lt;/a&gt; is an incredibly flexible piece of software for making audio connections. It&amp;rsquo;s mostly used to connect and patch virtually within one computer but it has a range of amazing extra features for connecting things in alternative ways.&lt;/p&gt;
&lt;p&gt;This is exploited to it&amp;rsquo;s fullest in the &lt;a href="https://packages.debian.org/jessie/sound/zita-njbridge"&gt;zita-njbridge&lt;/a&gt; package.&lt;/p&gt;
&lt;p&gt;To quote from the manual on zita-njbridge:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The zita-j2n (sender) and zita-n2j (receiver) applications allow to
exchange up to 64 channels of full-quality uncompressed audio streams between
two or more systems running the Jack audio server. Sender and receiver(s)
can each have their own sample rate and period size, and no word clock sync
between them is assumed. The receiver uses adaptive resampling to convert
the audio stream(s) to its local sample rate.&lt;/p&gt;</description></item><item><title>Notes for setting up a Raspberry Pi 4 for audio work</title><link>https://madskjeldgaard.dk/old-blog/raspi4-notes/</link><pubDate>Thu, 30 Apr 2020 16:07:22 +0200</pubDate><guid>https://madskjeldgaard.dk/old-blog/raspi4-notes/</guid><description>&lt;p&gt;&lt;img src="https://madskjeldgaard.dk/img/full/raspi-and-cheap-usb-interface.jpg" alt="raspberry pi 4 setup "&gt;&lt;/p&gt;
&lt;p&gt;These are notes for setting up a Raspberry Pi 4 single board computer for pro audio work. Specifically for running &lt;a href="https://supercollider.sourceforge.net/"&gt;SuperCollider programs for interactive installations&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I used &lt;a href="https://www.raspberrypi.org/downloads/Raspbian/"&gt;Raspbian Lite&lt;/a&gt; for this, since my intention is to run the Raspberry Pi in headless mode, meaning using no display and no desktop environment (to save resources).&lt;/p&gt;
&lt;p&gt;It is presumed that you have installed Raspbian on an SD card, with ssh enabled (allowing you to log in to the pi over the network and execute commands using a terminal), and that you are logged in.&lt;/p&gt;</description></item><item><title>Awesome SuperCollider: A curated list</title><link>https://madskjeldgaard.dk/old-blog/awesome-sc/</link><pubDate>Thu, 30 Apr 2020 12:57:31 +0200</pubDate><guid>https://madskjeldgaard.dk/old-blog/awesome-sc/</guid><description>&lt;p&gt;&lt;img src="https://madskjeldgaard.dk/img/small/chaos-algo.png" alt="chaos algo"&gt;&lt;/p&gt;
&lt;p&gt;A while ago I started compiling a list of links to SuperCollider based things that I found interesting and wanted to save for later.&lt;/p&gt;
&lt;p&gt;The list grew and at one point I organized it all in one public repository where the SuperCollider community could help curate links to &lt;em&gt;awesome SuperCollider things&lt;/em&gt; and it has since then become a truly rich resource for things like tutorials, reading material, nice projects and tools.&lt;/p&gt;</description></item><item><title>SuperCollider workshop at Notam, january 2020: Algorithmic composition using patterns</title><link>https://madskjeldgaard.dk/supercollider-workshop-at-notam-january-2020-algorithmic-composition-using-patterns/</link><pubDate>Thu, 23 Jan 2020 21:18:29 +0000</pubDate><guid>https://madskjeldgaard.dk/supercollider-workshop-at-notam-january-2020-algorithmic-composition-using-patterns/</guid><description>&lt;p&gt;Here are the slides for the SuperCollider workshop at Notam, january 2020.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://madskjeldgaard.dk/pdf/pattern-workshop-notam-2020.pdf"&gt;Download slides&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="algorithmic-composition-using-patterns"&gt;Algorithmic composition using patterns&lt;/h2&gt;
&lt;h3 id="notam-january-2020"&gt;Notam, january 2020&lt;/h3&gt;
&lt;hr&gt;
&lt;h2 id="about-me"&gt;About me&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Name: Mads Kjeldgaard&lt;/li&gt;
&lt;li&gt;Occupation: Composer and developer&lt;/li&gt;
&lt;li&gt;Work: The Norwegian Center for Technology and Art (Notam)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="notam"&gt;Notam&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Development for art projects (hardware, software, tech and artistic
guidance)&lt;/li&gt;
&lt;li&gt;Communities / meetups (SC meetup among others), see website
&lt;a href="http://notam.no"&gt;notam.no&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Studios / 3D sound / VR / Visuals / Electronics&lt;/li&gt;
&lt;li&gt;Courses&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="my-practice"&gt;My practice&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Computer music / livecoding&lt;/li&gt;
&lt;li&gt;Concrete music&lt;/li&gt;
&lt;li&gt;Cybernetic / systemic music&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="contact-info"&gt;Contact info&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;mail: &lt;a href="mailto:mail@madskjeldgaard.dk"&gt;mail@madskjeldgaard.dk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;web: &lt;a href="http://madskjeldgaard.dk"&gt;madskjeldgaard.dk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;github:
&lt;a href="http://github.com/madskjeldgaard"&gt;github.com/madskjeldgaard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;work: &lt;a href="http://notam.no"&gt;notam.no&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="about-algorithmic-composition"&gt;About algorithmic composition&lt;/h2&gt;
&lt;hr&gt;
&lt;h2 id="what-is-an-algorithm"&gt;What is an algorithm?&lt;/h2&gt;
&lt;p&gt;An algorithm is a process that takes something as an input, computes on
it, and then outputs the result.&lt;/p&gt;</description></item><item><title>Pattern workshop, Herlev Bibliotek 2019</title><link>https://madskjeldgaard.dk/pattern-workshop-herlev-bibliotek-2019/</link><pubDate>Wed, 06 Nov 2019 11:22:54 +0000</pubDate><guid>https://madskjeldgaard.dk/pattern-workshop-herlev-bibliotek-2019/</guid><description>&lt;p&gt;&lt;img src="https://madskjeldgaard.dk/img/small/workshop-herlev-2019.jpg" alt="alt"&gt;&lt;/p&gt;
&lt;p&gt;Here are the materials for the SuperCollider workshop at Herlev Bibliotek, Denmark, November 2019.&lt;/p&gt;
&lt;p&gt;The SynthDef used for the workshop [can be downloaded here.][1]&lt;/p&gt;
&lt;p&gt;&lt;a href="https://madskjeldgaard.dk/pdf/herlev-2019.pdf"&gt;Download slides here.&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="supercollider-workshop"&gt;SuperCollider workshop&lt;/h2&gt;
&lt;h3 id="herlev-bibliotek-denmark-2019"&gt;Herlev Bibliotek, Denmark, 2019&lt;/h3&gt;
&lt;hr&gt;
&lt;h2 id="about-me"&gt;About me&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Name: Mads Kjeldgaard&lt;/li&gt;
&lt;li&gt;Occupation: Composer and developer&lt;/li&gt;
&lt;li&gt;Work: The Norwegian Center for Technology and Art (Notam)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;img src="studio3.jpg" alt="studio3"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="notam"&gt;Notam&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Development for art projects (hardware, software, tech and artistic
guidance)&lt;/li&gt;
&lt;li&gt;Communities / meetups (SC meetup among others)&lt;/li&gt;
&lt;li&gt;Studios / 3D sound / VR / Visuals&lt;/li&gt;
&lt;li&gt;Courses&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="my-practice"&gt;My practice&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Computer music / livecoding&lt;/li&gt;
&lt;li&gt;Field recording&lt;/li&gt;
&lt;li&gt;3D sound composition&lt;/li&gt;
&lt;li&gt;Sound environments&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="contact-info"&gt;Contact info&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;mail: &lt;a href="mailto:mail@madskjeldgaard.dk"&gt;mail@madskjeldgaard.dk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;web: &lt;a href="http://madskjeldgaard.dk"&gt;madskjeldgaard.dk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;github:
&lt;a href="http://github.com/madskjeldgaard"&gt;github.com/madskjeldgaard&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="design"&gt;Design&lt;/h2&gt;
&lt;hr&gt;
&lt;h2 id="short-history-of-supercollider"&gt;Short history of SuperCollider&lt;/h2&gt;
&lt;p&gt;SC was designed by James McCartney as closed source proprietary software&lt;/p&gt;</description></item><item><title>How to change the default synth in SuperCollider</title><link>https://madskjeldgaard.dk/how-to-change-the-default-synth-in-supercollider/</link><pubDate>Fri, 18 Oct 2019 12:42:12 +0000</pubDate><guid>https://madskjeldgaard.dk/how-to-change-the-default-synth-in-supercollider/</guid><description>&lt;p&gt;The default synth sound in SuperCollider is a cheesy old piano sound. If you have ever tried the event pattern examples in the documentation of SuperCollider or been in the process of testing some pattern specifics of your own, you will have heard this extremely unconvincing synthesizer:&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;h2 id="a-nice-alternative-a-triangle-wave-synth-with-a-low-pass-filter"&gt;A nice alternative: A triangle wave synth with a low pass filter&lt;/h2&gt;
&lt;p&gt;Imagine a utopian world where the default cheese-piano-synth has been replaced by a nicer, kind of gameboy like synth. Well that world is here and now.&lt;/p&gt;</description></item><item><title>Introduction to SuperCollider, Notam 2019</title><link>https://madskjeldgaard.dk/scintro-notam-2019/</link><pubDate>Sun, 01 Sep 2019 12:54:46 +0000</pubDate><guid>https://madskjeldgaard.dk/scintro-notam-2019/</guid><description>&lt;p&gt;Here you will find the material for the introductory workshop held at Notam, Oslo in late summer 2019.&lt;/p&gt;
&lt;p&gt;The slides may be used as a sort of cheatsheet as well as notes for remembering the topics covered:&lt;/p&gt;
&lt;p&gt;• An overview: What is SuperCollider and what can you do with it?&lt;/p&gt;
&lt;p&gt;• The design and architecture of SuperCollider&lt;/p&gt;
&lt;p&gt;• Language basics: syntax, variables, expressions and functions&lt;/p&gt;
&lt;p&gt;• Learning resources: How to proceed from here&lt;/p&gt;</description></item><item><title>SuperCollider tutorial: Mass producing SynthDefs</title><link>https://madskjeldgaard.dk/old-blog/2019-08-19-supercollider-tutorial-mass-producing-synthdefs/</link><pubDate>Mon, 19 Aug 2019 10:36:35 +0000</pubDate><guid>https://madskjeldgaard.dk/old-blog/2019-08-19-supercollider-tutorial-mass-producing-synthdefs/</guid><description>&lt;p&gt;In SuperCollider, one of the most common ways of making sounds is by first defining a sort of recipe for a UGEN patch in a SynthDef and then from that recipe produce Synths that make sounds.&lt;/p&gt;
&lt;p&gt;But when you write a SynthDef, the patch architecture cannot change after the definition (as opposed to changing arguments in the patch).&lt;/p&gt;
&lt;p&gt;This becomes annoying when working with UGens that want to know the exact number of channels used, eg. &lt;a href="http://doc.sccode.org/Classes/PlayBuf.html"&gt;PlayBuf&lt;/a&gt;, when defining the Synth.&lt;/p&gt;</description></item><item><title>SuperCollider tutorial: Easily render generative compositions as sound files using NRT</title><link>https://madskjeldgaard.dk/old-blog/2019-08-05-supercollider-how-to-render-patterns-as-sound-files-using-nrt/</link><pubDate>Mon, 05 Aug 2019 17:46:09 +0000</pubDate><guid>https://madskjeldgaard.dk/old-blog/2019-08-05-supercollider-how-to-render-patterns-as-sound-files-using-nrt/</guid><description>&lt;p&gt;&lt;img src="https://madskjeldgaard.dk/wp-content/uploads/2019/08/supercollider-laptop-room-e1566211773173.jpg" alt="alt"&gt;&lt;/p&gt;
&lt;p&gt;One of the many powerful features of SuperCollider is it’s ability to render sounds offline. This is called &lt;a href="http://doc.sccode.org/Guides/Non-Realtime-Synthesis.html"&gt;Non-Realtime Synthesis (NRT)&lt;/a&gt;. NRT is for example useful for fast, offline processing of sounds, doing sound analysis or rendering generative compositions.&lt;/p&gt;
&lt;p&gt;NRT works like this (normally): First you write a list of server OSC messages (stored in a &lt;a href="http://doc.sccode.org/Classes/Score.html"&gt;Score&lt;/a&gt; usually) which will tell the (offline) server what to do at what point in time when you decide to render it. These are in the format [beat, [osc_command]]. An example: Making a Synth using synthdef \boring_sine at beat number 2 looks like this in such a OSC form: [2.0, [\s_new, \boring_sine, 1001, 0, 0]]&lt;/p&gt;</description></item></channel></rss>