192 lines
8.5 KiB
Prolog
192 lines
8.5 KiB
Prolog
Mysterious's ULTRA TRACKER File Format
|
||
by FreeJack of The Elven Nation
|
||
(some additional infos on the new format (V1.4/5) by MAS -> * marked)
|
||
|
||
I've done my best to document the file format of Ultra Tracker (UT).
|
||
If you find any errors please contact me.
|
||
The file format has stayed consistent through the first four public releases.
|
||
At the time of this writting, Ultra Tracker is up to version 1.3
|
||
(* With version V1.4/5 there are some changes done in the format. *)
|
||
|
||
Thanks go to :
|
||
SoJa of YLYSY for help translating stuff.
|
||
|
||
Marc Andr‚ Schallehn
|
||
Thanks for putting out this GREAT program.
|
||
Also thanks for the info on 16bit samples.
|
||
|
||
With all this crap out of the way lets get to the format.
|
||
|
||
|
||
Sample Structure :
|
||
______________________________________________________________________________
|
||
00h Samplename : 32 bytes (Sample name)
|
||
20h DosName : 12 bytes (when you load a sample into UT,
|
||
it records the file name here)
|
||
2Ch LoopStart : dbl word (loop start point)
|
||
30h LoopEnd : dbl word (loop end point)
|
||
34h SizeStart : dbl word (see below)
|
||
38h SizeEnd : dbl word (see below)
|
||
3Ch volume : byte (UT uses a logarithmic volume setting, 0-255)
|
||
(* V1.4: uses linear Volume ranging from 0-255 *)
|
||
3Dh Bidi Loop : byte (see below)
|
||
3Eh FineTune : word (Fine tune setting, uses full word value)
|
||
______________________________________________________________________________
|
||
|
||
8 Bit Samples :
|
||
|
||
SizeStart :
|
||
The SizeStart is the starting offset of the sample.
|
||
This seems to tell UT how to load the sample into the Gus's onboard memory.
|
||
All the files I have worked with start with a value of 32 for the first sample,
|
||
and the previous SizeEnd value for all sample after that. (See Example below)
|
||
If the previous sample was 16bit, then SizeStart = (Last SizeEnd * 2)
|
||
SizeEnd :
|
||
Like the SizeStart, SizeEnd seems to tell UT where to load the sample into the
|
||
Gus's onboard memory. SizeEnd equal SizeStart + the length of the sample.
|
||
|
||
Example :
|
||
If a UT file had 3 samples, 1st 12000 bytes, 2nd 5600 bytes, 3rd 8000 byte.
|
||
The SizeStart and SizeEnd would look like this:
|
||
|
||
Sample SizeStart SizeEnd
|
||
1st 32 12032
|
||
2nd 12032 17632
|
||
3rd 17632 25632
|
||
|
||
***Note***
|
||
Samples may NOT cross 256k boundaries. If a sample is too large to fit into the
|
||
remaining space, its Sizestart will equal the start of the next 256k boundary.
|
||
UT does keep track of the free space at the top of the 256k boundaries, and
|
||
will load a sample in there if it will fit.
|
||
Example : EndSize = 252144
|
||
If the next sample was 12000 bytes, its SizeStart would be 262144, not 252144.
|
||
Note that this leaves 10000 bytes unused. If any of the following sample could
|
||
fit between 252144 and 262144, its Sizestart would be 252144.
|
||
Say that 2 samples after the 12000 byte sample we had a sample that was only
|
||
5000 bytes long. Its SizeStart would be 252144 and its SizeEnd would be 257144.
|
||
This also applies to 16 Bit Samples.
|
||
|
||
16 Bit Samples :
|
||
16 bit samples are handled a little different then 8 bit samples.
|
||
The SizeStart variable is calculated by dividing offset (last SizeEnd)
|
||
by 2. The SizeEnd variable equals SizeStart + (SampleLength / 2).
|
||
If the first sample is 16bit, then SizeStart = 16.
|
||
Example :
|
||
sample1 = 8bit, 1000 bytes
|
||
sample2 = 16bit, 5000 bytes
|
||
|
||
sample1 SizeStart = 32
|
||
SizeEnd = 1032 (32 + 1000)
|
||
|
||
sample2 SizeStart = 516 (offset (1032) / 2)
|
||
SizeEnd = 3016 (516 + (5000/2))
|
||
|
||
***Note***
|
||
If a 16bit sample is loaded into banks 2,3, or 4
|
||
the SizeStart variable will be
|
||
(offset / 2) + 262144 (bank 2)
|
||
(offset / 2) + 524288 (bank 3)
|
||
(offset / 2) + 786432 (bank 4)
|
||
The SizeEnd variable will be
|
||
SizeStart + (SampleLength / 2) + 262144 (bank 2)
|
||
SizeStart + (SampleLength / 2) + 524288 (bank 3)
|
||
SizeStart + (SampleLength / 2) + 786432 (bank 4)
|
||
|
||
BiDi Loop : (Bidirectional Loop)
|
||
UT takes advantage of the Gus's ability to loop a sample in several different
|
||
ways. By setting the Bidi Loop, the sample can be played forward or backwards,
|
||
looped or not looped. The Bidi variable also tracks the sample
|
||
resolution (8 or 16 bit).
|
||
|
||
The following table shows the possible values of the Bidi Loop.
|
||
Bidi = 0 : No looping, forward playback, 8bit sample
|
||
Bidi = 4 : No Looping, forward playback, 16bit sample
|
||
Bidi = 8 : Loop Sample, forward playback, 8bit sample
|
||
Bidi = 12 : Loop Sample, forward playback, 16bit sample
|
||
Bidi = 24 : Loop Sample, reverse playback 8bit sample
|
||
Bidi = 28 : Loop Sample, reverse playback, 16bit sample
|
||
______________________________________________________________________________
|
||
Event Structure:
|
||
______________________________________________________________________________
|
||
0 Note : byte (See note table below)
|
||
1 SampleNumber : byte (Sample Number)
|
||
2 Effect1 : nib (Effect1)
|
||
2 Effect2 : nib (Effect2)
|
||
3 Effect2Data : byte
|
||
4 Effect1Data : byte
|
||
|
||
The High order byte of EffectVar is the Effect variable for Effect1.
|
||
The Low order byte of EffectVar is the Effect variable for Effect2.
|
||
***(Note)***
|
||
UT uses a form of compression on repetitive events. Say we read in the first
|
||
byte, if it = $FC then this signifies a repeat block. The next byte is the
|
||
repeat count. followed by the event structure to repeat.
|
||
If the first byte read does NOT = $FC then this is the note of the event.
|
||
So repeat blocks will be 7 bytes long : RepFlag : byte ($FC)
|
||
RepCount : byte
|
||
0 note : byte
|
||
1 samplenumber : byte
|
||
2 effect1 : nib
|
||
effect2 : nib
|
||
3 effectVar : word
|
||
|
||
Repeat blocks do NOT bridge patterns.
|
||
______________________________________________________________________________
|
||
Note Table:
|
||
______________________________________________________________________________
|
||
note value of 0 = pause
|
||
C-0 to B-0 1 to 12
|
||
C-1 to B-1 13 to 24
|
||
C-2 to B-2 26 to 36
|
||
C-3 to B-3 39 to 48
|
||
C-4 to B-4 52 to 60
|
||
______________________________________________________________________________
|
||
Offset Bytes Type Description
|
||
______________________________________________________________________________
|
||
0 15 byte ID block : should contain
|
||
'MAS_UTrack_V001'
|
||
|
||
(* V1.4: 'MAS_UTrack_V002')
|
||
|
||
(* V1.5: 'MAS_UTrack_V003')
|
||
|
||
15 32 AsciiZ Song Title
|
||
47 1 reserved This byte is reserved and
|
||
always contain 0;
|
||
|
||
(* V1.4: jump-value: reserved * 32;
|
||
space between is used for song
|
||
text;
|
||
[reserved * 32] = RES ! )
|
||
|
||
48+RES 1 byte Number of Samples (NOS)
|
||
49+RES NOS * 64 SampleStruct Sample Struct (see Sample Structure)
|
||
|
||
Patt_Seq = 48 + (NOS * 64) + RES
|
||
|
||
Patt_Seq 256 byte Pattern Sequence
|
||
Patt_Seq+256 1 byte Number Of Channels (NOC) Base 0
|
||
Patt_Seq+257 1 byte Number Of patterns (NOP) Base 0
|
||
|
||
(* V1.5: PAN-Position Table
|
||
Length: NOC * 1byte
|
||
[0 left] - [0F right] )
|
||
|
||
NOC+Patt_Seq+258 varies EventStruct Pattern Data (See Event Structure)
|
||
|
||
______________________________________________________________________________
|
||
The remainder of the file is the raw sample data. (signed)
|
||
______________________________________________________________________________
|
||
|
||
That should about cover it. If you have any questions , feel free
|
||
to e-mail me at
|
||
freejack@shell.portal.com
|
||
|
||
I can also be contacted on The UltraSound Connection (813) 787-8644
|
||
The UltraSound Connection is a BBS dedicated to the Gravis Ultrasound Card.
|
||
|
||
Also I'm the author of Ripper and Gvoc. If anyone has any questions or problems,
|
||
please contact me.
|
||
|