::|CONTENTS
- Introduction
- For beginners
- Voice Editor
- Pattern Editor
- Track Editor
- Special
- Data saving and loading
- Utilizing the samples
- SAP export
Introduction
translated from an article on atariki.krap.pl
Music ProTracker (MPT) is a music making tool written by SoTe. It was supposed to be released by Mirage Software, but ultimately that didn't happen. It has had many iterations (since 1994), with the most popular being version 2.4. There are many hacks of that one, the most used being 2.4s (s stands for stereo). MPT has risen in the ranks of Polish Atari scene, dethronizing Chaos Music Composer. Its key features were an ability for using digitized samples (compared to tools of the time using them was easy) and a very versatile player for playing songs in self-made prods.
The following is a translation of the original MPT 2.4 manual that came on the program's disk. It covers basics of tracking, and also some of POKEY's internal workings. Translated by Zlew
For beginners
In order to be able to correctly use MPT it's recommended to learn the rules of making sounds in an ATARI. This introduction will allow You to get accustomed with sound capabilities of ATARI XL/XE, and also will make it easier to understand many functions of the program. For starters you should know, that making sounds in the "small" ATARI is the job of a specialized integrated circuit called POKEY. This circuit hass four programmable sound generators (or PSGs for short). Each generator has special clocks assigned to them that generate a square wave that "goes through" a group of registers shifting the sound's tone. Each generator has two registers controlling its work.
They are placed in the memory at addresses:
AUDF0 (53760 = $D200)
AUDC0 (53761 = $D201)
AUDF1 153762 = $D202)
AUDC1 (53763 = $D203)
AUDF2 (53764 = $D204)
AUDC2 (53765 = $D205)
AUDF3 (53766 = $D206)
AUDC3 (53767 = $D207)
and
AUDCTL (53768 = $D208), which controls all the generators.
Registers AUDF0-3 set the frequencies of generated signals from generators 0-3 accordingly. Values 0-255 are written to them - they correspond to frequencies according to the equation:
F
f = -------
2*(N+A)
where:
f - output frequency
F - POKEY clock frequency (1773447Hz in Europe)
N - value written to registers AUDF0-3
A - constant equal to 1 for a single register and 7 for a pair (more on that later)
You won't be needing this equation too much in MPT though, because it uses four designated tables which it uses to write values to generators. (See: Special)
Registers AUDC0-3 control the shifting registers and sound's volume. Each control register gets a value 0-255, where they are divided into three parts bit-wise. Bits 0-3 control the volume (4 bits = values 0 to 15, or $0 to $F). If bit 4 is set to 1, it disables the shifting register and generator's clock, which results in a constant voltage impulse of value set by volume bits (used only when playing digi samples). Bits 5-7 control the shifting register, distorting the signal outputted by the clock:
AUDCx shifting
value register
0 5+17
2 5 (sic)
6 5
8 17
a off
c 4
e off
(Because those values are written to AUDC0-3 as the byte's second half, they have been displayed as how they're used in MPT)
As you can see, distortion values 2 and 6 enable shift register 5, outputting the same sound as a result.
Value 8 distorts the sound in a way, that noise is outputted.
Last important register is AUDCTL, controlling all the generators.
Bit 0 - clocks are working on a so-called "base clock" which is 63337Hz by default. Setting this bit results in changing this clock to 15834Hz, which effectively lowers all the sounds by 2 octaves.
Bit 1 - Setting this bit will turn on a filter on channel 1 controlled by generator 3. That means that harmonics of channel 1 will be passed only if they're higher than channel 3's harmonics. It results in very interesting effects lately popular among "Atari musicians".
Bit 2 - Enables filter on channel 0 controlled by channel 2
Bit 3 - Channels 2 and 3 are joined together into a 16-bit pair allowing for more precise frequency control. But now, as with enabling filters, the amount of sound channels is reduced by 1.
Bit 4 - Joins together channels 0 and 1. This bit is controlled by MPT, and setting it to 1 will cause it to use a special frequency table containing 16-bit values.
Bit 5 - Changes channel 2's base clock from 63337Hz to 1773447Hz
Bit 6 - Changes channel 0's base clock
Bit 7 - Setting this changing all the shift registers 17 to 9
Enough of theory. For a more exhausting description I recommend having a lecture of professional ATARI literature.
Despite having such detailed description, you have to keep in mind that no description will replace experimenting with the ATARI sound, and satisfaction from results only proves that.
The fun however requires the ability to use "bit level" values.
If you don't know what value should result after adding up bits, you can use this method:
Grab a piece of paper and number the grid from 7 to 0
|7|6|5|4|3|2|1|0|
*-*-*-*-*-*-*-*-*
| | | | | | | | |
then write 0 and 1 into respective grid slots, for example:
|7|6|5|4|3|2|1|0|
*-*-*-*-*-*-*-*-*
|1|1|0|1|0|0|1|0|
now divide this "table" into two even parts 7-4 and 3-0 and use this lookup table to read the value:
0000 - 0 1000 - 8
0001 - 1 1001 - 9
0010 - 2 1010 - a
0011 - 3 1011 - b
0100 - 4 1100 - c
0101 - 5 1101 - d
0110 - 6 1110 - e
0111 - 7 1111 - f
The example should result in a "d2", and that's a "hexadecimal" value.
Voice Editor
Voices are MPT's most advanced part. Advanced doesn't necessarily have to mean complicated (as it might seem). Let's take a look at such an instrument.
[PS] [PA]
00 0-00
00 1-00
________________ 00 2-00
00 3-00
00 4-00
NA ♦ 0000000000000000 00 5-00
NP ♦ 0000000000000000 00 6-00
WZ ♦ 0000000000000000 00 7-00
PS - parameters conntrolling the instrument
PA - accent parameters
NA - accent numbers
NP - accent parameter numbers
WZ - distortion values
Right after firing up MPT we're in EV (voice editor). Two flashing digits are current instrument's number (max value is $1F). You can change that number with * and +, and with = and - you can change the octave (1:2, 2:3 etc), also Down and Left arrows will change the instrument's volume. Now you can proceed to the voice edit with Ctrl+E. Flashing should move downward, which means that we can continue our work.
First row (highlighted) consists of numbers of accents. There is 7 accents (0 means no accent):
1 - parameter written to AUDF
2 - parameter+AUDF written to AUDF
3 - parameter+note written to AUDF
4 - what's in 1 and no divider written to AUDF
5 - what's in 1 + 9-bit register written to AUDF
6 - what's in 1 + enabling 15kHz written to AUDF
7 - parameter + random value written to AUDF
notes:
4 - applies only to channels 0 and 2
5 - works only with distortions 0 and 8
6 - applies to all channels
ALL accents other than 4-6 write $00 to AUDCTL
Lowest row corresponds to the distortion, which is the left half of AUDC register, while its right half is the volume which is represented by bars above theh accents.
First column of values contains parameters controlling the instrument and is as important as accents.
Topmost value is the effect number (left half) and its parameter (right half). There's 8 effects (0 to 7) and they apply only to the instrument's frequency. But watch out - writing any accent will override the effect.
0 - light vibrato
1 - adding the parameter to AUDF
2 - pitch slide down (speed is set by parameter)
3 - FAST pitch slide down
4 - same as 2 but up
5 - same as 3 but up
6 - deep vibrato
7 - VERY deep vibrato
note:
Using effect numbers higher than 7 may prove unsafe for players used in games.
Each effect doesn't have to start right at the instrument's beginnnning, it may start after some time passes - such delay can be defined in next value's right half (placed below).
Because each instrument can use a different frequency table, we can type the table's number into that next value's left half.
MPT's stock tables are prepared for following sounds:
0 - $A
1 - $C
2 - $C
3 - $2 (with no divider)
Third value will control instrument's fadeout and is contained within $00-FF range, where $00 means no fadeout.
Fourth value will be written to AUDCTL and can be different for various channels, though it might have effect on their sound.
Last four values are periodically added to note's value. They might be used to transpose the instrument (four values are the same) or to create arpeggios ($00, $00, $03, $07) with the $A distortion.
Second column is used for parameters used with accents, but beware! Enabling filter (on channel 0 or 2) will share the 0 parameter with the filter. After enabling the filter you can enter different values there, which will influence the filter's tone (sic). If someone wants to use that value to control the accent, it is important to remember that each change will influence both the filter and the accent.
Since we've learned about the instrument's possibilities, we can now move onto editing. We're in the EV and we can move with + * - = keys throughout the entire voice.
Digits 0-9 and letters A-F will be used to make changes in the instrument. In order to hear the instrument we need to "model" its envelope, and it can be done with Ctrl+ - and = keys (up/down arrows in Altirra). If you don't like the instrument, you can press CLEAR (Home in Altirra) to clear the instrument, but if you wanted to revert it, or cleared it on accident, you can press INSERT (Shift+Insert in Altirra).
Let's give it a shot. Let our instrument have the distortion $C, and make its envelope fade out. Now we can add an accent, for example, accent 1 with parameter number 8. That should be enough. When we press Ctrl+P our keyboard will transform into a music keyboard. We can change the octaves with Ctrl+ - and = keys (arrow keys in Altirra). By pressing ESC we leave the mode - press once again and we're out of EV. Press TAB and we will be into the...
Pattern Editor
When we go into EP (pattern edit), our keyboard is automatically changed into a musical one, with an addition of SPACE, which will insert an empty note. CLEAR and INSERT keys keep their function - wiping and inserting a pattern. Keys + and * with CTRL (left/right arrow keys in Altirra) change the channel on which the instrument will be played. Moving up and down the pattern will be achieved with - and = keys, while + and * keys will be used to change which pattern are we editing. Next to the pattern's number there's a minus, which means that the pattern's empty. The moment we type something in, it will change to a plus.
The window below the pattern will serve two functions:
Transposition is available after pressing CTRL+T. This allows to transpose an instrument (first parameter is its number) by a number of semitones (specified in the second parameter).
...
$03 +3
$02 +2
$01 +1
$00 base note
$3F -1
$3E -2
$3D -3
...
Both parameters are inserted with - and = keys, and they're confirmed with the RETURN key.
CHANGE (CTRL+X) allows us to replace an instrument (first parameter) with another instrument (second parameter).
Swapping instruments can be achieved in another way - by pressing SHIFT+TAB we can replace the instrument in the current row by currently selected instrument.
Next to the instrument number there's initially a VF "effect", which means that the note will be played with $F volume. By pressing SHIFT+V and using 0-9 and A-F keys we can change its volume. There can be two another effects - Sx which lets us change the song's speed to x (called with Shift+S), and F0 (called with Shift+F), which breaks the pattern across all channels (similar to D00 in contemporary trackers).
Now let's try to write a small piece. Select pattern 01 - and let's agree on pattern 00 always being empty. We've got an instrument selected, so let's type in:
BTBTJ7J7WOWOWOWO
Now let's try out the speed effect by insterting a "S7" into 00. Then insert a "F0" into 0F, and to wrap it up, let's transpose the instrument 00 by 0C semitones.
After all those changes the pattern should look like this:
|00|G-2 00S7|
|01|G-3 00VF|
|02|G-2 00VF|
|03|G-3 00VF|
|04|A#2 00VF|
|05|A#3 00VF|
|06|A#2 00VF|
|07|A#3 00VF|
|08|D-3 00VF|
|09|D-4 00VF|
|0A|D-3 00VF|
|0B|D-4 00VF|
|0C|D-3 00VF|
|0D|D-4 00VF|
|0E|D-3 00VF|
|0F|D-4 00F0|
Of course we don't need to use a single instrument in a pattern - it can be changed with Shift+ + and * (left/right arrow keys in Altirra), and with Shift+ - and = (up/down in Altirra) we can change to instrument's octave - for example instead of transposing we could've write the pattern with 2:3 octaves from the start. Now we can listen to our pattern. After pressing CTRL+P the program will play the pattern back from the current row, and after pressing SHIFT+P it'll play back from the row 00. It can be interrupted with any key, but to avoid any accidents it's recommended to use the ESC key.
Sometimes the notes may be out of order and thus desyncing the tune. This can be remedied in a way with Shift+Ins and Shift+Del. Shift+Ins will insert an empty row while shifting all the rows below it down by one, and Shift+Del will delete the current row and shift all the rows below it up by one.
Now by pressing TAB we can move over to...
Track Editor
ET (track edit) is the least complicated element of MPT. First column is the song's position. Each channel has two columns. First is the number of the pattern played, and the second is the value of transposition (which is applied to whole pattern). Movement is achieved with +, *, - and = keys. There are two control codes, $FE and $FF. $FE will cause the song to stop (like Cxx in FamiTracker), while $FF will make the player jump to the pattern specified in the transpose column (akin to Bxx effect in contemporary trackers) - for example FF-10 will make the player jump to position $10. To ensure correct function, those should be inserted only on channel 0.
You can edit with:
Shift+Ins - insert an empty order and move everything below it down by one
Shift+Del - delete the current order and move everything below it up by one
Shift+1 thru 4 - toggle channel 0 through 3
In addition, you can use Ctrl+X to call the CHANGE function, which will swap two channels' patterns. Use like in the EP.
Now we have an instrument, a pattern $01, so let's get to "composing" a tune. First let's spread the orders a bit (achieved with Shift+INS), next fill up the 0 channel with these values: 01-00, 01-00, 01-F9, 01-F9, FF-00 and the screen should look something like this:
|00|01-00|00-00|00-00|00-00|
|01|01-00|00-00|00-00|00-00|
|02|01-F9|00-00|00-00|00-00|
|03|01-F9|00-00|00-00|00-00|
|04|FF-00|00-00|00-00|00-00|
|05|FF-FF|FF-FF|FF-FF|FF-FF|
Now we can listen to our masterpiece by pressing CTRL+P. Now the editor will wait for a key - if it's SPACE, then it'll play music with a graphic equalizer. Let it be another key and it'll play and highlight the current position in the track editor.
Special
To reach the SPECIAL menu, first you have to access the topmost menu with CTRL+TAB. Then use the + and * keys to move around the menu. Highlight the "SPECIAL" menu and press RETURN. The options available are:
Speed : $00
This is the global speed of the song. This value will be overriden by the Sx effect in a pattern.
FrTab.Edit
As we already know, each instrument can use one of four frequency tables. Each note has a number assigned - C-1 has 01, C#1 has 02, D-1 has 03 etc. Because POKEY doesn't use actual note names, we have to use a table in which each note has a certain POKEY value assigned to it. With + * - = keys we select a position corresponding to the note, and after pressing RETURN we type a value. Pressing RETURN saves the value, and pressing ESC brings back the old value. This option can be quitted with ESC.
Locat: $xxxx
Each song has a standard file-type header ($FF, $FF, start address, end address, data), so it can be loaded by all programs that allow it (DOS, loaders, etc.). With this option we decide where the song will be loaded. This option is useful for coders, and meaningless for musicians.
15kHz
You might know thhat MPT can play digitized instruments. There are two modes for that. First allows for one channel playback with e.g. percussion sounds. This channel can be played back at 8 or 15kHz. By pressing RETURN we can enable the 15kHz playback or disable it and use 8kHz playback instead.
Digi:
By pressing RETURN you can toggle between one channel (ONE) or two channel (TWO) digi playback, or disable it altogether (OFF).
Digi file
In order to play digi samples, you have to load them first.
After selecting this option, you will be taken to a sample list populated with samples (if present in memory) and an option list. You can use - and = keys to move in the sample list, and by pressing RETURN you can play the selected sample. Options can be called by pressing their respective keys.
Load one
Load a file in one of two formats:
0 (first sample is byte's latter half)
$FFFF
Start (two bytes)
End (two bytes)
Data
1 -
$FEFE
Start (two bytes)
End (two bytes)
Data
Sample format is 4-bit unsigned PCM at 8000Hz. Loading an incorrectly prepared file will result in CIO error 180 (inforrect filetype).
Save all
Dumps all the samples from memory onto the drive.
Load all
Loads all the dumped samples from the drive into memory. If no samples were dumped, garbage data will be loaded instead.
Delete
Deletes the topmost sample.
LenPat $xx
Sets the default pattern length. Can be modiefied with - and = keys.
Data saving and loading
In order to not lose the music after turning off the computer, we have to somehow save it. For that we will use available external devices, that is a tape deck and a disk drive. From any editor we can move to MPT's main menu by pressing CTRL+TAB. We can navigate there with + and * keys.
After choosing the FILE option, press RETURN to call it. As with other options, a submenu will pop up. Inside the FILE menu, we choose the options with labeled keys. We need the SAVE option, and that can be called with the S key.
Word of explanation here - MPT can recognize from what device was it booted and prepares for transmission with that device. If you used a tape deck, after selecting SAVE (or LOAD), you will hear a standard save/load sound. But if you own a disk drive, MPT will ask you about the filename first. If the name contains a *, you will be given a listing of files fitting the mask. After selecting one of them (with - and = keys) press RETURN to confirm the name. After saving our work we can load it (or something else). LOAD option can be called with the L key. After choosing a filename (or not, see above) MPT will load up the file. Word of warning here - MPT is not a very smart program and it can't recognize whether it's loading music data or not, so you might hang it by accident. Most common sign of that is a black screen with white dots. Pressing the RESET key while holding START will result in wiping the music data from memory.
If that doesn't help (white screen after resetting, or program not responsive), you can only turn off the computer and load MPT again. Let's hope that such situations won't take place, but we have to remember one of Murphy's laws - each program contains at least one flaw (not a serious one, hopefully).
This is the end of the official manual.
Utilizing the samples
SAP export
Once you have your MPT module finished, you should make a SAP out of it! Sadly there's no "out of the box" method for that like provided by RMT, but there are workarounds.
If you're making a song with no samples,
ASAP is all you need. It contains a commandline tool "asapconv" which among many things, allows you to convert your MPT module into SAP.
To use it, copy your .MPT module into ASAP's folder, direct your shell of choice into the folder and execute:
asapconv -o MODULE.SAP module.mpt
If your module uses samples, you'll have more work. First of all you have to prepare your track for compilation.
First step is to save your module with a
.MDx
extension, where
x
corresponds to the "Digi" option value - 1 or 2.
Then you have to prepare your samples. You see, you cannot include separate sample files during compilation - you have to combine them into a bank. In MPT go to Digifile menu, select
Save all
and save it as
.Dxx
, where
xx
corresponds to the frequency of your samples - 8 for 8kHz, and 15 for 15kHz.
After pulling those files out of the .atr, you'll need to get
SAPMaker. Put your .MDx and .Dxx files into its directory, and execute this in shell:
sapmaker -o MODULE.sap --samples=SAMPLES.Dxx MODULE.MDx