Интересно, есть ли технология преобразования Wave-формата в обычный набор звуковых данных? К примеру, мне необходимо удалить заголовок и механизм (метод) сжатия, которые могут компилироваться и сохраняться вместе с Wave-файлами.
 
Код unit LinearSystem; 
 
interface 
 
{============== Тип, описывающий формат WAV ==================} 
type WAVHeader = record 
 
nChannels       : Word; 
nBitsPerSample  : LongInt; 
nSamplesPerSec  : LongInt; 
nAvgBytesPerSec : LongInt; 
RIFFSize        : LongInt; 
fmtSize         : LongInt; 
formatTag       : Word; 
nBlockAlign     : LongInt; 
DataSize        : LongInt; 
end; 
 
{============== Поток данных сэмпла ========================} 
const MaxN = 300;  { максимальное значение величины сэмпла } 
type SampleIndex = 0 .. MaxN+3; 
type DataStream = array[ SampleIndex ] of Real; 
 
var   N     : SampleIndex; 
 
{============== Переменные сопровождения ======================} 
type  Observation = record 
 
Name       : String[40];  {Имя данного сопровождения} 
yyy        : DataStream;  {Массив указателей на данные} 
WAV        : WAVHeader;   {Спецификация WAV для сопровождения} 
Last       : SampleIndex; {Последний доступный индекс yyy} 
MinO, MaxO : Real;        {Диапазон значений yyy} 
end; 
 
var K0R, K1R, K2R, K3R : Observation; 
 
 K0B, K1B, K2B, K3B : Observation; 
 
{================== Переменные имени файла ===================} 
var StandardDatabase : String[ 80 ]; 
 
BaseFileName      : String[ 80 ]; 
StandardOutput    : String[ 80 ]; 
StandardInput     : String[ 80 ]; 
 
{=============== Объявления процедур ==================} 
procedure ReadWAVFile  (var Ki, Kj : Observation); 
procedure WriteWAVFile (var Ki, Kj : Observation); 
procedure ScaleData    (var Kk     : Observation); 
procedure InitAllSignals; 
procedure InitLinearSystem; 
 
 
implementation 
{$R *.DFM} 
uses VarGraph, SysUtils; 
 
{================== Стандартный формат WAV-файла ===================} 
const MaxDataSize : LongInt = (MaxN+1)*2*2; 
const MaxRIFFSize : LongInt = (MaxN+1)*2*2+36; 
const StandardWAV : WAVHeader = ( 
 
nChannels       : Word(2); 
nBitsPerSample  : LongInt(16); 
nSamplesPerSec  : LongInt(8000); 
nAvgBytesPerSec : LongInt(32000); 
RIFFSize        : LongInt((MaxN+1)*2*2+36); 
fmtSize         : LongInt(16); 
formatTag       : Word(1); 
nBlockAlign     : LongInt(4); 
DataSize        : LongInt((MaxN+1)*2*2) 
); 
 
 
{================== Сканирование переменных сопровождения ===================} 
 
 
procedure ScaleData(var Kk : Observation); 
var I : SampleIndex; 
begin 
 
 
{Инициализация переменных сканирования} 
Kk.MaxO := Kk.yyy[0]; 
Kk.MinO := Kk.yyy[0]; 
 
 
{Сканирование для получения максимального и минимального значения} 
for I := 1 to Kk.Last do 
begin 
if Kk.MaxO < Kk.yyy[I] then Kk.MaxO := Kk.yyy[I]; 
if Kk.MinO > Kk.yyy[I] then Kk.MinO := Kk.yyy[I]; 
end; 
end; { ScaleData } 
 
procedure ScaleAllData; 
begin 
 
ScaleData(K0R); 
ScaleData(K0B); 
ScaleData(K1R); 
ScaleData(K1B); 
ScaleData(K2R); 
ScaleData(K2B); 
ScaleData(K3R); 
ScaleData(K3B); 
end; {ScaleAllData} 
 
{================== Считывание/запись WAV-данных ===================} 
 
VAR InFile,  : file of Byte; 
 
type Tag = (F0, T1, M1); 
type FudgeNum = record 
 
case X:Tag of 
F0 : (chrs : array[0..3] of Byte); 
T1 : (lint : LongInt); 
M1 : (up,dn: Integer); 
end; 
var ChunkSize  : FudgeNum; 
 
procedure WriteChunkName(Name:String); 
var i   : Integer; 
 
MM : Byte; 
begin 
 
for i := 1 to 4 do 
begin 
MM := ord(Name[i]); 
write(,MM); 
end; 
end; {WriteChunkName} 
 
procedure WriteChunkSize(LL:Longint); 
var I : integer; 
begin 
 
ChunkSize.x:=T1; 
ChunkSize.lint:=LL; 
ChunkSize.x:=F0; 
for I := 0 to 3 do Write(,ChunkSize.chrs[I]); 
end; 
 
procedure WriteChunkWord(WW:Word); 
var I : integer; 
begin 
 
ChunkSize.x:=T1; 
ChunkSize.up:=WW; 
ChunkSize.x:=M1; 
for I := 0 to 1 do Write(,ChunkSize.chrs[I]); 
end; {WriteChunkWord} 
 
procedure WriteOneDataBlock(var Ki, Kj : Observation); 
var I : Integer; 
begin 
 
ChunkSize.x:=M1; 
with Ki.WAV do 
begin 
case nChannels of 
1:if nBitsPerSample=16 
then begin {1..2 Помещаем в буфер одноканальный 16-битный сэмпл} 
ChunkSize.up := trunc(Ki.yyy[N]+0.5); 
if N<=Ki.Last do WriteOneDataBlock(Ki,Kj); {помещаем 4 байта и увеличиваем счетчик N} 
 
 
{Освобождаем буфер файла} 
CloseFile(  ); 
end; {WriteWAVFile} 
 
procedure InitSpecs; 
begin 
end; { InitSpecs } 
 
procedure InitSignals(var Kk : Observation); 
var J : Integer; 
begin 
 
for J := 0 to MaxN do Kk.yyy[J] := 0.0; 
Kk.MinO := 0.0; 
Kk.MaxO := 0.0; 
Kk.Last := MaxN; 
end; {InitSignals} 
 
procedure InitAllSignals; 
begin  
InitSignals(K0R); 
InitSignals(K0B); 
InitSignals(K1R); 
InitSignals(K1B); 
InitSignals(K2R); 
InitSignals(K2B); 
InitSignals(K3R); 
InitSignals(K3B); 
end; {InitAllSignals}