⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mmfirdlg.pas

📁 一套及时通讯的原码
💻 PAS
📖 第 1 页 / 共 2 页
字号:
{========================================================================}
{=                (c) 1995-98 SwiftSoft Ronald Dittrich                 =}
{========================================================================}
{=                          All Rights Reserved                         =}
{========================================================================}
{=  D 01099 Dresden             = Fax.: +49 (0)351-8037944              =}
{=  Loewenstr.7a                = info@swiftsoft.de                     =}
{========================================================================}
{=  Actual versions on http://www.swiftsoft.de/mmtools.html             =}
{========================================================================}
{=  This code is for reference purposes only and may not be copied or   =}
{=  distributed in any format electronic or otherwise except one copy   =}
{=  for backup purposes.                                                =}
{=                                                                      =}
{=  No Delphi Component Kit or Component individually or in a collection=}
{=  subclassed or otherwise from the code in this unit, or associated   =}
{=  .pas, .dfm, .dcu, .asm or .obj files may be sold or distributed     =}
{=  without express permission from SwiftSoft.                          =}
{=                                                                      =}
{=  For more licence informations please refer to the associated        =}
{=  HelpFile.                                                           =}
{========================================================================}
{=  $Date: 06.09.98 - 14:25:24 $                                        =}
{========================================================================}
unit MMFirDlg;

{$I COMPILER.INC}

interface

uses
  Windows,
  Messages,
  SysUtils,
  Classes,
  Graphics,
  Controls,
  Forms,
  Dialogs,
  Mask,
  StdCtrls,
  ExtCtrls,
  MMObj,
  MMUtils,
  MMMath,
  MMSpin,
  MMFIR,
  MMDIBCv,
  MMSpectr,
  MMDSPObj,
  MMPanel,
  MMEnvelp,
  MMEdit;

type
  {-- TMMFIRDlgForm -----------------------------------------------------------}
  TMMFIRDlgForm = class(TForm)
    Bevel1: TBevel;
    Label1: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Spectrum: TMMSpectrum;
    btnSave: TButton;
    btnLoad: TButton;
    btnReset: TButton;
    btnCancel: TButton;
    btnOK: TButton;
    btnClear: TButton;
    FilterComboBox: TComboBox;
    spinf1: TMMSpinButton;
    spinGain: TMMSpinButton;
    OpenDialog: TOpenDialog;
    SaveDialog: TSaveDialog;
    TmpFIR: TMMFIRFilter;
    MMPanel1: TMMPanel;
    Envelope: TMMEnvelope;
    Label2: TLabel;
    spinOrder: TMMSpinButton;
    edOrder: TMMNumberEdit;
    mef1: TMMFloatNumberEdit;
    meGain: TMMFloatNumberEdit;

    procedure btnResetClick(Sender: TObject);
    procedure btnLoadClick(Sender: TObject);
    procedure btnSaveClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure btnClearClick(Sender: TObject);
    procedure FilterComboBoxChange(Sender: TObject);
    procedure spinChange(Sender: TObject);
    procedure EnvelopeChange(Sender: TObject);
    procedure EnvelopeTrackBegin(Sender: TObject);
    procedure EnvelopeTrack(Sender: TObject);
    procedure mefExit(Sender: TObject);
    procedure mefKeyPress(Sender: TObject; var Key: Char);
    procedure spinOrderChange(Sender: TObject);
    procedure edOrderKeyPress(Sender: TObject; var Key: Char);
    procedure edOrderExit(Sender: TObject);
    procedure EnvelopeTrackEnd(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    FTitle: String;
    FFIR: TMMFIRFilter;
    UpdateFilters: Boolean;
    UpdateSpins: Boolean;

    procedure SetTitle(aValue: String);
    procedure SetFIR(aValue: TMMFIRFilter);
    procedure UpdateControls;
    procedure FillComboBox;
    procedure UpdateMaskEdits;
    procedure GetLimits(idx: integer; var MinX, MaxX: integer);
  public
    property Title: String read FTitle write SetTitle;
    property FIRFilter: TMMFIRFilter read FFIR write SetFIR;
  end;

  {-- TMMFIRFilterDialog ------------------------------------------------------}
  TMMFIRFilterDialog = class(TMMNonVisualComponent)
  private
    FSource: TMMFIRFilter;
    FTitle : string;

    procedure SetSource(aSource: TMMFIRFilter);

  protected
    procedure Notification(AComponent: TComponent; Operation: TOperation); override;

  public
    constructor Create(AOwner: TComponent); override;
    function Execute: Boolean;

  published
    property Source: TMMFIRFilter read FSource write SetSource;
    property Title: string read FTitle write FTitle;
  end;

var
  MMFIRDlgForm: TMMFIRDlgForm;

implementation

{$R *.DFM}

{------------------------------------------------------------------------------}
function VolumeToDB(Volume: Longint): Float;
begin
   if Volume <= 0 then
      Result := -99
   else
      Result := Log10(Volume/VOLUMEBASE)*20;
end;

{------------------------------------------------------------------------------}
function DBToVolume(DB: Float): integer;
begin
   Result := Trunc(pow(10.0,DB/20.0)*VOLUMEBASE);
end;

{== TMMFIRDlgForm =============================================================}
procedure TMMFIRDlgForm.FormCreate(Sender: TObject);
begin
   FTitle := Caption;
   FFIR := nil;
   FilterComboBox.ItemIndex := -1;
   UpdateFilters := True;
   UpdateSpins   := True;
end;

{-- TMMFIRDlgForm -------------------------------------------------------------}
procedure TMMFIRDlgForm.FormShow(Sender: TObject);
begin
   {$IFDEF BUILD_ACTIVEX}
   TmpFIR.Left := -50;
   {$ENDIF}
end;

{-- TMMFIRDlgForm -------------------------------------------------------------}
procedure TMMFIRDlgForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   if (ModalResult = mrOK) then
   begin
      if (FFIR <> nil) then FFIR.Assign(TmpFIR);
   end;
end;

{-- TMMFIRDlgForm -------------------------------------------------------------}
procedure TMMFIRDlgForm.SetTitle(aValue: String);
begin
   if (aValue <> FTitle) then
   begin
      FTitle := aValue;
      Caption := FTitle + ' -  ' + TmpFIR.Description;
   end;
end;

{-- TMMFIRDlgForm -------------------------------------------------------------}
procedure TMMFIRDlgForm.FillComboBox;
var
   i,old: integer;
begin
   with FilterComboBox,TmpFIR do
   begin
      old := Max(ItemIndex,0);
      Items.Clear;
      for i := 0 to Filters.Count-1 do
      with Filters[i] do
      begin
         Items.Add(IntToStr(i+1));
      end;
      if (old >= 0) and (old < Items.Count) then ItemIndex := old;

      UpdateMaskEdits;
   end;
end;

{-- TMMFIRDlgForm -------------------------------------------------------------}
procedure TMMFIRDlgForm.FilterComboBoxChange(Sender: TObject);
begin
   if (FilterComboBox.ItemIndex >= 0) then
   begin
      Envelope.SelectAll(False);
      Envelope.Select[FilterComboBox.ItemIndex] := True;
      //Envelope.Locator := Envelope.Points[FilterComboBox.ItemIndex].X_Value;
   end;
   UpdateMaskEdits;
end;

{-- TMMFIRDlgForm -------------------------------------------------------------}
procedure TMMFIRDlgForm.GetLimits(idx: integer; var MinX, MaxX: integer);
begin
   MinX := 0;
   MaxX := TmpFIR.SampleRate div 2;

   if (idx > 0) then
   begin
       MinX := Envelope.Points[idx-1].X_Value+1;
       if (idx < Envelope.Count-1) then
           MaxX := Envelope.Points[idx+1].X_Value-1;
   end;
end;

{-- TMMFIRDlgForm -------------------------------------------------------------}
procedure TMMFIRDlgForm.UpdateMaskEdits;
var
   XMin,XMax: integer;

begin
   with FilterComboBox,TmpFIR do
   begin
      UpdateSpins := False;
      if (ItemIndex >= 0) then
      with TmpFIR.Filters[ItemIndex] do
      begin
         mef1.Value      := f1;
         meGain.Value    := Gain;

         spinf1.Value    := Trunc(f1*100);
         spinGain.Value  := Trunc(Gain*100);

         meGain.Enabled  := True;
         spinGain.Enabled:= True;

         if (FilterComboBox.ItemIndex = 0) or
            (FilterComboBox.ItemIndex = Envelope.Count-1) then
         begin
            mef1.Enabled    := False;
            spinf1.Enabled  := False;
         end
         else
         begin
            mef1.Enabled    := True;
            spinf1.Enabled  := True;

            GetLimits(FilterComboBox.ItemIndex,XMin,XMax);

            spinf1.MinValue := XMin;
            spinf1.MaxValue := XMax;
         end;
      end
      else
      begin
         mef1.Value      := 0;
         meGain.Value    := 0;

         spinf1.Value    := 0;
         spinGain.Value  := 0;

         mef1.Enabled    := False;
         meGain.Enabled  := False;

         spinf1.Enabled  := False;
         spinGain.Enabled:= False;
      end;
      UpdateSpins        := True;
   end;
end;

{-- TMMFIRDlgForm -------------------------------------------------------------}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -