Scream Tracker 3 Module
- Extension: s3m
A normally 16-channel module format for MS-DOS on the PC, it can also support OPL2 FM synthesis (9 melodic channels + 5 drums). While the format itself can technically support 32 channels, only the 30 mentioned have any meaning assigned to them, and they are usually not all used at the same time.
The format is little-endian (least significant byte first). A "byte" is 8 bits, and a "word" is 16 bits. Hex values will be denoted with "0x".
Note that if some parts of the format are inconsistent, it's usually best to let it slip, as ST3 itself will allegedly for instance load instruments which don't have the "SCRS" / "SCRI" mark.
- 28 bytes: module name, NUL-terminated, NUL-padded.
- Byte: 0x1A.
- Byte: 16 (0x10) to indicate this is a Scream Tracker 3 module.
- 2 reserved bytes, should be 0x00.
- 6 words, denoting the following:
- Order count
- Instrument count
- Pattern count
- bit 0 (pre-3.01 ONLY): ST2 vibrato (effect unknown).
- bit 1 (pre-3.01 ONLY): ST2 tempo (effect unknown).
- bit 3 (pre-3.01 ONLY): Amiga slides (effect unknown).
- bit 4: 0-vol optimisations - turn off looping notes which have a zero volume for more than(?) 2 rows.
- bit 5: Amiga limits (limit periods to confine to 113 <= x <= 856).
- bit 6 (pre-3.01 ONLY): Enable filter / sfx with SB (effect unknown).
- bit 7: ST3.00 volume slides (automatically enabled if tracker version is <= 0x1300) - if the tick
- bit 8: Special custom data in file (uses "Special" field)
- Tracker version
- 0x1xyy == Scream Tracker x.yy
- TODO - look for other version numbers
- File format information
- 1 == signed samples (horribly, horribly old)
- 2 == unsigned samples
- Anything else is invalid and ST3 will not load the file(?).
- 4 byte string: "SCRM"
- 6 bytes, denoting the following:
WORK IN PROGRESS
Aspects which are easy to get wrong with this format are in bold text.
Note w/o sample results in retriggering the note without resetting the volume.
Sample w/o note results in resetting the volume and switching samples w/o retriggering the note. If the C4 speeds differ, this could potentially be out of tune as it does not convert the internal period values. If the note is off, it will stay off - it will not retrigger.
Vibrato and tremolo have a full cycle length of 256, though Hxy and Rxy use x*4 and y*4 as their parameters.
Base clock is 14317056 Hz. When calculating a note's period, use the following table:
C C# D D# E F F# G G# A A# A 1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960,907
and calculate the period like so:
period = 8363 * 16 * (note >> octave) / middle_c_frequency_of_instrument
Theoretically, both the period and the volume have "stored" values and "active" values.
Volumes actually peak at 63, and not 64. Setting the volume to 64 will actually make it go to 63.
However, on adlib channels, if the default volume is 64, it will use 64. Any further operations on the volume will clip it to within the 0-63 range.
When a note is selected, the tremolo position is retriggered if tremolo retriggering is enabled..
TODO the rest
Volume slide. If one of the values are 0, then we slide on all nonzero ticks. If one of the values are F, then we slide on all zero ticks. That means that D0F slides down 15 on all ticks and DF0 slides up 15 on all ticks.
However, if fast slides are enabled (if they are set as a flag or the version is less than 0x1320), then, unless we're doing a fineslide, we slide on all ticks.
When we do a volume slide, we slide the active volume without modifying the stored volume, and we retrigger tremolo for that channel.
The checking order is as follows:
- Dx0 (slide up)
- D0x (slide down)
- DxF (fine slide up)
- DFx (fine slide down)
So DFF slides the volume up 15 notches each nonzero tick.
Tremolo. x*4 is speed, y*4 is depth. This is possibly the screwiest effect of the lot. While XMPlay seems to be quite good with IT support these days after Storlek released his abuse tests, it gets several aspects of this S3M effect wrong.
- If xy is nonzero, load up the speed and the depth into this channel's tremolo speed & depth values.
- Set the active volume to the stored volume plus (depth * value) / (max_amplitude * 2) (Rxy peaks at 32 in each direction), and for each nonzero tick increase the tremolo position by the speed. The stored volume is untouched.
- When this effect is retriggered, the depth and position are set to 0 while the speed remains unaltered.
- Tremolo will not work if the stored volume is 0 (or 64 - adlib only).