1.0.0
Copyright © 2004 Rene Schallner
Permission to use, copy, modify and distribute this documentation for any purpose and without fee is hereby granted in perpetuity, provided that the above copyright notice and this paragraph appear in all copies.
The copyright holders make no representation about the suitability of this document for any purpose. It is provided “as is” without expressed or implied warranty.
Abstract
Description of the ICQ sound scheme file format.
Table of Contents
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:
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.
The size of the contained sound file in bytes.
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 Section 2, “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.
Table 1. 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 |
This section provides as much infornation about the archive format of ICQ Sound Scheme files as is necessary to programmatically read or generate them.
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.
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
![]() | Important |
|---|---|
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. | |
![]() | Note |
|---|---|
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:
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.
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?
![]() | Important |
|---|---|
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.
Example 1. 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.
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.
To summarize and further illustrate the information provided by the last two sections, an outline of a complete file follows below.
![]() | Note |
|---|---|
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. | |
Table 2. 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 |
Table 3. 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 |