Mega Code Archive

 
Categories / Delphi / Multimedia
 

Ses kaydetme

procedure CreateWave(LeftFreq, RightFreq: Single; Duration: Cardinal; const FileName: String); const BitsPerSample = 16; NumChannels = 2; SampleRate = 44100; var ChunkSize: Integer; DataSize: Integer; Factor: Single; Format: TWaveFormatEx; FourCC: array[0..3] of Char; I: Integer; NumSamples: Integer; L: SmallInt; R: SmallInt; WaveStream: TFileStream; begin WaveStream := TFileStream.Create(FileName, fmCreate); try FourCC := 'RIFF'; WaveStream.Write(FourCC, SizeOf(FourCC)); NumSamples := (SampleRate * Duration) div 1000; DataSize := (BitsPerSample shr 3) * NumChannels * NumSamples; ChunkSize := DataSize + SizeOf(TWaveFormatEx) + 20; WaveStream.Write(ChunkSize, SizeOf(ChunkSize)); FourCC := 'WAVE'; WaveStream.Write(FourCC, SizeOf(FourCC)); FourCC := 'fmt '; WaveStream.Write(FourCC, SizeOf(FourCC)); ChunkSize := SizeOf(TWaveFormatEx); WaveStream.Write(ChunkSize, SizeOf(ChunkSize)); with Format do begin wFormatTag := WAVE_FORMAT_PCM; nChannels := NumChannels; nSamplesPerSec := SampleRate; wBitsPerSample := BitsPerSample; nBlockAlign := nChannels * wBitsPerSample shr 3; nAvgBytesPerSec := nSamplesPerSec * nBlockAlign; cbSize := 0 end; WaveStream.Write(Format, SizeOf(Format)); FourCC := 'data'; WaveStream.Write(FourCC, SizeOf(FourCC)); ChunkSize := DataSize; WaveStream.Write(ChunkSize, SizeOf(ChunkSize)); for I := 0 to 999 do begin Factor := Exp(- 0.005 * (1000 - I)); L := Round(Factor * 32767 * Sin(2 * Pi * LeftFreq * I / SampleRate)); R := Round(Factor * 32767 * Sin(2 * Pi * RightFreq * I / SampleRate)); WaveStream.Write(L, SizeOf(L)); WaveStream.Write(R, SizeOf(R)) end; for I := 1000 to NumSamples - 1001 do begin L := Round(32767 * Sin(2 * Pi * LeftFreq * I / SampleRate)); R := Round(32767 * Sin(2 * Pi * RightFreq * I / SampleRate)); WaveStream.Write(L, SizeOf(L)); WaveStream.Write(R, SizeOf(R)) end; for I := NumSamples - 1000 to NumSamples - 1 do begin Factor := Exp(0.005 * (NumSamples - 1001 - I)); L := Round(Factor * 32767 * Sin(2 * Pi * LeftFreq * I / SampleRate)); R := Round(Factor * 32767 * Sin(2 * Pi * RightFreq * I / SampleRate)); WaveStream.Write(L, SizeOf(L)); WaveStream.Write(R, SizeOf(R)) end; WaveStream.Position := 0; finally WaveStream.Free end end; procedure TForm1.Button1Click(Sender: TObject); begin CreateWave(500, 100, 1000, 'test.wav'); end;