|
Inferno #01
31 декабря 2000 |
|
For Coderz - The Muse from PC (description of audio file formats).

Description audio formats
File samples
(Sample)
Search and edit by Penetrator (VFHB)
Add by Shaitan / Stars of Keladan
This document describes the file formats
Sound samples for the IBM PC, which
You can use our privacy policy on your favorite
Spectrum. Information for the preparation of this document were
obtained from various sources, so the author is not responsible
for the errors or the accuracy of the assumption in
compiling this document.
Let's first understand, sho si Take
is zvekovaya sampling.
"Sample" - a value that is input to DAC or obtained from the
ADC, usually an integer (either 8 or 16 bits).
Sampling characterizes the amplitude of the signal. The
frequency of sampling is determined by the issuance of
kilohertz (KHz), or samples / second. In addition, the sample
may to go from one channel (mono) or two
(Stereo), or ..., a greater number of channels. Thus, in order
to play sample except her own, you need to know:
- The number of bits per sample (8 / 16 bit, maybe up to 32
bits); - Sampling rate (5KHz/44KHz, possibly
up to 48KHz);
- Number of channels (1/2-mono/stereo possibly up to 4
channels).
There are three types of file format samples, with
extensions:
. SAM,. RAW - just a sampling, you must
know what part of her play.
. WAV - this format from Microsoft.
. VOC - it's from Creative.
R A W - format
Now, guided by the above-described
perametrami, we are able proigrovat data samples.
If the sample is stereo, which means that
first byte is the first channel, then
the second, and if more channels, then bytes is located
respectively on the rising number of the channel. Frequency is
characterized by the issuance of two bytes per second. For
stereo left channel - the first. Knowing Specifies the
settings for some . RAW file, you will be able to play it
correctly.
W A V - Format
This is a RIFF file, which was developed
by Microsoft. It is used in Windows. Therefore it is very
"popular." It is similar to AIFF - format Apple, which is used
for storing high quality audio tools, it is also used by SGI.
It is similar, but not compatible.
At first comes the title RIFF file:
typedef struct {
char id [4];
/ / File ID = "RIFF" =
/ / 0 x 46464952
long len;
/ / Length of the file without this header
} IDRiff;
Sam WAV-file can consist of several pieces and these pieces
may contain a few samples, or some other information. But this
is only theory at the moment we file with the
so perverted not met, therefore - and part of a sample of one.
Title piece WAV:
typedef struct {
char id [4];
/ / Id = "WAVE" = 0x45564157
char fmt [4];
/ / Id = "fmt" = 0x20746D66
long len;
/ / Length of this piece of WAV - file
} IDChuckWave;
Behind him is not mediocre piece WAV:
typedef struct {
int type;
/ / - The type of audio data, is -!
/ / 1 - just a sampling;
/ / 0x101 - IBM mu-law;
/ / 0x102 - IBM a-law;
/ / 0x103 - ADPCM.
int channels;
/ / Number of channels 1 / 2 -!
long SamplesPerSec;
/ / Sampling frequency
long AvgBytesPerSec;
/ / Frequency of issuance of bytes
int align;
/ / Alignment
int bits;
/ / Number of bits per sample -!
} IDWave;
Marked with - are especially needed.
Further, the identifier of the sample:
typedef struct {
char id [4];
/ / Id = "data" = 0x61746164
long len;
/ / Length of sample (a multiple of 2)
} IDSampleWave;
Samples in the piece may be several.
Example program for viewing WAV:
# Include
# Include
typedef struct {
char id_riff [4];
long len_riff;
char id_chuck [4];
char fmt [4];
long len_chuck;
int type;
int channels;
long freq;
long bytes;
int align;
int bits;
char id_data [4];
long len_data;
} TitleWave;
void main
(Int argc, char * argv [])
{
FILE * f;
TitleWave tw;
if (argc <2) {printf ("Specify a name. wav
file \ n "); return;}
f = fopen (argv [1], "rb");
if (f == 0) {printf ("Could not open file
-% S \ n ", argv [1]); return;}
fread ('& amptw, sizeof (TitleWave), a, f);
fclose (f);
printf ("LEN RIFF \ t-% ld \ n",
tw.len_riff);
if (strncmp (tw.id_riff, "RIFF", 4), = 0)
printf ("did not match the ID
RIFF \ n ");
printf ("LEN Chuck \ t -% ld \ n",
tw.len_chuck);
if (strncmp (tw.id_chuck, "WAVE", 4), = 0)
printf ("did not match the ID
CHUCK \ n ");
if (strncmp (tw.fmt, "fmt", 4), = 0)
printf ("did not match the ID
FMT \ n ");
printf ("Type \ t \ t -% d \ n", tw.type);
printf ("Channels \ t -% d \ n", tw.channels);
printf ("Sample Per Sec \ t-% d \ n",
tw.freq);
printf ("Bytes Per Sec \ t -% d \ n",
tw.bytes);
printf ("Bits \ t \ t -% d \ n", tw.bits);
printf ("Aligned \ t \ t -% d \ n", tw.align);
printf ("LEN Data \ t -% ld \ n",
tw.len_data);
if (strncmp (tw.id_data, "data", 4), = 0)
printf ("did not match the ID
DATA \ n ");
}
V O C - Format
Header. Voc:
typedef struct {
char txt_id [20];
/ / "Creative Voice File \ x1A"
unsigned int offset_data;
/ / Offset to the first block of data
unsigned int ver;
/ / Version number
unsigned int id;
/ / ID number of complementary
/ / Version number plus 1234h, ie
//(((~ Ver) +0 x1234) '& amp0xFFFF) == id
} VocHeader;
Then there are blocks of data. They are divided into
subblocks of different types. Structure of the sub-blocks of
data:
Sub-block of audio data:
typedef struct {
unsigned char type;
/ / Type of subblock
unsigned long len;
/ / Length of the subblock (read only need to
/ / The first 3 bytes)
} VocBlock;
Next come the data sub-block. Depending on the type of
sub-blocks are different. Here Several types of sub-blocks:
type = 0. Ends a block of data.
type = 1. Sub-block of audio data:
In this case, the length of the sub-block, you subtract two to
get the length of the sound data.
The title of this sub-block.
typedef struct {
unsigned char rate;
/ / Sample rate, as a team
/ / 40H
unsigned char type_zip;
/ / Packaging method 0 - Not packaged
} VocBlock1;
Next come the audio data.
type = 2. Subblock continuation of sound
Data:
Just the sound data.
type = 3. Subunit of silence
typedef struct {
unsigned int time;
/ / Time of silence
unsigned char rate;
/ / Sample rate, as a team
/ / 40H
} VocBlock3;
type = 4. Subunit marker
unsigned int marker; / / marker
type = 5. Sub-block text messages
Text data, ending with zero
type = 6. Poblok sound cycle
unsigned int count_repeat;
/ / Number of repetitions minus one
type = 7. Subblock end audio cycle
No data
type = 8. Subblock advanced configuration
typedef struct {
unsigned int rate;
/ / Sample rate, as a team
/ / 40H
/ / Mono: 65536 - (256000000/rate)
/ / Stereo: 65536 - (25600000 / (2 * rate))
unsigned char pack;
/ / Packaging method 0 = unpacked
unsigned char mode;
/ / Mode: 0 - mono, 1 - Stereo
} VocBlock8;
Example program to show VOC:
# Include
# Include
typedef struct {
char txt_id [20];
/ / "Creative Voice File \ x1A"
unsigned int offset_data;
/ / Offset to the first block of data
unsigned int ver;
/ / Version number
unsigned int id;
/ / ID number of complementary
/ / Version number plus 1234h, ie
//(((~ Ver) +0 x1234) '& amp0xFFFF) = id
} VocHeader;
typedef struct {
unsigned char type;
/ / Type of subblock
unsigned long len;
/ / Length of the subblock
/ / (You need only read the first 3 bytes)
} VocBlock;
typedef struct {
unsigned char rate;
/ / Sample rate, as a team
/ / 40H
unsigned char type_zip;
/ / Packaging method 0 - Not packaged
} VocBlock1;
typedef struct {
unsigned int time;
/ / Time of silence
unsigned char rate;
/ / Sample rate, as a team
/ / 40H
} VocBlock3;
unsigned int marker;
/ / Marker
unsigned int count_repeat;
/ / Number of repetitions minus one
typedef struct {
unsigned int rate; / / frequency
/ / Sample rate, as a team 40H
/ / Mono: 65536 - (256000000/rate)
/ / Stereo: 65536 - (25600000 / (2 * rate))
unsigned char pack; / / packaging method
/ / 0 = unpacked
unsigned char mode; / / Mode: 0 - Mono
/ / 1 - Stereo
} VocBlock8;
void main
(Int argc, char * argv [])
{
FILE * f;
VocHeader vh;
VocBlock vb;
VocBlock1 vb1;
VocBlock3 vb3;
VocBlock8 vb8;
unsigned int rate;
if (argc <2) {printf ("Specify a name. voc
file \ n "); return;}
f = fopen (argv [1], "rb"); if (f == 0) {
printf ("Could not open file -
% S \ n ", argv [1]); return;}
fread ('& ampvh, sizeof (VocHeader), a, f); if (
strncmp (vh.txt_id, "Creative Voice
File \ x1a ", 19), = 0)
{Printf ("Neto name \ n"); goto Fin;}
printf ("Creative Voice File \ t -
v% u.% 02u \ n ", (vh.ver>> 8) '& amp0xFF,
vh.cer '& amp0FF);
printf ("Start \ t \ t \ t -
% Xh \ n ", vh.offset_data); printf ("
Identifier \ t \ t
-% Xh \ n ", vh.id);
if ((((~ vh.ver) +0 x1234) '& amp0xFFFF)! = vh.id)
{Printf ("not matched \ n"); goto Fin;}
fseek (f, vh.offset_data, SEEK_SET);
while (1)
{
fread ('& ampvb, sizeof (VocBlock) -1,1, f);
vb.len '& = 0xffffffL; / / the first three bytes
if (ferror (f)! = 0)
{Printf ("Error reading \ n"); goto Fin;}
switch (vb.type)
{
case 0: printf ("The End. \ n"); goto Fin;
case 1: printf ("Sound:");
fread ('& ampvb1, sizeof (VocBlock1), a, f);
rate = (unsigned
int) (one million / (256-vb1.rate));
printf ("rate -% u, packing -% u,
len -% lu \ n ",
rate, vb1.type_zip, vb.len-2);
fseek (f, vb.len-2, SEEK_CUR);
break;
case 2: printf ("Continuation of sound:
% Lu \ n ", vb.len);
fseek (f, vb.len, SEEK_CUR);
break;
case 3:
fread ('& ampvb3, sizeof (VocBlock3), a, f);
printf ("Silence: time -% u, frequency -
% U \ n ",
vb3.time, vb3.rate);
break;
case 4:
fread ('& ampmarker, 2,1, f);
printf ("Marker -% u \ n", marker);
break;
case 5:
printf ("Text length -% lu \ n", vb.len);
break;
case 6:
fread ('& ampcount_repeat, 2,1, f);
printf ("Repetition -% u \ n",
count_repeat-1);
break;
case 7:
printf ("End of reps \ n");
break;
case 8:
fread ('& ampvb8, sizeof (VocBlock8), a, f);
rate = (unsigned
int) (256000000L / (65536L-vb8.rate));
printf ("Set-up: frequency -% u,
packaging -% u, mode -% s \ n ",
rate, vb8.pack,
vb8.mode == 0? "mono": "stereo");
break;
default:
printf ("T -% d ?????? \ n", vb.type);
fseek (f, vb.len, SEEK_CUR);
break;
}}
Fin:
fclose (f);
}
Other articles:
Similar articles:
В этот день... 6 December