文档章节

在 Delphi 下使用 DirectSound (16): 环境混响效果器 IDirectSoundFXI3DL2Reverb8

涂孟超
 涂孟超
发布于 2014/09/26 15:37
字数 1466
阅读 8
收藏 0
点赞 0
评论 0

IDirectSoundFXI3DL2Reverb8 效果器除了拥有 GetAllParameters()、SetAllParameters() 外, 还比其它效果器多出了四个方法:
GetQuality()、SetQuality()、GetPreset()、SetPreset().

{相关结构:}
TDSFXI3DL2Reverb = packed record
  lRoom: Longint;              //-10000 : 0    : -1000  (mB)
  lRoomHF: Longint;            //-10000 : 0    : 0      (mB)
  flRoomRolloffFactor: Single; //     0 : 10   : 0.0
  flDecayTime: Single;         //   0.1 : 20   : 1.49   (s)
  flDecayHFRatio: Single;      //   0.1 : 2    : 0.83
  lReflections: Longint;       //-10000 : 1000 : -2602  (mB)
  flReflectionsDelay: Single;  //     0 : 0.3  : 0.007  (s)
  lReverb: Longint;            //-10000 : 2000 : 200    (mB)
  flReverbDelay: Single;       //     0 : 0.1  : 0.011  (s)
  flDiffusion: Single;         //     0 : 100  : 100.0  (%)
  flDensity: Single;           //     0 : 100  : 100.0  (%)
  flHFReference: Single;       //   20 : 20000 : 5000.0 (Hz)
end;

//该结构相关常量:
DSFX_I3DL2REVERB_ROOM_MIN                  = -10000;
DSFX_I3DL2REVERB_ROOM_MAX                  = 0;
DSFX_I3DL2REVERB_ROOM_DEFAULT              = -1000;

DSFX_I3DL2REVERB_ROOMHF_MIN                = -10000;
DSFX_I3DL2REVERB_ROOMHF_MAX                = 0;
DSFX_I3DL2REVERB_ROOMHF_DEFAULT            = -100;

DSFX_I3DL2REVERB_ROOMROLLOFFFACTOR_MIN     = 0.0;
DSFX_I3DL2REVERB_ROOMROLLOFFFACTOR_MAX     = 10.0;
DSFX_I3DL2REVERB_ROOMROLLOFFFACTOR_DEFAULT = 0.0;

DSFX_I3DL2REVERB_DECAYTIME_MIN             = 0.1;
DSFX_I3DL2REVERB_DECAYTIME_MAX             = 20.0;
DSFX_I3DL2REVERB_DECAYTIME_DEFAULT         = 1.49;

DSFX_I3DL2REVERB_DECAYHFRATIO_MIN          = 0.1;
DSFX_I3DL2REVERB_DECAYHFRATIO_MAX          = 2.0;
DSFX_I3DL2REVERB_DECAYHFRATIO_DEFAULT      = 0.83;

DSFX_I3DL2REVERB_REFLECTIONS_MIN           = -10000;
DSFX_I3DL2REVERB_REFLECTIONS_MAX           = 1000;
DSFX_I3DL2REVERB_REFLECTIONS_DEFAULT       = -2602;

DSFX_I3DL2REVERB_REFLECTIONSDELAY_MIN      = 0.0;
DSFX_I3DL2REVERB_REFLECTIONSDELAY_MAX      = 0.3;
DSFX_I3DL2REVERB_REFLECTIONSDELAY_DEFAULT  = 0.007;

DSFX_I3DL2REVERB_REVERB_MIN                = -10000;
DSFX_I3DL2REVERB_REVERB_MAX                = 2000;
DSFX_I3DL2REVERB_REVERB_DEFAULT            = 200;

DSFX_I3DL2REVERB_REVERBDELAY_MIN           = 0.0;
DSFX_I3DL2REVERB_REVERBDELAY_MAX           = 0.1;
DSFX_I3DL2REVERB_REVERBDELAY_DEFAULT       = 0.011;

DSFX_I3DL2REVERB_DIFFUSION_MIN             = 0.0;
DSFX_I3DL2REVERB_DIFFUSION_MAX             = 100.0;
DSFX_I3DL2REVERB_DIFFUSION_DEFAULT         = 100.0;

DSFX_I3DL2REVERB_DENSITY_MIN               = 0.0;
DSFX_I3DL2REVERB_DENSITY_MAX               = 100.0;
DSFX_I3DL2REVERB_DENSITY_DEFAULT           = 100.0;

DSFX_I3DL2REVERB_HFREFERENCE_MIN           = 20.0;
DSFX_I3DL2REVERB_HFREFERENCE_MAX           = 20000.0;
DSFX_I3DL2REVERB_HFREFERENCE_DEFAULT       = 5000.0;


{SetQuality() 方法相关常量:}
DSFX_I3DL2REVERB_QUALITY_MIN               = 0;
DSFX_I3DL2REVERB_QUALITY_MAX               = 3;
DSFX_I3DL2REVERB_QUALITY_DEFAULT           = 2;

{SetPreset() 方法相关常量:}
DSFX_I3DL2_ENVIRONMENT_PRESET_DEFAULT         = 0;
DSFX_I3DL2_ENVIRONMENT_PRESET_GENERIC         = 1;
DSFX_I3DL2_ENVIRONMENT_PRESET_PADDEDCELL      = 2;
DSFX_I3DL2_ENVIRONMENT_PRESET_ROOM            = 3;
DSFX_I3DL2_ENVIRONMENT_PRESET_BATHROOM        = 4;
DSFX_I3DL2_ENVIRONMENT_PRESET_LIVINGROOM      = 5;
DSFX_I3DL2_ENVIRONMENT_PRESET_STONEROOM       = 6;
DSFX_I3DL2_ENVIRONMENT_PRESET_AUDITORIUM      = 7;
DSFX_I3DL2_ENVIRONMENT_PRESET_CONCERTHALL     = 8;
DSFX_I3DL2_ENVIRONMENT_PRESET_CAVE            = 9;
DSFX_I3DL2_ENVIRONMENT_PRESET_ARENA           = 10;
DSFX_I3DL2_ENVIRONMENT_PRESET_HANGAR          = 11;
DSFX_I3DL2_ENVIRONMENT_PRESET_CARPETEDHALLWAY = 12;
DSFX_I3DL2_ENVIRONMENT_PRESET_HALLWAY         = 13;
DSFX_I3DL2_ENVIRONMENT_PRESET_STONECORRIDOR   = 14;
DSFX_I3DL2_ENVIRONMENT_PRESET_ALLEY           = 15;
DSFX_I3DL2_ENVIRONMENT_PRESET_FOREST          = 16;
DSFX_I3DL2_ENVIRONMENT_PRESET_CITY            = 17;
DSFX_I3DL2_ENVIRONMENT_PRESET_MOUNTAINS       = 18;
DSFX_I3DL2_ENVIRONMENT_PRESET_QUARRY          = 19;
DSFX_I3DL2_ENVIRONMENT_PRESET_PLAIN           = 20;
DSFX_I3DL2_ENVIRONMENT_PRESET_PARKINGLOT      = 21;
DSFX_I3DL2_ENVIRONMENT_PRESET_SEWERPIPE       = 22;
DSFX_I3DL2_ENVIRONMENT_PRESET_UNDERWATER      = 23;
DSFX_I3DL2_ENVIRONMENT_PRESET_SMALLROOM       = 24;
DSFX_I3DL2_ENVIRONMENT_PRESET_MEDIUMROOM      = 25;
DSFX_I3DL2_ENVIRONMENT_PRESET_LARGEROOM       = 26;
DSFX_I3DL2_ENVIRONMENT_PRESET_MEDIUMHALL      = 27;
DSFX_I3DL2_ENVIRONMENT_PRESET_LARGEHALL       = 28;
DSFX_I3DL2_ENVIRONMENT_PRESET_PLATE           = 29;


测试代码:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    LabeledEdit1: TLabeledEdit;
    LabeledEdit2: TLabeledEdit;
    LabeledEdit3: TLabeledEdit;
    LabeledEdit4: TLabeledEdit;
    LabeledEdit5: TLabeledEdit;
    LabeledEdit6: TLabeledEdit;
    LabeledEdit7: TLabeledEdit;
    LabeledEdit8: TLabeledEdit;
    LabeledEdit9: TLabeledEdit;
    LabeledEdit10: TLabeledEdit;
    LabeledEdit11: TLabeledEdit;
    LabeledEdit12: TLabeledEdit;
    Label1: TLabel;
    Label2: TLabel;
    ComboBox1: TComboBox;
    ComboBox2: TComboBox;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure LabeledEdit1Change(Sender: TObject);
    procedure ComboBox1Change(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses DirectSound, ActiveX, ReadWave2; //ReadWave2 是前面(9)自定义的单元

var
  myDSound: IDirectSound8;
  buf8: IDirectSoundBuffer8;
  fxI3DL2Reverb: IDirectSoundFXI3DL2Reverb8; //IDirectSoundFXI3DL2Reverb8 效果器

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  System.ReportMemoryLeaksOnShutdown := True;
  DirectSoundCreate8(nil, myDSound, nil);
  myDSound.SetCooperativeLevel(Handle, DSSCL_NORMAL);

  Button1.Caption := '打开并播放';
  Button2.Caption := '停止播放';

  LabeledEdit1.EditLabel.Caption := 'lRoom: -10000 - 0';
  LabeledEdit1.Text := '-1000';
  LabeledEdit1.Tag := 1;

  LabeledEdit2.EditLabel.Caption := 'lRoomHF: -10000 - 0';
  LabeledEdit2.Text := '0';
  LabeledEdit2.Tag := 2;

  LabeledEdit3.EditLabel.Caption := 'flRoomRolloffFactor: 0.0 - 10.0';
  LabeledEdit3.Text := '0.0';
  LabeledEdit3.Tag := 3;

  LabeledEdit4.EditLabel.Caption := 'flDecayTime: 0.1 - 20.0';
  LabeledEdit4.Text := '1.49';
  LabeledEdit4.Tag := 4;

  LabeledEdit5.EditLabel.Caption := 'flDecayHFRatio: 0.1 - 2.0';
  LabeledEdit5.Text := '0.83';
  LabeledEdit5.Tag := 5;

  LabeledEdit6.EditLabel.Caption := 'lReflections: -10000 - 1000';
  LabeledEdit6.Text := '-2602';
  LabeledEdit6.Tag := 6;

  LabeledEdit7.EditLabel.Caption := 'flReflectionsDelay: 0.0 - 0.3';
  LabeledEdit7.Text := '0.007';
  LabeledEdit7.Tag := 7;

  LabeledEdit8.EditLabel.Caption := 'lReverb: -10000 - 2000';
  LabeledEdit8.Text := '200';
  LabeledEdit8.Tag := 8;

  LabeledEdit9.EditLabel.Caption := 'flReverbDelay: 0.0 -0.1';
  LabeledEdit9.Text := '0.011';
  LabeledEdit9.Tag := 9;

  LabeledEdit10.EditLabel.Caption := 'flDiffusion: 0.0 - 100.0';
  LabeledEdit10.Text := '100.0';
  LabeledEdit10.Tag := 10;

  LabeledEdit11.EditLabel.Caption := 'flDensity: 0.0 - 100.0';
  LabeledEdit11.Text := '100.0';
  LabeledEdit11.Tag := 11;

  LabeledEdit12.EditLabel.Caption := 'flHFReference: 20.0 - 20000.0';
  LabeledEdit12.Text := '5000.0';
  LabeledEdit12.Tag := 12;

  {其它 TLabeledEdit 的 OnChange 事件同 LabeledEdit1}
  for i := 0 to ControlCount - 1 do
    if Controls[i].ClassName = LabeledEdit1.ClassName then TLabeledEdit(Controls[i]).OnChange := LabeledEdit1.OnChange;

  {测试 SetQuality()、SetPreset() 的控件}
  Label1.Caption := 'SetQuality:';
  Label2.Caption := 'SetPreset:';
  ComboBox1.Items.CommaText := '最低,低,高,最高';
  ComboBox2.Items.CommaText :=
      'DSFX_I3DL2_ENVIRONMENT_PRESET_DEFAULT,'
    + 'DSFX_I3DL2_ENVIRONMENT_PRESET_GENERIC,'
    + 'DSFX_I3DL2_ENVIRONMENT_PRESET_PADDEDCELL,'
    + 'DSFX_I3DL2_ENVIRONMENT_PRESET_ROOM,'
    + 'DSFX_I3DL2_ENVIRONMENT_PRESET_BATHROOM,'
    + 'DSFX_I3DL2_ENVIRONMENT_PRESET_LIVINGROOM,'
    + 'DSFX_I3DL2_ENVIRONMENT_PRESET_STONEROOM,'
    + 'DSFX_I3DL2_ENVIRONMENT_PRESET_AUDITORIUM,'
    + 'DSFX_I3DL2_ENVIRONMENT_PRESET_CONCERTHALL,'
    + 'DSFX_I3DL2_ENVIRONMENT_PRESET_CAVE,'
    + 'DSFX_I3DL2_ENVIRONMENT_PRESET_ARENA,'
    + 'DSFX_I3DL2_ENVIRONMENT_PRESET_HANGAR,'
    + 'DSFX_I3DL2_ENVIRONMENT_PRESET_CARPETEDHALLWAY,'
    + 'DSFX_I3DL2_ENVIRONMENT_PRESET_HALLWAY,'
    + 'DSFX_I3DL2_ENVIRONMENT_PRESET_STONECORRIDOR,'
    + 'DSFX_I3DL2_ENVIRONMENT_PRESET_ALLEY,'
    + 'DSFX_I3DL2_ENVIRONMENT_PRESET_FOREST,'
    + 'DSFX_I3DL2_ENVIRONMENT_PRESET_CITY,'
    + 'DSFX_I3DL2_ENVIRONMENT_PRESET_MOUNTAINS,'
    + 'DSFX_I3DL2_ENVIRONMENT_PRESET_QUARRY,'
    + 'DSFX_I3DL2_ENVIRONMENT_PRESET_PLAIN,'
    + 'DSFX_I3DL2_ENVIRONMENT_PRESET_PARKINGLOT,'
    + 'DSFX_I3DL2_ENVIRONMENT_PRESET_SEWERPIPE,'
    + 'DSFX_I3DL2_ENVIRONMENT_PRESET_UNDERWATER,'
    + 'DSFX_I3DL2_ENVIRONMENT_PRESET_SMALLROOM,'
    + 'DSFX_I3DL2_ENVIRONMENT_PRESET_MEDIUMROOM,'
    + 'DSFX_I3DL2_ENVIRONMENT_PRESET_LARGEROOM,'
    + 'DSFX_I3DL2_ENVIRONMENT_PRESET_MEDIUMHALL,'
    + 'DSFX_I3DL2_ENVIRONMENT_PRESET_LARGEHALL,'
    + 'DSFX_I3DL2_ENVIRONMENT_PRESET_PLATE';

  ComboBox1.ItemIndex := 2;
  ComboBox2.ItemIndex := 0;
  ComboBox2.OnChange := ComboBox1.OnChange;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  buf: IDirectSoundBuffer;
  bufDesc: TDSBufferDesc;
  rEffect: TDSEffectDesc;
  wav: TReadWave;
  p1: Pointer;
  n1: DWORD;
begin
  wav := TReadWave.Create;
  if not wav.OpenDialog then begin wav.Free; Exit; end;

  ZeroMemory(@bufDesc, SizeOf(TDSBufferDesc));
  bufDesc.dwSize := SizeOf(TDSBufferDesc);
  bufDesc.dwFlags := DSBCAPS_CTRLFX or DSBCAPS_LOCSOFTWARE;
  bufDesc.dwBufferBytes := wav.Size;
  bufDesc.lpwfxFormat := @wav.Format;
  myDSound.CreateSoundBuffer(bufDesc, buf, nil);
  buf.QueryInterface(IID_IDirectSoundBuffer8, buf8);

  buf8.Lock(0, 0, @p1, @n1, nil, nil, DSBLOCK_ENTIREBUFFER);
  wav.Read(p1, n1);
  wav.Free;
  buf8.Unlock(p1, n1, nil, 0);

  ZeroMemory(@rEffect, SizeOf(TDSEffectDesc));
  rEffect.dwSize := SizeOf(TDSEffectDesc);
  rEffect.dwFlags := 0;
  rEffect.guidDSFXClass := GUID_DSFX_STANDARD_I3DL2REVERB; //GUID_DSFX_STANDARD_I3DL2REVERB;

  Set8087CW($133f); //少了这句, 下面的 SetFX() 会浮点溢出
  buf8.SetFX(1, @rEffect, nil);
  Set8087CW(Default8087CW); //恢复默认的浮点精度

  buf8.GetObjectInPath(GUID_DSFX_STANDARD_I3DL2REVERB, 0, IID_IDirectSoundFXI3DL2Reverb8, fxI3DL2Reverb);
  buf8.Play(0, 0, DSBPLAY_LOOPING);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if Assigned(buf8) then buf8.Stop;
end;

procedure TForm1.LabeledEdit1Change(Sender: TObject);
var
  rI3DL2Reverb: TDSFXI3DL2Reverb;
  f: Single;
  obj: TLabeledEdit;
begin
  obj := Sender as TLabeledEdit;
  if obj.Text = '-' then Exit;

  f := StrToFloatDef(obj.Text, MaxInt);
  case obj.Tag of
    1:  if (f < -10000) or (f > 0)     then obj.Text := '-1000';
    2:  if (f < -10000) or (f > 0)     then obj.Text := '0';
    3:  if (f < 0)      or (f > 10)    then obj.Text := '0.0';
    4:  if (f < 0.1)    or (f > 20)    then obj.Text := '1.49';
    5:  if (f < 0.1)    or (f > 2)     then obj.Text := '0.83';
    6:  if (f < -10000) or (f > 1000)  then obj.Text := '-2602';
    7:  if (f < 0)      or (f > 0.3)   then obj.Text := '0.007';
    8:  if (f < -10000) or (f > 2000)  then obj.Text := '200';
    9:  if (f < 0)      or (f > 0.1)   then obj.Text := '0.011';
    10: if (f < 0)      or (f > 100)   then obj.Text := '100.0';
    11: if (f < 0)      or (f > 100)   then obj.Text := '100.0';
    12: if (f < 20)     or (f > 20000) then obj.Text := '5000.0';
  end;

  if buf8 = nil then Exit;
  rI3DL2Reverb.lRoom               := StrToInt(LabeledEdit1.Text);
  rI3DL2Reverb.lRoomHF             := StrToInt(LabeledEdit2.Text);
  rI3DL2Reverb.flRoomRolloffFactor := StrToFloat(LabeledEdit3.Text);
  rI3DL2Reverb.flDecayTime         := StrToFloat(LabeledEdit4.Text);
  rI3DL2Reverb.flDecayHFRatio      := StrToFloat(LabeledEdit5.Text);
  rI3DL2Reverb.lReflections        := StrToInt(LabeledEdit6.Text);
  rI3DL2Reverb.flReflectionsDelay  := StrToFloat(LabeledEdit7.Text);
  rI3DL2Reverb.lReverb             := StrToInt(LabeledEdit8.Text);
  rI3DL2Reverb.flReverbDelay       := StrToFloat(LabeledEdit9.Text);
  rI3DL2Reverb.flDiffusion         := StrToFloat(LabeledEdit10.Text);
  rI3DL2Reverb.flDensity           := StrToFloat(LabeledEdit11.Text);
  rI3DL2Reverb.flHFReference       := StrToFloat(LabeledEdit12.Text);
  fxI3DL2Reverb.SetAllParameters(rI3DL2Reverb);
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  if fxI3DL2Reverb = nil then Exit;
  fxI3DL2Reverb.SetQuality(TComboBox(Sender).ItemIndex);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  buf8 := nil;
  myDSound := nil;
end;

end.


窗体设计:
object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 366
  ClientWidth = 548
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  OnDestroy = FormDestroy
  PixelsPerInch = 96
  TextHeight = 13
  object Label1: TLabel
    Left = 128
    Top = 312
    Width = 31
    Height = 13
    Caption = 'Label1'
  end
  object Label2: TLabel
    Left = 207
    Top = 312
    Width = 31
    Height = 13
    Caption = 'Label2'
  end
  object Button1: TButton
    Left = 32
    Top = 28
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
    OnClick = Button1Click
  end
  object Button2: TButton
    Left = 32
    Top = 75
    Width = 75
    Height = 25
    Caption = 'Button2'
    TabOrder = 1
    OnClick = Button2Click
  end
  object LabeledEdit1: TLabeledEdit
    Left = 128
    Top = 30
    Width = 193
    Height = 21
    EditLabel.Width = 61
    EditLabel.Height = 13
    EditLabel.Caption = 'LabeledEdit1'
    TabOrder = 2
    OnChange = LabeledEdit1Change
  end
  object LabeledEdit2: TLabeledEdit
    Left = 128
    Top = 77
    Width = 193
    Height = 21
    EditLabel.Width = 61
    EditLabel.Height = 13
    EditLabel.Caption = 'LabeledEdit2'
    TabOrder = 3
  end
  object LabeledEdit3: TLabeledEdit
    Left = 128
    Top = 125
    Width = 193
    Height = 21
    EditLabel.Width = 61
    EditLabel.Height = 13
    EditLabel.Caption = 'LabeledEdit3'
    TabOrder = 4
  end
  object LabeledEdit4: TLabeledEdit
    Left = 128
    Top = 173
    Width = 193
    Height = 21
    EditLabel.Width = 61
    EditLabel.Height = 13
    EditLabel.Caption = 'LabeledEdit4'
    TabOrder = 5
  end
  object LabeledEdit5: TLabeledEdit
    Left = 128
    Top = 221
    Width = 193
    Height = 21
    EditLabel.Width = 61
    EditLabel.Height = 13
    EditLabel.Caption = 'LabeledEdit5'
    TabOrder = 6
  end
  object LabeledEdit6: TLabeledEdit
    Left = 128
    Top = 269
    Width = 193
    Height = 21
    EditLabel.Width = 61
    EditLabel.Height = 13
    EditLabel.Caption = 'LabeledEdit6'
    TabOrder = 7
  end
  object LabeledEdit7: TLabeledEdit
    Left = 336
    Top = 30
    Width = 193
    Height = 21
    EditLabel.Width = 61
    EditLabel.Height = 13
    EditLabel.Caption = 'LabeledEdit7'
    TabOrder = 8
  end
  object LabeledEdit8: TLabeledEdit
    Left = 336
    Top = 78
    Width = 193
    Height = 21
    EditLabel.Width = 61
    EditLabel.Height = 13
    EditLabel.Caption = 'LabeledEdit8'
    TabOrder = 9
  end
  object LabeledEdit9: TLabeledEdit
    Left = 336
    Top = 125
    Width = 193
    Height = 21
    EditLabel.Width = 61
    EditLabel.Height = 13
    EditLabel.Caption = 'LabeledEdit9'
    TabOrder = 10
  end
  object LabeledEdit10: TLabeledEdit
    Left = 336
    Top = 173
    Width = 193
    Height = 21
    EditLabel.Width = 67
    EditLabel.Height = 13
    EditLabel.Caption = 'LabeledEdit10'
    TabOrder = 11
  end
  object LabeledEdit11: TLabeledEdit
    Left = 336
    Top = 221
    Width = 193
    Height = 21
    EditLabel.Width = 67
    EditLabel.Height = 13
    EditLabel.Caption = 'LabeledEdit11'
    TabOrder = 12
  end
  object LabeledEdit12: TLabeledEdit
    Left = 336
    Top = 269
    Width = 193
    Height = 21
    EditLabel.Width = 67
    EditLabel.Height = 13
    EditLabel.Caption = 'LabeledEdit12'
    TabOrder = 13
  end
  object ComboBox1: TComboBox
    Left = 128
    Top = 331
    Width = 73
    Height = 21
    TabOrder = 14
    Text = 'ComboBox1'
    OnChange = ComboBox1Change
  end
  object ComboBox2: TComboBox
    Left = 207
    Top = 331
    Width = 322
    Height = 21
    TabOrder = 15
    Text = 'ComboBox2'
  end
end


运行效果图:


本文转载自:http://www.cnblogs.com/del/archive/2011/01/24/1943379.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2004
码字总数 14107
作品 0
深圳
程序员
Freeverb3 3.1.1 发布,声音处理库

Freeverb3 3.1.1 发布,修复了 cpuid 问题以及一些在 amd64 平台上的小问题。 Freeverb3是一个声音处理库,其中包括采样率缩放功能的一些修复的freeverb版本,NReverb延长执行CCRMA,对脉冲响...

oschina ⋅ 2014/06/10 ⋅ 0

Freeverb3 2.5.22 发布,声音处理库

Freeverb3 2.5.22 发布,该版本新增很多 Jack 效果插件。 Freeverb3 是一个声音处理库,其中包括采样率缩放功能的一些修复的freeverb版本,NReverb延长执行CCRMA,对脉冲响应混响,FIR滤波器...

红薯 ⋅ 2011/10/24 ⋅ 0

Freeverb3 2.5.15 发布,声音处理库

Freeverb3 是一个声音处理库,其中包括采样率缩放功能的一些修复的freeverb版本,NReverb延长执行CCRMA,对脉冲响应混响,FIR滤波器构造带分 离器,softknee执行/ hardknee压缩机,softknee ...

红薯 ⋅ 2011/06/07 ⋅ 1

Freeverb3 3.0.0 发布,声音处理库

Freeverb3 3.0.0 支持 Audacious 3.1 API,移除一些旧的无用的插件,支持 GTK 3 API。 Freeverb3 是一个声音处理库,其中包括采样率缩放功能的一些修复的freeverb版本,NReverb延长执行CCRMA...

oschina ⋅ 2013/06/02 ⋅ 0

Freeverb3 3.0.2 发布,声音处理库

Freeverb3 3.0.2 增加 LFSR 线性反馈移位寄存器的最大长度序列 MLS 生成器;autoconf 文件更新以适应新的 autoconf/automake 结构;支持 out-of-tree 构建。 Freeverb3 是一个声音处理库,其...

oschina ⋅ 2013/11/17 ⋅ 1

DirectSound入门

文档内容: (费话篇) 关于DirectSound DirectSound是DirectX API的音频(waveaudio)组件之一,它可以提供快速的混音、硬件加速功能,并且可以直接访问相关设备,当然,最主要的是它提供的...

长平狐 ⋅ 2012/08/13 ⋅ 0

远场语音交互中的麦克风阵列技术解读

最近,微软的Surface Studio着实让人惊艳了一把!除了设计以外,大家都感叹PC机也开始使用麦克风阵列了。其实,早前亚马逊Echo和谷歌Home两者PK,除了云端服务,他们在硬件上区别最大的就是麦...

陈孝良 ⋅ 2016/12/03 ⋅ 0

声音处理库--Freeverb3

Freeverb3 是一个声音处理库,其中包括采样率缩放功能的一些修复的freeverb版本,NReverb延长执行CCRMA,对脉冲响应混响,FIR滤波器构造带分离器,softknee执行/ hardknee压缩机,softknee ...

匿名 ⋅ 2010/03/20 ⋅ 0

MIMO声信号处理

1 引言 1.1 MIMO声信号处理 一方面,我们面临着更加复杂的声环境。麦克风接收到的信号,目标语音混杂着以下四种干扰: 1 噪声。 2 回声。回声的产生是由于扬声器和麦克风的耦合。回声的存在会...

chenxiao60 ⋅ 2016/07/07 ⋅ 0

小米和西工大联手,三篇论文被Interspeech接收

翻译 | 林椿眄 编辑 | 阿司匹林 出品 | 人工智能头条(公众号ID:AI_Thinker) 小米和西北工业大学的“交情”不浅。 去年 7 月,小米和西工大计算机学院的谢磊教授合作,在 arXiv 上提交了一...

AI科技大本营 ⋅ 06/19 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 48分钟前 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

一起读书《深入浅出nodejs》-node模块机制

node 模块机制 前言 说到node,就不免得提到JavaScript。JavaScript自诞生以来,经历了工具类库、组件库、前端框架、前端应用的变迁。通过无数开发人员的努力,JavaScript不断被类聚和抽象,...

小草先森 ⋅ 昨天 ⋅ 0

Java桌球小游戏

其实算不上一个游戏,就是两张图片,不停的重画,改变ball图片的位置。一个左右直线碰撞的,一个有角度碰撞的。 左右直线碰撞 package com.bjsxt.test;import javax.swing.*;import j...

森林之下 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部