Hello.
Long ago I tried to write a kind of doc about PT3 modules. I stopped it but due to a certain person who asked for it ... (this goes especially for Nerlaska) I write here what I have. I can't remember exactly what I wrote on some papers so when you see something like (?), it means I can't remember what I wrote
It would be very nice if someone could complete the info here given. It's very easy; just write some basic on Vortex Tracker II and start watching with an hex-viewer the changes ... at least, that's what I did
Have fun.
===========================================================================
PT3 format:
*Info inside the module*
$00: "ProTracker 3."
$0D: Version (always "5" for Vortex Tracker II).
$0E: " compilation of "
$1E: Name of the module.
$3E: " by "
$42: Author of the module.
$63: Frequency table (from 1 to 4).
$64: Speed ----------------------------------------------------------- Delay: 1 byte
$65: Number of patterns.
$66: Pattern loop --------------------------------------------------- LPosPtr: 1 byte
$67: Position of patterns inside the module ---------------- PatsPtrs: 2 bytes
$69: Position of samples inside the module ----------------- SamPtrs: 2 bytes
(2 bytes per address * 32 samples = 64 bytes)
$A9: Position of ornaments inside the module ------------- OrnPtrs: 2 bytes
(2 bytes per address * 16 ornaments = 32 bytes)
$C9: It points to where the patterns order ist ------------- CrPsPtr: 2 bytes
If you have a look to where this address points you can see, for instance,
$00,$03,$06,$03,$FF, which means:
pattern 0 ($00), pattern 1 ($03), pattern 2 ($06), pattern 1 ($03), END ($FF).
As you can see, you have to multiply for 3 every pattern number.
------------------------------------------------------------------------------
Now, in group of 6 bytes, come the address of every channel of every pattern.
So the first 6 bytes will point to the address of channel A, B and C of
pattern 0 (3 channels * 2 bytes = 6 bytes). The next 6 bytes to the 3 channels
of pattern 1, etc ...
------------------------------------------------------------------------------
In $69 (SamPtrs) we have the address where the definition of the samples
start. So $69 and $70 will contain the address of the definition of the first
sample in the module. $71 and $72 of the second, and so on.
The definition of the samples are like this:
byte 1: Loop
byte 2: Length of the sample
byte 3: 0 0 0 0 0 0 0 0
¦_¦ ¦______¦ ¦___ 0: Envelope 1: No envelope
¦ ¦
¦ ¦________ Noise: 0 - 31
¦
¦______________ 10: Volume down 11: Volume up
byte 4: 0 0 0 0 0 0 0 0
¦_¦ ¦_¦ ¦____¦
¦ ¦ ¦
¦ ¦ ¦______ Volume
¦ ¦
¦ ¦___________ Noise slide (?)
¦
¦______________ Frequency slide (?)
byte 5: Low byte.
byte 6: High byte.
These two bytes (5 and 6) contain the frequency slide. In case of negative
slide (higher pitch) the frequency you want to rest is rested to $FFFF and
stored in these 2 bytes.
Bytes 3,4,5 and 6 form a line of the sample (raster). So a sample will have
so many groups of these bytes as lines has the sample.
------------------------------------------------------------------------------
Definition of ornaments are much easier:
Byte 1: Loop
Byte 2: Length
Byte 3: Note (0-95)
The same as for samples. Byte 3 contains the definition of one line so there
will be as much bytes containing the new note as lines of definition has the
ornament.
------------------------------------------------------------------------------
Now it becomes more complex
The address of the channels of every pattern come in group of 6, as we said.
If we go to the address pointed for channel A (the first 2 bytes of those 6)
we'll have definition of the channel A in the tracker. The bytes are coded so
we have to read the higher 4 bites:
$4x: Ornament ($40-$4F)
$50-$AF: Note to play. There are 96 (12 notes * 8 octaves). The byte before
this one tells the length in lines inside the tracker. For instance:
$05,$50 will play C1 (Do in octave 1) during 5 lines of tracker. If
the Speed (Delay) is 6, the player will play this note during 30
(6 rasters * 5 lines in tracker) rasters.
$Bx: Envelope. We have to add 1 to know which value should we give to register
13. If there's envelope (a value different to $B1) the next 2 bytes are
register 12 and register 11 of the PSG. An example: $B9, $00, $50 means
R13=$08, R12=$00, R11=$50.
$Cx: Volume - $C0-$CF
$Dx: Sample - $D0-$EF
$0X: Effects/Commands ... The values they handle are set after note value
($50-$AF).
*Effects*
$01: Sound frequency decreasing in that channel.
First byte indicates the delay used to add the new frequency.
Next 2 bytes will indicate the frequency to add. Example:
$02,$23,$00 will add $23 to the final frequency in that raster
and another $23 every 2 rasters.
$01: Sound frequency increasing in that channel.
It's the same as above but the value is rested to $FFFF. Example:
$01,$DD,$FF will rest $23 to the final frequency in every raster.
$02: Tone portamento.
First byte is delay again. (?)
$03: Starts playing sample from a particular position/line definition.
Byte indicates from which position.
$04: Starts playing ornament from a particular position/line definition.
Byte indicates from which position.
$06: Periodical sound off/on in that channel.
Two bytes are used here. The first one tells how many rasters will be
played and the second how many will be not. Example. $03,$04 means
that that channel will be played 3 rasters, 4 not played, 3 played, ...
$08: Envelope frequency increasing.
Two bytes will indicate the frequency to add to registers R12 and R11.
Example: $34,$00 will add $34 to R11.
$09: Set playing speed (new Delay).
The byte after the note will tell the new delay.
$0A: Envelope frequency decreasing.
Same as increasing but the value is rested to $FFFF.
Example: $CC,$FF will rest $34 to R11.
------------------------------------------------------------------------------
*Example 1*
So if we have this in the module: $D2,$CF,$B1,$05,$50 we will have this in the
tracker:
C-1 2..F ....
--- .... ....
--- .... ....
--- .... ....
--- .... ....
$D2: Sample 2 ($Dx samples)
$CF: Volume 15 ($Cx volume)
$B1: No envelope ($Bx envelope)
$05,$50: Play note $50 (C1) during five tracker lines.
*Example 2*
If we have this in the module: $D1,$CE,$09,$B1,$08,$50,$07
$D1: Sample 1.
$CE: Volume 14.
$09: New delay will be set. See after note is set.
$B1: No envelope.
$08,$50: Play note $50 (C1) during eight tracker lines.
$07: New Delay.
===========================================================================