Difference between revisions of "SCUMM/Technical Reference/Sound resources"
Jestar jokin (talk | contribs) m (→Early v5: Clarify SOUN blocks contain the music blocks) |
Jestar jokin (talk | contribs) m (→Early v5 - SBL blocks: minor clarifications) |
||
Line 32: | Line 32: | ||
==Early v5 - SBL blocks== | ==Early v5 - SBL blocks== | ||
Digitized sounds first appeared in Monkey Island 1 & 2. They are contained in the .001 resource | Digitized sounds first appeared in Monkey Island 1 & 2. They are contained in the .001 resource files, and are sub-blocks of "SOUN" blocks (see the music section above). | ||
Block name 4 bytes ("SBL ") | Block name 4 bytes ("SBL ") | ||
Line 41: | Line 41: | ||
VOC data variable | VOC data variable | ||
AUhd and AUdt are used in Monkey Island, while WVhd and WVdt are used in the non-interactive demo of Sam & Max. The actual sound data is stored in | AUhd and AUdt are used in Monkey Island, while WVhd and WVdt are used in the non-interactive demo of Sam & Max. The actual sound data is stored in the Creative VOC format, without the identifying header. | ||
==Early v5 - CD tracks== | ==Early v5 - CD tracks== |
Revision as of 02:19, 16 March 2009
Music
Todo:
- Adlib, GM, MT-32 etc formats
- Digital
- iMUSE (separate tracks and specific markers in each song format)
Early v5
In Monkey Island 2 (MI2), music blocks are stored in LFLF blocks, outside of the ROOMs, so they can be accessed globally. The containing sound block looks like this:
Block name 4 bytes ("SOUN") Block size 4 bytes Block name 4 bytes ("SOU ") Block size 4 bytes Music block variable
The redundant header is possibly due to building on a legacy implementation, or for easier identification in the table stored in the .000 index file.
The music block may contain any combination of ROL (Roland MT-32), ADL (Adlib/OPL FM), or SPK (PC speaker) blocks. They can also store a single SBL block for digitized sound (described in a later section). Aside from SBL, each of these blocks follow the same basic pattern.
Block name 4 bytes ("ROL ", or "ADL ", or "SPK ") Block size 4 bytes MIDI data variable
Every track is stored in MIDI format, in order to make use of the iMUSE technology through System Exclusive (SysEx) messages.
Due to the predominance of the Sound Blaster and Adlib/OPL FM technology at the time of MI2's release, every musical SOUN block contains an ADL block.
Digitized Sounds
Early v5 - SBL blocks
Digitized sounds first appeared in Monkey Island 1 & 2. They are contained in the .001 resource files, and are sub-blocks of "SOUN" blocks (see the music section above).
Block name 4 bytes ("SBL ") Block size 4 bytes Sound header 4 bytes ("AUhd" or "WVhd") Unknown 3 bytes (always 00 00 80) Data header 4 bytes ("AUdt" or "WVdt") VOC data variable
AUhd and AUdt are used in Monkey Island, while WVhd and WVdt are used in the non-interactive demo of Sam & Max. The actual sound data is stored in the Creative VOC format, without the identifying header.
Early v5 - CD tracks
Games that use CD tracks (Loom/CD, MI1/CD, Zak256/FM-TOWNS) are a bit different. For MI1/CD at least, the "SOU " block size is always 32 bytes and presumably points to the CD track to play.
v5-v6 - MONSTER.SOU
Original
From Indy 4 onwards, sound effects and speech are stored in a separate resource file called "MONSTER.SOU". The format is:
Block name 4 bytes ("SOU ") Block size 4 bytes One or more: Block name 4 bytes ("VCTL") Block size 4 bytes Lip-sync tags variable Sound data variable ("Crea" block / VOC file)
The lip-sync tags provide timing information. In v5 the number of tags is stored in the calling text, according to the formula ((num_tags / 2) << 1) + 8. The "Crea" block is an entire Creative VOC file.
Compressed
ScummVM can use compressed monster.sou files created with the tool "compress_scumm_sou.exe". Aside from using either MP3, OGG, or FLAC formats for the sound data, they contain a mapping table followed by the sound data, like so:
size_of_table : uint32 size_of_table / 16 times { orig_offset : uint32 actual_offset : uint32 num_tags : uint32 sound_size : unit32 } size_of_table / 16 times { num_tags times { tag : uint8 } sound : sound_size (sound file - MP3/OGG/FLAC) }
Each entry in the table has 4 items, each item is 4 bytes, so a table with one entry has a size of 16.
The original offset is what the game will try to play, the actual offset is taken from after the index table.
Each sound is directly preceded by its lip-synch tags.