home *** CD-ROM | disk | FTP | other *** search
- {
- 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
-