1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| // le code que tu as posté, à peine modifié
function SaveToWav(const aFilename:String; var aBuffer; aBufferSize, aBitsPerSample, aSampleRate, aChannelCount :Integer):Boolean;
var
vTmp :TWavWriter;
begin
Result := False;
vTmp := TWavWriter.Create;
with vTmp do
try
StoreToFile(aFilename);
fmt.BitsPerSample := aBitsPerSample;
fmt.SampleRate := aSampleRate;
fmt.Channels := aChannelCount;
WriteBuf(aBuffer, aBufferSize);
FlushHeader;
Result := true;
finally
Free;
end;
end;
// et ce que j'ai inventé, en piquant ici et là :
procedure TForm1.btnBernardClick(Sender: TObject);
const
Mono : Word = $0001; //Son mono
Stereo: Word = $0002; //Son stereo
zero : byte = 128;
var
buffer: array[0..44099] of byte; // forçage de la taille du buffer sinon c'est sigsegv garanti
i,asize,abps,asr,acc: integer;
SineCount : single;
Frequency : single;
Amplitude: double;
begin
for i := 0 to 44100-1 do buffer[i] := 0;
asize := SizeOf(buffer);
Amplitude := 0.5;
Frequency := 440;
SineCount :=0;
case form1.rdgSampleRate.ItemIndex of
0: asr := 8000;
1: asr := 11025;
2: asr := 22050;
3: asr := 44100;
end;
acc := Mono;
abps:= $0002; // ou $0004 ou $0008
// write the sine function to the output stream
for i := 0 to 44100-1 do begin
SineCount := SineCount + (Frequency / 44100);
buffer[i] := Round(Sin(SineCount * 2 * PI) * Amplitude*127);
//Caption := inttostr(i)+' '+inttostr(buffer[i])+' '+floattostr(SineCount)
// +' '+floattostr((Sin(SineCount * 2 * PI) * Amplitude)*127);
//Application.ProcessMessages;
end;
if SaveToWav('/tmp/bernard.wav',buffer,asize,abps,asr,acc) then showmessage('ok');
end; |
Partager