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.
Comments
jy
sole
eric
sole
sdka
sole
digger
Got anything to say?