Arcane Tracking.

JKL

What you are reading here is a purely technical article about tracking. All examples and names of effects and parameters I'll give in Impulse Tracker notation, mainly because it's the tracker I'm using. If you do not use IT, this article might still be of interest to you, because most the things written here apply to any FT2 or IT kind of tracker.

Cell layout.

  C-4 01 64 U73
    |  |  |   `effect
    |  |  `----volume & panning & effect
    |  `-------instrument
    `----------note

Let's look at these fields in order.

Note

The note is used by the tracker:

> as an index into the instrument's sample table, to find out what sample and at what actual note to play.

> to calculate pitch-pan separation (if default pan is enabled)

> to trigger NNA of previous note.

Special values:

> Note cut. Stops last note played in this channel. If it's already stopped, note cut has no effect. (To cut all virtual channels owned by this channel, use the S70 effect:

         ^^^ .. .. S70

Otherwise any background channels will continue.)

> Note off. Releases all sustain loops in the last played note. Also may trigger note fade. Doesn't put the note into the background, i.e. you still can apply effects to it and cut it with note cut.

> Note fade. Not supported in IT 2.14 editor (but supported by player and documented, see ittech.txt).

Defaults:

> If you play the note without instrument number, IT uses the previous instrument number in that channel. If there hasn't been one yet, IT plays nothing.

> If you also omit the volume, the volume of the previous note is used (and not the default volume of the instrument!).

      C-4 01 15 ...
      ... .. .. ...
      E-5 .. .. ... - plays as E-5 01 15 ...

Instrument

The instrument number is used by the tracker:

> to play a note using this instrument (there are a few cases when no note is played, see below).

Defaults:

> If there's no note, then things get very complex:

> If the previous note was played by the same instrument, and there haven't been any note offs, then the volume is set to the instrument's default volume, panning isn't changed and sample or envelopes aren't restarted, unless the note has already ended. Then it's played again. Example: (instrument 1 has a volume envelope that ends after two rows at 0 volume, and the sample it plays has the default volume 64)

          C-4 01 20 ...
          ... 01 .. ... - same as   ... .. 64 ...   here
          ... .. .. ... (note ends)
          ... 01 .. ... - same as   C-4 01 .. ...   here
          ^^^ .. .. ...
          ... 01 .. ... - nothing happens

> If the previous note was played by a different instrument, and there haven't been any note offs, then the effect is the same, but sample and envelopes are restarted (even if it's the same sample), and panning is set to default. In effect it's the same as playing the same note as before but with different instrument.

> If there has been a note off after the previous note, then it plays the new instrument (starts envelopes, sets default volume, but doesn't change panning), but doesn't change or restart the sample! That is, it continues playing the last sample (if it hasn't been cut), but applies envelopes from a new instrument. This doesn't seem to be a documented feature, but it's a great help sometimes.

Volume

The volume field sets the volume of last played note. It can also contain a panning value that changes the panning of the last played note. Note that neither panning effects nor panning values in volume column affect other virtual channels owned by that physical channel. In fact, only things that affect "background" notes are past note cuts/offs/fades, channel volume changes and NNAs with Duplicate Note Checks.

The volume field can also contain some effects.

Effects.

Read it.txt for a good description about which effect does what. Here I'll give some non-obvious details.

Gxx - Works like Exx or Fxx (except that the effect value is always treated like the speed of normal pitch slide, there's no fine or extra fine portamentos). IT decides in which direction to slide and when to stop by difference in the current pitch of the previous note and the pitch of the note you're sliding to (after looking it up in the instrument's table).

      C-4 01 .. ...  C-4 01 .. ...
      C-5 01 .. G01  ... .. .. F01 - both channels will play the same

Thus, if you want to start portamento immediately after playing a note, use an appropriate slide:

      C-4 01 .. F01
      C-5 01 .. G00 - E, F, G share effect values

Hxy - If you want light vibrato (usually you do), better use Uxy. It allows finer control over depth.

Jxy - Some good uses besides making ZX-Spectrum chords in chiptunes:

> J01 or J02 creates a "hard vibrato" (there's a name for such an effect in music theory, but I forgot it). Listen to "You, my smile" by Mellow-D for a good example of this effect.

> JC0, J0C, JCC. Because these effects raise the note by an octave, they don't create a "chord", but rather add some pattern to sound. The effect depends very much on the sample you're using. As a rule, simpler samples sound better.

> Jxy on precussion. Try it on snares. Jxy works best when your tempo is a multiple of 3. Consider the following example (tempo is set to 2):

      C-4 01 .. J0F  ... .. .. A02
      ... .. .. J00  ... .. .. ...
      ... .. .. J00  ... .. .. ...
      ... .. .. J00  ... .. .. ... 

Each J00 will restart command, and thus it will have no effect on note.

Oxy - It works only if you start the note in the same row.

Pxy - Panning in IT is a 6 bit value (well, actually range 0 .. 64 doesn't fit in six bits by one value, but who cares). Pxy affects this actual panning, and not whatever you're setting with Xxx command.

S91 - This counts as panning value. Any change of panning will reset this, that includes S8x and Xxx mentioned in it.txt and also volume column panning and default panning of instrument or sample (but not panning envelope). Because you can't have surround as default instrument panning, you have to either use S91 on every note or disable default pannings.

Qxy - It won't re-trigger a sample that has already ended. If you want to do that (usually that means you're tracking a chiptune), you can loop the last two bytes of sample, but be sure they're both equal to 0, or the sample will beep at the end and click on note cuts.

S77 - Stops volume envelope and ...

S78 - ... continues volume envelope. You can use these effects on one note multiple times, "pausing" volume envelope and then letting it go on again (look at the envelope in the instrument editor while using these effects to see what happens). The same goes for other envelope controls.

SBx - Each channel has its own loopback information. Which means that you can nest several loopbacks:

      C-4 01 .. ...  ... .. .. SB0
      D-4 01 .. SB0  ... .. .. ...
      E-4 01 .. SB1  ... .. .. ...
      F-4 01 .. ...  ... .. .. SB2

This will play C D E D E F three times. However, if more than one SBx command is used in one row (where x is not 0), only the rightmost one will be executed, all others will be ignored (just like with Cxx or Bxx).

SDx - IT won't play anything if x is greater than or equal to tempo, i.e. it will not delay into the next row.

Slides.

Some of the most used effects in trackers are different slides. In IT there are commands for volume slide, pitch, panning, channel volume, global volume and tempo slide. Most of them are available in FT2 too. Here below I'm using IT notation. FT2/Protracker veterans should get an IT - FT2 dictionary.

Fading volume.

C-4 01 03 ...                    1.0986...
... .. 03 ...
... .. 02 ...                    0.6931...
... .. 02 ...
... .. 01 ...                    0
... .. 01 ...
... .. 00 ...                    --------
^^^ .. .. ...                    ln(vol) 

A typical fade-out of volume column. Everyone has used something like this. It's also somehow wrong. The main reason is that while volume is decreasing linearly, the loudness (measure of how strong a human perceives the sound) is not. For constant frequency, loudness is proportional to the logarithm of the volume. And, as you can see above, ln(vol) behaves in non-linear fashion.

The best way to hear what I'm talking about here is to listen to a song that fades out using global volume slide down. The first quarter or so volume change is almost unnoticeable, while in the last few rows the sound seems to fade very quickly.

  N       ln(N)       ln(N+1) - ln(N)

 128      4.852...
 127      4.844...    0.008
 126      4.836...    0.008
 125      4.828...    0.008
  -   -   -   -   -   -
 11       2.397...    0.087
 10       2.302...    0.095
 9        2.197...    0.105
 8        2.079...    0.117
 7        1.945...    0.133
 6        1.791...    0.154
 5        1.609...    0.182

Look. While the step of slide is small compared to value of N, loudness also decreases linearly. But when the step becomes comparable to N, ln(N) is non-linear, and if N is global volume you get an abrupt ending.

Ways to go.

Volumes must decrease exponentially, i.e. instead of subtracting a constant value, you have to divide by a constant. The most straightforward way is to use a pocket calculator: 0.92 X 64 = = = = = .... Where 0.92 is 1 / my_constant. This will give you a nice sounding exponential fade. It's also a hell of work.

So we interpolate.

Look again at the table above. While step is small, linear slide works fine. So we calculate just a few points, and then use Alt+K (that's for ST3 and IT, FT2 users have the more powerful Alt+V key).

C-4 01 64 ...\
... .. .. ... Alt+K
... .. 32 .../  \
... .. .. ...    Alt+K
... .. 16 ...   /  \
... .. .. ...       Alt+K
... .. 08 ...      / \
... .. .. ...         Alt+K
... .. 04 ...        /

And we get still nice sounding fade, which is almost as fast to do as simple linear.

Another place where this matters is volume envelopes. When making envelopes, say, for strings, most people just leave one long segment that goes from roof to zero, and put sustain before it. In this case note-off quits the sustain loop and note fades. But with linear envelope it sounds bad, or at least, worse than with exponential.

And exponential envelope is easy to make. You just put the power of two values at constant intervals - the tracker will interpolate them for you. After that you can insert additional points to make it look nicer or to add some echo or what not.

The best is an enemy of good.

Don't overdo. If you have 40 channels active, and you want to fade out one background channel, use simple linear slide. Nobody will hear the difference anyway.

Pitch slides.

Hail to Triton productions! ...

I'm talking about linear frequency tables. All that mooh-mooh about volume and loudness works with frequency too. Halftones make a geometrical progression with quotient 2^(1/12). That means that if you change freq. by constant number of Hz, you'll have different intervals for different base notes. And because the human ear is much more sensitive to pitch that to volume, there'll be a huge problem to use pitch slides in a musical way with an "Amiga" table.

But with a linear table, you'll have the same intervals for all starting notes! On IT, one halftone is divided into 64 steps. Non extra fine slides go 4 steps at once, extra fine go 1 step. Thus

C-4 01 20 EF4
... .. .. E00
... .. .. E00
... .. .. E00

will sound like B-3 after the fourth row.

So?

The ability to calculate the exact results of pitch slides is often useful. Say, you want to add slides to a fast (jazzy) solo (I assume the tempo is 5):

C-4 01 10 ...               C-4 01 10 ...
D-4 01 08 ...     -\        C#4 01 08 F04   <- this slides from C#4 to D-4,
C-4 01 12 ...     -/        C-4 01 12 ...      but only if the tempo is 5:
D#4 01 10 ...               D#4 01 10 ...           (5-1) * 4 = 16

Another case. You're a theory wizard and you want to make a tune using quarter tones:

C-4 01 .. ...
C-4 01 .. FF8     <- this is halfway between C-4 and C#4
C#4 01 .. ...
C#4 01 .. FF8
D-4 01 .. ...
 -   -   -

Volume resolution.

Look again at that first example at the top of this text. Due to the small value of the volume, it changes only three times. We can't use volume like 2.5 or 1.5. That's because since mother Amiga gave us trackers, volumes are expressed as 6 bit numbers. Tradition. Now we all scream about how 8 bit samples suck and 16 bit rule and so on - volumes still are 6 bit (ok, the global volume of song and instruments in IT is 7 bit). If we try to use small volume values, we introduce horrible round-off errors. There are several easy measures to take against this.

Global volumes.

There's such a thing as the global volume of a sample and the global volume of an instrument (in IT, at least). If you see that you never play a particular instrument louder than, say, 32, it's a good idea to halve its global volume and double the volumes used in patterns (this also includes the default volume). This way you'll get 1 extra bit of resolution. Also, it's easier to track when all instruments have 64 as their maximum "allowed" pattern volume.

Channel volumes.

Are Power. I'm surprised how little they're used by trackers. By properly using channel volumes you can create complex crossfades, reuse the same channels without re-working volumes ...

A little comment here. If you're using volume effects, you usually can't just scale all volumes in the channel to change its volume - it will sound different, sometimes very different. Consider this:

 C-4 01 16 D04
 ... .. .. ...  <- if tempo is 5, volume will be 0 at this row - no sound. 

Now you increase all volumes 4 times:

 C-4 01 64 D04
 ... .. .. ... <- now volume is 48. 

It's as far from 0 as the moon from Moscow. And you can't increase the slide argument 4 times as well, because then it'll exceed 0F.

Generally, channel volumes make tracking easier. Here's the slide from the top of the text, using channel volumes (it'll sound about the same, only smoother):

C-4 01 48 M04
... .. 40 ...
... .. 32 ...
... .. 24 ...
... .. 16 ...
... .. 08 ...
... .. 00 ...
^^^ .. .. M40 <-restore volume. If you're a C programmer, consider this a '}'

Pan slides.

A special effect. Use it with care, but use it. It sometimes beats the hell out of panning envelopes. Especially in IT, where you don't have an envelope offset command. (FT2 people, listen! Use the envelope offset command! Use the glissando control command! IT doesn't have them, and they're mighty powerful when used properly.)

Complex effects

Sometimes you want more than just a vibrato. Of course, a tracker doesn't have reverb for example, so usually if you want to add such effects to a track you end up saving separate channels to files, processing them in a sound editor, then mixing them together (either by loading them back into the tracker as - huge - samples, or using the same sound editor). It's a lot of work, and although it allows you to achieve a better quality than by "pure" tracking, it takes time, practice and software not everyone has. But if you want "professional" quality, this is your way to go.

There's a lot of interesting effects, however, that can be done in a tracker without external processing, using only tracker commands and sometimes a clever choice of samples.

"Echo" channels are one of the most well used tricks. In fact, it's hard to find a mod that doesn't have echo channels. Usually it looks something like:

C-4 01 64 ...  ... .. .. ...
... .. .. ...  ... .. .. ...
D#4 01 60 ...  C-4 01 20 ...
... .. .. ...  ... .. .. ...
... .. .. ...  D#4 01 18 ... 

I.e. you just copy one channel, shift it down few rows and then decrease it's volume by a half or more. A few comments about how to do it better:

> Use channel volumes whenever possible instead of scaling volumes down. The example above should look like:

    C-4 01 64 ...  ... .. .. M14
    ... .. .. ...  ... .. .. ...
    D#4 01 60 ...  C-4 01 64 ...
    ... .. .. ...  ... .. .. ...
    ... .. .. ...  D#4 01 60 ... 

> If echo spans more than one pattern, then don't be lazy and put the last few rows that were lost shifting the channel down at the beginning of the next channel. It's usually not noticeable (if you're not listening for it), but the overall impression is "smoother", and if you have a really complex solo then losing a few lines might create problems.

> Edit the echo channel a little. Changing the sample to the flanged or filtered version of the main one really works well. Also, change the volume of the echo channel or just a few notes, to put accents.

Another widely used effect is flange/chorus. It's done similarly to echo - you copy the channel and add a fine pitch slide (for flange) or vibrato (for chorus):

C-4 01 44 ...  C-4 01 44 FE8

Flange works well on percussion - snares, cymbals, other noisy samples. A slight (quiet) flange and chorus also works with lead samples. There are a few things to note:

> If both channels have different pan positions, it will create surround effects (especially with slow flanger), because at some points the phase of the channels becomes the opposite. You can expect sound coming out the rear channel on surround systems.

> You can get flange effects every time frequencies of two playing notes differ by a very small value (if this value becomes larger you get a strong dissonant sound). Even if notes are played by different samples. So sometimes you can detune samples on purpose, to create such effects. It especially applies to small, chip sounds.

> You can also flange with previous notes if you use NNAs. This can be useful if you use chip sounds (like sine waves). Playing same notes twice sometimes silences both, because they happen to sound with almost opposite phases. You can then apply vibrato or pitch slide to one of them to avoid the drop in volume.

Sample attack

Many samples have a long attack time, during which their volume rises from zero to the maximum. String samples are a good example. There is one problem with such samples - when you play them simultaneously with samples that have very short attack times, they will seem to start later than other samples. It's because you'll start to hear them only when their volume has reached some level. To work around this, you can either:

> reduce the attack time. The simplest way is to use the sample offset command. It will, however, sound "sudden", and sometimes can be worse than a late start of the note.

> or you can raise the note by a few ticks. You'll have to experiment to find the best offset for each note (higher notes will have shorter attack times). It'll look something like this:

    ... .. .. ...  C-4 01 40 SD4
    C-6 10 60 ...  ... .. .. ...
    ... .. .. ...  ... .. .. ...
    ... .. .. ...  ... .. .. ...
    ... .. .. ...  D-4 01 40 SD4
    C-6 10 60 ...  ... .. .. ... 

(There the tempo is higher than 4, or the notes won't play at all).

There can be another reason why you'd want to raise notes. Strings usually have a long release in volume envelopes, and even if the attack time of the sample isn't too long, the new note will seem to start later because the previous note will be louder than the new one for some time.

Bye, everybody, and good tracking.

JKL (juris@mt.lv)