
procedure GenSine(Freq:Single);
var   n,e,x1,x2:Integer;
      d,p,v,a:Double;
      s,c,cb,snm1,snm2,cnm1,cnm2,s2:double;
      i:integer;
const b=0.01;      
Begin
if EditorSample.Length<=0 then EditorSample.Length:=Round(EditorSample.MSToSamples(1000));
Editor.GetSelectionS(x1,x2);

d:=Pi*2*Freq/EditorSample.SampleRate;
a:=d*3;


cb:= 2* cos(d);
snm2:= sin(d);  snm1:= sin(2*d);
cnm2:= cos(d);  cnm1:= cos(2*d);


for n:=x1 to x2 do
  begin
  s:= cb * snm1 - snm2;
  c:= cb * cnm1 - cnm2;
  snm2:= snm1;  cnm2:= cnm1;
  snm1:= s;  cnm1:= c;

  if n mod 10000=0 then ProgressMsg('Processing',n,EditorSample.Length);


  s2:=sin(a);
  a:=a+d;
   
  for e:=0 to EditorSample.NumChans-1 do
    EditorSample.SetSampleAt(n,e,abs(s-s2));
  
(*
// left = goertzel, right = sine
EditorSample.SetSampleAt(n,0,s);
EditorSample.SetSampleAt(n,1,s2);
*)
  End;
End;


var Form:TScriptDialog;

Begin
Form:=CreateScriptDialog('Sine generator','Simple sine generator.');
Form.AddInputKnob('Freq (Hz)',100,1,20000);
if Form.Execute then GenSine(Form.GetInputValue('Freq (Hz)'));
Form.Free;
End.
