Chris McCormick - News Chris McCormick - News en Copyright 2008- Chris McCormick 60 GMT Fridgetown & Donnelly River July 2018 entries/fridgetown-amp-donnelly-river-july-2018 DSC_1961.JPG DSC_1962.JPG DSC_1963.JPG DSC_1969.JPG DSC_1970.JPG DSC_1982.JPG DSC_1988.JPG DSC_1989.JPG DSC_2005.JPG DSC_2008.JPG DSC_2009.JPG DSC_2011.JPG DSC_2024.JPG DSC_2029.JPG DSC_2032.JPG DSC_2040.JPG

/tags/all Mon, 16 Jul 2018 12:52 GMT
Talk: GNU/Linux in Tiny Places entries/talk-gnu-linux-in-tiny-places gnu-linux-in-tiny-places.jpg

Last night I gave a talk at a Perth Linux User's Group meetup about doing Linuxy stuff on small machines:

/tags/all Wed, 11 Jul 2018 08:10 GMT
Night Mushrooms entries/night-mushrooms DSC_1943.JPG

/tags/all Sat, 07 Jul 2018 00:52 GMT
Frock: Clojure-flavoured PHP entries/frock-clojure-like-php Frock is a little experimental tool for writing PHP scripts using Clojure-like LISP syntax.

If you want to see what the code looks like, here's an example which fetches and lists top news items from the Hacker News API.

Some Frock code

Frock could be interesting to you if you are LISP or Clojure programmer writing a web application which is mostly front-end code, but which needs some small amount of server side logic for e.g. proxying, authentication, data persistence etc. and you want this application to be easily deployable by semi-technical users on commodity hosting.

Basically if your target audience is graphic designers, you like Clojure, and your backend requirements are slim, then you might be interested.


Pythagoras says no to Fava beans

PHP is an old server-side web development language which is simultaneously loathed by software developers everywhere, and also wildly popular and widely deployed. To reconcile this paradox let's take a look at some pros and cons of PHP.


  • Ugly language semantics & features.
  • Dubious security record.
  • Much awful legacy code lying around.


  • User-friendly app deployments (simply copy files to server).
  • Widely available on internet servers.
  • Mature language and ecosystem.
  • Excellent documentation.
  • Much useful tech bundled ("batteries included").

The pros make PHP quite democratic. It's very easy to install PHP code on widely available, cheap, commodity hosting. It's easy to get started writing PHP applications; the PHP binary comes pre-installed on OSX for example. PHP contains a lot of capabilities by default: zipping files, opening sockets, encryption, command execution.

Frock exists to make the language semantics and features less of a con for brace wrangling LISP heads, whilst retaining the wide deployment surface and other democratic features of PHP.

/tags/all Wed, 27 Jun 2018 08:51 GMT
Browser Blockchain in ClojureScript entries/browser-blockchain-in-clojurescript I built a little blockchain-in-a-browser in ClojureScript to help understand the underlying algorithms.

You can simulate a network of peers by opening multiple browser tabs. Each peer can mine blocks and make transactions independently and the resulting blockchain will resolve conflicts correctly across all tabs.

A blockchain works by laying down a chain of blocks of transaction data.

Bitcoin whitepaper SPV

Each block in the chain contains a cryptographic hash with two important properties:

  • It proves a link to the previous block.
  • It proves that difficult computational work has been done.

The proof-of-work is accomplished by iteratively updating a nonce until a low-probability hash is discovered.

These two properties mean a blockchain is digital amber.

Insect embedded in amber

If somebody wants to modify a transaction deep inside the amber it would be very difficult because they would have to re-create every layer of the blockchain by doing as much work as the original process required.

In my browser blockchain the hashing is implemented like this:

(hash-object [timestamp transactions previous-hash nonce])

As you can see the previous block's hash is included in the current block.

The hashing is performed iteratively in a loop until a hash with at least one byte of leading zeroes is found:

(loop [c 0]
  (let [candidate-block (make-block (now) transactions previous-hash new-index (make-nonce))]
    (if (not= (aget (candidate-block :hash) 0) 0)
      (recur (inc c))
/tags/all Wed, 13 Jun 2018 01:30 GMT
Across the Sea of Space entries/across-the-sea-of-space Mountain with space ship




Romanesque arial


Hillside, tree, and spacecraft


Airballoon over a valley

/tags/all Wed, 09 May 2018 05:22 GMT
Scitech Show entries/scitech-show DSC_1197.JPG

I'm playing a show tonight at the local science education centre, Scitech, for their adult event, After Dark.

I'll play live electronic music using some Gameboy, Commodore 64, and Raspberry Pi gear and algorave Pd patches. I'll also give a little talk about the tech and how it works.

Scitech, After Dark

/tags/all Sat, 14 Apr 2018 00:59 GMT
Plastimake's Great for Making Homethings entries/plastimake-s-great-for-making-homethings plastimake-models.jpg

A couple of years ago my friend Joe recommended this stuff called Plastimake to me.

It is a hard plastic which goes soft and malleable at around 60 degrees celcius. You drop some in boiling water until it goes clear and soft and then you can mold it into whatever shape you want. It cools and hardens again quickly in whatever shape you have molded it into. You can re-heat it to soften and re-use it again.

Scout and I have used it several times to hand craft little figures for play. I've also used it around the home and when prototyping things as it's a very quick way to get a hard plastic into exactly the shape you want.

Here's their video which is clear and honest:

/tags/all Thu, 01 Mar 2018 04:19 GMT
Internet of Things Questions entries/internet-of-things-questions A list of real questions that could be answered by teensy little technology nuggets.

Raspberry Pi with Waveshare Rpi Hat

  • In which physical folder is my child's birth certificate?
  • What items of mine are not here?
  • How much hand soap refill is left in my bathroom cupboard?
  • What is the smallest storage space in which I can fit all of my furniture?
  • Which items that I own do I never use?
  • At what time of day do I interact with different items I own?
  • What is the total weight of my filing cabinet and work desk?
  • I need a new one of these, pull up the page where I purchased it in my browser.
  • This thing does not belong to my grandmother. Who did she borrow it from before she died?
  • List the items in my craft box which have "needle" in the name.
  • How much television are my kids watching and what percentage are educational shows?
  • Are there any NE5532s in my tool box?
  • Graph my family's diet composition. How much of it is fresh food?
  • Place a grocery order under $50 for the items I most commonly use that I will soon run out of.
  • Search all of the physical books in my personal library for the following phrase.
  • Are my running shoes in this house or the holiday house?
  • We are leaving this hotel. Have we packed everything?
  • Where have I put my phone and keys?

Generic USB Sound Device

Most of these question could be answered without an internet connection. "Of Things" sounds kind of weird by itself though.

"Internet connected lightbulb" does not provide a use-case that anybody wants or needs.

The things should be telling us their data. They should not be telling corporations our data.

What you want is dumb little things that do one thing well. Good traditional design plus CPU, I/O, and memory.

Things that talk straight to us [and nobody else] with IR, sound, light, QR code, and raw radio.

Is there a word for "Internet of Things" objects which don't have an internet connection?

Maybe "ov things" lol.

"Neat little ov thing you got there friend."

/tags/all Fri, 16 Feb 2018 12:22 GMT
Tiny Core Linux on Raspberry Pi entries/tiny-core-linux-on-raspberry-pi Tiny Core Linux SSH screenshot

I'm discovering Tiny Core Linux, a beautifully executed, minimalist, immutable-by-default GNU/Linux distribution that runs nicely on the Raspberry Pi and other x86 and ARM devices.

The documentation is comprehensive but arcane so here are my field notes.

I'm using piCore the Raspberry Pi variant of TinyCore but most of these notes should work for other variants too. These notes assume you are already a GNU/Linux desktop user and know basic Linux command line fu.

Happy penguin jumping

I'm a huge fan of this distribution!

Official disk images.

Here's the official README for the Raspberry Pi version.

Write the disk image to your SD card

sudo dd if=piCore-9.0.3.img of=/dev/mmcblk0

Make sure you get your sd card's device (e.g. mmcblk0) correct so you don't overwrite the wrong disk!

Tip: you can see where dd is up to by sending it a signal:

sudo kill -SIGUSR1 `pgrep -f mmcblk0`

After this put the sd card into your Raspberry Pi and it'll boot Tiny Core Linux with an SSH server running so that you can access it remotely over the network.

Find the Pi on your network

find-pis: use this little script to find the Raspberry Pi on your network so that you can ssh to it.

Default login:

username: tc
password: piCore

Immutable by default

Tiny Core Linux is a perfect fit for Raspberry Pi because it does not write to disk by default. Note that between reboots if you want to persist any changes you've made, you need to do it manually with -b. You'll especially want to do this after first boot to persist the SSH server keys. This includes any changes you make to files in the home directory.

This lack of disk writes is a huge boon because it prevents issues that distributions like Raspbian have with SD card corruption when you power off the Raspberry Pi. Immutability is also just a good thing generally for building robust software systems.

Tiny Core Linux package repository

The packages are .tcz files which like most package formats are a zipped up collection of files with some metadata. You can browse the packages available to the Raspberry Pi distribution.

Various useful commands

Persist current state to disk: -b

Where to specify additional default file locations for persistence:


Download and install packages (nodejs binary package in this example):

tce-load -wi node.tcz

Show which packages are currently installed:

tce-status -i

Install a package for doing C/C++ compilation & development:

tce-load -wi compiletc

Find current OS version info:


Search for and install packages with console UI:


Where to put your own startup and shutdown scripts:


Getting WiFi working

You'll want the packages wifi and firmware-rpi3-wireless and then reboot and set up a connection:


Don't forget to persist your changes.

Getting sound working

You'll want the alsa and alsa-utils packages.

I managed to compile Pure Data and output a basic test tone. I went into the src folder of Pd and issued make -f makefile.gnu to build it from the source after checking it out from git.

GPIO access

I managed to interface with the Raspberry Pi GPIO by installing node and then using the onoff package installed via npm. Lots of dev packages were required for a successful build (compiletc probably covers most of them). Each time npm threw an error I looked at what the error message was to determine which package to install next until it built successfully.

I managed to get an LED to blink on pin 16 with this code:

var Gpio = require('onoff').Gpio;
led = new Gpio(16, 'out');
c = 0
setInterval(function() { led.writeSync(Number(c = !c)); }, 1000);

I had to run node as root to get access to the GPIO.

Philosophical waxing

GNU/Linux has now been subsumed into the technological substrates of the world. It is found in most phones, servers and appliances that people interact with every day. There are probably 10 copies of Linux running in the median developed-world household. It has become infrastructure, like roads and wires and water pipes.

I don't see that many young people at GNU/Linux meetups these days. I don't think we GNU/Linux nerds are required by the world in the same way that we were before when it was sparkly and new.

It's exciting for me to find Tiny Core Linux which has re-ignited the spark of enthusiasm for this technology.

/tags/all Sat, 03 Feb 2018 05:34 GMT
Tech Nugget entries/tech-nugget DSC_0413.JPG

Secret project.

/tags/all Mon, 29 Jan 2018 04:35 GMT
The 2018 Situation entries/the-2018-situation DSC_0149.JPG

/tags/all Mon, 01 Jan 2018 01:46 GMT
Other Worlds entries/other-worlds planet-0.png planet-1.png planet-2.png planet-3.png planet-4.png planet-5.png

I just finished another sketchbook.

Recently a friend linked me to The Etherington Brothers and I've been doing their tutorials.

Lately I've been concentrating on plants.

/tags/all Fri, 24 Nov 2017 12:49 GMT
Technological Artifact entries/technological-artifact Hand drawn technological artifact in the style of Scott Robertson

In the style of this guy in the style of Scott Robertson space ship sketches.

/tags/all Tue, 17 Oct 2017 03:55 GMT
Lovelace Day 2017 entries/lovelace-day-2017 A non-exhaustive list of technologies that I used this year which happen to be built by women:

I feel grateful to these people for enriching technology with their contributions.

/tags/all Wed, 11 Oct 2017 06:58 GMT
The Mountains entries/the-mountains IMG_20170912_170725_387.JPG

Some mountains I copied from some website.

/tags/all Tue, 12 Sep 2017 09:09 GMT
Cloud Notepad entries/cloud-notepad Cloud Notepad on the Desktop

I love this piece of software and I use it every day. It is a simple note taking application which syncs across all of your devices. It is a self-hosted single-page web app that runs on a PHP server and does not require a database.

Cloud Notepad on the Desktop

I run a copy on my phone and a copy on my laptop.

The app was built by Kaspars Dambis and I forked it to modify the design and add some usability tweaks like ctrl-S to force sync. You can find the source code of my fork on GitHub if you want to install it yourself.

/tags/all Mon, 04 Sep 2017 03:00 GMT
Clerk: Event Logging Web App entries/clerk-event-logging-web-app Screenshot

There are times in life when you need to keep track of periodic events as they happen. For example when you have a new baby it is sometimes useful to keep track of when they feed, nappy changes, etc. Another example might be tracking how often you eat chocolate or drink beer.

Clerk is a simple self-hosted web application that I built which you can install to the home screen of your device (by doing "add to home screen" in your browser) or load up on your tablet or laptop. You can then keep track of simple events with two taps on your device - once to open the app and once to record the event.

Screenshot 2

For every event logged the event type, timestamp, and comment are stored in CSV files. Events are stored in individual CSV files - one file per event type. You can also download all CSVs stiched together with an extra column for the event name.


  • Web based.
  • Easy to deploy.
  • Self-hosted & FLOSS.
  • Simple text based CSV format.
  • Allows multiple people to log events.
  • Mobile friendly - "Add to Home Screen" web-app.


To require authentication, first create a password file:

htpasswd -c /path/to/.htpasswd username

Then copy ./example.htaccess to .htaccess and edit it.


/tags/all Thu, 06 Jul 2017 02:38 GMT
Lost Town Of Belgium entries/lost-town-of-belgium

Scout and I made this stop-motion short film.

How we made it:

  • We used an old Android phone with one of those $10 phone tripods to take each frame.
  • We flipped through the stills in Ristretto by hand, recording the output with RecordMyDesktop.
  • We used avconv to convert between formats.
  • We used Audacity to record the audio.
  • We used OpenShot to edit the video.
/tags/all Thu, 08 Jun 2017 09:06 GMT
A Smart Alternative to `watch make` entries/a-smart-alternative-to-watch-make watch-make is a script that rebuilds your project only when make detects it needs a rebuild, for example when source files change.


  • Works with any existing Makefile based project.
  • No dependencies apart from make.
  • Passes any arguments to make (such as -C mydir).
  • Silent if there is nothing to build and does not swallow output when there is.

I wrote it in response to this Stack Overflow question.

The source code is hosted on GitHub.

Install it

curl -s > ~/bin/watch-make
chmod 755 ~/bin/watch-make

Full source code


while true;
  if ! make -q "$@";
    echo "#-> Starting build: `date`"
    make "$@";
    echo "#-> Build complete."
  sleep 0.5;
/tags/all Wed, 31 May 2017 03:13 GMT
The 2017 Situation entries/the-2017-situation IMG_20170506_150538.jpg

No point crying!

-- Sent from my Android device with K-9 Mail. Please excuse my brevity.

/tags/all Mon, 08 May 2017 01:10 GMT
Lonely Robot entries/lonely-robot Simple line sketch of a robot walking in a natural scene.

I went to the woods because I wished to live deliberately, to front only the essential facts of life, and see if I could not learn what it had to teach, and not, when I came to die, discover that I had not lived.

-- Thoreau, Walden

/tags/all Sun, 05 Mar 2017 04:24 GMT
Xmas Geodesic entries/xmas-geodesic DSC_2621.JPG DSC_2608.JPG DSC_2597.JPG DSC_2577.JPG DSC_2654.JPG

Over the Xmas holiday my friend Fenris and I built this geodesic dome (actually a truncated icosahedron) out of corrugated plastic sheets and gaffer tape.

It took about 4 hours over two sessions of cutting and then taping.

/tags/all Fri, 17 Feb 2017 07:09 GMT
Hope entries/hope Gödel's incompleteness theorems provide us with mathematical proof of the unknowable. The vast empty skies of those things we don't and can't know -> that is where hope resides. Nobody knows the future.

/tags/all Thu, 02 Feb 2017 11:44 GMT
Sounds Incredible entries/sounds-incredible sounds incredible by chr15m + fenris

After 14 years of playing music together on Gameboy Advance and Commodore 64 my buddy Fenris and I finally recorded an album while he was visiting during Xmas.

You can listen to the album for free or purchase a download for however much you like.

All of the software we use to play music is Free and Open Source:

I hope you enjoy the music.

/tags/all Sun, 15 Jan 2017 10:52 GMT
New York PdCon 2016 entries/new-york-pdcon-2016 DSC_1662.JPG DSC_1673.JPG DSC_1731.JPG DSC_1701.JPG DSC_1716.JPG DSC_1739.JPG DSC_1864.JPG DSC_1742.JPG DSC_1680.JPG DSC_1690.JPG DSC_1698.JPG DSC_1859.JPG DSC_1793.JPG DSC_1801.JPG DSC_1818.JPG DSC_1788.JPG DSC_1810.JPG DSC_1724.JPG DSC_1862.JPG DSC_1713.JPG DSC_1747.JPG DSC_1743.JPG DSC_1745.JPG DSC_1877.JPG

In November I was in New York for PdCon 2016 and to visit my brother, thanks in large part to my friend Joe Deken and his not-for-profit, New Blankets.

The conference was fantastic. Many fascinating performances, a chance to catch up in person with people from the Pure Data community, and the opportunity to present and perform some of my own work. A highlight for me was hearing Miller Puckette, creator of Pure Data, talk about his approach and philosophy.

On top of that I got to catch up with some awesome people outside of the conference, especially my brother. We went hiking together one day - a rare opportunity to hang out together in nature.

/tags/all Mon, 09 Jan 2017 09:49 GMT
Gameboy Nature Beats entries/gameboy-nature-beats gameboynaturebeats-poster-1.png gameboynaturebeats-poster-4.png

Tonight my friend Fenris and I will play some music in a park here in Perth, Western Australia, on Gameboy and Commodore 64 powered by batteries and broadcast over FM radio to local speakers hanging from the trees. We'll start playing at 9:30pm and after us our friends Atomsmasha and Kataplexia will also play some music on Gameboys.

Might see you there!

/tags/all Fri, 06 Jan 2017 07:07 GMT
Geodesic Scale Test entries/geodesic-scale-test DSC_1913.JPG DSC_1914.JPG DSC_1918.JPG DSC_1908.JPG

/tags/all Sat, 26 Nov 2016 06:32 GMT
Open Skies entries/open-skies Hand drawn image of a country scene with a rocket flying above the clouds and the moon with a habitation ring around it.

/tags/all Fri, 25 Nov 2016 01:51 GMT
Algorave Set in Williamsburg entries/algorave-set-in-williamsburg Lately I've been working on new algorave music in the style of drill&bass and I'm playing a set here in New York for the PdCon16 party. It's at a space called Vital Joint in Williamsburg, tonight (Saturday) at midnight.

spinning globe 

/tags/all Sat, 19 Nov 2016 06:12 GMT
Startup Idea: Web App Installer entries/startup-idea-webapp-store Although it is an exadgeration to say that app stores are dead it is true that web apps (applications that run in a web browser) and the mobile-device browser platforms have become powerful to the point that it is often not neccessary to build a native app.

There is a gap in the web app paradigm as users don't always realise they can install a web app they use by going to "Add to homescreen".

An interesting way to fill that gap would be to build an "app store" for web apps. That is, a native app that curates and carries out the "add to homescreen" process for the user for a wide variety of quality web applications. So basically like Firefox OS but without the OS - just the installer, and for the native browser of each platform.

Ideas are cheap and execution is everything - you don't need my permission to take this idea and run with it if you're convinced.

/tags/all Mon, 14 Nov 2016 15:22 GMT
Tentacle Being entries/tentacle-being Drawing of a tentacle being

Drawing practice in the style of Ben Hatke.

Scout and I finished Zita the Spacegirl recently which was a wonderful adventure.

/tags/all Fri, 11 Nov 2016 08:12 GMT
Delhi 2016 entries/delhi-2016 DSC_0232.JPG DSC_0242.JPG DSC_0251.JPG DSC_0304.JPG DSC_0326.JPG DSC_0350.JPG DSC_0358.JPG DSC_0217.JPG DSC_0411.JPG DSC_0212.JPG DSC_0432.JPG DSC_0453.JPG IMG_20160930_105853.JPG

Couple of weeks ago I was fortunate enough to visit Delhi and spend a week with my colleagues Umang, Gaurav and Tom. We had an excellent and productive week and in between development discussion Umang was kind enough to drive us to many fascinating and beautiful places - not least of all to enjoy a wonderful meal at his sister's house.

We worked out of Awfis co-working, which I recommend.

I feel lucky to have seen Delhi this way.

/tags/all Thu, 20 Oct 2016 06:57 GMT
Sci Fi UIs in ClojureScript entries/sci-fi-uis-in-clojurescript I built these sci fi user interfaces using ClojureScript, React, and SVG:

Tap or click to interact with them.






More here.

Source code here.

/tags/all Sun, 11 Sep 2016 07:13 GMT
Namibia 2027 entries/namibia-2027 TS.2850-Anthony-Scime-style-copy.png

I am trying to teach myself sci-fi style vector painting and this a piece that I think meets the post-on-blog standard.

I tried to copy the basic palette/mood/style of this image.

/tags/all Sun, 21 Aug 2016 02:05 GMT
You Are Here entries/you-are-here you are here

/tags/all Sun, 24 Jul 2016 08:13 GMT
OMG Not Another TODO List Application entries/omg-not-another-todo-list-application My wife and I needed a collaborative shopping list that we could update from our phones. There are proprietary solutions to this but after some research I was surprised to discover that there is no Free Software application that meets the following criteria:

  • Web based.
  • Easy to deploy.
  • Self-hosted & FLOSS.
  • Allows multiple people to update a list.
  • Simple text based format for easy editing.
  • Mobile friendly - "Add to Home Screen" webapp.
  • Satisfies the single use-case of collaborative TODO editing.

Of course I built one with ClojureScript.

Screenshot of 

We've been using this "in production" for 3 months and so far it fills our need without issue.

  • Authentication can be accomplished with a .htaccess file or similar.
  • The text-file format is designed so that you can edit lists with a text-editor directly if you want to.
  • If you want to support multiple users you can set up two instances in two different folders and symlink the textfile of the list you want to share between them. Each folder can have its own authentication.
  • You can also do other textfile things like make a symlink into a Syncthing folder which enables you to modify your TODO lists on your laptop or server as well as through the web app.

The realtime updating is accomplished via long-polling. Primarily I used this instead of websockets because when it comes to browsers, older tech is more robust to different operating environments than newer tech.

I resorted to using PHP for a very lightweight server backend because it has the property that basically anybody with web hosting is able to upload a PHP script and I think it's good to give software as egalitarian a deployment surface as possible. Luckily it is only 150 lines of not-too-painful PHP.

Click here to get the source and download/install it.

/tags/all Sat, 28 May 2016 01:29 GMT
Treehouse Building entries/treehouse-building DSC_0381.png DSC_0386.png DSC_0387.png smssecure-2016-05-07-141043.png DSC_0407.png DSC_0392.png

Couple of weekends ago Jessee and Chris came over and we made this free-standing tree-house-like platform thing for Scout and Orson out of some wooden palettes I'd collected during the preceding week.

When I say "we made" of course I mean they made it and wisely only let me touch one or two power tools during the course of construction.

/tags/all Sun, 22 May 2016 11:01 GMT
Some Isometric Sprites entries/some-isometric-sprites Ship



Tree #1

Tree #2

Mandarc side view

These are some video game style isometric and side view renders of previous 3d work I did:

/tags/all Fri, 08 Apr 2016 05:58 GMT
Corn & Zucchini entries/corn-amp-zucchini- DSC_0129.JPG DSC_0054.JPG

Wrong time of year but we'll see what happens.

/tags/all Sun, 27 Mar 2016 01:52 GMT
Mccormick Family Photo 2016 entries/mccormick-family-photo-2016 smssecure-2016-03-11-184134.jpeg

/tags/all Tue, 15 Mar 2016 12:09 GMT
Heuristic For Algorave Mastering entries/heuristic-for-algorave-mastering This is the pattern I use for mastering algorithmic electronic music that I write.

Algorave mastering heuristic block diagram

First, each audio source or channel Sn is given a random (sometimes hand tuned) delay of 0 to 20 milliseconds on either the left or right channel in RPn. My friend Crispin put me on to this technique, which gives each audio source its own psycho-acoustic space in the mix, probably due to the Haas effect.

Next the resulting sources are summed together - separately for left and right channel. Here you can also run the combined signal through a high pass filter set at 5Hz to remove any DC offset present in the signal.

Then the combined signal is passed through a reverb with mostly "dry" signal - maximum 30% wet as a general rule of thumb. Adjust the reverb to taste. I'll usually make it a bit long and airy but subtle.

Next we win the loudness wars. This is dance music and we want people to dance, so it has to sound powerful. To acheive this we do something horrible: measure the RMS - the power of the sound - and then amplify until the power of the signal is normalised. Here is the "auto compress" Pure Data patch I use for doing this:

Pure Data auto-compress patch

The env~ object here is a simple envelope follower and the source code is here. The dbtorms function source code is here. The possible magnitude of the power correction is limited by the clip function which does what it says on the box, and the resulting multiplier is smoothed with a 10ms rise and fall time (line~) to get rid of sudden discontinuities. Only 30% of the resulting power-normalized signal is mixed with the original signal.

Finally, run the mixed signal through a soft-clipper before sending it to the speakers. Soft clipping is a good idea because the power normalisation step above will push the peaks up above 1.0 and we don't want harsh hard-clipped distortion to be audible.

The soft clipper I use (probably incorrectly called "sigmoid" in the diagram) is simultaneously a compressor to get that extra punchy sound:

2 / (1 + pow(27.1828, -$v1)) - 1

Where $v1 here corresponds to your vector of incoming audio samples.

Hopefully this method doesn't break any international treaties or anything.


/tags/all Mon, 29 Feb 2016 02:45 GMT
I'm Playing Algorave at Rhetoric entries/i-m-playing-algorave-at-rhetoric rhetoric3.0_web.jpg

I am playing algorithmic rave music at Rhetoric in Western Australia.

  • February 5th, 2016
  • Game city { Raine Square / Perth Train Station }
  • Doors open 6pm
  • $10 Entry
  • Free arcade games
  • With: chr15m, cbat, marko maric, atomsmasha, kataplexia, amnesia, polite society & free arcade games.


/tags/all Sat, 23 Jan 2016 03:31 GMT
Orchids to Dusk is a great game entries/orchids-to-dusk-is-a-great-game orchids_201520185417.png

"An astronaut stranded on an alien planet, with only a few minutes left to live."

Orchids to Dusk had a powerful effect on me.

I dreamed about the game the night after playing it.

The creative power of code is the microwave background radiation of my subconscious and this game made me notice it again in a visceral way.


/tags/all Thu, 24 Dec 2015 04:22 GMT
Ludum Dare 34 entries/ludum-dare-34 Over the weekend I built a tiny game for Ludum Dare #34. Here it is:

Instructions: grow the white square's heart by clicking and dragging to the other squares.

Link to the game here.

Source code here.

Play/review/rate it here.

/tags/all Wed, 16 Dec 2015 05:23 GMT
Zero Asset Game Engine entries/zero-asset-games Zero Asset Game Mockup

A "zero asset game" is a game that does not use any external art assets.

Game art is instead generated procedurally or by using artifacts of the rendering environment.

The following is a screenshot of a tiny game engine I built a little while ago in ClojureScript.

Tiny CLJS Game Engine Screenshot

The renderer runs on Facebook's React library so it is just a couple of lines of code.

I've spread it over several lines here for readability:

; DOM "scene grapher"
[:div {:id "game-board"}
      (fn [[id e]]
        [:div {:class (str "sprite c" (:color e))
           :key id
           :style (compute-position-style e)
           :on-click (fn [ev] (sfx/play :blip))}
        (:symbol e)])
      (:entities @game-state)))]

The sprites are utf8 characters which are instantiated like this:

(make-entity {:symbol "◍"
              :color 0
              :pos [-20 300]
              :angle 0
              :behaviour behaviour-rock})

The function behaviour-rock here gets called once per frame and returns the new immutable entity-state for the next frame.

When you click on something the blip sound is generated procedurally in the browser using jsfxr.

/tags/all Fri, 11 Dec 2015 12:19 GMT
Fubbles entries/fubbles Fubbles title screen

This is a video game I made for Scout to help her practice using a gamepad.

Play it! You'll need at least one gamepad and Firefox or Chrome.

  • It's hard to find nice games that fit the search "two player gamepad-enabled couch-co-op suitable for four year olds".

  • Game design for a four year old is quite nuanced. To make a fun game without all of the normal risk reward mechanics basically comes down to "make rude noises".

  • It's 360 lines of ClojureScript, rendered in the browser DOM with React. It took me a handful of evenings over a period of one month to develop.

  • I don't play many games, but the gamepad is probably my favourite human-computer interface.

Fubbles title screen

Source code:


infinitelives Logo

Fubbles is the first game I have made using the new infinitelives ClojureScript library for game development that my friend Crispin and I have been building.

/tags/all Sun, 08 Nov 2015 11:43 GMT
Stylus Prediction Revisited entries/stylus-prediction-revisited Nearly three years ago I wrote:

Prediction: within 3 years the stylus will be the killer feature of Android tablets.

Since then I've felt a little embarrassed remembering that post. Grand claims, ha ha!


With the recent announcement of Apple's "Pencil" I feel somewhat vindicated. I got the details wrong but I think broadly speaking that hand-drawing, sketches, doodles, will feature strongly in the future of human-to-human communication. Maybe even more strongly than typed messages for some people.

  • I'm thinking about the 16% of people worldwide who can't read or write, but who are rapidly adopting hand held technologies where they can draw.

  • I'm thinking about the tens of thousands of years of human beings using sticks as a technology for making marks upon a surface.

  • I'm thinking about the popularity of emoji, the universality of pictographs, the cross-cultural and language-independent nature of the medium of drawn communication.

  • I'm thinking about my kids and how the second thing they learn after talking is drawing.

Pictographs of phone repair

Maybe one future is a world in which many of our planet's population do a significant fraction of our communication through the medium of doodles.

/tags/all Wed, 28 Oct 2015 12:01 GMT
miniCast web based podcast app entries/minicast-web-based-podcast-app screenshot.png

miniCast is a self-hosted web app for listening to podcasts.

I wrote it while learning ClojureScript. The back-end API is written in PHP. My friend George came up with the name and design.

/tags/all Sun, 25 Oct 2015 12:30 GMT
Feeling Grateful entries/feeling-grateful This is late.

I feel grateful because this year when my daughter said to me "I want to be a mummy, not an astronaut," I was able to tell her about Anna Fisher, who in 1984 became the first astronaut-mother in space, and to show her the stories and images online of the several astronaut-mothers who have followed her into space.

Anna Lee Fisher by Bren 
Luke Anna Lee Fisher by Bren Luke.

I feel grateful this year to Jess Frazelle from Docker, who wrote an honest blog post that reminded me of my privilege; reminded me how lucky I am to participate in tech and open source communities without friction and harassment; reminded me of a hidden strength and fortitude exhibited by amazing people all around us that I can aspire to; and reminded me that there is always more work to be done to make the world a better place for all humans.

I feel grateful that I am not alone in thinking and wanting that our culture can change for the better. I'm grateful that the internet can amplify the voices of people like Jess, and counteract the Friendship Paradox every time somebody speaks up.

I am grateful for the writing of bloggers like Pamela Fox and Liza Shulyayeva and Nicole Reid who demonstrate the technical, evidence based counter-factual to every trolling Hacker News comment.

As I do every year, this year I feel deeply grateful and so very lucky that my parents bought our Apple IIe when I was eight years old and that my mother taught me to code.

I feel grateful to have worked, and to continue to work beside amazing people who every day prove that smart, capable, technical people don't fit a stereotype.

The stereotype disagrees with reality, and so it is wrong.

/tags/all Thu, 15 Oct 2015 02:52 GMT