{
JOE DICKSON

> Hello there.. I was just wondering if anyone had any idea
> on how to play a wav/voc File over the pc speaker. I have a
> Program called PC-VOICE, written by Shin K.H. (Is he here?)
> that will play voc's and wav's (whats the difference?) over
> the speaker.. I don't know assembly, just pascal, but I've
> got a friend that can show me how to link the assembly stuff
> in With the Pascal, so that shouldn't be a problem..
> Also, I've tried and failed to find the format of a voc/wav
> File, so if anyone has that, it would be much appriciated.
}

Header-- CT-VOICE Header Block
-=-
The header is a data block that identifies the File as a CT-format File.  This
means that you can use the header to check whether the File is an actual
CT-format File.

Bytes $00 - $13 (0-19)

The first 19 Bytes of a VOC File contain the Text "Creative Voice File", as
well as a Byte With the value $1A.  This identifies the File as a VOC File.

Bytes $14 - $15 (20-21)

These Bytes contain the offset address of the sample data as a
low-Byte/high-Byte value.  At this point, this value is $001A because the
header is exactly $1A Bytes long.

However, if the length of the header changes later, the Programs that access
the VOC data in this File will be able to use the values stored in these two
Bytes to determine the location at which the sample data begins.

Bytes $16 - $17 (22-23)

These two Bytes contain the CT-Voice format version number as a
low-Byte/high-Byte value.  The current version number is still 1.10 (NOTE--This
may have changed, this was published in 92) so Byte $17 contains the main
version number ($01) and Byte $16 contains the version subnumber ($0A).  The
version number is very important because later CT-Voice format versions may use
an entirely different method For storing the sample data than the current
version.

To ensure that the data contained in the File will be processed correctly, you
should always check the File's version number.  if a different version number
appears, an appropriate warning should be displayed.

Bytes $18 - $19 (24-25)

The importance of the version number is obvious in Bytes $18 and $19.  These
Bytes contain the complement of the version number, added to $1234, as a
low-Byte/high-Byte value.

Therefore, With the current version number $010A, Byte $18 contains the value
$29, While Byte $19 contains $11.  This results in the Word value $1129.  If
you check this value and succesfully compare it to the version number stored in
the previos two Bytes, you can be almost certain that you're using a VOC File.

This completes the desciprtion of Bytes contained in the header.  Everything
that follows these Bytes in the File belongs to the File's data blocks.

The Data Blocks--  The eight data blocks of the CT-Voice format have the same
structure, except For block 0.  Each block begins With a block identifier,
which is a Byte containing a block-Type number between 0 and 7.  This number is
followed by three Bytes specifying the length of the block, and then the
specified number of additional data.

The three length Bytes contain increasing values (i.e., the first Byte
represents the lowest value and the third Byte represents the highest).  SO the
block's length can be calculated by using the formula:

Byte1 + Byte2*256 + Byte3*65536

In all other cases, the CT-Voice format stores values requiring more than one
Byte in a low Byte followed by  a high-Byte, which corresponds to the Word data
Type.

Block 0 - end Block

The end block has the lowest block number.  It indicates that there aren't any
additional data blocks.  When such a block is reached, the output of VOC data
during the playback of digitized Sounds stops.  Therefore, this block should be
located only at the end of a VOC File.  The end block is the only block that
doesn't have Bytes indicating its block length.

+----------------------------+
| STRUCTURE of THE end BLOCK |
|                            |
| Block Type: 1 Byte = 0     |
| Block Length: None         |
| Data Bytes: None           |
+----------------------------+

Block 1 - New Voice Block

The block Type number 1 is the most frequently used block Type.  It contains
playable sample data.  The three block length Bytes are followed by a Byte
specifying the sampling rate (SR) that was used to Record the Sounds.

Calculatin The Sampling Rate-- Since only 256 different values can be stored in
a singly Byte, the actual sampling rate must be calculated from the value of
this Byte.

Use the following formula to do this:

  Actual_sampling_rate = -1000000 div (SR - 256)

To convert a sampling rate into the corresponding Byte value, reverse the
equation:

  SR = 256 - 1000000 div actual_sampling_rate

The pack Byte follows the SR Byte.  This value indicates whether and how the
sample data have been packed.

The value 0 indicates that the data hasn't been packed; so 8 bits form one data
value.  This is the standard Recording format.  However, your Sound Blaster
card is also capable of packing data on a hardware level. (good luck trying to
recreate that)

A value of 1 in the pack Byte indicates that the original 8 bit values have
been packed to 4 bits.  This results in a pack rate of 2:1.  Although the data
requires only half as much memory, this method also reduces the Sound quality.

The value 2 indicates a pack rate of 3:1, so the data requires only a third of
the memory.  Sound quality reduces significantly.

A pack Byte value of 3 indicates a pack rate of 4:1, so 8 original bits have
been packed down to 2.  This pack rate results in A LOT of reduction in Sound
quality.

The pack Byte is followed by the actual sample data.  The values contained in
the block length Bytes also indicate the length of the sample data.  To
determine the length of the actual sample data in Bytes, simply subtract the SR
and pack Bytes from the block length.

+---------------------------------+
| STRUCTRE of THE NEW VOICE BLOCK |
|                                 |
| Block Type: 1 Byte = 1          |
| Block Length: 3 Bytes           |
| SR Byte: 1 Byte                 |
| Pack Byte: 1 Byte = 0,1,2,3     |
| Data Bytes: X Bytes.            |
+---------------------------------+

Block 2 - Subsequent Voice Block

Block Type 2 is used to divide sample data into smaller individual blocks. This
method is used by the Creative Labs Voice Editor when you want to work With a
sample block that's too large to fit into memory in one piece.  This block is
then simply divided into several smaller blocks.

Since these blocks contain only three length Bytes and the actual sample data,
blocks of Type 2 must always be preceded by a block of Type 1.  So, the
sampling rate and the pack rate are determined by the preceeding block Type 1.

+-----------------------------------------+
| STRUCTURE of THE SUBSEQUENT VOICE BLOCK |
|                                         |
| Block Type: 1 Byte = 2                  |
| Block Length: 3 Bytes                   |
| Data Bytes: X Bytes                     |
+-----------------------------------------+

Block 3 - Silence Block

Block Type 3 Uses a small number of Bytes to represent a mass of zeros.  First
there are the three familiar block length Bytes.  The length of a silence block
is always 3, so the lowest Byte contains a three, and then the other two Bytes
contain zeros.

The length Bytes are followed by two other Bytes, which indicate how many zero
Bytes should be replaced by the silence block.

This is followed by a Byte that indicates the sampling rate For the silence
block.  The SR Byte is encoded in the same way as indicated in block Type 1.

Silence blocks can be used to insert longer paUses or silences in a sample,
which reduces the required data to a few Bytes.  The Voice Editor will insert
these silence blocks through the Silence Packing Function.

+--------------------------------+
| STRUCTURE of THE SILENCE BLOCK |
|                                |
| Block Type: 1 Byte = 3         |
| Block Length: 3 Bytes = 3      |
| Duration: 2 Bytes              |
| Sample Rate: 1 Byte            |
+--------------------------------+

Block 4 - Marker Block

The marker block is an important element of the CT-Voice format.  It also has
three block length Bytes followed by two marker Bytes.  The block length Bytes
always contain the value 2 in the lowest Byte.

When the playback routine of "CT-VOICE.DRV" encounters a marker block, the
value of the marker Byte is copied to a memory location that was specified to
the driver.  The marker block is often used to determine where exactly in
playback you are.  This is useful For synchronizing the action of your Program
with the playback, For a Graphical intro For example.

Using the Voice Editor, you can divide large sample data blocks into smaller
ones, inserting marker blocks at important locations.  This doesnt affect the
playback of the sample.  However, you'll be able to determine, from your
Program, which point of the sample the playback routine is currently reading.

+-------------------------------+
| STRUCTURE of THE MARKER BLOCK |
|                               |
| Block Type : 1 Byte = 4       |
| Block Length: 3 Bytes = 2     |
| Marker: 2 Bytes               |
+-------------------------------+

Block 5 - Message Block

It's also possible to insert ASCII Texts Within a VOC File.  Use the message
block to do this.  if you want to identify a specific seciont of a sample File
by adding a title, simply add a block of Type 5, in which you can then store
the desired Text.

This block also has three block length Bytes.  These Bytes are followed by the
Text in ASCII format.  The Text must contain a 0 in the last Byte to indicate
the end of the Text.  This corresponds to the String convention of the C
Programming language.  This allows you to pring the Texts in a VOC File
directly from memory using the printf() Function in ANSI C.

+--------------------------------+
| STRUCTURE of THE MESSAGE BLOCK |
|                                |
| Block Type: 1 Byte = 5         |
| Block Length: 3 Bytes          |
| ASCII Data: X Bytes            |
| end Character: 1 Byte = 0      |
+--------------------------------+

Block 6 - Repeat Block

Another special Characteristic of the CT-Format is that it's possible to
specify, Within a VOC File, whether specific sample sequences should be
Repeated.  Blocks 6 and 7 are used to do this.

Block 6 has three block length Bytes, followed by two Bytes indicating how
often the following data block should be Repeated.  if the value specified here
is 4, the next block is played a total of five times (one "normal" playback and
four Repeats).

+-------------------------------+
| STRUCTURE of THE Repeat BLOCK |
|                               |
| Block Type: 1 Byte = 6        |
| Block Length: 3 Bytes = 2     |
| Counter: 2 Bytes              |
+-------------------------------+

Block 7 - Repeat end Block

Block 7 indicates that all blocks between block 6 and block 7 should be
Repeated.  With this block, several data blocks can be included in a Repeat
loop.  However, nested loops aren't allowed.  The driver is capable of handling
only one loop level.

Block Type 7 also has three block length Bytes, which actually aren't necessary
because this block doesnt contain any additional data.  Therefore, the block
length is always 0.

+-------------------------------+
| STRUCUTRE of Repeat end BLOCK |
|                               |
| Block Type: 1 Byte = 7        |
| Block Length: 3 Bytes = 0     |
+-------------------------------+

We've now described all the different block Types used in VOC Files.  These
Functions are fully supported by the CT-VOICE.DRV driver software.

if you'll be writing your own Sound Programs, you should follow this format
because it's easy to use and flexible.  When needed, new block Types are easily
added.  Programs that dont recognize block Types should be written so they
continue operating after an unrecognized block.  This is easy to do because
each Function specifies its own block length.

BiblioGraphy: Stolz, Axel  "The Sound Blaster Book", Abacus Copyright (c)1992,
A Data Decker Book Copyright (c) 1992

