The ICQ Sound Scheme Format
Description of the ICQ sound scheme file format.

What are Sound Scheme Files?
Sound scheme files, as used by ICQ, are simple archive files that contain multiple sound files (usually WAVE files). They are used by ICQ to associate certain events with sound notifications.
For instance: ICQ plays a certain sound every time a user receives a new ICQ message. That very sound is part of a sound scheme, which itself is stored in a single file, the ICQ sound scheme file.
Having all the sounds in one file makes it easy to share sound schemes. The following information about each sound file is stored in such an archive:
File Name 	 The file name contained in the archive is the name of the embedded sound file. For instance: Email.wav. There is no path information included in the file name.
File Size 	 The size of the contained sound file in bytes.
ICQ Event Type 	 This information is stored implicitly in the archive. The ICQ event type (eg: 'incoming message', or 'incoming chat request') is defined by the relative position of the sound file within the archive. More information about event types can be found in ICQ Sound Event Types.

ICQ Sound Event Types
What follows is a table of ICQ sound event types. At this point I will not go into details about what each of the event types means, however, the event names should be descriptive enough to get a good feeling for it. Of course, there's always the option of finding out by extracting the sound files you are corious about, listening to them, etc.
The Relative Position in Archive coloumn works like this: The first file in the archive gets position 0 and hence gets associated with the Authorization Message event. The second file in the archive gets position 1, etc.
Interestingly enough, - well, by my experience - the original Mirabilis ICQ client won't let you modify all of these event types but just some of them.

ICQ's Event Types
Absolute Position in Archive	Event Name
0	Authorization Message
1	Chat Request
2	External Application Request
3	File Request
4	ICQ Chat Beep
5	ICQ Email Notification
6	ICQ Startup
7	Incoming Message
8	Incoming URL
9	Notification Message
10	Online Alert
11	System Message
12	Contacts Message
13	Phone Request
14	ICQ Reminder
15	Global Online Alert
16	Picture Request
17	ICQ Homepage Hit
18	Message Typing
19	Message Bell
20	Message Sent
21	Message Backspace
22	Birthday Reminder
23	Plugin
24	ICQ Chat LOL
25	ICQ Chat Emote
26	ICQ Chat Action
27	ICQ File Transfer Done
28	ICQ Websearch Sent

File Format Details
This section provides as much infornation about the archive format of ICQ Sound Scheme files as is necessary to programmatically read or generate them.

Overview
Sound scheme files consist of two major parts:
a HEADER
and a DATA section
While the header just holds meta information such as the names and sizes of the contained sound files - and thereby acts as some sort of archive index - , the data section contains the raw sound file data.

Header
The header of an ICQ sound scheme file carries the names and sizes of the contained sound files and consists of two parts:
The size in bytes of the array following below (fileinfo-array-size)
An array of 29 sound file information entities
All size or length indicators are stored as 4-byte unsigned integers in little endian order. This leads to the following byte order: low byte of the low word, high byte of the low word, low byte of the high word, high byte of the high word.
For those who are not aware of endianities: Assumed that the first byte is b1, the second one b2, etc, the actual value of the little endian 4-byte unsigned integer can be calculated like this:
value = b1 + b2 *256 + b3 * 256^2 + b4 * 256^3
So the first four bytes of a sound scheme file specify the size of the net header, the sound file "infos". With this information it is easy to work out that by adding 4 to that value we get the absolute offset of the data section within the file.
The 29 sound file information entities consist of the following fields each:
File Name	The name of the sound file (including the extension .wav) as zero-terminated ASCII string. Example: EMail.wav. The file name never contains any sort of path information and is always terminated by a zero (0x00) byte.
File Size	An - as usual - 4-byte unsigned integer in little endian order specifying the size of the content of the sound file.
So there are 29 instances of those sound file information entities, one for each ICQ event type - but what if one or more ICQ events have no custom sounds assigned to them?
ICQ Event types that NO sound file is provided for, always have the file name "None" (no extension ".wav") and their file size is set to 0
To illustrate the information provided by this section, a hexdump of a sample header follows below.

Hexdump of a header

00000000  c7 01 00 00 41 75 74 68  2e 77 61 76 00 87 4f 00  |Ç...Auth.wav..O.|
00000010  00 43 68 61 74 2e 77 61  76 00 9e 42 01 00 45 78  |.Chat.wav..B..Ex|
00000020  74 65 72 6e 61 6c 2e 77  61 76 00 6c 31 00 00 46  |ternal.wav.l1..F|
00000030  69 6c 65 2e 77 61 76 00  8f 7a 00 00 43 68 61 74  |ile.wav..z..Chat|
00000040  42 65 65 70 2e 77 61 76  00 e8 49 03 00 45 4d 61  |Beep.wav.èI..EMa|
00000050  69 6c 2e 77 61 76 00 95  0e 01 00 53 74 61 72 74  |il.wav.....Start|
00000060  75 70 2e 77 61 76 00 b2  75 02 00 4d 65 73 73 61  |up.wav.²u..Messa|
00000070  67 65 2e 77 61 76 00 d2  15 01 00 55 52 4c 2e 77  |ge.wav.Ò...URL.w|
00000080  61 76 00 94 a1 00 00 4e  6f 74 69 66 79 2e 77 61  |av..¡..Notify.wa|
00000090  76 00 15 bf 02 00 4f 6e  6c 69 6e 65 2e 77 61 76  |v..¿..Online.wav|
000000a0  00 94 8e 01 00 53 79 73  74 65 6d 2e 77 61 76 00  |.....System.wav.|
000000b0  a6 f0 00 00 43 6f 6e 74  61 63 74 2e 77 61 76 00  |¦ð..Contact.wav.|
000000c0  2b b8 00 00 50 68 6f 6e  65 2e 77 61 76 00 de da  |+¸..Phone.wav.ÞÚ|
000000d0  01 00 52 65 6d 69 6e 64  65 72 2e 77 61 76 00 8a  |..Reminder.wav..|
000000e0  ae 01 00 47 6c 6f 62 61  6c 2e 77 61 76 00 f8 68  |®..Global.wav.øh|
000000f0  00 00 50 69 63 74 75 72  65 2e 77 61 76 00 b5 20  |..Picture.wav.µ |
00000100  00 00 48 6f 6d 65 50 61  67 65 2e 77 61 76 00 8f  |..HomePage.wav..|
00000110  77 01 00 4d 73 67 54 79  70 65 2e 77 61 76 00 ac  |w..MsgType.wav.¬|
00000120  0e 00 00 4d 73 67 42 65  6c 6c 2e 77 61 76 00 14  |...MsgBell.wav..|
00000130  15 00 00 4d 73 67 53 65  6e 74 2e 77 61 76 00 e2  |...MsgSent.wav.â|
00000140  24 00 00 4d 73 67 42 61  63 6b 2e 77 61 76 00 b9  |$..MsgBack.wav.¹|
00000150  07 00 00 42 69 72 74 68  64 61 79 2e 77 61 76 00  |...Birthday.wav.|
00000160  da 5b 00 00 50 6c 75 67  69 6e 2e 77 61 76 00 c2  |Ú[..Plugin.wav.Â|
00000170  33 00 00 43 68 61 74 4c  4f 4c 2e 77 61 76 00 1a  |3..ChatLOL.wav..|
00000180  c9 00 00 43 68 61 74 45  6d 6f 74 65 2e 77 61 76  |É..ChatEmote.wav|
00000190  00 cc 25 00 00 43 68 61  74 41 63 74 69 6f 6e 2e  |.Ì%..ChatAction.|
000001a0  77 61 76 00 3c 1e 00 00  46 69 6c 65 44 6f 6e 65  |wav.<...FileDone|
000001b0  2e 77 61 76 00 bb c5 01  00 57 65 62 53 65 61 72  |.wav.»Å..WebSear|
000001c0  63 68 2e 77 61 76 00                              |ch.wav.|

As you can see, the fileinfo-array-size is 0x0001c7 - encoded as "c7 01 00 00", as required by the little endian byte ordering scheme. Right after the first 4 bytes (file info array size) the file name "Auth.wav" follows, which is terminated by a zero (0x00) byte. The file size of Auth.wav is specified by the 4 bytes following that zero byte. So in our example the size of Auth.wav is 0x00004f87.

Data Section
The data section of the file just holds the raw contents of the sound files, one by one. Sticking to our example, it would contain the contents of Auth.wav followed by the contents of Chat.wav, etc. There is no extra meta information in the data section.

"The Big Picture"
To summarize and further illustrate the information provided by the last two sections, an outline of a complete file follows below.
The trailing "\0" in file names just indicates that the file name strings are terminated by a 0x00 byte.
Additionally, the double quotes in the file names shown below are of course not part of those file names.

The Header
Address	Length	Data
0x0000 0000	0x0004	Header Length = 0x000001C7
0x00000004	0x0009	File Name 0 = "Auth.wav\0"
0x0000000D	0x0004	File Size 0 = 0x00004F87
0x00000011	0x0009	File Name 1 = "Chat.wav\0"
0x0000001A	0x0004	File Size 1 = 0x0001429E
0x0000001E	0x000D	File Name 2 = "External.wav\0"
0x0000002B	0x0004	File Size 2 = 0x0000316C
0x0000002F	0x0009	File Name 3 = "File.wav\0"
0x00000038	0x0004	File Size 3 = 0x00007A8F
0x0000003C	0x000D	File Name 4 = "ChatBeep.wav\0"
0x00000049	0x0004	File Size 4 = 0x000349E8
0x0000004D	0x000A	File Name 5 = "EMail.wav\0"
0x00000057	0x0004	File Size 5 = 0x00010E95
0x0000005B	0x000C	File Name 6 = "Startup.wav\0"
0x00000067	0x0004	File Size 6 = 0x000275B2
0x0000006B	0x000C	File Name 7 = "Message.wav\0"
0x00000077	0x0004	File Size 7 = 0x000115D2
0x0000007B	0x0008	File Name 8 = "URL.wav\0"
0x00000083	0x0004	File Size 8 = 0x0000A194
0x00000087	0x000B	File Name 9 = "Notify.wav\0"
0x00000092	0x0004	File Size 9 = 0x0002BF15
0x00000096	0x000B	File Name 10 = "Online.wav\0"
0x000000A1	0x0004	File Size 10 = 0x00018E94
0x000000A5	0x000B	File Name 11 = "System.wav\0"
0x000000B0	0x0004	File Size 11 = 0x0000F0A6
0x000000B4	0x000C	File Name 12 = "Contact.wav\0"
0x000000C0	0x0004	File Size 12 = 0x0000B82B
0x000000C4	0x000A	File Name 13 = "Phone.wav\0"
0x000000CE	0x0004	File Size 13 = 0x0001DADE
0x000000D2	0x000D	File Name 14 = "Reminder.wav\0"
0x000000DF	0x0004	File Size 14 = 0x0001AE8A
0x000000E3	0x000B	File Name 15 = "Global.wav\0"
0x000000EE	0x0004	File Size 15 = 0x000068F8
0x000000F2	0x000C	File Name 16 = "Picture.wav\0"
0x000000FE	0x0004	File Size 16 = 0x000020B5
0x00000102	0x000D	File Name 17 = "HomePage.wav\0"
0x0000010F	0x0004	File Size 17 = 0x0001778F
0x00000113	0x000C	File Name 18 = "MsgType.wav\0"
0x0000011F	0x0004	File Size 18 = 0x00000EAC
0x00000123	0x000C	File Name 19 = "MsgBell.wav\0"
0x0000012F	0x0004	File Size 19 = 0x00001514
0x00000133	0x000C	File Name 20 = "MsgSent.wav\0"
0x0000013F	0x0004	File Size 20 = 0x000024E2
0x00000143	0x000C	File Name 21 = "MsgBack.wav\0"
0x0000014F	0x0004	File Size 21 = 0x000007B9
0x00000153	0x000D	File Name 22 = "Birthday.wav\0"
0x00000160	0x0004	File Size 22 = 0x00005BDA
0x00000164	0x000B	File Name 23 = "Plugin.wav\0"
0x0000016F	0x0004	File Size 23 = 0x000033C2
0x00000173	0x000C	File Name 24 = "ChatLOL.wav\0"
0x0000017F	0x0004	File Size 24 = 0x0000C91A
0x00000183	0x000E	File Name 25 = "ChatEmote.wav\0"
0x00000191	0x0004	File Size 25 = 0x000025CC
0x00000195	0x000F	File Name 26 = "ChatAction.wav\0"
0x000001A4	0x0004	File Size 26 = 0x00001E3C
0x000001A8	0x000D	File Name 27 = "FileDone.wav\0"
0x000001B5	0x0004	File Size 27 = 0x0001C5BB
0x000001B9	0x000E	File Name 28 = "WebSearch.wav\0"
0x000001C7	0x0004	File Size 28 = 0x0000128E

The Data Section
Address	Length	Data
000001CB	00004F87	Contents of file 0
00005152	0001429E	Contents of file 1
000193F0	0000316C	Contents of file 2
0001C55C	00007A8F	Contents of file 3
00023FEB	000349E8	Contents of file 4
000589D3	00010E95	Contents of file 5
00069868	000275B2	Contents of file 6
00090E1A	000115D2	Contents of file 7
000A23EC	0000A194	Contents of file 8
000AC580	0002BF15	Contents of file 9
000D8495	00018E94	Contents of file 10
000F1329	0000F0A6	Contents of file 11
001003CF	0000B82B	Contents of file 12
0010BBFA	0001DADE	Contents of file 13
001296D8	0001AE8A	Contents of file 14
00144562	000068F8	Contents of file 15
0014AE5A	000020B5	Contents of file 16
0014CF0F	0001778F	Contents of file 17
0016469E	00000EAC	Contents of file 18
0016554A	00001514	Contents of file 19
00166A5E	000024E2	Contents of file 20
00168F40	000007B9	Contents of file 21
001696F9	00005BDA	Contents of file 22
0016F2D3	000033C2	Contents of file 23
00172695	0000C91A	Contents of file 24
0017EFAF	000025CC	Contents of file 25
0018157B	00001E3C	Contents of file 26
001833B7	0001C5BB	Contents of file 27
0019F972	0000128E	Contents of file 28