Chat with our musicians on our Discord Server: https://discord.gg/JnBmRed

IndieGameMusic.com

How to create "modern" effects in oldskool tracker modules

All the many modern DAWs available nowadays comes with a lot of built-in effects we can use: Echo, reverb, phaser, lowpass filter, highpass filter etc. All with "automatisation" options too, which allows you to change the levels of the effect dynamically. Fancy stuff!

But for some of us, the oldskool way of tracking just remains the most appealing and intriguing option. Producing oldskool formats like MOD, XM, S3M and IT that can be used on older retro platforms, instead of creating the bigger sized streamed formats that can only be used on more modern platforms.

But these old formats generally doesn't offer such fancy effects, so what do we do there? Simple: You simulate the effects.

In this article I will describe how you can achieve the following cool effects in these old formats - even in the 8-bit 4-channel MOD format:

  1. Echo
  2. Reverb
  3. Phaser
  4. Surround sound
  5. Lowpass filter
  6. Highpass filter
  7. Bitcrunch
  8. 14-bit quality in an 8-bit MOD

There are of course many other kinds of effects you can create with the old formats, such as Timestretch (using 9xx). But this article is not about the available built-in effects-commands. This article is about how to achieve other effects that isn't officially supported by the format(s) with effect-commands, but rather effects you can achieve mostly by playing two samples at the same time.

Now, obviously you can always achieve most of these effects simply by merging the effect into the sample itself: Load the sample into Audacity and apply the effect. Then replace the boring-effectless-sample with this new sample-with-awesome-effect in your track.
And I'm not saying that's a wrong way to do it in some cases. I use this approach myself sometimes, depending on the effect and the track.
But merging the effect(s) into the sample will give a rather static result - always the same amount of the effect. And that's not an optimal solution in my humble opinion.

In this little guide, we'll focus is on how to achieve a more flexible version of these effects, where you can adjust the levels dynamically in your track, thus ending up with much more variation of the effect.

1. Echo

The most simple of them all. Everyone (should) already know about this one. It is no doubt the most used effect on the list, and no one would ever think about merging this effect into the sample. I'm just including it here to make it a complete list.

To add an echo to a channel, simply copy the channel of the pattern to another channel - insert a few empty rows at the top for the delay, and reduce the volume of all notes. That's all there is too it. And you can do this multiple times, thus using multiple channels to produce a bigger echo effect.

You can also add some panning on the echo-channel(s) (if supported by the format), to enhance the echo-effect further.

So the dynamics of this effect can be controlled by the volume and panning of the echo channels, and of course how many channels you want to use.

You can hear an example of such an echo effect in my track Happy Sunrise. I use channel 4 to apply an echo of the lead square synth in channel 3.

2. Reverb

To create a dynamic reverb, we first need to produce a sample of a reverb.

Load your sample into Audacity, and apply some heavy reverb effect. If the effect is strong enough, the actual instrument will be almost gone, and only reverb will be left - which is what we're going for here.

Normalise and apply Compressor a few times to boost the reverb. Then create/find some good loop points, so the reverb continues forever.

This way you'll have a reverb sample to go with your actual instrument. We're not merging the reverb effect with the sample in this approach. We're merely producing a separate reverb sample to use. One that is really loud, and thus needs to be played in a different channel at a low volume.

What's the difference in the actual result, you ask? Well there are two advantages with this approach:
First, you can now adjust the level of reverb you want, in the actual track using volume commands, rather than in the sample. This can thus be dynamic through out the whole track.
Second, because the reverb sample is normalised and compressed, and thus played at a very low volume, it'll practically be noiseless in an 8-bit MOD. Had we instead merged a low reverb effect into the sample, it would have been rather noisy in an 8-bit MOD.

The dynamics of this effect is thus controlled by the volume of the reverb sample, and how many channels you use. An instrument that only uses 1 channel, could easily use 3 additional channels for the reverb sample.

You can hear an example of such a dynamic reverb effect in my track "Infected Perspective". Notice, despite being only an 8-bit MOD that the noise on the reverb isn't much noticable.

In an alternative approach to a dynamic reverb effect, we can merge the two samples together: Merge the instrument sample with the compressed and normalized reverb sample. This approach is mostly useful for short instruments though, and the idea is that you fade the volume of the sample to reduce reverb. The more reverb you want, the less you fade the sample.
The advantage with this approach is that you only have to use a single channel.

3. Phaser

A phaser effect is achieved by playing the same sound in 2 channels slightly out of phase.

In case of a looped synth/chip sample, a phaser effect can be achieved by copying the instrument to another instrument, and adding a finetune on one of them. Playing both samples at the same time will then create a looping phaser effect. And because we used finetuning on the instrument, we have the effect column completely free for other effects.

Alternatively, you can use the same sample in both channels, using finetuning effect command on one of them. For a MOD you can use commands E1x and E2x. For an XM there's Xxy available for even finer tuning. You can also get some funky effects with 4xy. Any command that controls vibrato and portamento makes the dynamics of this effect.

4. Surround sound

You can turn the phaser effect into a surround sound'ish effect simply by panning each channel to each speaker.

5. Lowpass filter

Low- and highpass filters are essentially the removal of high or low frequencies.
To create a dynamic lowpass filter on a certain sample, first load the sample in Audacity and apply a highpass filter. (Yes, you read that right - apply the opposite filter of what you want in your track).

Then invert the sample (also known as boosting the volume minus 100%).

Now load this highpassed inverted version of your sample into your tracker, and play it with the original sample at the same time. Make sure they're both panned the same.

You will now only hear the low frequencies of the sound, because you're playing the inverted high frequencies of the same sound at the same time with the same panning, effectively removing the high frequencies, thus resulting in a lowpass filter. Setting volume on the inverted high frequency sample will determine how much of the high frequencies to filter away. Full volume = All high frequencies removed. Low volume = Very little high frequencies removed.

Creating a lowpass filter this way will give you

  • One normal sample
  • One highpassed sample
  • Dynamic lowpass result

That's 64 levels of lowpass + 1 level of highpass.

You can hear an example of a lowpass filter done this way, in my track "Unshackled". It starts off by substracting the high frequencies of the synth, then slowly fades out that substraction.

This approach requires 100% precise timing of the player though. (Read more about that later). For an alternative way of achieving a lowpass filter, you can simply create the lowpass sample in Audacity, and play that together with the normal sample, slowly decreasing volume of one while increasing volume of the other. That approach won't require precise timing, but you'll miss the highpassed sample as the other approach will give you.

6. Highpass filter

To create a highpass filter is done the exact same way as the lowpass filter, except of course you select the lowpass filter in Audacity instead of the highpass filter.

Any equaliser effect you want to dynamically filter out can be achieved this way.

You can hear an example of a highpass filter done this way, in my track "Back to Basics". It starts off the same way as Unshackled, only with the low frequencies substracted less and less.

7. Bitcrunch

A bitcrunch effect can be achieved much the same way as the low- and highpass filters are done. Simply run your sample through a filter that cuts off the upper or lower bits, depending on what effect you want. Then invert the sample, and play both at the same time. Again you have the dynamics available by adjusting volume of the effect-sample.
For example, you could split an 8-bit sample into two 4-bit samples, producing a rather rough noisy sound, that you can slowly fade away and back using the volume.
outbytelow = (inbyte & 0x0f);
outbytehigh = (inbyte >> 4);

8. 14-bit quality in an 8-bit MOD

The same way you can play two 4-bit samples in an 8-bit environment to produce 8-bit sound with the bitcrunch effect, you can also play two 8-bit samples in a 16-bit environment to produce 16-bit sound. This may not sound a whole lot interesting at first. Why split up a 16-bit sound into two 8-bit samples like that? Because: This technique also works on certain older platforms, such as the Amiga, where you officially only have 8 bits available, but technically can achieve 14-bit quality. I will skip the technical explanation, and just say that you can - by splitting a 16-bit sample into an 8-bit part and a 6-bit part - actually get 14-bit'ish quality on Amiga. (The "ish" part means "Definitely much better than 8-bit, but probably not quite true 14-bit"). And who wouldn't love that bass to be less noisy?

A 16-bit sample consists of sets of 2 bytes. Shift the first byte of each set 2 bits to the right, and save all these bytes as "6bit.raw". Save the other byte as "8bit.raw".
Play the 8-bit sample at full volume, and the 6-bit sample at volume 1.
outbyte6bit = (inbyte1 >> 2)
outbyte8bit = inbyte2

You can hear an example of an 8-bit MOD with 14-bit quality in my track "Happy Sunrise", and also in "Sneaky Chick". (Try turning on/off channel 3 in "Sneaky Chick" to hear the difference).

A note about low/highpass filter, bitcrunch and 14-bit

Low- and highpass filters, as well as bitcrunch and the 14-bit trick all require precise timing in order to work, because the two samples has to play 100% synchronised.

This is not a problem for the XM, S3M and IT format, since all trackers and playerlibs for those formats has such a precise timing.

But trackers and playerlibs for MOD files sadly aren't consistent when it comes to precise timing. In other words, these tricks won't work with all trackers and playerlibs for the MOD format. So if you insist that your MODs must play correctly everywhere, you should avoid using these tricks.

But if you only need your MODs to play correctly in the productions where they're actually used, go ahead and use these tricks all you want. Just make sure the playerlib that the gamedev is using, handles the MOD(s) correctly. This can be done simply by listening to the track(s) when played in the game.

If you use any of these effects; playing two samples at the same time that requires precise timing, there's a tag you can attach to the track called "Precise timing required".

I've had gamedevelopers help me test playback of MODs using these tricks on various platforms, and so far it seems that the only platform that has issues is the Amiga, and only with Protracker 3.61 (and I assume 3.15 too).
Protracker 2.3d handles them fine. Same with Hippoplayer and Delitracker. EaglePlayer only handles the tricks for the right speaker though. The built-in playerlib in AMOS also supports them fine, tested on A500 and A1200.

So I'm seeing a lot more players that support these tricks, than players that don't. I will keep a list of supported players in the tag descriptions.