Нашол код и переделал под себя:
| Код | unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
Const noError = 0; ReadError = 1; HeaderError = 2; DataError = 3; FileCorrupt = 4; IncorectFileFormat = 5; HeaderWriteError = 6; StreamError = 7;
type TForm1 = class(TForm) Button2: TButton; procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
TWaveHeaderChank = packed record //Заголвок (чанк) формата wFormatTag : Smallint; wChannels : WORD; wSamplesPerSec : Cardinal; wAvgBytesPerSec: Cardinal; wBlockAlign : WORD; wBitsPerSample : WORD; wcbSize : WORD; end; TWaveResult = record //Минимальная структура ERROR : WORD; //Используеися для возвращения результата wSamplesPerSec : Cardinal; //разбора Wav файла wBitsPerSample : WORD; wChannels : WORD; Data : TMemoryStream; end;
var Form1: TForm1;
implementation
{$R *.dfm}
uses math;
Function WriteWave(FileName : AnsiString; data : TWaveResult) : WORD; var f : TFileStream; wFileSize : Cardinal; wChankSize : Cardinal; ID : array[0..3] of Char; Header : TWaveHeaderChank;
Begin Result := noError; Try f := TFileStream.Create(FileName, fmCreate); f.Seek(0, soFromBeginning);
Header.wFormatTag := 1; Header.wChannels := data.wChannels; Header.wSamplesPerSec := data.wSamplesPerSec; Header.wBlockAlign := data.wChannels * (data.wBitsPerSample div 8); Header.wAvgBytesPerSec:= data.wSamplesPerSec * Header.wBlockAlign; Header.wBitsPerSample := data.wBitsPerSample; Header.wcbSize := 0; //нет дополнительного блока
ID := 'RIFF'; f.WriteBuffer(ID, 4); wFileSize := 0; //пока не известен f.WriteBuffer(wFileSize, 4); ID := 'WAVE'; f.WriteBuffer(ID, 4); //Запись идентификатора формата
ID := 'fmt '; f.WriteBuffer(ID, 4); //Запись идентификатора чанка формата wChankSize := SizeOf(Header); f.WriteBuffer(wChankSize, 4); //Запись размера чанка f.WriteBuffer(Header, SizeOf(Header)); //Запись чанка формата
except Result := HeaderWriteError; end; Try ID := 'data'; f.WriteBuffer(ID, 4); //Запись чанка данных wChankSize := data.Data.Size; //Запись размера чанка f.WriteBuffer(wChankSize, 4); //Запись данных data.Data.Seek(0, soFromBeginning); f.CopyFrom(data.Data, data.Data.Size);
except Result := StreamError; end; f.Seek(SizeOf(ID), soFromBeginning); //Поиск записи размера файла wFileSize := f.Size - SizeOf(ID) - SizeOf(wFileSize); f.Write(wFileSize, 4); //Запись размера файла - заголовок f.Free; Form1.Caption := 'Готово!'; end;
procedure TForm1.Button2Click(Sender: TObject); var r : TWaveResult; I: Integer; d : SmallInt; begin r.ERROR := noError; r.wSamplesPerSec := 44100; r.wBitsPerSample := 16; r.wChannels := 2; r.Data := TMemoryStream.Create; r.Data.Seek(0, soFromBeginning);
For i := 0 to r.wSamplesPerSec * 10 do Begin d :=Round(32767 * Sin(DegToRad(1000 * 360 * I/r.wSamplesPerSec))); r.Data.WriteBuffer(d, 2); d :=Round(32767 * Sin(DegToRad(1000 * 360 * I/r.wSamplesPerSec + 90))); r.Data.WriteBuffer(d, 2); end; WriteWave('Sample.wav', r); r.Data.Free; end; end.
|
Но в созданном файле слышны щелчки если посмотреть на сигнал то в месте щелчков видно что синусоида разрывается и происходит реское падение. Как от этого избавится??? |