Blog
Learning GoatTracker, 3: Generating an MP3 file
Before I continued dissecting Readme.txt, I wanted to find out the answer to a question to which I insisting and unconciously go back again and again: how do I convert a SNG file (GoatTracker’s format) to WAV (and then to MP3)?
It seems the answer resides in sidplay, which is a (guess it!) SID player. It can be installed using Synaptic Package Manager. I looked for sidplay and it seems that the libsidplay1 library was already installed, as some other packages such as gstreamer plugins for “ugly” formats depended on it). I checked the sidplay package anyway, and pressed ‘Apply’ as usual.
But sidplay can only play SID files, not SNG files. So we need to export the song from within GoatTracker. This is called packing in their jargon. You can access the option if you press F9.
It will then ask you lots of questions such as “Select playroutine options”, “Start address”, “Select zeropage address”, and finally “Format to save in”. Scroll down with the arrows until you see “SID – SIDPlay music file format” in green, and then press Enter to accept. Then browse to the folder where you want to save the song, type in a filename and all that.
Since I have the ‘ugly’ gstreamer plugins, I can quickly test that my song works by dragging the output SID to the gnome movie player.
And now to output the wav file you just need to open a terminal and type this in:
sidplay2 filename.sid -wfilename.wav
Change the filenames as required ;)
If all went well, you should have a filename.wav file with your rendered song! You can now convert it to MP3 or OGG or whatever you like.
Learning GoatTracker, 2: Patterns and instruments
Goattracker’s orders and patterns vs ‘normal’ trackers like Impulse Tracker
- In Impulse Tracker you only have a tune which is split in several patterns. These patterns are arranged in a sequence in the order list and that’s it. On the other hand, Goat Tracker allows you to split your tune in several subtunes. Each one has its own order list.
- Moreover, each element of the order list in GT specifies which pattern is going to be used in each channel. This is done for saving space, and for flexibility.
- There are special commands which can be entered in the order list and allow us to transpose or repeat the following patterns. But I think this is kind of too advanced for now :)
The patterns
The format is totally familiar: C-1 00 0 00 = Note name, Octave, Instrument number, Command and Databyte, which I assume is the command value.
And there’s also the usual cut-off/fade style commands which can be entered in place of notes:
- … Rest
- —- Key off (clear gatebit mask)
- +++ Key on (set gatebit mask)
although I still don’t know what is the gatebit mask, but I’ll find it eventually.
The available commands are familiar too: portamento up/down, toneportamento (the usual glide or portamento to note), vibrato, and then some new ones for modifying several parameters of the active instrument. Some are intuitive at this point (changing filter cutoff, resonance…) whereas others (set wavetable pointer, for example) are not.
Master volume and tempo can also be changed using commands, so we are able to fade out songs and make swingy music with groove if needed ;-)
Instruments
To understand how they work I guess it’s best to think of an instrument as if it was a synthetiser. GoatTracker does not use samples, instead it gives you a number of parameters that you can configure in order to get some sound from the instruments. So you get familiar parameters such as Attack, decay, sustain and release and then more references to those strange tables (wave, pulse and filter tables). Minigotcha here: since the Attack/Decay and Sustain/Release parameters are somehow linked, their values are specified at the same time, one char for each. For example in the Attack/Decay column, a value of 34 means 3 for Attack and 4 for Delay. Same for SR.
You might know it already but I think it’s important to stress this, and the readme.txt agrees with me on that: ADSR settings are crucial to getting any sound at all. So let’s set some values which might produce sound!
In the pattern, enter some random notes. Then move to the instrument editor (press TAB repeatedly until you get there, or click over the Attack/Decay value column to place the focus there). And set A/D to be 22 and S/R to be FF. If you press F1 now (to play the song) you’ll heard absolutely nothing though, because guess what… we haven’t edited the (in)famous tables yet!
The tables
Readme.txt says it better than me:
Tables control the execution of instruments’ waveform/arpeggio changes, pulse modulation, and filter modulation. All the tables are controlled by the left side bytes, while the right side byte specifies additional parameters
After having a quick glance at the wave table reference, let’s do a little trick to see if we understood how things work:
- In Wavetable Pos, enter ‘01’ (because if using ‘00’ the wave table is not used, and that’s bad, because we don’t get any sound).
- Now in the first row (‘step 1’ in their words) of the wave table, enter ‘10’ in the left column. According to the reference, values from 10 to DF specify waveform values in this column. If you press F1 now (or if you hadn’t stopped the song with F4 before) you’ll finally hear something! YEAH!!
You can enter more values in that first row and hear the different waves that are output. There’s a list in the readme. But basically 10 = Triangle, 20 = Sawtooth, 40 = Pulse, 80 = Noise.
There’s also some reference to ring modulation using another channel and etc. Ignored by now.
These sounds are very basic and nothing more than a pure wave being played. For building richer sounds we need to get serious with the wave table. It will even allow us to create chippy arpeggios! There are some examples in the reference, such as:
Sawtooth waveform on note’s original pitch
01: 21 00
02: FF 00
This one is very similar to the one we had until now, with the difference that it has the FF in step 2 which I didn’t add before. Its purpose is to tell the player to stop iterating through the wavetable.
A snaredrum sound, using all absolute notes so that it does not depend on which note it’s played
I’ll add some explanation for each row to make sure I understand how this works :)
- 01: 81 D0: 81 = use a noise wave, D0 = the note to be played (ref says: 81-DF Absolute notes C#0 – B-7, so D0 = G#6, D1 = A-6, D2 = A#6, D3 = B-6, D4 = C-7, D5 = C#7, D6 = D-7, D7 = D#7, D8 = E-7, D9 = F-7, DA = F#7, DB = G-7, DC = G#7, DD = A-7, DE = A#7, DF = B-7)
- 02: 41 AA: 41 = use a pulse waveform, AA = some note in a lower pitch (AA is in the 81-DF range)
- 03: 41 A4: 41 = use pulse waveform, in an even lower pitch note
- 04: 80 D4: 80 = noise waveform, D4 = C-7
- 05: 80 D1: 80 = noise waveform, D1 = A-6
- 06: FF 00: stop playing the wavetable
So why should we use the FF command on the left column? It’s very simple: because the wavetable is shared by all the instruments. That’s why each instrument has a Wavetable Pos parameter so we can select at which point in the table do we want them to start playing, and also why we need to specify when do they need to stop too, or they will just traverse the full table.
I still haven’t investigated how the other tables work, but I’m 99.99% sure they work exactly the same way.
Learning GoatTracker, 1
Here’s my self proposed challenge: create a true 8-bit song for the RetroEuskal compo. It’s going to be quite tought because I have never, ever, in my life, made a true 8-bit song with true 8-bit limitations. I have decided to use GoatTracker because it works on my computer and operating system (Ubuntu). I could maybe use FamiTracker which I think was easier from when I tried it, but I have to run it inside VirtualBox (wine won’t do the trick this time) and it was horribly slow, plus the lag and the sound crackles. A definitive no-no.
As an exercise and also just in case it is helpful for someone else, I’m going to write down the process here. There we go!
First thing with GoatTracker is to locate some documentation, because just playing around with the values of things in the screen is not working, and nobody though of busy people like me and recorded a youtube tutorial or something. In Ubuntu, if you install GoatTracker using the package manager, the documentation which accompanies the softare is in a compressed file in /usr/share/doc/goattracker/readme.tar.gz, so you’ll have to extract it somewhere where you, as a simple user, are allowed to extract it. By the way, the sample songs are also in that directory.
Just as I began reading it I had the feeling that I should really understand how the SID chip works if I really want to make a song. Readme.txt points to the C64 programmer’s Reference Guide (which can be downloaded from here) or to AAY64 Both sound frankly scaring, but I’ll do my best…
Back to the readme.txt, it points out that maybe the songs won’t sound like a true computer would play them. Well, bad luck then. I’ll have to do with what I have, even if there are always C64’s in ebay. It then proceeds to describe lots of changes and differences between versions with a set of terms which are quite obscure at this point. I foresee myself as the darkest mistress of C64 music when I finish reading the readme.txt, though. Ha!
There are also lots of command line options which can be used when starting the program. Since I hardly understand what the majority of them do (with esoteric titles such as hard restart ADSR parameter, reSID interpolation, pulse optimization/skipping, random reSID write delay in cycles, etc), I’ll just ignore them for the time being.
It’s interesting that all the Key shortcuts are listed in the Readme file. Even if you can access an online help screen by pressing F12 while in GoatTracker, it is a bit tedious to alternate between them.
Hiatus, II
I don’t quite know why but I stopped posting here something like 3 months ago. It seems like every hiatus happens around June. Consequently I have a backlog of stuff to post and write about, which includes adding some songs I have composed since the last time I wrote here. But with some time and dedication it will all end up here :-)
Black holes
Yet another song featured in an educational project… I wonder if this is going to become an established trend :-)
Anyway, here’s the video, using A dream of sorts as musical background:
Black Holes from Adrian Aquilino on Vimeo.