VOC (Audiocodec)

Creative Voice File (VOC)

Dateiendung:  | `.voc`
MIME-Type:  | `audio/x-voc`
Magische Zahl:  | Creative Voice File
Entwickelt von:  | Creative Labs

Creative Voice, Dateinamenserweiterung `.VOC` (in DOS-üblicher 8.3-Schreibweise) bzw. `.voc`, ist ein Audioformat für digitale Audiodaten für die in den 1990er-Jahren entwickelten Sound-Blaster-Soundkarten von Creative Labs.

Das Format war anfangs auf 8-Bit-Audio beschränkt und wurde mit dem Sound Blaster 16 auf 16-Bit-Audio erweitert (Containerformat). Die Audiodaten sind in Little Endian meist mit PCM oder mit ADPCM kodiert.

## Aufbau

[Bearbeiten | Quelltext bearbeiten]

### Original-Format (8-Bit)

[Bearbeiten | Quelltext bearbeiten]

Das Dateiformat[1][2][3] besteht aus einem 26-Byte großen Header und einer Reihe darauffolgender Datenblöcke, die die Audioinformation enthalten. Die Byte-Reihenfolge ist Little Endian.

VOC-Header Offset (hex)  | Länge (in Byte)  | Inhalt

|
|

`0x00` | 19  | ASCII-Zeichenfolge `Creative Voice File`
`0x13` | 1  | EOF: `1A` (hexadezimal)
`0x14` | 2  | Offset für ersten Datenblock: `1A 00` (hexadezimal)
`0x16` | 2  | Version (Major, Minor), hexadezimal;
Beispielsweise: `0x010a`, Version 1.10[1]
`0x18` | 2  | Validierung: Versionsnummer `+ 0x1234`, hexadezimal;
Beispielsweise: `0x1129`

Auf den Header folgen Datenblöcke. Jeder Datenblock beginnt mit einem Typ-Byte, das den Inhalt der Daten beschreibt, gefolgt von 3 Bytes für die Größe der Daten (als Integerzahl). Bei zwei der 9 definierten Typen fehlt die anschließende Größe der Daten, sodass der Block schließlich nur aus einem einzigen Byte besteht – diese sind `0x00`, der Terminator, und `0x07`, das Wiederholungsende.

Ist eine Größe angegeben, so folgt den ersten 4 Bytes ein Block des Inhalts, der sich aus dem angegebenen Typ ergibt, mit der angegebenen Größe.

VOC-Datenblock  Typ (hex)  | Typ-Beschreibung  | Größe
(3-Byte-Integer)  | Info

|
|
|

engl.  | deu.
`0x00` | Terminator | Trennzeichen | –  | –
`0x01` | Sound data | Audiodaten  | 2+Größe der Daten  |  Audioinhalt  | Offset  | Beschreibung  | Bedeutung

|
|

`0x00` | Abtastrate | 256-(1000000/Sample rate)
`0x01` | Codec | siehe Tabelle
wird ignoriert, wenn davor ein Block des Typs `0x08` (Extra info) einen Codec definiert (ab Version 1.20, neues 16-Bit-Format)
ab `0x02` | Audiodaten im angegebenen Format (Codec)
`0x02` | Sound continue | weitere Audiodaten  | Größe der Daten  | weitere Audiodaten im selben Format wie der vorherige Block
`0x03` | Silence | Stille  | 3  |  Stille  | Offset  | Beschreibung  | Bedeutung

|
|

`0x00-01` | Länge der Stille in der Einheit der Abtastrate  | Integer`-1`
`0x02` | Abtastrate | wie bei Audioinhalt
`0x04` | Marker |  | 2  | Markernummer (2 Bytes)
Der jeweils letzte Marker bleibt beim Abspielen in einem Zwischenspeicher und kann wieder angesprungen werden.
`0x05` | ASCII string | ASCII-Zeichenkette | Länge der Zeichenkette  | Null-terminierte Zeichenkette
`0x06` | Repeat | Wiederholen  | 2  | Anzahl an Wiederholungen (2-Byte-Integer)
`0x0000` bis `0xFFFE` für 1–65.535 Wiederholungen, `0xFFFF` für unendlich
`0x07` | End repeat | Ende der Wiederholung  | –

Die Datei endet optional mit dem Terminator-Block (Datenblock des Typs `0x00`).

### 16-Bit-Formaterweiterung

[Bearbeiten | Quelltext bearbeiten]

Um das bestehende Format auf 16-Bit zu erweitern wurde für den Datenblock ein neues Typ-Byte eingeführt: `0x09`. Die Version im Header muss dabei 1.20 (Hexadezimal `0x0114`) oder neuer sein.

Erweiterer VOC-Datenblock  Typ (hex)  | Typ-Beschreibung  | Größe
(3-Byte-Integer)  | Info

|
|
|

engl.  | deu.
`0x08` | Extra info | Zusätzliche Information  | 4  |  Audioinhalt  | Offset  | Beschreibung  | Bedeutung

|
|

`0x00-01` | Frequenz-Divisor  | `256000000/(nb_channels * (65536 - frequency_divisor))`
`0x02` | Codec | Ersetzt Codec-Informationen in allen auf diesen Block folgenden Audiodaten(blöcken)
`0x03` | Kanäle  | `nb_channels` = Anzahl `-1`, Beispiel: 2 Kanäle → `0x01`
`0x09` | Sound data (new format) | Audiodaten im neuen Format  | `12` \+ Größe der Daten  |  Audioinhalt  | Offset  | Beschreibung  | Bedeutung

|
|

`0x00-03` | Abtastrate |
`0x04` | Bits pro Sample  |
`0x05` | Kanäle  |
`0x06-07` | Codec | siehe Tabelle
`0x08-11` | reserviert
ab `0x12` | Audiodaten im angegebenen Format (Codec)

### Codecs

[Bearbeiten | Quelltext bearbeiten]

Audioinhalt  Codec-ID
(hex)  | Kodierung, Kompression, Codec | Block-Typ

|
|

`0x00` | 8 Bits unsigned PCM | Original (`0x01, 0x02`) und Neu (`0x09`)
`0x01` | 4–8 Bits Creative ADPCM
`0x02` | 3–8 Bits Creative ADPCM (2,6 Bits)
`0x03` | 2–8 Bits Creative ADPCM
`0x04` | 16 Bits signed PCM  | ab Version 1.20; Original (`0x01, 0x02`) und Neu (`0x09`)
`0x06` | A-law
`0x07` | μ-law
`0x0200` | 4–16 Bits Creative ADPCM  | nur neues erweitertes Format (ab Version 1.20; `0x09` und `0x02`)

## Verwendung

[Bearbeiten | Quelltext bearbeiten]

Creative-Voice-Dateien fanden in diversen DOS-Spielen Verwendung, wenn diese für die Audioausgabe Sound-Blaster-Karten verwenden konnten, beispielsweise Eye of the Beholder.[4][5]

Die Verbreitung des Dateiformats verschwand zusehends mit dem Aufkommen von RIFF WAVE, welches in Windows von Microsoft bereits vom Betriebssystem unterstützt wurde. Für das Creative-Voice-Dateiformat mussten hingegen zusätzliche Abspielprogramme installiert werden, die bei den Treibern für die Sound-Blaster-Karten mitgeliefert wurden. Mit dem Aufkommen von AC’97 setzte sich WAVE, Dateiendung `.WAV`, schließlich durch.

## Einzelnachweise

[Bearbeiten | Quelltext bearbeiten]

1. ↑ a b Greg: Greg figures out most of the .VOC Format. In: Programming Textfiles: Format Specifications. Abgerufen am 1. Juni 2018 (englisch).
2. ↑ John: John chimes in with further analysis of the .VOC Format. In: Programming Textfiles: Format Specifications. Abgerufen am 1. Juni 2018 (englisch).
3. ↑ Chris Bagwell: Audio File Formats FAQ. Chris Bagwell, 14. November 1998, S. Kapitel 11: File Formats, abgerufen am 1. Juni 2018 (englisch, Dokumentation (FAQ) des SoX-Audioeditor).
4. ↑ lol.voc. (Wiki) In: Eye of the Beholder Wiki. Abgerufen am 1. Juni 2018 (englisch).
5. ↑ movAX13h/DrRiptideDissected. (GitHub) In: Dr. Riptide Dissected. Abgerufen am 1. Juni 2018 (englisch).