Интересно, есть ли технология преобразования Wave-формата в обычный набор звуковых данных? К примеру, мне необходимо удалить заголовок и механизм (метод) сжатия, которые могут компилироваться и сохраняться вместе с Wave-файлами.
У меня есть программа под D1/D2, которая читает WAV-файлы и вытаскивает исходные данные, но она не может их восстанавить, используя зашитый алгоритм сжатия.
unit LinearSystem;
interface
{============== Тип, описывающий формат WAV ==================} type WAVHeader = record
{Сканирование для получения максимального и минимального значения} for I := 1to 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 }
if FileExists(StandardInput) then with Ki.WAV do begin{ Вызов диалога открытия файла } OK := True; {если не изменится где-нибудь ниже} {Приготовления для чтения файла данных} AssignFile(InFile, StandardInput); { Файл, выбранный в диалоговом окне } Reset(InFile);
{Считываем ChunkName "RIFF"} ReadChunkName; if ChunkName <> 'RIFF'then OK := False;
{Считываем ChunkSize} ReadChunkSize; RIFFSize := ChunkSize.lint; {должно быть 18,678}
{Считываем ChunkName "WAVE"} ReadChunkName; if ChunkName <> 'WAVE'then OK := False;
{Считываем ChunkName "fmt_"} ReadChunkName; if ChunkName <> 'fmt 'then OK := False;
{Считываем ChunkSize} ReadChunkSize; fmtSize := ChunkSize.lint; {должно быть 18}
if ChunkName <> 'data'then begin for I := 1to DataSize do {пропуск данных, не относящихся к набору звуковых данных} Read(InFile, MM); end else NoDataYet := False; end;
nDataBytes := DataSize; {Наконец, начинаем считывать данные для байтов nDataBytes} if nDataBytes > 0then DataYet := True; N := 0; {чтение с первой позиции} while DataYet do begin ReadOneDataBlock(Ki, Kj); {получаем 4 байта} nDataBytes := nDataBytes - 4; if nDataBytes <= 4then DataYet := False; end;
ScaleData(Ki); if Ki.WAV.nChannels = 2then begin Kj.WAV := Ki.WAV; ScaleData(Kj); end; {Освобождаем буфер файла} CloseFile(InFile); end else begin InitSpecs; {файл не существует} InitSignals(Ki); {обнуляем массив "Ki"} InitSignals(Kj); {обнуляем массив "Kj"} end; end; { ReadWAVFile }
{================= Операции с набором данных ====================}
const MaxNumberOfDataBaseItems = 360; type SignalDirectoryIndex = 0..MaxNumberOfDataBaseItems;
procedure GetDatabaseItem(Kk: Observation; N: LongInt); begin
if N <= LastDataBaseItem then begin Seek(DataBaseFile, N); Read(DataBaseFile, Kk); end else InitSignals(Kk); end; {GetDatabaseItem}
procedure PutDatabaseItem(Kk: Observation; N: LongInt); begin
if N < MaxNumberOfDataBaseItems then if N <= LastDataBaseItem then begin Seek(DataBaseFile, N); Write(DataBaseFile, Kk); LastDataBaseItem := LastDataBaseItem + 1; end else while LastDataBaseItem <= N do begin Seek(DataBaseFile, LastDataBaseItem); Write(DataBaseFile, Kk); LastDataBaseItem := LastDataBaseItem + 1; end else ReportError(1); {Попытка чтения MaxNumberOfDataBaseItems} end; {PutDatabaseItem}
procedure InitDataBase; begin
LastDataBaseItem := 0; if FileExists(StandardDataBase) then begin Assign(DataBaseFile, StandardDataBase); Reset(DataBaseFile); whilenot EOF(DataBaseFile) do begin GetDataBaseItem(K0R, LastDataBaseItem); ItemNameS[LastDataBaseItem] := K0R.Name; LastDataBaseItem := LastDataBaseItem + 1; end; if EOF(DataBaseFile) then if LastDataBaseItem > 0then LastDataBaseItem := LastDataBaseItem - 1; end; end; {InitDataBase}
function FindDataBaseName(Nstg: string): LongInt; var ThisOne: LongInt; begin
ThisOne := 0; FindDataBaseName := -1; while ThisOne < LastDataBaseItem do begin if Nstg = ItemNameS[ThisOne] then begin FindDataBaseName := ThisOne; Exit; end; ThisOne := ThisOne + 1; end; end; {FindDataBaseName}