Adding Sounds to Tracks
In order to do this you're going to need a hex editor. I use FRHED as
it's simple enough for me to understand, it does what I want it to do
and it's free! You can get it HERE
When using a hex editor I prefer to have it show 16 bytes per line as
this seems to make more sense (as we're dealing with hexadecimal, i.e
base 16). You don't have to do this of course, I just thought I'd
mention it :-) You'll also probably want Paul Hoad's GPL Track Editor
(sometimes known as just GPL Editor) although you can add sounds without it; I don't know where you can get
this from but a search at Race Sim Central will probably point you in the right direction.
Hex, bytes, nodes, offsets....???
Hex - I won't attempt to
explain hexadecimal; the FRHED help file does this pretty well anyway.
Hex numbers are usually written with a preceding 0x, e.g 0x10 = decimal
16. Note that the 0x is not
part of the number, it's just there to show that what follows is
hexadecimal(i.e 10). In this tutorial I haven't always stuck to this
convention as we're dealing with hex most of the time so it's easier to
state when a number isn't hex than when it is :-)
Bytes - Again, the FRHED help
file is worth looking at for more about bytes. If you can't be bothered
to read that then bear these things in mind when dealing with bytes and
a hex editor:
- one byte is shown as two 'digits' - e.g 4f is one byte, not two.
(hexadecimal numbers, that is) are shown least significant byte first -
in other words, the bytes are shown 'backwards'. This is
important to remember that one byte is two 'digits' : 1a2b3c4d
will be shown in a hex editor as 4d 3c 2b 1a (not d4 c3 b2 a1)
- if you use
Windows calculator note that it doesn't display preceding zeros. It's
probably best to consider all numbers as being 4-byte
numbers as this is what you're be dealing with most of the time. So if
the calculator shows 1ab, look at it as 4 bytes with all
preceding zeros: 000001ab; in a hex editor this be seen as ab 01 00 00
Nodes - Don't worry about
nodes, and don't worry about the fact that they're called "nodes"
- for the purposes of adding sounds to tracks the main thing to
know is what the relevant nodes look like in a hex editor, and which
parts you need to edit to make something happen. This is explained
Offsets - A 3do consists of
different sections; within any of those sections a particluar byte can
be said to be a certain 'distance' from the start of that section, with
the distance measured in bytes. E.g if this was a section: 00 00 00 00
FF 00 00 00, the 'FF' has an offset of 3 (bytes) from the start
of the section. If we wanted to reference 'FF' from somewhere else we
could do it by giving its offset, i.e 3.
Okay not the greatest explanations.... for more (and better) info on 3dos, nodes and offsets visit Guru's GPL File Formats
Three things are needed for a track to have to sounds: the track 3do
must have an ssourcelist section (which references other 3dos on the
track to be used as sound sources); the referenced objects must also
have an ssourcelist section (different to the track one - this tells
GPL to actually 'play' the sounds); the track folder must have files
called crowd.wav and/or announce.wav. If both these files are in the
track folder then both sounds will be heard at the sound sources. I
haven't been able to find a way of 'splitting' them and I doubt it's
possible as all the Papy tracks which use both sounds play them
together, so I presume if it were possible to play only one then Papy
would have done this.
Restoring sounds to Papy tracks
Some of the orignal tracks have been updated in a way which means the
track 3dos have lost the ssourcelist section. Putting the sound back is
slightly easier than adding sounds to a track that never had any as to
start with the 3dos which are the sound sources already have the
ssourcelist section (or most of them do; some have been edited and the
ssourcelist section lost). Also much of the data can be copied from the
orignal (unedited) tracks so there's not as much to do. If you want to
add sounds to non-Papy tracks you should read this section first as
much of the info is still relevant.
Adding string "ssourcelist"
This process is the same for both track 3dos and non-track 3dos.
Strings are the names of files and other bits an pieces that the 3do
uses. All the names of the mips, srbs, sub-3dos, etc are strings and
they're stored in the STRN section. Note they're not stored with the
file extension, e.g asphalt.mip will be just asphalt in the STRN section.
1. Open 3do in a hex editor and find the end of the STRN section. The easiest way to do this is to
use the "find" tool and search for MIRP; the end of the STRN section will
then be a few bytes before this and will be FF in hex and shown as a y with
two dots above it in the text window.
End of STRN section:
2. Position the cursor at this byte (i.e click on it) and switch
to INSERT mode (press the insert key to switch between overwrite and
insert modes); then type 73 73 6f 75 72 63 65 6c 69 73 74 00. (You can
also type "ssourcelist" (without quotes) directly in the text window
but remember to then add 00 to the end in the hex window afterwards.)
3. Now you need to update the STRN section header so that it has the
correct data for the length of the section, which has now increased by
12 bytes (length of section means the number of bytes in the section,
not including the header). So scroll up to the top of the STRN section
(or just search
for NRTS) to find the header. Add 0xC to the number shown as the
section length to get the new section length and type this in; make
sure that you're in OVERWRITE mode.
And that's it for the string. It's a good idea to save the file now,
partly as a back-up if it all goes wrong later but mainly so that the
track can be opened in GPLeditor as a reference for the string offsets which you'll need later. Before saving you need
to update the 3do header so that it has the correct data for the
section length (i.e the file size). This is very easy to work out as
it's just the total file size (in bytes) minus 12. The file size is
shown in the bottom-right corner in FRHED (in decimal). The 3do header
is the first 12 bytes of the file and the section length is bytes 8 -
11 (counting starts at 0) so just subtract 12 from the file size,
convert to hex and type the number in (make sure you're OVERWRITE
mode). Then save .
Adding ssourcelist and HAND sections to track 3do
Some of this can be done by copying the data from the original Papy
tracks and then pasting it back into the new track; however you will
still need to edit some offsets. It's not difficult, you just need to
keep your wits about you! To make it a bit easier I've made some files
which contain only the data needed from the Papy tracks. i.e the
ssourcelist section and the HAND section - download the zip HERE Note these file won't
actually do anything - it just seemed the easiest way of getting the
data into a copyable form :-) In case you're interested (and in case
I've made a mistake) the ssourcelist sections of the Papy tracks are
all at the start of the PRIM section (well, 4 bytes after the start -
the first 4 bytes are the offset for the start of the section (which is
somewhere near the end of the file...the whole things is upside down)).
T-E and T-13 nodes total 48 bytes, thus 48* the number of sound
sources + 8 ( T-4, number of offsets) + (4*number of sound
sources) = the number of bytes in the ssourcelist section. (In case
interested, the reason I'm putting the ssourcelist at the end of the
file is because if it's put back where it came from all the other
offsets in the PRIM section would have to be changed, and I'm not interested in
doing that :-))
1. Open <trackname>_ssourcelist file in hex editor and select all the data. Copy this to the clipboard.
2. Open the track in the hex editor. Scroll right down to the end of
the file and position the cursor after the last byte. Paste the data
here. (You'll need to choose 'insert' in the paste dialog box)
End of file:
3. Now you need to edit the offsets, so first you need to know what a T-E node and a T-13 node looks like in a hex editor.
This node is used to define a sub-3do in another 3do, in this
case a sound source within the track 3do. It consists of 12 bytes - the
first 4 bytes are 0e 00 00 00; the next 4 bytes are the string offset;
the last 4 bytes are always 00 00 00 00
The string offset references the string in the STRN section for the
object which is used as a sound source. This needs to be edited so that
it points to the correct string - the string name willl be the same,
but it's position in the STRN section may be different to what it
was originally. The easiest way to find out the string offset is to
open the track in GPL Editor and look at the STRN section. You can
expand the STRN section by clicking on +
STRN section in GPL Editor:
The numbers in brackets are the string offsets. (These are shown
in decimal in GPL Editor so you need to convert to hexadecimal.) Find
the string in the list and enter the offset into bytes 4-7 of the T-E
node in the hex editor. (See the table further down the page for a list
of all the strings which are referenced for sound sources by each of
This node is used to define the position (co-ordinates, rotation and
scale) of the sub-3do in the T-E node. It consists of 36
bytes - the first 4 bytes are 13 00 00 00; the next 28 bytes
define the object's position and scale (4 bytes each for x, y, z,
x-rotation, y-rotation, z-rotation, scale) - these don't need to be
changed. The last 4 bytes are the offset in the PRIM section for the
T-E node which immediately precedes the T-13 node in the file.
The offset for the T-E node can be found by subtracting the offset in the whole file
of the start of the PRIM section by the offset (in the whole file) of
the start of the T-E node. So now you need to find the start of the
PRIM section - use the "find" tool and search for MIRP (may need to search 'up'). The PRIM section
has a header of 12 bytes, and the section starts with the first byte
Start of PRIM section:
If you position the cursor at the first byte of the PRIM section
the offset for this in the whole file will be shown in the bottom-left
corner (both in decimal and hex)
Make a note of this as you'll need it several times! Now go back down
to the T-E and T-13 nodes and position the cursor at the first byte
(0e) of the T-E node. T-E offset minus start of PRIM offset equals offset in PRIM section of the T-E node. This is the value you need to enter in the last 4 bytes of the T-13 node.
Do the same for all the other T-E and T-13 nodes! The number of
T-E/T-13 pairs will vary depending on how many sound sources the track
NOTE: when used in the ssourcelist the T-13 and T-E nodes don't
actually place an object; they just specify the co-ordinates of the
sound source. Usually you'll want your sound to come from the relevant
object but this doesn't have to be the case. This means that you could
actually just use the same string offset for all the T-E nodes (as
long as the object it references has the ssourcelist section) - the
co-ords in the T-13 will define where the sounds comes from.
4. After the T-E and T-13 nodes there'll be one T-4 node. This node
references all the T-13 nodes so obviously its length will depend on
how many T-13 nodes there are in the ssourcelist but the first 4 bytes
will always be 04 00 00 00; the next 4 bytes will be the number of
T-E/T13 pairs in the ssourcelist (i.e the number of offsets in the T-4
node); then there'll be the offsets for the T-13 nodes, which are 4
bytes each. These are what you'll need to edit.
The offsets for the T-13 nodes can be calculated in the same way as the T-E offsets, i.e T-13 offset minus
start of PRIM section. The order is from top to bottom, so bytes 8-11
of the T-4 node will be the offset for the first T-13 in the file,
bytes 12- 15 for the next T-13, etc. The whole structure of the
ssourcelist might make more sense when seen in GPL Editor (note GPL
Editor uses decimal for node types, so T-E = 14 and T-13 = 9)
ssourcelist in GPL Editor:
5. Now you need to edit the HAND section. There's two things to
change here, the string offset and the offset which points to the start
of the ssourcelist.
The string offset is the offset in the STRN section of the
"ssourcelist" string. This can be found by looking at the list of
strings in the STRN section in GPL Editor.
The offset to the start of the ssourcelist points at the T-4 node, so start of T-4 node minus start of PRIM section gives the value that need to be entered here.
6. Next you need to update the PRIM header so that the data for the
section length is correct. The length of the PRIM section is start of
HAND section minus start of PRIM section. This is then entered in bytes 8 - 11 of the PRIM header.
The last thing to be done is to update the 3do header so the
data for the size of the file is correct. This was described earlier.
Then save, and that's it. :-)
EDIT - d'oh!!! Although the
above method will work it's not actually necessary to add all the new
T-E and T-13 nodes as these already exist in the track 3do. As
mentioned the ssourcelist consists of a T-4 node which contains offsets
that point to all the objects which are sound-sources; so all that
needs to be done is to find the offsets in the track 3do for these
objects and add these to the T-4 node. Finding these offsets is not
difficult but it take a while as it basically means searching the 3do
for the required objects, but this might be preferable to hex-editing a
load of new T-E and T-13 nodes :-) So the process would now be: 1) add
"ssourcelist" string; 2) add T-4 node at end of file and
add the offsets for sound-source objects (note no need to add T-E and
T-13 nodes); 3) add HAND section
Sound sources for Papy tracks
Here are the names of the objects that each track uses as sound
sources. Some objects are used more than once - the purpose of the list
is to show the strings in the order they appear in the ssourcelist
section of the track 3do. For some reason the Nurburgring doesn't have
an ssourcelist; for some other, slightly more curious reason the Spa track 3do has ssourcelist but the object it references doesn't.....
| 1. grndst1
| 1. garage
Not used -
does not have
Adding ssourcelist and HAND sections to non-track 3dos
This is a lot less complicated than with the track 3dos as the
ssourcelist section is always the same and there's only three offsets
1. First you need to add the string "ssourcelist" to the STRN section.
This can be done in a hex editor in the same way as for a track 3do;
however it's much easier to use GPL Editor - just click the 'add new
string' button and type in "ssourcelist" (Note this can't be done for
track 3dos as GPL Editor cannot save a track 3do) This is the only part
of adding sounds that can be done in GPL Editor - everything else
requires a hex editor :-(
New string in GPL Editor:
2. The ssourcelist section for a 3do consists of one T-4 node and one
T-10 node; the T-10 node is the one which makes sounds happen. This can
go at the end of the PRIM section, which will probably be at the end of
the file BUT if the object has a collision volume there'll be a HAND
section at the end - in this case the ssourcelist (T-4 and T-10 nodes)
must come before the HAND
section (but still at the end of the PRIM section). Either way,
the data you have to add will be the same, which is as follows:
10 00 00 00 02 00 00 00 00 00 00 00 00 00 00
00 - this is the T-10 node. Immediately after comes the T-4 node: 04 00
00 00 01 00 00 00 ....and then 4 bytes for the offset to
the T-10 node. (start of T-10 node minus start of PRIM section equals offset)
3. Then comes the HAND section. If the 3do doesn't already have a HAND
section you'll need to add one. It will be 20 bytes as follows:
44 4e 41 48 00 00 00 00 08 00 00 00 string offset
(4 bytes) offset to start of ssourcelist, i.e T-4 node (4 bytes)
3do HAND section:
If the 3do does already have a HAND section then you'll need to
edit it so it also references the ssourcelist. All that needs to be
done is to add the string offset and offset for the ssourcelist, and
then update the HAND header so the section-length data is correct, i.e
3do HAND section - collision and ssourcelist:
4. Finally update the PRIM header and 3do header for the correct section lengths, and save :-)
Adding sounds to other tracks
This is a bit more complicated than adding sounds to Papy tracks but
the basic principal is the same - add "ssourcelist" string, add
ssourcelist section, add HAND section. However all the nodes will have
to be made from scratch, although this isn't really too difficult once
you get used to how a node looks in a hex editor.
The procedure is the same for Papy tracks, so first you add the
"ssourcelist" string. Then you add the ssourcelist itself, but instead
of pasting data at the end of the PRIM section you need to make it
yourself - T-E node first, then the T-13 which references this
T-E. Add as many pairs of T-E and T-13 nodes as you want sound sources,
then add the T-4 node which will reference the T-13s. Finally add the
HAND section and update the PRIM and 3do headers. Now all that in more
Always 12 bytes. The only part you need to edit is bytes 4-7, which is the string offset....
Always 36 bytes....
The co-ordinates are all absolute co-ordinates, i.e they are offset
from the x=0 y=0 z=0 point of the track (exactly where this is will
vary from track to track). Dave Noonan's 3doEd utility has an option
"list inserts" which will produce a text file listing the absolute
co-ords of all the objects in the track.
The rotation values are all in radians.... but the list of inserts
shows rotation in degrees, so you'll need to convert into radians - THIS SITE can help with that.
The scale is always 1 (0x3f800000)
The co-ords, rotation and scale are all 'floats' (numbers with decimal
points). Windows calculator won't convert floats to hex, but THIS SITE will :-)
The offset points to the T-E which precedes the T-13 node (although it
doesn't have to; it's just probably best to stick to this structure)
This will vary in length depending on how many offsets it has, i.e how many T-13/T-E pairs (sound sources) there are....
I guess the main thing to be sure of here is that the number given as
the number of offsets does actually match the number of offsets! And as
always, make sure the offsets do point to where they're supposed to.
This is always 20 bytes when used in the track 3do....
The section length will always be 8 for the HAND section in a track
3do; the string offset points to the "ssourcelist" string in the STRN
..and that's it. I hope this all makes sense, if not straight away then
maybe eventually! There's no doubt some things I've forgotten to
mention or haven't explained very well - any questions/complaints then
post on THIS THREAD at Race Sim Central. :-)
last updated 20/5/06