358 lines
20 KiB
Plaintext
358 lines
20 KiB
Plaintext
|
Below lists the format of the Protracker Studio 16 (PS16) header. This can
|
|||
|
change if it doesn't allow for enough flexibility for the time being.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD> PS16 Header Format: <20>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
|
|||
|
Description Length Data Type Information
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
Sig 5 Character This contains the string "PS16<31>" which
|
|||
|
acts as both an identifier to
|
|||
|
determine the file, but also serves
|
|||
|
as part of the text string which
|
|||
|
can be done by TYPEing the file to
|
|||
|
the screen.
|
|||
|
SongName 75 Character This contains the 75-character name of
|
|||
|
the music file. This may contain
|
|||
|
the MODule name if converted from a
|
|||
|
MOD, or it may contain information
|
|||
|
on number of channels or whatever.
|
|||
|
The final byte, 75, MUST have a ^Z
|
|||
|
in it.
|
|||
|
TypeOfFile 1 Byte This field holds what type of music
|
|||
|
file the file is. If this field
|
|||
|
contains a 0, then it is a module
|
|||
|
with self-contained instruments.
|
|||
|
If it is a 1, then it is a song
|
|||
|
with the header and patterns, but
|
|||
|
not the samples.
|
|||
|
CommentOfs 4 Longint The Comment Offset field points to
|
|||
|
the offset of the file where
|
|||
|
comments begin. The comments
|
|||
|
contain all text and information
|
|||
|
pertinent to the music. The
|
|||
|
sample names are also stored here.
|
|||
|
See below for parsing information.
|
|||
|
This field DOESN'T need to be
|
|||
|
used. Just store a zero here if
|
|||
|
there are no comments.
|
|||
|
Version 1 Byte This is the version identifier for
|
|||
|
the PS16 file. All versions of
|
|||
|
PS16 formats will have the header
|
|||
|
structure as described thus far.
|
|||
|
The format from here on can change,
|
|||
|
although it isn't likely. The
|
|||
|
format described below is a Version
|
|||
|
0 format.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Version 0 Header
|
|||
|
NumPatterns 1 Byte Contains the number of patterns
|
|||
|
(max 256) in the file.
|
|||
|
totalPatternSize 4 Longint For quick reads off the disk, the
|
|||
|
TOTAL pattern length is stored here.
|
|||
|
The maximum total size of patterns
|
|||
|
for any given music file is
|
|||
|
3075 bytes per pattern * 256 patterns.
|
|||
|
With the current player, this is
|
|||
|
simply not possible.
|
|||
|
SongLen 1 Byte This contains the number of sequences
|
|||
|
in the PS16 file.
|
|||
|
Sequences 128 Byte These are the sequences for the entire
|
|||
|
PS16 music.
|
|||
|
Samples 31*PS16Sample These are the 31 individual sample
|
|||
|
structures, described below.
|
|||
|
|
|||
|
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD> PS16 Sample Header Format, Version 0: <20>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
|
|||
|
Description Length Data Type Information
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
BitStruc 1 Bit Field These are bits that may be set for each
|
|||
|
sample. The default for a MOD file
|
|||
|
is: Bit 0 - Digital, Bit 1 - 0,
|
|||
|
Bit 2 - 8-bit.
|
|||
|
7 6 5 4 3 2 1 0
|
|||
|
<20> <20> <20><> 0 - Digital, 1 - Synthesized
|
|||
|
<20> <20><><EFBFBD><EFBFBD> (if bit 0=1) 0 - FM, 1 - Waveform
|
|||
|
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0 - 8-bit, 1 - 16-bit.
|
|||
|
|
|||
|
Volume 1 Byte Default volume for the sample. Range
|
|||
|
is 0 to 64 decimal. Please, ALWAYS
|
|||
|
make it default to this range.
|
|||
|
FineTune 1 Byte This field must contain one of the
|
|||
|
following values:
|
|||
|
0 - Tuning 0
|
|||
|
1 - Tuning 1
|
|||
|
2 - Tuning 2
|
|||
|
3 - Tuning 3
|
|||
|
4 - Tuning 4
|
|||
|
5 - Tuning 5
|
|||
|
6 - Tuning 6
|
|||
|
7 - Tuning 7
|
|||
|
8 - Tuning -8
|
|||
|
9 - Tuning -7
|
|||
|
10 - Tuning -6
|
|||
|
11 - Tuning -5
|
|||
|
12 - Tuning -4
|
|||
|
13 - Tuning -3
|
|||
|
14 - Tuning -2
|
|||
|
15 - Tuning -1
|
|||
|
Length 4 Longint This contains the length of the
|
|||
|
sample. Currently, my player
|
|||
|
doesn't support greater than 64k
|
|||
|
samples, and I really don't see
|
|||
|
the need. It's here in case it's
|
|||
|
needed.
|
|||
|
Repeat 4 Longint This contains the repeat start for
|
|||
|
the sample. Again, this can be
|
|||
|
>64k
|
|||
|
RepeatLength 4 Longint This contains the repeat length for
|
|||
|
the sample. If the sample Length
|
|||
|
is greater than the sample Repeat
|
|||
|
plus the sample RepLen, then the
|
|||
|
sample can be clipped to Repeat+
|
|||
|
RepLen. If you didn't get that,
|
|||
|
don't worry about it.
|
|||
|
C-2 Freq 2 Word The default playback frequency of
|
|||
|
a sample's C on octave 2. This
|
|||
|
can be used to fine tune a sample,
|
|||
|
but it defaults to 8448.
|
|||
|
|
|||
|
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD> PS16 Pattern Format, Version 0: <20>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
|
|||
|
Immediately following the version 0 header structure are the patterns. The
|
|||
|
reason that the offset of the patterns in the file is not contained in the
|
|||
|
header is because it was felt that the patterns would probably not be
|
|||
|
relocated.
|
|||
|
|
|||
|
When converting from the MODule format, this format will always be a minimum
|
|||
|
of 253 bytes smaller than the patterns in a MODule. A MODule's pattern is
|
|||
|
always 1,024 bytes. This is obvious since a MODule note and effect occupies
|
|||
|
four bytes, and there are four channels per row. With 64 rows in a file,
|
|||
|
this equation becomes: 4 bytes * 4 channels * 64 rows = 1,024 bytes.
|
|||
|
|
|||
|
A PS16 note occupies three bytes. A "note" in PS16 consists of the actual
|
|||
|
note, an instrument, and a special effect and its data.
|
|||
|
|
|||
|
A PS16 note will use the following table to convert from Amiga periods to
|
|||
|
its own notes, and they will be stored as such:
|
|||
|
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
|||
|
<20> 1<> 2<> 3<> 4<> 5<> 6<> 7<> 8<> 9<> 10<31> 11<31> 12<31>
|
|||
|
<20> 1712<31> 1616<31> 1524<32> 1440<34> 1356<35> 1280<38> 1208<30> 1140<34> 1076<37> 1016<31> 960<36> 906<30>
|
|||
|
<20> C-0<> C#0<> D-0<> D#0<> E-0<> F-0<> F#0<> G-0<> G#0<> A-0<> A#0<> B-0<>
|
|||
|
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
|||
|
<20> 13<31> 14<31> 15<31> 16<31> 17<31> 18<31> 19<31> 20<32> 21<32> 22<32> 23<32> 24<32>
|
|||
|
<20> 856<35> 808<30> 762<36> 720<32> 678<37> 640<34> 604<30> 570<37> 538<33> 508<30> 480<38> 453<35>
|
|||
|
<20> C-1<> C#1<> D-1<> D#1<> E-1<> F-1<> F#1<> G-1<> G#1<> A-1<> A#1<> B-1<>
|
|||
|
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
|||
|
<20> 25<32> 26<32> 27<32> 28<32> 29<32> 30<33> 31<33> 32<33> 33<33> 34<33> 35<33> 36<33>
|
|||
|
<20> 428<32> 404<30> 381<38> 360<36> 339<33> 320<32> 302<30> 285<38> 269<36> 254<35> 240<34> 226<32>
|
|||
|
<20> C-2<> C#2<> D-2<> D#2<> E-2<> F-2<> F#2<> G-2<> G#2<> A-2<> A#2<> B-2<>
|
|||
|
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
|||
|
<20> 37<33> 38<33> 39<33> 40<34> 41<34> 42<34> 43<34> 44<34> 45<34> 46<34> 47<34> 48<34>
|
|||
|
<20> 214<31> 202<30> 190<39> 180<38> 170<37> 160<36> 151<35> 143<34> 135<33> 127<32> 120<32> 113<31>
|
|||
|
<20> C-3<> C#3<> D-3<> D#3<> E-3<> F-3<> F#3<> G-3<> G#3<> A-3<> A#3<> B-3<>
|
|||
|
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
|||
|
<20> 49<34> 50<35> 51<35> 52<35> 53<35> 54<35> 55<35> 56<35> 57<35> 58<35> 59<35> 60<36>
|
|||
|
<20> 107<30> 101<30> 95<39> 90<39> 85<38> 80<38> 75<37> 71<37> 67<36> 63<36> 60<36> 56<35>
|
|||
|
<20> C-4<> C#4<> D-4<> D#4<> E-4<> F-4<> F#4<> G-4<> G#4<> A-4<> A#4<> B-4<>
|
|||
|
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
A zero is stored in the event a period was not found or approximated or when
|
|||
|
there is not an actual period being played. The note field requires 6 bits.
|
|||
|
|
|||
|
Version 0 only handles 31 instruments. Thus, the instrument field requires
|
|||
|
5 bits.
|
|||
|
|
|||
|
The special effect field can range from 0 to F in hexadecimal and requires
|
|||
|
4 bits.
|
|||
|
|
|||
|
The special effects data field is a whole byte and can have 8 bits.
|
|||
|
|
|||
|
Thus, with this information, we are able to construct the following bitfields:
|
|||
|
Byte 1 Byte 2 Byte 3
|
|||
|
7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
|
|||
|
<20> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<20> <20> Note <20> Effect Effect Data
|
|||
|
<20> <20> Bit 5 of instrument <20><><EFBFBD> Bits 1-4 of the instrument
|
|||
|
<20>
|
|||
|
<20><><EFBFBD> Follow previous line bit.
|
|||
|
|
|||
|
Reconstruction algorithms are as follows:
|
|||
|
|
|||
|
Get the <20><><EFBFBD><EFBFBD>Get Byte 1
|
|||
|
Note <20><><EFBFBD><EFBFBD>AND it with binary 00111111b
|
|||
|
|
|||
|
<20><><EFBFBD><EFBFBD>Get Byte 1 again.
|
|||
|
<20> AND it with binary 01000000b
|
|||
|
<20> Shift it right twice.
|
|||
|
Get the <20> Store as result #1.
|
|||
|
Instr. <20> Get Byte 2.
|
|||
|
<20> AND it with binary 11110000b
|
|||
|
<20> Shift it right four times.
|
|||
|
<20><><EFBFBD><EFBFBD>OR it with Result #1.
|
|||
|
|
|||
|
Get the <20><><EFBFBD><EFBFBD>Get Byte 2 again.
|
|||
|
Effect. <20><><EFBFBD><EFBFBD>AND it with binary 00001111b
|
|||
|
|
|||
|
Efx Data<74><61><EFBFBD><EFBFBD>Get Byte 3.
|
|||
|
|
|||
|
Bit 7 requires a bit of additional explanation. As aforementioned, patterns
|
|||
|
can be a MINIMUM of 253 bytes smaller than their MOD counterparts. This is
|
|||
|
due to three special compression methods.
|
|||
|
|
|||
|
One) Instead of ordering the patterns as Track 1, Track 2, Track 3, Track 4,
|
|||
|
then Track 1, Track 2 again and so on until the end, the Tracks are
|
|||
|
grouped together as all of Track 1 and all of Track 2 and so on.
|
|||
|
|
|||
|
Two) If a note appears on row 0 and another note appears on row 5 with
|
|||
|
Three) nothing in between, why not get rid of the blank rows? For instance,
|
|||
|
a situation such as this may appear as:
|
|||
|
|
|||
|
Module Track MOD Data PS16 Data
|
|||
|
00 C-1 01 F06 0358 1F06 8D 1F 06
|
|||
|
01 --- 00 000 0000 0000
|
|||
|
02 --- 00 000 0000 0000
|
|||
|
03 --- 00 000 0000 0000
|
|||
|
04 --- 00 000 0000 0000
|
|||
|
05 E-3 03 C40 00AA 3C40 05 29 3C 40
|
|||
|
06 E-3 01 A01 00AA 1A01 A9 1A 01
|
|||
|
07 --- 00 000 0000 0000
|
|||
|
. .
|
|||
|
. .
|
|||
|
. .
|
|||
|
63 --- 00 000 0000 0000 FF
|
|||
|
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
1024 bytes 11 bytes
|
|||
|
|
|||
|
Two and three are combined for two reasons. As can be seen, MODs
|
|||
|
store extra information for blank pattern lines. This was
|
|||
|
remedied in PS16 by two methods. If the jump between one line
|
|||
|
and another was greater than one, then the new line number was
|
|||
|
written out (see row 5 of the PS16 Data, first byte). However,
|
|||
|
if the two lines were right by each other (5 & 6), then the
|
|||
|
pattern row was not written out.
|
|||
|
|
|||
|
Here's why. As you recall from the above diagrams of PS16 notes,
|
|||
|
it can be seen that Bit 7 is named "Follow Previous Line." This
|
|||
|
means that if the new PS16 line follows the previous line, there
|
|||
|
is no need to store a row number in front. All that needs be
|
|||
|
done is have this bit set.
|
|||
|
|
|||
|
Let's break down the PS16 data from above:
|
|||
|
|
|||
|
Row 0: 8D 1F 06 -- Bit 7 is set here. The first line of a pattern
|
|||
|
is always assumed to follow Byte 255 (which is
|
|||
|
what the line counter is initialized). A byte
|
|||
|
of 255 plus 1 = 0. Otherwise, the 0Dh in 8Dh
|
|||
|
specifies note 0Dh, which is C-1. The 1F 06
|
|||
|
specifies instrument 1, special effect F (speed)
|
|||
|
06.
|
|||
|
Row 5: 05 29 3C 40 -- Since there was a large skip here, and row 5
|
|||
|
does not immediately follow row 0, the 5 was
|
|||
|
stored in first here. How does the interpreter
|
|||
|
know the difference between a row number and
|
|||
|
a note? A note ALWAYS follows a row number
|
|||
|
and if a row number is not present, then bit 7
|
|||
|
MUST be set in the note. Bit 7 is NEVER set
|
|||
|
in a row except for the ONE exception below.
|
|||
|
Row 6: A9 1A 01 -- Immediately follows Row 5, so bit 7 is set.
|
|||
|
Final
|
|||
|
Byte: FF -- This is a -1 which means terminate track.
|
|||
|
|
|||
|
A -1 always terminates the current track. Bear in mind that ALL 16 tracks
|
|||
|
are stored per pattern, so if converting from a MOD, tracks 5-16 are
|
|||
|
automatically set to -1.
|
|||
|
|
|||
|
The discussion thus far has been centered around the general pattern format.
|
|||
|
Two other factors are introduced into the PS16 pattern. The format of a
|
|||
|
pattern is this:
|
|||
|
|
|||
|
Byte Name Description
|
|||
|
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
0-1 Size (Word) Size is the total size of the ENTIRE
|
|||
|
pattern, INCLUDING bytes 0 through 2.
|
|||
|
This number is paragraph aligned. This
|
|||
|
means that if a pattern is 253 bytes
|
|||
|
long, its actual size is 256. If the
|
|||
|
size is 256, no change takes place.
|
|||
|
2 NumLines (Byte) This is the number of pattern lines in
|
|||
|
the pattern. If a pattern only uses
|
|||
|
30 lines and the pattern must terminate
|
|||
|
to the next pattern at this point,
|
|||
|
store a 30 here. Otherwise, ALWAYS store
|
|||
|
a 64 so the entire pattern will play.
|
|||
|
3-?? Track This is Track 1, terminated with a -1.
|
|||
|
The other tracks follow immediately after
|
|||
|
this.
|
|||
|
|
|||
|
|
|||
|
See routine MOD_LoadSavePatterns in MODLOAD.ASM.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD> PS16 Sample Format, Version 0: <20>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
|
|||
|
Only the digital sample format has been defined thus far. In order to appeal
|
|||
|
to archivers more, the sample storage format has changed. Instead of being
|
|||
|
stored as raw data as in all trackers I am aware of, the format was changed
|
|||
|
to use "deltas." The algorithm for converting a sample to deltas is:
|
|||
|
|
|||
|
Get the number of sample bytes to process.
|
|||
|
Call this SamplesLeft.
|
|||
|
|
|||
|
Set Delta counter to 0.
|
|||
|
|
|||
|
DO
|
|||
|
Get a byte from the buffer.
|
|||
|
Store the byte in Temp.
|
|||
|
Subtract the Delta counter from the byte.
|
|||
|
Store it in the buffer.
|
|||
|
Move the Temp byte into the Delta Counter
|
|||
|
Decrement SamplesLeft.
|
|||
|
WHILE(SamplesLeft <> 0)
|
|||
|
|
|||
|
See routine MOD_ConvertSample in MODLOAD.ASM.
|
|||
|
|
|||
|
The technique for conversion back to the raw data is:
|
|||
|
|
|||
|
Get the number of sample bytes to process.
|
|||
|
Call this SamplesLeft.
|
|||
|
|
|||
|
Set Delta counter to 0.
|
|||
|
|
|||
|
DO
|
|||
|
Get a byte from the buffer.
|
|||
|
Add onto the byte the Delta Counter.
|
|||
|
Store the byte in Delta Counter.
|
|||
|
Store the byte in Temp.
|
|||
|
Decrement SamplesLeft.
|
|||
|
WHILE(SamplesLeft <> 0)
|
|||
|
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD> PS16 Comment Format, Version 0: <20>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
|
|||
|
This format resembles an ILBM format. Only two things are currently defined
|
|||
|
in this format.
|
|||
|
|
|||
|
Signature Description
|
|||
|
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
INST Immediately following this four character
|
|||
|
identifier is a byte indicating the length of
|
|||
|
each instrument name. After that is a byte
|
|||
|
describing how many samples names are stored in
|
|||
|
this text. Example for the MOD format:
|
|||
|
|
|||
|
I N S T [Chr 22] [Chr 2, normally 31]
|
|||
|
[Instrument name #1 padded to 22 chars]
|
|||
|
[Instrument name #2 padded to 22 chars]
|
|||
|
|
|||
|
See MOD_ConvertComments in MODLOAD.ASM.
|
|||
|
|
|||
|
TEXT Immediately following this four character
|
|||
|
identifier is a WORD describing the length
|
|||
|
of the upcoming text.
|
|||
|
|
|||
|
|