MMFirDlg.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:17k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. {========================================================================}
  2. {=                (c) 1995-98 SwiftSoft Ronald Dittrich                 =}
  3. {========================================================================}
  4. {=                          All Rights Reserved                         =}
  5. {========================================================================}
  6. {=  D 01099 Dresden             = Fax.: +49 (0)351-8037944              =}
  7. {=  Loewenstr.7a                = info@swiftsoft.de                     =}
  8. {========================================================================}
  9. {=  Actual versions on http://www.swiftsoft.de/mmtools.html             =}
  10. {========================================================================}
  11. {=  This code is for reference purposes only and may not be copied or   =}
  12. {=  distributed in any format electronic or otherwise except one copy   =}
  13. {=  for backup purposes.                                                =}
  14. {=                                                                      =}
  15. {=  No Delphi Component Kit or Component individually or in a collection=}
  16. {=  subclassed or otherwise from the code in this unit, or associated   =}
  17. {=  .pas, .dfm, .dcu, .asm or .obj files may be sold or distributed     =}
  18. {=  without express permission from SwiftSoft.                          =}
  19. {=                                                                      =}
  20. {=  For more licence informations please refer to the associated        =}
  21. {=  HelpFile.                                                           =}
  22. {========================================================================}
  23. {=  $Date: 06.09.98 - 14:25:24 $                                        =}
  24. {========================================================================}
  25. unit MMFirDlg;
  26. {$I COMPILER.INC}
  27. interface
  28. uses
  29.   Windows,
  30.   Messages,
  31.   SysUtils,
  32.   Classes,
  33.   Graphics,
  34.   Controls,
  35.   Forms,
  36.   Dialogs,
  37.   Mask,
  38.   StdCtrls,
  39.   ExtCtrls,
  40.   MMObj,
  41.   MMUtils,
  42.   MMMath,
  43.   MMSpin,
  44.   MMFIR,
  45.   MMDIBCv,
  46.   MMSpectr,
  47.   MMDSPObj,
  48.   MMPanel,
  49.   MMEnvelp,
  50.   MMEdit;
  51. type
  52.   {-- TMMFIRDlgForm -----------------------------------------------------------}
  53.   TMMFIRDlgForm = class(TForm)
  54.     Bevel1: TBevel;
  55.     Label1: TLabel;
  56.     Label3: TLabel;
  57.     Label4: TLabel;
  58.     Spectrum: TMMSpectrum;
  59.     btnSave: TButton;
  60.     btnLoad: TButton;
  61.     btnReset: TButton;
  62.     btnCancel: TButton;
  63.     btnOK: TButton;
  64.     btnClear: TButton;
  65.     FilterComboBox: TComboBox;
  66.     spinf1: TMMSpinButton;
  67.     spinGain: TMMSpinButton;
  68.     OpenDialog: TOpenDialog;
  69.     SaveDialog: TSaveDialog;
  70.     TmpFIR: TMMFIRFilter;
  71.     MMPanel1: TMMPanel;
  72.     Envelope: TMMEnvelope;
  73.     Label2: TLabel;
  74.     spinOrder: TMMSpinButton;
  75.     edOrder: TMMNumberEdit;
  76.     mef1: TMMFloatNumberEdit;
  77.     meGain: TMMFloatNumberEdit;
  78.     procedure btnResetClick(Sender: TObject);
  79.     procedure btnLoadClick(Sender: TObject);
  80.     procedure btnSaveClick(Sender: TObject);
  81.     procedure FormCreate(Sender: TObject);
  82.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  83.     procedure btnClearClick(Sender: TObject);
  84.     procedure FilterComboBoxChange(Sender: TObject);
  85.     procedure spinChange(Sender: TObject);
  86.     procedure EnvelopeChange(Sender: TObject);
  87.     procedure EnvelopeTrackBegin(Sender: TObject);
  88.     procedure EnvelopeTrack(Sender: TObject);
  89.     procedure mefExit(Sender: TObject);
  90.     procedure mefKeyPress(Sender: TObject; var Key: Char);
  91.     procedure spinOrderChange(Sender: TObject);
  92.     procedure edOrderKeyPress(Sender: TObject; var Key: Char);
  93.     procedure edOrderExit(Sender: TObject);
  94.     procedure EnvelopeTrackEnd(Sender: TObject);
  95.     procedure FormShow(Sender: TObject);
  96.   private
  97.     FTitle: String;
  98.     FFIR: TMMFIRFilter;
  99.     UpdateFilters: Boolean;
  100.     UpdateSpins: Boolean;
  101.     procedure SetTitle(aValue: String);
  102.     procedure SetFIR(aValue: TMMFIRFilter);
  103.     procedure UpdateControls;
  104.     procedure FillComboBox;
  105.     procedure UpdateMaskEdits;
  106.     procedure GetLimits(idx: integer; var MinX, MaxX: integer);
  107.   public
  108.     property Title: String read FTitle write SetTitle;
  109.     property FIRFilter: TMMFIRFilter read FFIR write SetFIR;
  110.   end;
  111.   {-- TMMFIRFilterDialog ------------------------------------------------------}
  112.   TMMFIRFilterDialog = class(TMMNonVisualComponent)
  113.   private
  114.     FSource: TMMFIRFilter;
  115.     FTitle : string;
  116.     procedure SetSource(aSource: TMMFIRFilter);
  117.   protected
  118.     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  119.   public
  120.     constructor Create(AOwner: TComponent); override;
  121.     function Execute: Boolean;
  122.   published
  123.     property Source: TMMFIRFilter read FSource write SetSource;
  124.     property Title: string read FTitle write FTitle;
  125.   end;
  126. var
  127.   MMFIRDlgForm: TMMFIRDlgForm;
  128. implementation
  129. {$R *.DFM}
  130. {------------------------------------------------------------------------------}
  131. function VolumeToDB(Volume: Longint): Float;
  132. begin
  133.    if Volume <= 0 then
  134.       Result := -99
  135.    else
  136.       Result := Log10(Volume/VOLUMEBASE)*20;
  137. end;
  138. {------------------------------------------------------------------------------}
  139. function DBToVolume(DB: Float): integer;
  140. begin
  141.    Result := Trunc(pow(10.0,DB/20.0)*VOLUMEBASE);
  142. end;
  143. {== TMMFIRDlgForm =============================================================}
  144. procedure TMMFIRDlgForm.FormCreate(Sender: TObject);
  145. begin
  146.    FTitle := Caption;
  147.    FFIR := nil;
  148.    FilterComboBox.ItemIndex := -1;
  149.    UpdateFilters := True;
  150.    UpdateSpins   := True;
  151. end;
  152. {-- TMMFIRDlgForm -------------------------------------------------------------}
  153. procedure TMMFIRDlgForm.FormShow(Sender: TObject);
  154. begin
  155.    {$IFDEF BUILD_ACTIVEX}
  156.    TmpFIR.Left := -50;
  157.    {$ENDIF}
  158. end;
  159. {-- TMMFIRDlgForm -------------------------------------------------------------}
  160. procedure TMMFIRDlgForm.FormClose(Sender: TObject; var Action: TCloseAction);
  161. begin
  162.    if (ModalResult = mrOK) then
  163.    begin
  164.       if (FFIR <> nil) then FFIR.Assign(TmpFIR);
  165.    end;
  166. end;
  167. {-- TMMFIRDlgForm -------------------------------------------------------------}
  168. procedure TMMFIRDlgForm.SetTitle(aValue: String);
  169. begin
  170.    if (aValue <> FTitle) then
  171.    begin
  172.       FTitle := aValue;
  173.       Caption := FTitle + ' -  ' + TmpFIR.Description;
  174.    end;
  175. end;
  176. {-- TMMFIRDlgForm -------------------------------------------------------------}
  177. procedure TMMFIRDlgForm.FillComboBox;
  178. var
  179.    i,old: integer;
  180. begin
  181.    with FilterComboBox,TmpFIR do
  182.    begin
  183.       old := Max(ItemIndex,0);
  184.       Items.Clear;
  185.       for i := 0 to Filters.Count-1 do
  186.       with Filters[i] do
  187.       begin
  188.          Items.Add(IntToStr(i+1));
  189.       end;
  190.       if (old >= 0) and (old < Items.Count) then ItemIndex := old;
  191.       UpdateMaskEdits;
  192.    end;
  193. end;
  194. {-- TMMFIRDlgForm -------------------------------------------------------------}
  195. procedure TMMFIRDlgForm.FilterComboBoxChange(Sender: TObject);
  196. begin
  197.    if (FilterComboBox.ItemIndex >= 0) then
  198.    begin
  199.       Envelope.SelectAll(False);
  200.       Envelope.Select[FilterComboBox.ItemIndex] := True;
  201.       //Envelope.Locator := Envelope.Points[FilterComboBox.ItemIndex].X_Value;
  202.    end;
  203.    UpdateMaskEdits;
  204. end;
  205. {-- TMMFIRDlgForm -------------------------------------------------------------}
  206. procedure TMMFIRDlgForm.GetLimits(idx: integer; var MinX, MaxX: integer);
  207. begin
  208.    MinX := 0;
  209.    MaxX := TmpFIR.SampleRate div 2;
  210.    if (idx > 0) then
  211.    begin
  212.        MinX := Envelope.Points[idx-1].X_Value+1;
  213.        if (idx < Envelope.Count-1) then
  214.            MaxX := Envelope.Points[idx+1].X_Value-1;
  215.    end;
  216. end;
  217. {-- TMMFIRDlgForm -------------------------------------------------------------}
  218. procedure TMMFIRDlgForm.UpdateMaskEdits;
  219. var
  220.    XMin,XMax: integer;
  221. begin
  222.    with FilterComboBox,TmpFIR do
  223.    begin
  224.       UpdateSpins := False;
  225.       if (ItemIndex >= 0) then
  226.       with TmpFIR.Filters[ItemIndex] do
  227.       begin
  228.          mef1.Value      := f1;
  229.          meGain.Value    := Gain;
  230.          spinf1.Value    := Trunc(f1*100);
  231.          spinGain.Value  := Trunc(Gain*100);
  232.          meGain.Enabled  := True;
  233.          spinGain.Enabled:= True;
  234.          if (FilterComboBox.ItemIndex = 0) or
  235.             (FilterComboBox.ItemIndex = Envelope.Count-1) then
  236.          begin
  237.             mef1.Enabled    := False;
  238.             spinf1.Enabled  := False;
  239.          end
  240.          else
  241.          begin
  242.             mef1.Enabled    := True;
  243.             spinf1.Enabled  := True;
  244.             GetLimits(FilterComboBox.ItemIndex,XMin,XMax);
  245.             spinf1.MinValue := XMin;
  246.             spinf1.MaxValue := XMax;
  247.          end;
  248.       end
  249.       else
  250.       begin
  251.          mef1.Value      := 0;
  252.          meGain.Value    := 0;
  253.          spinf1.Value    := 0;
  254.          spinGain.Value  := 0;
  255.          mef1.Enabled    := False;
  256.          meGain.Enabled  := False;
  257.          spinf1.Enabled  := False;
  258.          spinGain.Enabled:= False;
  259.       end;
  260.       UpdateSpins        := True;
  261.    end;
  262. end;
  263. {-- TMMFIRDlgForm -------------------------------------------------------------}
  264. procedure TMMFIRDlgForm.spinChange(Sender: TObject);
  265. begin
  266.    if UpdateSpins and UpdateFilters and (FilterComboBox.ItemIndex >= 0) then
  267.    with TmpFIR.Filters[FilterComboBox.ItemIndex] do
  268.    begin
  269.       if Sender = spinf1 then
  270.       begin
  271.          f1 := spinf1.Value/100;
  272.          mef1.Value := f1;
  273.          mef1.Update;
  274.       end
  275.       else
  276.       begin
  277.          Gain := spinGain.Value/100;
  278.          meGain.Value := Gain;
  279.          meGain.Update;
  280.       end;
  281.       with Envelope.Points[FilterComboBox.ItemIndex] do
  282.       begin
  283.          X_Value := Trunc(f1*100);
  284.          Y_Value := DBToVolume(Gain);
  285.       end;
  286.       Envelope.Refresh;
  287.    end;
  288. end;
  289. {-- TMMFIRDlgForm -------------------------------------------------------------}
  290. procedure TMMFIRDlgForm.mefExit(Sender: TObject);
  291. begin
  292.    spinf1.Value := Trunc(mef1.Value*100);
  293.    spinGain.Value := Trunc(meGain.Value*100);
  294. end;
  295. {-- TMMFIRDlgForm -------------------------------------------------------------}
  296. procedure TMMFIRDlgForm.mefKeyPress(Sender: TObject; var Key: Char);
  297. begin
  298.    if (Key = #13) then TMaskEdit(Sender).OnExit(Sender);
  299. end;
  300. {-- TMMFIRDlgForm -------------------------------------------------------------}
  301. procedure TMMFIRDlgForm.spinOrderChange(Sender: TObject);
  302. begin
  303.    with TmpFIR do
  304.    begin
  305.       Order := spinOrder.Value;
  306.       edOrder.Value := Order;
  307.    end;
  308. end;
  309. {-- TMMFIRDlgForm -------------------------------------------------------------}
  310. procedure TMMFIRDlgForm.edOrderExit(Sender: TObject);
  311. var
  312.    val: integer;
  313. begin
  314.    val := Max(edOrder.Value,1);
  315.    if (val mod 2 = 0) then inc(Val);
  316.    spinOrder.Value := val;
  317. end;
  318. {-- TMMFIRDlgForm -------------------------------------------------------------}
  319. procedure TMMFIRDlgForm.edOrderKeyPress(Sender: TObject; var Key: Char);
  320. begin
  321.    if (Key = #13) then TEdit(Sender).OnExit(Sender);
  322. end;
  323. {-- TMMFIRDlgForm -------------------------------------------------------------}
  324. procedure TMMFIRDlgForm.EnvelopeTrackBegin(Sender: TObject);
  325. var
  326.    Pos: TPoint;
  327.    i: integer;
  328. begin
  329.    GetCursorPos(Pos);
  330.    Pos := Envelope.ScreenToClient(Pos);
  331.    i := Envelope.FindPointAtPos(Pos.X, Pos.Y);
  332.    if (i >= 0) and (i < FilterComboBox.Items.Count) then
  333.    begin
  334.       FilterComboBox.ItemIndex := i;
  335.       UpdateMaskEdits;
  336.    end;
  337. end;
  338. {-- TMMFIRDlgForm -------------------------------------------------------------}
  339. procedure TMMFIRDlgForm.EnvelopeTrack(Sender: TObject);
  340. var
  341.    f1,Gain: Float;
  342. begin
  343.    with FilterComboBox,Envelope do
  344.    begin
  345.       if (ItemIndex >= 0) then
  346.       with Envelope.Points[ItemIndex] do
  347.       begin
  348.          UpdateFilters := False;
  349.          f1 := X_Value/100;
  350.          Gain := VolumeToDB(Y_Value);
  351.          mef1.Value      := f1;
  352.          meGain.Value    := Gain;
  353.          spinf1.Value    := Trunc(f1*100);
  354.          spinGain.Value  := Trunc(Gain*100);
  355.          UpdateFilters   := True;
  356.       end
  357.    end;
  358. end;
  359. {-- TMMFIRDlgForm -------------------------------------------------------------}
  360. procedure TMMFIRDlgForm.EnvelopeTrackEnd(Sender: TObject);
  361. begin
  362.    Envelope.Locator := -1;
  363. end;
  364. {-- TMMFIRDlgForm -------------------------------------------------------------}
  365. procedure TMMFIRDlgForm.EnvelopeChange(Sender: TObject);
  366. var
  367.    i: integer;
  368. begin
  369.    if UpdateFilters then
  370.    with TmpFIR do
  371.    begin
  372.       Filters.BeginUpdate;
  373.       try
  374.          Filters.FreeAll;
  375.          for i := 0 to Envelope.Count-1 do
  376.          with Envelope.Points[i] do
  377.          begin
  378.             Filters.AddObject(TMMFIRFilterItem.CreateEx(X_Value/100,
  379.                                                         VolumeToDB(Y_Value)));
  380.          end;
  381.       finally
  382.          Filters.EndUpdate;
  383.       end;
  384.       FillComboBox;
  385.    end;
  386. end;
  387. {-- TMMFIRDlgForm -------------------------------------------------------------}
  388. procedure TMMFIRDlgForm.UpdateControls;
  389. var
  390.    i: integer;
  391. begin
  392.    with TmpFIR do
  393.    begin
  394.       Caption := Title + ' -  '+ Description;
  395.       FillComboBox;
  396.       spinOrder.MaxValue := MAXTAPS;
  397.       edOrder.MaxValue   := MAXTAPS;
  398.       spinOrder.Value    := TmpFIR.Order;
  399.       edOrder.Value      := TmpFIR.Order;
  400.       with Envelope do
  401.       begin
  402.          UpdateFilters := False;
  403.          try
  404.             RangeMinX := 0;
  405.             RangeMaxX := (SampleRate div 2)*100;
  406.             DispMinX  := 0;
  407.             DispMaxX  := (SampleRate div 2)*100;
  408.             RangeMinY := 0;
  409.             RangeMaxY := 2*VOLUMEBASE;
  410.             DispMinY  := 0;
  411.             DispMaxY  := 2*VOLUMEBASE;
  412.             BaseY     := VOLUMEBASE;
  413.             GridWidthX:= RangeMaxX / 16;
  414.             GridWidthY:= RangeMaxY / 10;
  415.             Clear;
  416.             if (Filters.Count > 0) then
  417.                 Envelope.Points[0].Y_Value := DBToVolume(Filters[0].Gain);
  418.             for i := 1 to Filters.Count-2 do
  419.             with Filters[i] do
  420.             begin
  421.                AddPoint(TMMEnvelopePoint.CreateEx(Trunc(f1*100),
  422.                                                   DBToVolume(Gain),
  423.                                                   False),False);
  424.             end;
  425.             if (Filters.Count > 1) then
  426.                 Envelope.Points[Envelope.Count-1].Y_Value := DBToVolume(Filters[Filters.Count-1].Gain);
  427.          finally
  428.             UpdateFilters := True;
  429.          end;
  430.       end;
  431.    end;
  432. end;
  433. {-- TMMFIRDlgForm -------------------------------------------------------------}
  434. procedure TMMFIRDlgForm.SetFIR(aValue: TMMFIRFilter);
  435. begin
  436.    if (aValue <> Nil) then
  437.    begin
  438.       FFIR := aValue;
  439.       TmpFIR.assign(aValue);
  440.       UpdateControls;
  441.       EnvelopeChange(Envelope);
  442.    end;
  443. end;
  444. {-- TMMFIRDlgForm -------------------------------------------------------------}
  445. procedure TMMFIRDlgForm.btnResetClick(Sender: TObject);
  446. begin
  447.    SetFIR(FFIR);
  448. end;
  449. {-- TMMFIRDlgForm -------------------------------------------------------------}
  450. procedure TMMFIRDlgForm.btnClearClick(Sender: TObject);
  451. begin
  452.    Envelope.Clear;
  453. end;
  454. {-- TMMFIRDlgForm -------------------------------------------------------------}
  455. procedure TMMFIRDlgForm.btnLoadClick(Sender: TObject);
  456. begin
  457.    if OpenDialog.Execute then
  458.    begin
  459.       TmpFIR.Filters.LoadFromFile(OpenDialog.FileName);
  460.       FilterComboBox.ItemIndex := -1;
  461.       UpdateControls;
  462.    end;
  463. end;
  464. {-- TMMFIRDlgForm -------------------------------------------------------------}
  465. procedure TMMFIRDlgForm.btnSaveClick(Sender: TObject);
  466. begin
  467.    if SaveDialog.Execute then
  468.    begin
  469.       TmpFIR.Filters.SaveToFile(SaveDialog.FileName);
  470.    end;
  471. end;
  472. {== TMMFIRFilterDialog ========================================================}
  473. constructor TMMFIRFilterDialog.Create(AOwner: TComponent);
  474. begin
  475.    inherited Create(AOwner);
  476.    FTitle := 'FIR-Filter Editor';
  477.    FSource := nil;
  478.    ErrorCode := ComponentRegistered(InitCode, Self, ClassName);
  479.    if (ErrorCode <> 0) then RegisterFailed(InitCode, Self , ClassName);
  480. end;
  481. {-- TMMFIRFilterDialog --------------------------------------------------------}
  482. procedure TMMFIRFilterDialog.SetSource(aSource: TMMFIRFilter);
  483. begin
  484.    if Longint(aSource) = Longint(Self) then exit;
  485.    if (aSource is TMMFIRFilter) or (aSource = Nil) then
  486.    begin
  487.       if (FSource <> aSource) then
  488.       begin
  489.          FSource := aSource;
  490.       end;
  491.    end;
  492. end;
  493. {-- TMMFIRFilterDialog --------------------------------------------------------}
  494. procedure TMMFIRFilterDialog.Notification(AComponent: TComponent; Operation: TOperation);
  495. begin
  496.    inherited Notification(AComponent, Operation);
  497.    if (Operation = opRemove) and (AComponent = FSource) then
  498.       FSource := Nil;
  499. end;
  500. {-- TMMFIRFilterDialog --------------------------------------------------------}
  501. function TMMFIRFilterDialog.Execute: Boolean;
  502. begin
  503.    Result := False;
  504.    if assigned(FSource) then
  505.    begin
  506.       with TMMFIRDlgForm.Create(Application) do
  507.       try
  508.          FIRFilter := (Self.FSource as TMMFIRFilter);
  509.          Title := Self.FTitle;
  510.          Result := (ShowModal = mrOK);
  511.       finally
  512.          Free;
  513.       end;
  514.    end;
  515. end;
  516. end.