191 lines
6.6 KiB
Plaintext
191 lines
6.6 KiB
Plaintext
Sound Tracker Module File Format
|
|
--------------------------------
|
|
|
|
This document (C) Copyright 1990, Steven W Green. This document may
|
|
be freely distibuted, providing that any corrections are sent to me,
|
|
this copyright notice remains intact and that it does not breach any
|
|
law.
|
|
|
|
Deduced by reverse engineering a soundtracker player and looking at
|
|
the files. The author of this document can not be held responsible
|
|
for any damage caused by inacuracies in this document. The author has
|
|
absolutely no relationship with anybody concerned with the creation of
|
|
SoundTracker or related utilities.
|
|
|
|
|
|
Overall Structure:
|
|
Module name char[20];
|
|
Instruments INSTRUMENT[15 or 31] 30 bytes per instrument
|
|
Header UBYTE[2];
|
|
Sequences UBYTE[80];
|
|
[ID] LONG 'M.K.'
|
|
Patterns PATTERN[];
|
|
Samples WORD[][]
|
|
|
|
There appear to be 2 different flavours of Soundtracker modules.
|
|
Earlier ones, which allow 15 instruments and later ones allow 31. A
|
|
way to find out the version is to look at the LongWord at offset $438
|
|
from the start of the file and compare it with the packed string
|
|
'M.K.' (presumably the initials of someone?).
|
|
|
|
Version1 Version2
|
|
offset length | offset length | section
|
|
--------------+---------------+-----------------
|
|
0 20 | 0 20 | Module Name
|
|
$14 30X15 | $14 30X31 | Instruments
|
|
$1d6 2 | $3b6 2 | Header
|
|
$1d8 80 | $3b8 80 | Sequences
|
|
| $438 4 | Version ID 'M.K.'
|
|
$258 1024X? | $43c 1024X? | Patterns
|
|
? ? | ? ? | Samples
|
|
--------------+---------------+-----------------
|
|
|
|
|
|
Instrument structure
|
|
--------------------
|
|
|
|
Each instrument occupies 30 bytes. There are either 15 or 31
|
|
instruments in a module.
|
|
char name[20]; A null terminated filename
|
|
WORD unknown;
|
|
WORD length; Length of sample in words
|
|
WORD volume; Default volume (0..64)
|
|
WORD unknown
|
|
WORD repeat; 1=No repeat, otherwise position in sample for
|
|
repeat play of continuous sample.
|
|
|
|
To find the sample, you must find the end of the track data by finding
|
|
the maximum track number from the seqence section and then multiplying
|
|
by 1024 and adding to the start of the pattern data. Then each
|
|
instrument sample is simply stored one after the other.
|
|
|
|
Note that the 1st instrument is instrument 1. Thus the instruments
|
|
are numbered 1..15 or 1..31.
|
|
|
|
The instruments should be sampled as an A (110/220/440Hz) at 14KHz.
|
|
This is a calculated guess.
|
|
|
|
The filename is an Amiga name, often beginning with a volume name such
|
|
as ST-01:filename
|
|
|
|
Header
|
|
------
|
|
|
|
UBYTE n_tracks; Number of tracks to play
|
|
UBYTE unknown; Maybe highest note (78)
|
|
|
|
Sequences
|
|
---------
|
|
|
|
This is an array of 80 bytes. It is a list of patterns to play and
|
|
they are read in order for n_tracks tracks, unless a jump instruction
|
|
is encountered in the pattern data.
|
|
|
|
Pattern Data
|
|
------------
|
|
|
|
Each Pattern is 1024 bytes long. A pattern consists of 64 events.
|
|
there is one Longword for each of the 4 tracks. An event is executed
|
|
each 'tempo' vertical-blanks. I don't know whether this should be 50Hz
|
|
or 60Hz. I shall be assuming 50Hz. The default tempo is 6. A
|
|
typical song may have 4 events per crotchet => 16 per bar of 4/4 => 4
|
|
bars per pattern. Then on 60Hz systems you could skip one in 6 VBL's
|
|
to keep the same tempo.
|
|
|
|
The format of a track event is:
|
|
|
|
7 6 5 4 3 2 1 0
|
|
+---+---+---+---+---+---+---+---+
|
|
Byte 0 | Unknown | I | Frequency hi |
|
|
+---+---+---+---+---+---+---+---+
|
|
|
|
+---+---+---+---+---+---+---+---+
|
|
Byte 1 | Frequency mid | Frequency lo |
|
|
+---+---+---+---+---+---+---+---+
|
|
|
|
+---+---+---+---+---+---+---+---+
|
|
Byte 2 | Instrument | Command |
|
|
+---+---+---+---+---+---+---+---+
|
|
|
|
+---+---+---+---+---+---+---+---+
|
|
Byte 3 | Value |
|
|
+---+---+---+---+---+---+---+---+
|
|
|
|
|
|
Frequency is a 12 bit value ranging from $71 to $358. It is the value
|
|
put directly into the Amiga sound chip. The actual frequency can be
|
|
calculated as:
|
|
6
|
|
3.5 X 10 [3.579545 (PAL), 3.546895 (NTSC)]
|
|
f = -----------
|
|
value
|
|
|
|
This is an aproximate value. The actual value depends on the video
|
|
display and varies for PAL and NTSC. The exact values can be found in
|
|
the Amiga hardware reference manual. It is the horizontal scan line
|
|
frequency multiplied by 124 X 2, or something similar. A value of 0
|
|
means use the same as before.
|
|
|
|
Instrument is either a 4 or 5 bit value. If the extended instrument
|
|
is allowed thn the I bit becomes bit 4 of the instrument. A value of
|
|
0 means use the same instrument as before.
|
|
|
|
Command is one of:
|
|
0 : Arpeggio
|
|
1 : Portamento Up
|
|
2 : Portamento Down
|
|
3..9 : Reserved for future use
|
|
10 : Volume slide
|
|
11 : Position Jump
|
|
12 : Set Volume
|
|
13 : Pattern break
|
|
14 : Set filter
|
|
15 : Set speed
|
|
|
|
Value is used differently depending on the command:
|
|
Arpeggio:
|
|
A value of 0 means NO arpeggio. This also doubles as a NO COMMAND
|
|
instruction.
|
|
|
|
If the value is non-zero then it is split into 2 nybbles. The
|
|
note will warble between different frequencies of:
|
|
Base note
|
|
Base note + 1st nybble (semitones)
|
|
Base note + 2nd nybble (semitone)
|
|
Base note
|
|
Base note + 1st nybble (semitones)
|
|
Base note + 2nd nybble (semitone)
|
|
The note changes each VBL (20ms).
|
|
|
|
|
|
Portamento:
|
|
The value is either added or subtracted to the base note each VBL
|
|
depending on the direction. The value refers to the amiga
|
|
frequency as referred to above. The note is always forced into
|
|
the range $71..$358.
|
|
|
|
Volume slide:
|
|
The volume is changed by VALUE each VBL. Presumably it is in 2's
|
|
complement so that -ve and +ve values can be used. Presumably
|
|
values are clipped to the range 0..64?
|
|
|
|
Position Jump:
|
|
Value is the position within the Sequence list to jump to
|
|
|
|
Set Volume:
|
|
Set the current volume to value. This is a value between 0..64
|
|
and is the value used by the Amiga hardware!
|
|
|
|
Pattern Break:
|
|
Ends the current pattern.
|
|
|
|
Set Filter:
|
|
A value of 1 turns the Amiga's filter ON, value 0 turns it off.
|
|
Other values are undefined.
|
|
|
|
Set speed:
|
|
Value is the number of VBL's between events. The default is 6.
|
|
It should be a value between 1..15.
|
|
|
|
|