22 December, 2005
I've been seriously busy lately, although I still don't seem to be getting the stuff done that I really need to. My thesis, for example.
I've had very little time for music, too. Luckily, I have hundreds of unfinished tracks lying formant on my hard-drive, so when I've had a spare hour in the evening I've been going back over them. Most of them are just tiny little snippets of things that I kept to use later and forgot about, but some were things that sounded quite promising, but were abandoned when I ran out of ideas.
Then I found something I'd played with a while ago and didn't really do much with.
So, I cobbled them together to produce bent [ogg|mp3] - a tribute to trackers, the history of trackers and people who make music with trackers. It uses most of the old tricks, lots of commands, and sounds like Jean Michel Jarre's bad dreams.
Since people keep asking about how I use trackers, here's some info.
One of the ways I create sounds is to take an existing sample, such as a piano or some singing, and chop out one or two cycles of the sound. Looped, this makes a very simple and plain sound. It's very easy to work like this in a tracker.
Sometimes, I don't even go for a zero crossing - I let it make a disgusting noise and filter it when I use it.
On their own, these sounds tend to be very dry and uninteresting. Setting volume and filter envelopes helps, as does a healthy stack of effects. Distortion, reverb, flange, low pass, etc.
Another thing I like about trackers is the effects column. This isn't for effects like reverb, but for altering the playback of the sound currently triggered in that channel.
We have pitch bend - Ehh (down) and Fhh (up) where hh is a two digit hex number between 0 and FF. Offset (Ohh) lets you control where in the sample playback starts. If 255 isn't enough, you can change the offset with SAh.
Although CheeseTracker uses instruments, unlike trackers of old, and can have per-instrument effects, envelopes, decays, etc, it's sometimes handy to be able to just cut the playback. That's what ^^^ does. You can just tell it to start to decay, or exit the sustain loop with ===.
Way back, when you only had 4 channels to work with, you didn't have the luxury of plug-in effects, envelopes or even the ability to play more than one sound at a time in a channel. And yet people made amazing tunes with tiny little samples.
By using vibrato, tremor and arpeggio commands (Hhh, Ihh and Jhh) in the effects column, they managed to turn a very flat sound into something completely different - usually by cranking up the parameters beyond what they were originally intended for.
There's also effects for volume slides, (Dhh) start delay (SDh) and many more, including my favourite: slide to note (Ghh).
I've been tracking for so long now that these commands are burned into my memory.
16 December, 2005
Last week, in one of the modules of the creative computing course, we were looking at boolean operations on shapes.
As an illustration, I wrote a little program in Python that could be used to show boolean operations on circles and squares. It was very simple - there was a super class called Shape that implemented methods called and_() or_() xor_() and andnot_(). Subclasses simply had to override the isin() method that, given a tuple containing xy coordinates, returned True for points within the shape and False otherwise.
To display the shape, there was a __repr__() method that scanned a 40 by 40 square of points, printing a hash (#) when the current location fell within the shape. The results of the boolean operations returned a string constructed in the same way.
Anyway, I gave the lecture and we looked at the output. It served its purpose , but I couldn't just leave it alone. The boolean operations, really, should return a Shape object. Then we could write, for example, a.and_(b).xor_(c). But the original code couldn't do this - the isin() method in Circle, for example, checked to see if the given point was within its radius. This wouldn't extend well to shapes that couldn't be calculated simply from a few parameters.
So, I've made a nicer version. Shape now has a list of points that are within it. Each subclass overrides the constructor to set up the initial list, and isin() now just checks the list for the given coordinates. It's made the subclasses a lot simpler, because isin() doesn't need to be overridden any more.
And, now that shapes are simply a list of points that fall within them, the boolean operations can return a Shape object too. So, it's now possible to operate on the results of the boolean operations.
I've also overloaded the operators & | - and / to call and_(), or_(), andnot_() and xor_() respectively, so you can write:
print (s - c)/c2
to show the shape s without c, xor'd with c2.
I know I shouldn't enjoy writing these little programs so much, but I do. I get a kick out of simple things done nicely.
Anyway, the code is in bools.py
03 December, 2005
Science in song
Go to Greg's Science Songs and have a listen to "Glucose Glucose" (You're sweeter than a woman's kiss, because I need you for glycolysis), "3.14159" (Three point one four one five nine!) and many more.
They're funny and educational, too.
02 December, 2005
The Freesound project
Freesound is a collection of free samples for musicians. Things are categorised (using tags, lovely), can be previewed very easily in the browser, can be found by similarity to other sounds (or dissimilarity!) and waveforms are displayed.
They're trying to get to 20,000 sounds before there are 2,000,000 downloads, and it looks like they'll manage it.
So, go and contribute.
Everything is under a Creative Commons license, so there's no worries about copyright or royalties.
Go! Now! Make something! Contribute!