Skip to contents

The ProTrackR package can import and export module files from the music tracker ProTracker from the Commodore Amiga machine. This package can also render and play module files. Furthermore, the package provides the means to manipulate and analyse the modules.

Details

ProTracker is a popular music tracker to sequence music on a Commodore Amiga machine. This package offers the opportunity to import, export, manipulate an play ProTracker module files. Even though the file format could be considered archaic, it still remains popular to this date. This package intends to contribute to this popularity and therewith keeping the legacy of ProTracker and the Commodore Amiga alive.

Some experience with ProTracker (or any other music tracker) will promote the ease of use of this package. However, the provided documentation and exernal links should help you, when you're starting from scratch. A good place to start reading this manual would be the documentation of the PTModule, which describes the structure of a ProTracker module and how it is implemented in this package. You should also have a look at the documentation of the PTPattern, PTTrack, PTCell and PTSample classes, which are all elements of the PTModule.

Current issues and future developments

For the development state of this package, please check the README section on GitHub.

Currently, not all effect commands are implemented, although most common ones are. I will work on implementing the remaining effect commands (see also section below). ProTracker also has specific interpretations that are currently not all implemented correctly.

Sample switching (that is when a module switches from one sample number to another, without specifying a new note) is also something that is implemented differently by varying module players. This package currently does not implement such switches conform ProTracker specs.

Period values, which dictate at which fequency samples should be played, are censored both by Amiga hardware and software coded limits in the original ProTracker. Documentation on these limits are ambiguous. I've made a first attempt to implement these bounds in the current version of the package after consulting with Olav Sørensen (who created a ProTracker clone for modern machines: https://16-bits.org/pt.php). I'm really grateful for his input and doing some checks on an actual Amiga.

I also realise that the documentation of this package may be a bit cryptic at some points. I would like to improve it where I can, but for that I need a fresh perspective from the users. So please feel free to provide constructive feedback such that I can improve the quality of this package.

ProTracker Effect Commands

As explained before, effect commands are composed of a three hexadecimal digits. The first digit indicates the type of effect, trigger or jump that should be applied, the latter two digits indicate the magnitude of the effect. An exception are commands starting with the digit 'E', for which the first two digits specify the type of effect and only the last digit represents the magnitude. Below all available effect commands (or codes if you will) are listed with the magnitudes labelled 'x' or 'xy'. The overview shows which commands are used for which kind of effect and whether it is implemented (between brackets) in the playing routines of this package.

But first a few words on speed and tempo in ProTracker. Both are two sides of the same coin, both affect the overall speed with which patterns are played. Speed is defined as the number of 'ticks' per pattern row and tempo sets the duration of each tick. So by increasing the speed value, or decreasing the tempo, the overall playing speed of the pattern table is reduced. At the default tempo of 125, the duration of a tick equals the vertical blank period of the monitor (1/50 seconds for PAL and 1/60 seconds NTSC video systems). They can be set with the Fxy command.

On the Commodore Amiga the chip responsible for audio output (Paula), the audio playback of samples can be controlled by the user in two ways: the playback rate of the sample can be changed by specifying 'period' values (see e.g. periodToSampleRate) and specifying a volume which is linearly scaled between 0 (silent) and 64 (maximum). Period and volumes can only be changed at the start of each tick. This is why the effects will be affected by the speed setting, but not the tempo.

And now, without further ado, the overview of effect commands:

CodeEffectDescriptionStatus
0xyArpeggioThis effect alternates the pitch each tick to simulate a chord. xy needs to be greater then 00. First the specified note is played, then the pitch is increased with x semitones, then with y semitones.Partly implemented
1xyPorta upDecrease the period value with xy every tick but the first.Implemented
2xyPorta downIncrease the period value with xy every tick but the first.Implemented
3xyPorta to noteChange the period value with xy every tick but the first, untill the specified target note is reached.Implemented
4xyVibratoOscillate the pitch with magnitude x. Where y relates to the oscillation frequency.Implemented
5xyPorta to note + Volume slideA combination of effects 3xy and Axy.Implemented
6xyVibrato + Volume slideA combination of effects 4xy and Axy.Implemented
7xyTremoloOscillate the volume with magnitude x. Where y relates to the oscillation frequency.Implemented
8xyNot implementedThis effect command is not implemented in ProTracker, nor will it be in this package.Not implemented
9xySet sample offsetThis effect causes the note to start playing at an offset (of 256 times xy samples) into the sample, instead of just from the start.Implemented
AxyVolume slideChange the volume every but the first tick: increase with x, decrease with y.Implemented
BxyPosition jumpJump to position xy of the patternOrder table.Implemented
CxySet volumeSet the volume with xy.Implemented
DxyPattern breakBreak to row xy in the next pattern. Note: xy is (even though it is a hexadecimal) interpreted as a decimal.Implemented
E0xTurn filter on/offIf x is even, the (emulated) hardware filter is turned on (for all tracks). It is turned off if x is odd.Implemented
E1xPorta up (fine)The period value is decreased with x, at the first tick.Implemented
E2xPorta down (fine)The period value is increased with x, at the first tick.Implemented
E3xGlissando ControlThis effect causes a change in the effect 3xy (porta to note). It toggles whether to do a smooth slide or whether to slide in jumps of semitones. When x is 0 it uses a smooth slide, non-zero values will result in jumps.Not yet implemented
E4xVibrato WaveformThis effect sets the waveform for the vibrato command to follow. With x modulo 4 equals 0, a sine wave is used, with 1 ramp down, with 2 or 3 a square wave. Values greater than 4 causes the ossicating waveform not to retrigger it when a new note is played.Implemented
E5xSet finetuneSet the finetune with x, where x is interpreted as a signed nybble.Partly implemented
E6xPattern loopSet pattern loop start with E60, and loop x times when x is non-zero.Implemented
E7xTremolo waveformSame as E4x, but this controls the wave form for the tremolo effect (7xy) rather then the vibrato effect.Implemented
E8xNot implementedAccording to official documentation this command is not implemented in ProTracker, but it is. Applies a filter on a looped sample, therewith destroying the original sample data.Not implemented
E9xRetrigger noteRetrigger the note every x-th tick.Implemented
EAxVolume slide up (fine)Increase the volume with x at the first tick.Implemented
EBxVolume slide down (fine)Decrease the volume with x at the first tick.Implemented
ECxCut noteCut the volume of the note to zero after x ticks.Implemented
EDxDelay noteThe note is triggered with a delay of x ticks.Implemented
EExPattern delayThe duration of the row in ticks is multiplied by (x + 1).Implemented
EFxNot implementedAccording to official documentation this command is not implemented in ProTracker, but it is. It flips sample data in a looped sample, therewith destroying the original sample data.Not implemented
FxySet speed or tempoWhen xy is smaller then 32, it sets the speed in ticks per row. When xy is greater then 31, it will set the tempo, wich is inversely related to the duration of each tick. Speed and tempo can be defined in combination.Implemented

Test cases

The interpretation of the effect commands can be tedious. They often vary between module players. Even ProTracker can have a quirky (and unexpected) ways of handling the effect commands. This package aims at staying as close to ProTracker 'standards' as possible.

The current version already implements most effect commands and common quirks when it comes to their interpretation. My subjective estimate is that it will correctly play roughly 95% of the ProTracker modules on ModArchive. Some Less common unexpected behaviour is documented by the team behind OpenMPT, for which they developed several test cases. The table below shows which test cases this package passes and which it does not.

Test moduleStatus
AmigaLimitsFinetune.modFail
ArpWraparound.modFail
DelayBreak.modPass
finetune.modFail
PatLoop-Break.modPass
PatternJump.modPass
PortaSmpChange.modFail
PortaTarget.modPass
PTInstrSwap.modFail
ptoffset.modPass
PTSwapEmpty.modFail
VibratoReset.modPass

References

Some basic information on ProTracker: https://en.wikipedia.org/wiki/Protracker

Some basic information on music trackers in general: https://en.wikipedia.org/wiki/Music_tracker

A tutorial on ProTracker on YouTube: https://www.youtube.com/playlist?list=PLVoRT-Mqwas9gvmCRtOusCQSKNQNf6lTc

Some informal but extensive technical documentation on ProTracker: ftp://ftp.modland.com/pub/documents/format_documentation/Protracker%20effects%20(FireLight)%20(.mod).txt

Author

Maintainer: Pepijn de Vries pepijn.devries@outlook.com (ORCID) [data contributor]