home *** CD-ROM | disk | FTP | other *** search
/ Chip 2005 November / CDVD1105.ISO / Software / Freeware / programare / bass / Delphi / DspTest / DTMain.pas < prev   
Encoding:
Pascal/Delphi Source File  |  2005-09-14  |  6.0 KB  |  266 lines

  1. unit DTMain;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  7.   StdCtrls, BASS;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     Button1: TButton;
  12.     CheckBox1: TCheckBox;
  13.     CheckBox2: TCheckBox;
  14.     CheckBox3: TCheckBox;
  15.     OpenDialog1: TOpenDialog;
  16.     procedure FormCreate(Sender: TObject);
  17.     procedure FormDestroy(Sender: TObject);
  18.     procedure Button1Click(Sender: TObject);
  19.     procedure CheckBox1Click(Sender: TObject);
  20.     procedure CheckBox2Click(Sender: TObject);
  21.     procedure CheckBox3Click(Sender: TObject);
  22.   private
  23.     { Private-Deklarationen }
  24.   public
  25.     { Public-Deklarationen }
  26.   end;
  27.  
  28. const
  29.   ECHBUFLEN = 1200;  // buffer length
  30.   FLABUFLEN = 350;   // buffer length
  31.  
  32. var
  33.   Form1: TForm1;
  34.  
  35.   floatable: DWORD; // floating-point channel support?
  36.   chan: DWORD;     // the channel... HMUSIC or HSTREAM
  37.  
  38.   rotdsp: HDSP = 0;  // DSP handle
  39.   rotpos: Single;    // cur.pos
  40.  
  41.   echdsp: HDSP = 0;  // DSP handle
  42.   echbuf: array[0..ECHBUFLEN - 1,0..1] of Single;  // buffer
  43.   echpos: Integer;  // cur.pos
  44.  
  45.   fladsp: HDSP = 0;  // DSP handle
  46.   flabuf: array[0..FLABUFLEN - 1,0..1] of Single;  // buffer
  47.   flapos: Integer;  // cur.pos
  48.   flas, flasinc: Single;  // sweep pos/increment
  49.  
  50. implementation
  51.  
  52. {$R *.DFM}
  53.  
  54. function fmod(a, b: Single): Single;
  55. begin
  56.   Result := a - (b * Trunc(a / b));
  57. end;
  58.  
  59. procedure Rotate(handle: HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user: DWORD); stdcall;
  60. var
  61.   a: DWORD;
  62.   d: PSingle;
  63. begin
  64.   d := buffer;
  65.  
  66.   a := 0;
  67.   while (a < (length div 4)) do
  68.   begin
  69.     d^ := d^ * Abs(Sin(rotpos));
  70.     Inc(d);
  71.     d^ := d^ * Abs(Cos(rotpos));
  72.  
  73.     rotpos := fmod(rotpos + 0.00003, Pi);
  74.  
  75.     Inc(d);
  76.     a := a + 2;
  77.   end;
  78. end;
  79.  
  80. procedure Echo(handle: HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user: DWORD); stdcall;
  81. var
  82.   a: DWORD;
  83.   d: PSingle;
  84.   l, r: Single;
  85. begin
  86.     d := buffer;
  87.  
  88.   a := 0;
  89.   while (a < (length div 4)) do
  90.   begin
  91.     l := d^ + (echbuf[echpos,1] / 2);
  92.     Inc(d);
  93.     r := d^ + (echbuf[echpos,0] / 2);
  94.     Dec(d);
  95.  
  96.     { Basic "bathroom" reverb }
  97.     d^ := l;
  98.     echbuf[echpos,0] := l;
  99.     Inc(d);
  100.     d^ := r;
  101.     echbuf[echpos,1] := r;
  102.  
  103.     { Echo }
  104. //    echbuf[echpos,0] := d^;
  105. //    d^ := l;
  106. //    Inc(d);
  107. //    echbuf[echpos,1] := d^;
  108. //    d^ := r;
  109.  
  110.         echpos := echpos + 1;
  111.         if (echpos = ECHBUFLEN) then
  112.       echpos := 0;
  113.  
  114.     Inc(d);
  115.     a := a + 2;
  116.   end;
  117. end;
  118.  
  119. procedure Flange(handle: HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user: DWORD); stdcall;
  120. var
  121.     a: DWORD;
  122.     d: PSingle;
  123.   f, s: Single;
  124.   p1, p2: Integer;
  125. begin
  126.     d := buffer;
  127.  
  128.   a := 0;
  129.   while (a < (length div 4)) do
  130.   begin
  131.     p1 := Trunc(flapos + flas) mod FLABUFLEN;
  132.     p2 := (p1 + 1) mod FLABUFLEN;
  133.     f := fmod(flas, 1);
  134.  
  135.     s := d^ + ((flabuf[p1, 0] * (1 - f)) + (flabuf[p2, 0] * f));
  136.     flabuf[flapos, 0] := d^;
  137.     d^ := s;
  138.  
  139.     Inc(d);
  140.     s := d^ + ((flabuf[p1, 1] * (1 - f)) + (flabuf[p2, 1] * f));
  141.     flabuf[flapos, 1] := d^;
  142.     d^ := s;
  143.  
  144.     flapos := flapos + 1;
  145.     if (flapos = FLABUFLEN) then
  146.       flapos := 0;
  147.  
  148.     flas := flas + flasinc;
  149.     if (flas < 0.0) or (flas > FLABUFLEN) then
  150.       flasinc := -flasinc;
  151.  
  152.     Inc(d);
  153.     a := a + 2;
  154.   end;
  155. end;
  156.  
  157. procedure TForm1.FormCreate(Sender: TObject);
  158. begin
  159.   if BASS_GetVersion <> DWORD(MAKELONG(2,2)) then
  160.   begin
  161.     MessageBox(0, 'BASS version 2.2 was not loaded', 'Incorrect BASS.DLL', 0);
  162.     Halt;
  163.   end;
  164.  
  165.   BASS_SetConfig(BASS_CONFIG_FLOATDSP, 1);
  166.   if not BASS_Init(-1, 44100, 0, Handle, nil) then
  167.   begin
  168.     MessageBox(0, 'Can''t initialize device', 'Error', 0);
  169.     Halt;
  170.   end;
  171.  
  172.   floatable := BASS_StreamCreate(44100, 2, BASS_SAMPLE_FLOAT, nil, 0);
  173.   if (floatable > 0) then
  174.   begin
  175.     BASS_StreamFree(floatable); // woohoo!
  176.     floatable := BASS_SAMPLE_FLOAT;
  177.   end
  178. end;
  179.  
  180. procedure TForm1.FormDestroy(Sender: TObject);
  181. begin
  182.   BASS_Free;
  183. end;
  184.  
  185. procedure TForm1.Button1Click(Sender: TObject);
  186. var
  187.   info: BASS_CHANNELINFO;
  188. begin
  189.   if not OpenDialog1.Execute then
  190.     Exit;
  191.  
  192.   // free both MOD and stream, it must be one of them! :)
  193.   BASS_MusicFree(chan);
  194.   BASS_StreamFree(chan);
  195.  
  196.   chan := BASS_StreamCreateFile(False, PChar(OpenDialog1.FileName), 0, 0, floatable or BASS_SAMPLE_LOOP);
  197.   if (chan = 0) then
  198.     chan := BASS_MusicLoad(False, PChar(OpenDialog1.FileName), 0, 0, BASS_MUSIC_LOOP or BASS_MUSIC_RAMPS or floatable, 0);
  199.   if (chan = 0) then
  200.   begin
  201.     // whatever it is, it ain't playable
  202.     Button1.Caption := 'click here to open a file...';
  203.     MessageBox(0, 'Can''t play the file', 'Error', 0);
  204.     Exit;
  205.   end;
  206.  
  207.   BASS_ChannelGetInfo(chan, info);
  208.   if (info.chans <> 2) then // only stereo is allowed
  209.   begin
  210.     Button1.Caption := 'click here to open a file...';
  211.     BASS_MusicFree(chan);
  212.     BASS_StreamFree(chan);
  213.     MessageBox(0, 'Only stereo sources are supported', 'Error', 0);
  214.     Exit;
  215.   end;
  216.  
  217.   Button1.Caption := OpenDialog1.FileName;
  218.   // setup DSPs on new channel
  219.   CheckBox1.OnClick(Self);
  220.   CheckBox2.OnClick(Self);
  221.   CheckBox3.OnClick(Self);
  222.  
  223.   // play both MOD and stream, it must be one of them!
  224.   BASS_ChannelPlay(chan, False);
  225. end;
  226.  
  227. procedure TForm1.CheckBox1Click(Sender: TObject);
  228. begin
  229.   if (CheckBox1.Checked) then
  230.   begin
  231.     rotpos := 0.7853981;
  232.     rotdsp := BASS_ChannelSetDSP(chan, @Rotate, 0, 2);
  233.   end
  234.   else
  235.     BASS_ChannelRemoveDSP(chan, rotdsp);
  236. end;
  237.  
  238. procedure TForm1.CheckBox2Click(Sender: TObject);
  239. begin
  240.   if (CheckBox2.Checked) then
  241.   begin
  242.     FillChar(echbuf, SizeOf(echbuf), 0);
  243.     echpos := 0;
  244.     echdsp := BASS_ChannelSetDSP(chan, @Echo, 0, 1);
  245.   end
  246.   else
  247.     BASS_ChannelRemoveDSP(chan, echdsp);
  248. end;
  249.  
  250. procedure TForm1.CheckBox3Click(Sender: TObject);
  251. begin
  252.   if (CheckBox3.Checked) then
  253.   begin
  254.     FillChar(flabuf, SizeOf(flabuf), 0);
  255.     flapos := 0;
  256.     flas := FLABUFLEN / 2;
  257.     flasinc := 0.002;
  258.     fladsp := BASS_ChannelSetDSP(chan, @Flange, 0, 0);
  259.   end
  260.   else
  261.     BASS_ChannelRemoveDSP(chan, fladsp);
  262. end;
  263.  
  264. end.
  265.  
  266.