Zapis dzwięku do wave...

0

Siemka,
Jak w delphi wygenewrować dzwięk o określonej częstotliwości a nastepnie zapisać go do pliku wave ?
Tak jak bym chcial sobie zrobić na paru przyciskach pianinko, wcisnąc klawisz rec i nagrywac button 1 sound taki 2 taki 3 taki to a taki ;]

0

Kodzik pewnego programu:

unit Gen;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Spin, ComCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Button1: TButton;
    SaveDialog1: TSaveDialog;
    SpinEdit1: TSpinEdit;
    SpinEdit2: TSpinEdit;
    SpinEdit3: TSpinEdit;
    Label3: TLabel;
    ProgressBar1: TProgressBar;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
TWaveheader = packed record
     RiffID     : array [1..4] of char;
     RiffLen    : LongWord;
     WaveID     : array [1..4] of char;
     FmtID      : array [1..4] of char;
     FmtLen     : LongWord;
     FormatTag  : Word;
     Stereo     : Word;
     Freq       : LongWord;
     BytesPSec  : LongWord;
     BlockAlign : Word;
     BitsPer    : Word;
     DataID     : array [1..4] of char;
     DataLen    : LongWord;
    end;


  TDataArray = array of smallint;
const
  SFreq=44100;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses Math;

procedure TForm1.Button1Click(Sender: TObject);
var
 Header : TWaveHeader;
 Data : TDataArray;
 i : integer;
 F : file;
 temp1, temp2: double;

begin
  SetLength(Data, (SpinEdit1.Value*SFreq) div 1000) ;


  with Header do
  begin
    RiffID:='RIFF';
    RiffLen:=Length(Data)*2 +36;
    WaveID:='WAVE';
    FmtID:='fmt ';
    FmtLen:=16;
    FormatTag:=1;
    Stereo:=1;
    Freq:=SFreq;
    BitsPer:=16;
    BytesPSec:=(SFreq*Stereo*BitsPer) div 8;
    BlockAlign:=(BitsPer div 8)*stereo;
    DataID:='data';
    DataLen:=Length(Data)*2;
  end;

  temp1:=2*Pi
        *(1/(sFreq/SpinEdit2.Value));
  temp2:=Power(10,SpinEdit3.Value/20)*32767;

  for i:=0 to High(Data) do


  begin
    Data[i]:=Round(Sin(i*temp1)*temp2);
    ProgressBar1.Position:=Round(i/High(Data)*100);


  end;

  if SaveDialog1.Execute then
     begin
       AssignFile(F, SaveDialog1.FileName);
       Rewrite(F,1);
       BlockWrite(F,Header,SizeOf(Header));
       BlockWrite(F,Data[0],Length(Data)*2);
       CloseFile(F);
     end;


end;

end.
0

Siemka,
Wykonalem jak napisałes... podałem 3 wartości... dalem buttona, otwozylo sie okno save, zapisalem pod test.wav ...
All pllayer, odpalam i kicha... nie startuje...

Musi byc jakiś błąd...

Pomozesz go znaleźć ?
PS: I tak wielkie dzięki za chociażby zainteresowanie bo to się liczy :]

0

Powyższy kod został skopiowany z mojego programu Generator dostępnego na http://pq.royy.net (z poprzedniej wersji). Program i źródła są dostępne publicznie, jednak dobre obyczaje nakazują podawać skąd się wzięło cudzy kod, "Gościu"

1 użytkowników online, w tym zalogowanych: 0, gości: 1