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

📄 mmflange.pas

📁 一套及时通讯的原码
💻 PAS
📖 第 1 页 / 共 2 页
字号:
{========================================================================}
{=                (c) 1995-98 SwiftSoft Ronald Dittrich                 =}
{========================================================================}
{=                          All Rights Reserved                         =}
{========================================================================}
{=  D 01099 Dresden             = Tel.: +0351-8012255                   =}
{=  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: 20.01.1998 - 18:00:00 $                                      =}
{========================================================================}
unit MMFlange;

{$I COMPILER.INC}

interface

uses
{$IFDEF WIN32}
    Windows,
{$ELSE}
    WinTypes,
    WinProcs,
{$ENDIF}
    SysUtils,
    Classes,
    Controls,
    IniFiles,
    MMSystem,
    MMRegs,
    MMObj,
    MMDSPObj,
    MMUtils,
    MMMath,
    MMWaveIO,
    MMPCMSup,
    MMFX;

type
   EMMFlangeError = class(Exception);

   {-- TMMFlanger -------------------------------------------------------------}
   TMMFlanger = class(TMMDSPComponent)
   private
      FEnabled       : Boolean;
      FOpen          : Boolean;
      FPFlange       : PFlanger;
      FDescription   : String;
      FDryMix        : TMMEffectVolume;
      FWetMix        : TMMEffectVolume;
      FFeedBack      : TMMFeedBack;
      FMaxDelay      : integer;
      FDelay         : integer;
      FDepth         : Float;
      FRate          : Float;
      FCleanup       : Longint;

      FOnChange      : TNotifyEvent;
      FOnPcmOverflow : TNotifyEvent;

      procedure SetDescription(aValue: String);
      procedure SetEnabled(aValue: Boolean);
      procedure SetGains(index: integer; aValue: TMMEffectVolume);
      procedure SetFeedBack(aValue: TMMFeedBack);
      procedure SetDelays(index: integer; aValue: integer);
      procedure SetDepth(aValue: Float);
      procedure SetRate(aValue: Float);

   protected
      procedure Assign(Source: TPersistent); override;
      procedure SetPWaveFormat(aValue: PWaveFormatEx); override;
      procedure Change; dynamic;
      procedure Update; virtual;
      procedure Opened; override;
      procedure Closed; override;
      procedure Started; override;
      procedure PcmOverflow; dynamic;
      procedure BufferReady(lpwh: PWaveHdr); override;
      procedure BufferLoad(lpwh: PWaveHdr; var MoreBuffers: Boolean); override;

   public
      constructor Create(aOwner: TComponent); override;
      destructor Destroy; override;

      procedure SaveToIniFile(IniFile: TFileName; Section: string);
      procedure ReadFromIniFile(IniFile: TFileName; Section: string);
      procedure ReadIniSections(IniFile: TFileName; Strings: TStrings);
      procedure DeleteSection(IniFile: TFileName; Section: string);

      procedure Open;
      procedure Close;
      procedure Process(Buffer: PChar; Length: integer);
      function  CleanUp(Buffer: PChar; Length: integer): Longint;

   published
      property OnChange: TNotifyEvent read FOnChange write FOnChange;
      property OnPcmOverflow: TNotifyEvent read FOnPcmOverflow write FOnPcmOverflow;

      property Input;
      property Output;
      property Enabled: Boolean read FEnabled write SetEnabled default True;
      property Description: String read FDescription write SetDescription;
      property DryMix: TMMEffectVolume index 0 read FDryMix write SetGains;
      property WetMix: TMMEffectVolume index 1 read FWetMix write SetGains;
      property FeedBack: TMMFeedBack read FFeedback write SetFeedBack;
      property MaxDelay: integer index 0 read FMaxDelay write SetDelays;
      property Delay: integer index 1 read FDelay write SetDelays;
      property Depth: Float read FDepth write SetDepth;
      property Rate: Float read FRate write SetRate;
   end;

implementation

{== TMMFlanger ============================================================}
constructor TMMFlanger.Create(aOwner: TComponent);
begin
   inherited Create(aOwner);

   FEnabled     := True;
   FOpen        := False;
   FPFlange     := nil;

   FDescription := 'Untitled';
   FDryMix      := 50;
   FWetMix      := 50;
   FFeedBack    := 0;
   FMaxDelay    := 250;
   FDelay       := 1;
   FDepth       := 0;
   FRate        := 0;
end;

{-- TMMFlanger ------------------------------------------------------------}
destructor TMMFlanger.Destroy;
begin
   Close;

   inherited Destroy;
end;

{-- TMMFlanger ------------------------------------------------------------}
procedure TMMFlanger.Assign(Source: TPersistent);
begin
   if (Source is TMMFlanger) then
   begin
      if (Source <> nil) then
      begin
         Enabled    := TMMFlanger(Source).Enabled;
         Description:= TMMFlanger(Source).Description;
         DryMix     := TMMFlanger(Source).DryMix;
         WetMix     := TMMFlanger(Source).WetMix;
         FeedBack   := TMMFlanger(Source).FeedBack;
         MaxDelay   := TMMFlanger(Source).MaxDelay;
         Delay      := TMMFlanger(Source).Delay;
         Depth      := TMMFlanger(Source).Depth;
         Rate       := TMMFlanger(Source).Rate;
      end;
   end;
end;

{-- TMMFlanger ------------------------------------------------------------}
procedure TMMFlanger.PcmOverflow;
begin
   if assigned(FOnPcmOverflow) then FOnPcmOverflow(Self);
end;

{-- TMMFlanger ------------------------------------------------------------}
procedure TMMFlanger.Change;
begin
   if assigned(FOnChange) then FOnChange(Self);
end;

{-- TMMFlanger ------------------------------------------------------------}
procedure TMMFlanger.SaveToIniFile(IniFile: TFileName; Section: string);
begin
   if (IniFile <> '') then
   begin
      with TIniFile.Create(IniFile) do
      try
         if Pos('Flanger.',Section) = 0 then Section := 'Flanger.'+Section;
         WriteInteger(Section, 'DryMix', DryMix);
         WriteInteger(Section, 'WetMix', WetMix);
         WriteInteger(Section, 'FeedBack', FeedBack);
         WriteInteger(Section, 'MaxDelay', MaxDelay);
         WriteInteger(Section, 'Delay', Delay);
         WriteString(Section, 'Depth', FloatToStr(Depth));
         WriteString(Section, 'Rate', FloatToStr(Rate));

      finally
         Free;
      end;
   end;
end;

{-- TMMFlanger ------------------------------------------------------------}
procedure TMMFlanger.ReadFromIniFile(IniFile: TFileName; Section: string);
var
   i,P: integer;
begin
   if (IniFile <> '') then
   begin
      with TIniFile.Create(IniFile) do
      try
         if Pos('Flanger.',Section) = 0 then Section := 'Flanger.'+Section;
         i := ReadInteger(Section, 'MaxDelay', -1);
         if (i > 0) then
         begin
            DryMix      := ReadInteger(Section, 'DryMix', 50);
            WetMix      := ReadInteger(Section, 'WetMix', 50);
            FeedBack    := ReadInteger(Section, 'FeedBack', 0);
            MaxDelay    := ReadInteger(Section, 'MaxDelay', 250);
            Delay       := ReadInteger(Section, 'Delay', 1);
            Depth       := StrToFloat(ReadString(Section, 'Depth', '4.0'));
            Rate        := StrToFloat(ReadString(Section, 'Rate', '1.0'));

            P := Pos('.',Section);
            if (P <> 0) then Section := Copy(Section,P+1,MaxInt);
            Description := Section;
         end;

      finally
         Free;
      end;
   end;
end;

{-- TMMFlanger ------------------------------------------------------------}
procedure TMMFlanger.ReadIniSections(IniFile: TFileName; Strings: TStrings);
var
   i, P: integer;
   Sections: TStringList;
begin
   if (IniFile <> '') and (Strings <> nil) then
   begin
      with TIniFile.Create(IniFile) do
      try
         Sections := TStringList.Create;
         try
            ReadSections(Sections);
            Strings.BeginUpdate;
            try
               Strings.Clear;
               for i := 0 to Sections.Count-1 do
               begin
                  P := Pos('.',Sections[i]);
                  if (P <> 0) then Strings.Add(Copy(Sections[i],P+1,MaxInt));
               end;

⌨️ 快捷键说明

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