The ICQ Sound Scheme Format

1.0.0

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

1. What are Sound Scheme Files?
2. ICQ Sound Event Types
3. File Format Details
3.1. Overview
3.2. Header
3.3. Data Section
3.4. "The Big Picture"

1. 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 Section 2, “ICQ Sound Event Types”.

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

3. 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.

3.1. 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.

3.2. Header

The header of an ICQ sound scheme file carries the names and sizes of the contained sound files and consists of two parts:

  1. The size in bytes of the array following below (fileinfo-array-size)

  2. An array of 29 sound file information entities

[Important]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]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:

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?

[Important]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.

3.3. 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.

3.4. "The Big Picture"

To summarize and further illustrate the information provided by the last two sections, an outline of a complete file follows below.

[Note]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

AddressLengthData
0x0000 00000x0004Header Length = 0x000001C7
0x000000040x0009File Name 0 = "Auth.wav\0"
0x0000000D0x0004File Size 0 = 0x00004F87
0x000000110x0009File Name 1 = "Chat.wav\0"
0x0000001A0x0004File Size 1 = 0x0001429E
0x0000001E0x000DFile Name 2 = "External.wav\0"
0x0000002B0x0004File Size 2 = 0x0000316C
0x0000002F0x0009File Name 3 = "File.wav\0"
0x000000380x0004File Size 3 = 0x00007A8F
0x0000003C0x000DFile Name 4 = "ChatBeep.wav\0"
0x000000490x0004File Size 4 = 0x000349E8
0x0000004D0x000AFile Name 5 = "EMail.wav\0"
0x000000570x0004File Size 5 = 0x00010E95
0x0000005B0x000CFile Name 6 = "Startup.wav\0"
0x000000670x0004File Size 6 = 0x000275B2
0x0000006B0x000CFile Name 7 = "Message.wav\0"
0x000000770x0004File Size 7 = 0x000115D2
0x0000007B0x0008File Name 8 = "URL.wav\0"
0x000000830x0004File Size 8 = 0x0000A194
0x000000870x000BFile Name 9 = "Notify.wav\0"
0x000000920x0004File Size 9 = 0x0002BF15
0x000000960x000BFile Name 10 = "Online.wav\0"
0x000000A10x0004File Size 10 = 0x00018E94
0x000000A50x000BFile Name 11 = "System.wav\0"
0x000000B00x0004File Size 11 = 0x0000F0A6
0x000000B40x000CFile Name 12 = "Contact.wav\0"
0x000000C00x0004File Size 12 = 0x0000B82B
0x000000C40x000AFile Name 13 = "Phone.wav\0"
0x000000CE0x0004File Size 13 = 0x0001DADE
0x000000D20x000DFile Name 14 = "Reminder.wav\0"
0x000000DF0x0004File Size 14 = 0x0001AE8A
0x000000E30x000BFile Name 15 = "Global.wav\0"
0x000000EE0x0004File Size 15 = 0x000068F8
0x000000F20x000CFile Name 16 = "Picture.wav\0"
0x000000FE0x0004File Size 16 = 0x000020B5
0x000001020x000DFile Name 17 = "HomePage.wav\0"
0x0000010F0x0004File Size 17 = 0x0001778F
0x000001130x000CFile Name 18 = "MsgType.wav\0"
0x0000011F0x0004File Size 18 = 0x00000EAC
0x000001230x000CFile Name 19 = "MsgBell.wav\0"
0x0000012F0x0004File Size 19 = 0x00001514
0x000001330x000CFile Name 20 = "MsgSent.wav\0"
0x0000013F0x0004File Size 20 = 0x000024E2
0x000001430x000CFile Name 21 = "MsgBack.wav\0"
0x0000014F0x0004File Size 21 = 0x000007B9
0x000001530x000DFile Name 22 = "Birthday.wav\0"
0x000001600x0004File Size 22 = 0x00005BDA
0x000001640x000BFile Name 23 = "Plugin.wav\0"
0x0000016F0x0004File Size 23 = 0x000033C2
0x000001730x000CFile Name 24 = "ChatLOL.wav\0"
0x0000017F0x0004File Size 24 = 0x0000C91A
0x000001830x000EFile Name 25 = "ChatEmote.wav\0"
0x000001910x0004File Size 25 = 0x000025CC
0x000001950x000FFile Name 26 = "ChatAction.wav\0"
0x000001A40x0004File Size 26 = 0x00001E3C
0x000001A80x000DFile Name 27 = "FileDone.wav\0"
0x000001B50x0004File Size 27 = 0x0001C5BB
0x000001B90x000EFile Name 28 = "WebSearch.wav\0"
0x000001C70x0004File Size 28 = 0x0000128E

Table 3. The Data Section

AddressLengthData
000001CB00004F87Contents of file 0
000051520001429EContents of file 1
000193F00000316CContents of file 2
0001C55C00007A8FContents of file 3
00023FEB000349E8Contents of file 4
000589D300010E95Contents of file 5
00069868000275B2Contents of file 6
00090E1A000115D2Contents of file 7
000A23EC0000A194Contents of file 8
000AC5800002BF15Contents of file 9
000D849500018E94Contents of file 10
000F13290000F0A6Contents of file 11
001003CF0000B82BContents of file 12
0010BBFA0001DADEContents of file 13
001296D80001AE8AContents of file 14
00144562000068F8Contents of file 15
0014AE5A000020B5Contents of file 16
0014CF0F0001778FContents of file 17
0016469E00000EACContents of file 18
0016554A00001514Contents of file 19
00166A5E000024E2Contents of file 20
00168F40000007B9Contents of file 21
001696F900005BDAContents of file 22
0016F2D3000033C2Contents of file 23
001726950000C91AContents of file 24
0017EFAF000025CCContents of file 25
0018157B00001E3CContents of file 26
001833B70001C5BBContents of file 27
0019F9720000128EContents of file 28