Keep On Trackin: Making Music for Sifteo Cubes

posted by danmerrill, 30 Jan 2013


A Bit of Background…

Before working with the new Sifteo Cubes, I scored most games and films in Logic Pro, manipulating pretty waveform representations and skeuomorphic plugin interfaces and rendering the results to WAV or AIF. So when I heard that Sifteo was moving to tracked audio with their latest generation of Sifteo Cubes, I was apprehensive.

My only previous encounters with trackers involved opening a file, looking at what seemed like a wall of indecipherable text, and deciding that it was just too foreign and odd to pursue.

I can happily report that adapting to the writing process was fairly painless, and mainly involved re-contextualizing a few already-familiar concepts. If you can punch notes into a MIDI piano roll in GarageBand, you can write tracked music. Like any piece of software, as you become more familiar with the tracker, the interface becomes more transparent. It becomes natural to subdivide numerical pattern blocks into bars and beats, to hear rhythms represented as text, and to live in a world without flats (all accidentals in the tracker are notated as sharps).

Tracker music became a popular way to write and share original electronic music in the 90s (see demoscene). Distinct from general MIDI music files, which contain only channel and timing info and rely on samples or synths located on each user’s computer to actually play sound, tracker files contain a bank of all the audio samples used in each piece. This allows the composer to be sure that the intended sound sample is always played. Because the ‘score’ or instructions for playing the music are basically stored as text, a longer piece of music doesn’t take up much more space than a short piece, and you can write a LOT of music using a tiny data footprint. This makes the format particularly well-suited for games, especially when disk space is a concern.

Authoring a module in MilkyTracker

Cube Music Tech Specs

Sifteo Cubes use the XM tracker format to store and play music. The cubes support 8 channels of 16khz audio, which can be split however you like between music and sound effects (blank tracker channels load in pairs– I find that six channels of music and two channels for sfx usually works well). One sample per tracker instrument is supported. All samples are de-duplicated when the game builds, meaning you can use the same samples in separate XM files for all of your different pieces of music, and they’ll all automatically get crunched into a single shared bank, with duplicate samples removed (as long as the audio data in corresponding samples is identical).

I use MilkyTracker, which is free, to write all of my Sifteo Cube music. The native sample rate of the tracker is 8363hz (a remnant of the Amiga clock speed), but you don’t have to worry about sample rate conversion – when you load in an audio sample, MilkyTracker automatically maps it to middle C on the keyboard (you can use an external MIDI keyboard for note input) and adjusts the tuning to compensate for any sample rate deviations from 8363hz. I try to keep things as light as possible – I usually use 16khz samples, or in really resource-demanding games, I’ll downsample to the native 8363hz.

Approaches to Composition/Instrumentation

Writing music for the cubes is an exercise in creatively maximizing limited resources, and some of the decisions borne from necessity can have cool and thought-provoking musical results. In Chroma Splash, I knew I wanted beds of shifting major and minor string chords, but I didn’t want to devote several channels to strings alone. Instead, I sampled both a complete C major and a C minor chord, and used each chord as a single tracker instrument. So, if I was using my “major chord” instrument, when I played the note C, I would hear the entire C major chord. The note D on the keyboard played a complete D major chord, etc. Same for minor chords.

The coolest part was the realization that I could also build more complex chords using the major and minor chords as building blocks, without tying up many audio channels. A C major chord with an E minor chord stacked on top of it becomes a Cmaj7 (CEG + EGB = CEGB). A C major chord with a G major on top becomes a Cmaj9. Change it to a G minor on top and you get a C dominant 9. Pretty cool! I charted out some of the stacked chords I thought would be particularly useful:

I approach instrumentation for the Cubes the same as in any other piece of music, but with a few added constraints. The speaker on the base has a low frequency cutoff of ~500hz, so I choose instruments that really speak in the mid-high range. Sawtooth-based synths, french horns, and violins all work well as sustaining instruments – anything with lots of buzzy overtone energy. Sine-y instruments like flutes can work too, but need to stay in a narrower, higher range to sound balanced in the mix and typically take a bit more volume massaging. Plucked instruments like banjos, shamisens, and mandolins work great.

For some instruments with sharp attacks and quick decays, like guitars and hand drums, I like to use multiple samples across two or more tracker instruments – this might mean alternating an upstroke and downstroke for a guitar, or a left and right hand on a conga. Exploiting a bent note or other expressive effect can be a great way to breathe more life into a piece (browse the MilkyTracker effect list here).

Since most of the time my samples are monophonic (i.e. based on a single note), it helps me to think of harmony in terms of the voice leading between single voices rather than as a series of block chords. Every once in a while I’ll devote 3 or 4 channels to a single, thicker chord, but I get a lot of milage out of thinking linearly.

Rhythmic, percussive textures tend to work particularly well:

I find it’s more difficult to write slowly-evolving soundscape textures – but not impossible! They just take more planning and layering:

There are rich possibilities to explore by using a variety of source audio as the building blocks of sampler instruments – the stacked chords above are one example, but there’s a lot of room for further innovation!

Over and Out

One takeaway I’ve had after working on several Sifteo titles is that the tool (i.e. the “retro” tracker) doesn’t necessarily determine the output style. You can write a really broad range of music for Sifteo Cubes – so far I’ve explored introspective, orchestral sci-fi music in Chroma Splash, angular, Devo-meets-Muppets music in Cube Buddies, and hip-hop textures filtered through traditional Japanese instrumentation in Teenage Mutant Ninja Turtles: Ninja Slide. There’s much more to dig into than what I’ve touched upon, so go browse the MilkyTracker manual and Sifteo Documentation, check out a tutorial or two, and start making music!

Daniel Merrill is a composer for media based in Los Angeles, CA. http://www.danielmerrill.com

blog comments powered by Disqus