These are compiled modules of Pro Sound Maker, a project of Denis Dratov (Dexus). In the mid-90s it was presented as a demo version. After 10 years, the project was finalized, and the format of the compiled modules is well documented (including the source code of the player).
The editor ideas are interesting, but not many modules have been written: a little more than 50 (mostly by Dexus, but there are several by Scratcher).
There is a transposition in the positions list like in Sound Tracker. However, the playback speed is not a property of the entire module, but of each pattern like in SQ Tracker (the set delay command was planned, but was not implemented).
Envelopes can be set traditionally, but the envelope period possible values choice is limited to the ranges 0x0000..0x00F0 (the highest byte is always zero) and 0x0100..0x0F00 (here, on the contrary, the lowest byte is always zero), or it is possible to automatically calculate the period according to the frequency of the note (including an automatic envelope calculation on every note setting).
Channel volume control is done rationally (as in STP, SQT and GTR, see descriptions of these formats), i.e. without using a cumbersome table or a similar complex formula.
Samples and ornaments may be not looped. At the same time, when looping a sample, the possibility of an amplitude long decrease or increase is provided (this is no longer in any tracker).
There is no envelope mask in the sample, but since the channel volume is applied to the amplitude register after setting the envelope bit, at certain volume values, some of the ticks may sound with an envelope, and some without.
The notes in the pattern channel descriptor are stored not as in other trackers, but as relative values (described in detail below).
Offset | Size | Designation | Description |
---|---|---|---|
+0 | 2 | PossPtr | Pointer to the positions list in the playback order. |
+2 | 2 | SamsPtr | Pointer to the sample list. |
+4 | 2 | OrnsPtr | Pointer to the ornament list. |
+6 | 2 | PatsPtr | Pointer to a pattern list. |
+8 | 0..128 | Remark | It starts with five bytes of "psm1" with a trailing zero in all existing modules. The presence of a remark continuation can be assumed by the value of the PossPtr. |
+PossPtr | ? | PosList | Position list (byte-pairs "pattern:transposition"). It ends with the byte 0xFF, followed by the second byte: this is either the loop position, or 0xFF for no loop. |
+SamsPtr | ? | SamPtrs | Sample pointers. |
? | Samples | Samples (described below). | |
+OrnsPtr | ? | OrnPtrs | Ornament pointers. |
? | Ornaments | Ornaments (described below). | |
+PatsPtr | ? | PatChanPtrs | List of seven-byte blocks (the first byte is the playback speed, then three words are pointers to pattern channels A, B, C). |
? | PatChans | Pattern channels (described below). |
A sequence of bytes ending with 0xFF.
Channel bytes | Description |
---|---|
0x00..0x5F | Calculate the note number (described below). If necessary, calculate the type and period of the envelope (described below). Exit. |
0x60 | Mute the sound. Exit. |
0x61..0x6F | Set the sample to 0..14. |
0x70..0x8F | Set the ornament to 0..31. Disable envelopes. |
0x90 | Exit. |
0x91..0x9F | Set the volume to 1..15. |
0xA0 | Disable ornaments. |
0xA1..0xB0 | Enable envelopes via variant 2 (described below), calculate and set at each note setting (the mode can be changed via 0xFA/0xFB). |
Enable envelopes via variant 1 (described below), calculate and set once (the mode can be changed via 0xFB/0xFA). | |
0xB8..0xF8 | Do skipping on 1..65 (1..64 in the author's documentation) lines since now. |
Remember the address of the next byte after these four (for later return to this place) and continue analyzing the pattern from the Addr address (subroutine). Cnt decreases at each pattern analyzer entry. Analysis will continue from the stored address as soon as Cnt will zero. The command was not implemented in the compiler. | |
0xFA | Disable mode of calculation and setting envelope at each note setting. |
0xFB | Enable mode of calculation and setting envelope at each note setting. |
0xFC, Delay | Change the playback speed (project). The command was not implemented either in the native player or in the compiler. |
The value from the pattern (0..95) is subtracted from the previous note number of the pattern, and if it is the first, then from the value "pattern transposition + 48"). If the received number is less than zero, increase it by 96.
Further check it for the range 0..95 (according to the number of notes in the table) after applying the ornament.
If the envelope is set via 0xB1..0xB7 bytes (option 1), then set the envelope type to 8..14 respectively; if EnvDiv <= 0xF0, set high byte of the envelope period to 0, and low to EnvDiv, otherwise set the low byte of the envelope to 0, and the high to the value in bits 3-0 of EnvDiv.
If the envelope is set via 0xA1..0xB0 bytes (option 2), then multiply the value of bits 1–0 by 2, add 8 and use the result for the envelope type; multiply the bits 3–2 value by 12, add the note number, and do decreasing by 48 until the result is within [0..47], add 48 and use this result as an index in the note table to set both bytes of the envelope period.
Offset | Description |
---|---|
+0 | Bits 7–6: volume change value in the sample (reduced by 1 if the volume is decreased). Bit 5: the direction of the volume change in the sample (0 for increase, 1 for decrease). Bits 4–0: sample length reduced by 1. |
+1 | Bits 7–5: 0, if the sample is not looped, 1–7 is the number of sample repetitions before the next volume change in the sample. Bits 4–0: loop point. |
+2 | Three-byte sample ticks in order. Every tick: +0 Bit 7: noise mask. Bit 4: tone mask. Bits 3–0: amplitude. +1 Bits 7–3: noise period (used only if noise is enabled by a mask). Bits 2–0: high bits of the tone period offset accumulation (the highest bit is signed). +2 The lowest byte of the tone period offset accumulation. When the tone goes beyond the range of 0..4095, the tone is set at the appropriate boundary. |
Offset | Description |
---|---|
+0 | The length of the ornament, reduced by 1. |
+1 | Bit 7: 1 if the ornament is looped. Bits 4–0: loop point. |
+2 | Single-byte ticks of the ornament in order. |