С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Lazarus
Войти
Регистрация
Восстановить пароль
 
USERPC01
0 / 0 / 0
Регистрация: 29.06.2018
Сообщений: 222
1

Эквалайзер на Лазарусе

06.07.2018, 13:59. Просмотров 187. Ответов 6
Метки нет (Все метки)

Эквалайзер на Лазарусе: как сделать эквалайзер на Лазарусе и BASS.dll, используя массив IIR-фильтров, посемпловый ввод-вывод данных через BASS.dll?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.07.2018, 13:59
Ответы с готовыми решениями:

Бд в Лазарусе
Прошу помогите! Очень нужно написать базу данных с запросами,так чтобы...

Паскаль на Лазарусе
Добрый вечер, уважаемые участники форума! Требуется небольшая помощь по поводу...

Программка в Лазарусе
Всем доброго времени суток. Очень нужна помощь с задачкой, сделанную в...

Не запускается в лазарусе
Не получается запустить в лазарусе прогу, а через паскаль открывает криво,...

Аналог return из С++ в Лазарусе?
Всем привет ! Народ подскажите аналог return из С++ в лазарусе Например ...

6
USERPC01
0 / 0 / 0
Регистрация: 29.06.2018
Сообщений: 222
10.08.2018, 21:23  [ТС] 2
ссылка

Добавлено через 2 минуты
***********

Добавлено через 2 минуты
Как исправить (с сайта ***********):
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
unit test;
 
interface
 
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, StdCtrls, Bass, ExtCtrls;
 
type
TForm1 = class(TForm)
Button1: TButton;
OpenDialog1: TOpenDialog;
Panel1: TPanel;
Label5: TLabel;
Label6: TLabel;
TrackBar4: TTrackBar;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure TrackBar4Change(Sender: TObject);
procedure updateeq(sender:Tobject);
private
{ Private declarations }
chan: DWORD;
public
{ Public declarations }
end;
 
var
Form1: TForm1;
p: BASS_DX8_PARAMEQ;
pR: BASS_DX8_REVERB;
fx: array[1..19] of integer;
eq: array[1..18] of Tscrollbar;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var
p1: BASS_CHANNELINFO;
i:integer;
begin
If OpenDialog1.Execute then begin
// free both MOD and stream, it must be one of them! :)
BASS_MusicFree(chan);
BASS_StreamFree(chan);
chan := BASS_StreamCreateFile(FALSE, PChar(OpenDialog1.FileName), 0, 0, BASS_SAMPLE_FX or BASS_SAMPLE_LOOP);
if (chan = 0) then
chan := BASS_MusicLoad(FALSE, PChar(OpenDialog1.FileName), 0, 0, BASS_MUSIC_LOOP or BASS_MUSIC_RAMP or BASS_SAMPLE_FX,0);
if (chan = 0) then
begin
// not a WAV/MP3 or MOD
Button1.Caption := 'Can''t play the file! Please select another.';
Exit;
end;
if (p1.flags and BASS_SAMPLE_8BITS) > 0 then
begin
// not 16-bit stereo
Button1.Caption := '16-bit stereo sources only. Please select another.';
BASS_MusicFree(chan);
BASS_StreamFree(chan);
Exit;
end;
Button1.Caption := OpenDialog1.FileName;
for i:= 1 to 18 do
fx[i] := BASS_ChannelSetFX(chan, BASS_FX_DX8_PARAMEQ, 1);
 
fx[19] := BASS_ChannelSetFX(chan, BASS_FX_DX8_REVERB, 1);
// Set equalizer to flat and reverb off to start
 
p.fGain := 0;
//p.fBandwidth := 1;
p.fBandwidth := 2.5;
p.fCenter := 31;
BASS_FXSetParameters(fx[1], @p);
p.fCenter := 63;
BASS_FXSetParameters(fx[2], @p);
p.fCenter := 125;
BASS_FXSetParameters(fx[3], @p);
p.fCenter := 170;
BASS_FXSetParameters(fx[4], @p);
p.fCenter := 250;
BASS_FXSetParameters(fx[5], @p);
p.fCenter := 310;
BASS_FXSetParameters(fx[6], @p);
p.fCenter := 600;
BASS_FXSetParameters(fx[7], @p);
p.fCenter := 1000;
BASS_FXSetParameters(fx[8], @p);
p.fCenter := 1500;
BASS_FXSetParameters(fx[9], @p);
p.fCenter := 2000;
BASS_FXSetParameters(fx[10], @p);
p.fCenter := 3000;
BASS_FXSetParameters(fx[11], @p);
p.fCenter := 4000;
BASS_FXSetParameters(fx[12], @p);
p.fCenter := 6000;
BASS_FXSetParameters(fx[13], @p);
p.fCenter := 8000;
BASS_FXSetParameters(fx[14], @p);
p.fCenter := 10000;
BASS_FXSetParameters(fx[15], @p);
p.fCenter := 12000;
BASS_FXSetParameters(fx[16], @p);
p.fCenter := 14000;
BASS_FXSetParameters(fx[17], @p);
p.fCenter := 16000;
BASS_FXSetParameters(fx[18], @p);
 
 
 
BASS_FXGetParameters(fx[19], @pR);
pR.fReverbMix := -96;
pR.fReverbTime := 1200;
pR.fHighFreqRTRatio := 0.1;
BASS_FXSetParameters(fx[19], @pR);
 
// play both MOD and stream, it must be one of them! :)
BASS_ChannelPlay(chan, False);
end;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
// check the correct BASS was loaded
if (HIWORD(BASS_GetVersion) <> BASSVERSION) then
begin
MessageBox(0,'An incorrect version of BASS.DLL was loaded',0,MB_ICONERROR);
Halt;
end;
// setup output - default device, 44100hz, stereo, 16 bits
if not BASS_Init(-1, 44100, 0, handle, nil) then
begin
Application.MessageBox('Can''t initialize device','Bass Initialize problem');
Halt;
end
else
BASS_Start;
// Adjust buffer size to balance 'clicks' vs. response time, slower computers need bigger
BASS_SetConfig(BASS_CONFIG_BUFFER,1000);
 
//Создание ползунков
for i:=1 to 18 do
begin
eq[i]:=TScrollBar.Create(Self);
eq[i].Parent:=panel1;
eq[i].Kind:=sbVertical;
eq[i].Top:=20;
eq[i].Height:=100;
eq[i].Width:=10;
eq[i].Left:=10+12*i;
eq[i].OnChange:=updateeq;
eq[i].Tag:=i;
eq[i].Max:=31;
eq[i].Position:=15;
end;
 
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
var i:integer;
begin
Bass_Stop();
BASS_StreamFree(chan);
BASS_MusicFree(chan);
BASS_Free();
for i:= 1 to 18 do
eq[i].Free;
end;
 
procedure TForm1.TrackBar4Change(Sender: TObject);
var
v: integer;
begin
v := TrackBar4.position;
BASS_FXGetParameters(fx[19], @pR);
// give exponential quality to trackbar as Bass more sensitive near 0
pR.fReverbMix := -0.012*v*v*v; // gives -96 when bar at 20
BASS_FXSetParameters(fx[19], @pR);
Label5.Caption := inttostr(20-TrackBar4.position);
end;
 
procedure TForm1.updateeq(sender: Tobject);
var i:integer;
begin
i:=(sender as TScrollbar).tag;
BASS_FXGetParameters(fx[i], @p);
p.fgain := 15-eq[i].position;
BASS_FXSetParameters(fx[i], @p);
end;
 
end.
{p.fBandwidth надо задать не 18 а 2.5}
Добавлено через 17 минут
http://downloads.2ccc.com/vcl/effects_multimedia/

Добавлено через 1 минуту
http://www.delphisources.ru/forum/showthread.php?t=14788

Добавлено через 1 минуту
http://www.delphisources.ru/forum/showthread.php?t=21788

Добавлено через 42 секунды
Эквалайзер

Добавлено через 32 секунды
Эквалайзер Как переписать на Лазарус?

Добавлено через 2 минуты
http://www.un4seen.com/ Un4seen Developments Forum » Developments » BASS » Topic: Delphi Equalizer

Добавлено через 42 секунды
http://bass.radio42.com/help/html/7d...68e46fb8f1.htm

Добавлено через 32 секунды
https://4programmers.net/Delphi/Gotowce/BASS_-_Equalizer
0
USERPC01
0 / 0 / 0
Регистрация: 29.06.2018
Сообщений: 222
11.08.2018, 01:27  [ТС] 3
Как исправить несовместимость типов в eq[i].OnChange:= updateeq ; при инициализации ?
0
Вложения
Тип файла: zip test1.zip (259.5 Кб, 1 просмотров)
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26582 / 17829 / 7052
Регистрация: 22.10.2011
Сообщений: 31,372
Записей в блоге: 6
11.08.2018, 08:18 4
Pascal
1
eq[i].OnChange:=@updateeq;
0
USERPC01
0 / 0 / 0
Регистрация: 29.06.2018
Сообщений: 222
17.08.2018, 02:35  [ТС] 5
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
unit test1;
 
interface
 
uses
Windows,  Messages,  SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, StdCtrls, Bass, ExtCtrls;
 
type
 
{ TForm1 }
 
TForm1 = class(TForm)
Button1: TButton;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
OpenDialog1: TOpenDialog;
Panel1: TPanel;
Label5: TLabel;
Label6: TLabel;
TrackBar1: TTrackBar;
TrackBar2: TTrackBar;
Label1: TLabel;
TrackBar3: TTrackBar;
TrackBar4: TTrackBar;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Label1Click(Sender: TObject);
procedure Label5Click(Sender: TObject);
procedure Panel1Click(Sender: TObject);
procedure TrackBar1Change(Sender: TObject);
procedure TrackBar3Change(Sender: TObject);
procedure TrackBar4Change(Sender: TObject);
procedure updateeq(sender:Tobject);
private
{ Private declarations }
chan: DWORD;
public
{ Public declarations }
end;
 
var
Form1: TForm1;
p: BASS_DX8_PARAMEQ;
pR: BASS_DX8_REVERB;
fx: array[1..19] of integer;
eq: array[1..18] of Tscrollbar;
 
implementation
 
 {$R *.lfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var
 
p1: BASS_CHANNELINFO;
i:integer;
 //chan : HSTREAM;
begin
If OpenDialog1.Execute then begin
// free both MOD and stream, it must be one of them! :)
BASS_MusicFree(chan);
BASS_StreamFree(chan);
chan := BASS_StreamCreateFile(FALSE, PChar(OpenDialog1.FileName), 0, 0, BASS_SAMPLE_FX or BASS_SAMPLE_LOOP);
if (chan = 0) then
chan := BASS_MusicLoad(FALSE, PChar(OpenDialog1.FileName), 0, 0, BASS_MUSIC_LOOP or BASS_MUSIC_RAMP or BASS_SAMPLE_FX,0);
if (chan = 0) then
begin
// not a WAV/MP3 or MOD
Button1.Caption := 'Can''t play the file! Please select another.';
Exit;
end;
 if (p1.flags and BASS_SAMPLE_8BITS) > 0 then
begin
// not 16-bit stereo
Button1.Caption := '16-bit stereo sources only. Please select another.';
BASS_MusicFree(chan);
BASS_StreamFree(chan);
Exit;
end;
Button1.Caption := OpenDialog1.FileName;
for i:= 1 to 18 do
fx[i] := BASS_ChannelSetFX(chan, BASS_FX_DX8_PARAMEQ, 1);
 
fx[19] := BASS_ChannelSetFX(chan, BASS_FX_DX8_REVERB, 1);
// Set equalizer to flat and reverb off to start
 
p.fGain := 0;
p.fBandwidth := 3.5;  //2.5
p.fCenter := 31;
BASS_FXSetParameters(fx[1], @p);
p.fCenter := 63;
BASS_FXSetParameters(fx[2], @p);
p.fCenter := 125;
BASS_FXSetParameters(fx[3], @p);
p.fCenter := 170;
BASS_FXSetParameters(fx[4], @p);
p.fCenter := 250;
BASS_FXSetParameters(fx[5], @p);
p.fCenter := 310;
BASS_FXSetParameters(fx[6], @p);
p.fCenter := 600;
BASS_FXSetParameters(fx[7], @p);
p.fCenter := 1000;
BASS_FXSetParameters(fx[8], @p);
p.fCenter := 1500;
BASS_FXSetParameters(fx[9], @p);
p.fCenter := 2000;
BASS_FXSetParameters(fx[10], @p);
p.fCenter := 3000;
BASS_FXSetParameters(fx[11], @p);
p.fCenter := 4000;
BASS_FXSetParameters(fx[12], @p);
p.fCenter := 6000;
BASS_FXSetParameters(fx[13], @p);
p.fCenter := 8000;
BASS_FXSetParameters(fx[14], @p);
p.fCenter := 10000;
BASS_FXSetParameters(fx[15], @p);
p.fCenter := 12000;
BASS_FXSetParameters(fx[16], @p);
p.fCenter := 14000;
BASS_FXSetParameters(fx[17], @p);
p.fCenter := 16000;
BASS_FXSetParameters(fx[18], @p);
 
 
 
BASS_FXGetParameters(fx[19], @pR);
pR.fReverbMix := -96;
pR.fReverbTime := 1200;
pR.fHighFreqRTRatio := 0.1;
BASS_FXSetParameters(fx[19], @pR);
 
// play both MOD and stream, it must be one of them! :)
BASS_ChannelPlay(chan, False);
end;
end;
 
procedure TForm1.updateeq(sender: Tobject);
var i:integer;
begin
i:=(sender as TScrollbar).tag;
BASS_FXGetParameters(fx[i], @p);
p.fgain := 15-eq[i].position;
BASS_FXSetParameters(fx[i], @p);
end;
 
 
 
procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
// check the correct BASS was loaded
if (HIWORD(BASS_GetVersion) <> BASSVERSION) then
begin
 MessageBox(0,'An incorrect version of BASS.DLL was loaded','Error',MB_ICONERROR);
Halt;
end;
// setup output - default device, 44100hz, stereo, 16 bits
if not BASS_Init(-1, 44100, 0, handle, nil) then
begin
Application.MessageBox('Can''t initialize device','Bass Initialize problem');
Halt;
end
else
BASS_Start;
// Adjust buffer size to balance 'clicks' vs. response time, slower computers need bigger
BASS_SetConfig(BASS_CONFIG_BUFFER,1000);
 
//Создание ползунков
for i:=1 to 18 do
begin
 
 
eq[i]:=TScrollBar.Create(Self);
eq[i].Parent:=Panel1;
eq[i].Kind:=sbVertical;
eq[i].Top:=20;
eq[i].Height:=100;
eq[i].Width:=15;
eq[i].Left:=20+20*i;
eq[i].OnChange:=  @updateeq ;
eq[i].Tag:=i;
eq[i].Max:=31;
eq[i].Position:=15;
 
end;
 
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
var i:integer;
begin
Bass_Stop();
BASS_StreamFree(chan);
BASS_MusicFree(chan);
BASS_Free();
for i:= 1 to 18 do
eq[i].Free;
end;
 
procedure TForm1.Label1Click(Sender: TObject);
begin
 
end;
 
procedure TForm1.Label5Click(Sender: TObject);
begin
 
end;
 
procedure TForm1.Panel1Click(Sender: TObject);
begin
 
end;
 
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
 
end;
 
procedure TForm1.TrackBar3Change(Sender: TObject);
begin
 
end;
 
procedure TForm1.TrackBar4Change(Sender: TObject);
var
v: integer;
begin
v := TrackBar4.position;
BASS_FXGetParameters(fx[19], @pR);
// give exponential quality to trackbar as Bass more sensitive near 0
pR.fReverbMix := -0.012*v*v*v; // gives -96 when bar at 20
BASS_FXSetParameters(fx[19], @pR);
Label5.Caption := inttostr(20-TrackBar4.position);
end;
 
 
 
end.
С этим кодом работает, но первые два канала плохо регулируются . Как Сделать их правильно регулирующимися(какая p.fBandwidth лучше )?

Как добавить регулятор громкости и баланса на первый и второй трекбар ? По какой формуле правильнее задавать p.fgain, eq[i].Max (:=31 , среднее 15) , нужно ли что то менять для +/- 10...15...20 дБ для правильной работы первых двух каналов ( иначе добавляет ВЧ, а басы плохо, неправильная полоса, кажется ) ?

Добавлено через 2 минуты
Как автоматически добавить подписи и значения к ползункам , создаваемым как массив ползунков, надписей (данные взять из p.fCenter [i] , p.fgainх [i] )?
0
USERPC01
0 / 0 / 0
Регистрация: 29.06.2018
Сообщений: 222
17.08.2018, 02:55  [ТС] 6
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
unit test1;
 
interface
 
uses
Windows,  Messages,  SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, StdCtrls, Bass, ExtCtrls;
 
type
 
{ TForm1 }
 
TForm1 = class(TForm)
Button1: TButton;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
OpenDialog1: TOpenDialog;
Panel1: TPanel;
Label5: TLabel;
Label6: TLabel;
TrackBar1: TTrackBar;
TrackBar2: TTrackBar;
Label1: TLabel;
TrackBar3: TTrackBar;
TrackBar4: TTrackBar;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Label1Click(Sender: TObject);
procedure Label5Click(Sender: TObject);
procedure Panel1Click(Sender: TObject);
procedure TrackBar1Change(Sender: TObject);
procedure TrackBar3Change(Sender: TObject);
procedure TrackBar4Change(Sender: TObject);
procedure updateeq(sender:Tobject);
private
{ Private declarations }
chan: DWORD;
public
{ Public declarations }
end;
 
var
Form1: TForm1;
p: BASS_DX8_PARAMEQ;
pR: BASS_DX8_REVERB;
fx: array[1..19] of integer;
eq: array[1..18] of Tscrollbar;
 
implementation
 
 {$R *.lfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var
 
p1: BASS_CHANNELINFO;
i:integer;
 //chan : HSTREAM;
begin
If OpenDialog1.Execute then begin
// free both MOD and stream, it must be one of them! :)
BASS_MusicFree(chan);
BASS_StreamFree(chan);
chan := BASS_StreamCreateFile(FALSE, PChar(OpenDialog1.FileName), 0, 0, BASS_SAMPLE_FX or BASS_SAMPLE_LOOP);
if (chan = 0) then
chan := BASS_MusicLoad(FALSE, PChar(OpenDialog1.FileName), 0, 0, BASS_MUSIC_LOOP or BASS_MUSIC_RAMP or BASS_SAMPLE_FX,0);
if (chan = 0) then
begin
// not a WAV/MP3 or MOD
Button1.Caption := 'Can''t play the file! Please select another.';
Exit;
end;
 if (p1.flags and BASS_SAMPLE_8BITS) > 0 then
begin
// not 16-bit stereo
Button1.Caption := '16-bit stereo sources only. Please select another.';
BASS_MusicFree(chan);
BASS_StreamFree(chan);
Exit;
end;
Button1.Caption := OpenDialog1.FileName;
for i:= 1 to 18 do
fx[i] := BASS_ChannelSetFX(chan, BASS_FX_DX8_PARAMEQ, 1);
 
fx[19] := BASS_ChannelSetFX(chan, BASS_FX_DX8_REVERB, 1);
// Set equalizer to flat and reverb off to start
 
p.fGain := 0;
p.fBandwidth := 3.5;  //2.5
p.fCenter := 31;
BASS_FXSetParameters(fx[1], @p);
p.fCenter := 63;
BASS_FXSetParameters(fx[2], @p);
p.fCenter := 125;
BASS_FXSetParameters(fx[3], @p);
p.fCenter := 170;
BASS_FXSetParameters(fx[4], @p);
p.fCenter := 250;
BASS_FXSetParameters(fx[5], @p);
p.fCenter := 310;
BASS_FXSetParameters(fx[6], @p);
p.fCenter := 600;
BASS_FXSetParameters(fx[7], @p);
p.fCenter := 1000;
BASS_FXSetParameters(fx[8], @p);
p.fCenter := 1500;
BASS_FXSetParameters(fx[9], @p);
p.fCenter := 2000;
BASS_FXSetParameters(fx[10], @p);
p.fCenter := 3000;
BASS_FXSetParameters(fx[11], @p);
p.fCenter := 4000;
BASS_FXSetParameters(fx[12], @p);
p.fCenter := 6000;
BASS_FXSetParameters(fx[13], @p);
p.fCenter := 8000;
BASS_FXSetParameters(fx[14], @p);
p.fCenter := 10000;
BASS_FXSetParameters(fx[15], @p);
p.fCenter := 12000;
BASS_FXSetParameters(fx[16], @p);
p.fCenter := 14000;
BASS_FXSetParameters(fx[17], @p);
p.fCenter := 16000;
BASS_FXSetParameters(fx[18], @p);
 
 
 
BASS_FXGetParameters(fx[19], @pR);
pR.fReverbMix := -96;
pR.fReverbTime := 1200;
pR.fHighFreqRTRatio := 0.1;
BASS_FXSetParameters(fx[19], @pR);
 
// play both MOD and stream, it must be one of them! :)
BASS_ChannelPlay(chan, False);
end;
end;
 
procedure TForm1.updateeq(sender: Tobject);
var i:integer;
begin
i:=(sender as TScrollbar).tag;
BASS_FXGetParameters(fx[i], @p);
p.fgain := 15-eq[i].position;
BASS_FXSetParameters(fx[i], @p);
  eq[i].Hint:=  IntToStr(15-eq[i].position) +' dB' ;
 
 
 
end;
 
 
 
procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
// check the correct BASS was loaded
if (HIWORD(BASS_GetVersion) <> BASSVERSION) then
begin
 MessageBox(0,'An incorrect version of BASS.DLL was loaded','Error',MB_ICONERROR);
Halt;
end;
// setup output - default device, 44100hz, stereo, 16 bits
if not BASS_Init(-1, 44100, 0, handle, nil) then
begin
Application.MessageBox('Can''t initialize device','Bass Initialize problem');
Halt;
end
else
BASS_Start;
// Adjust buffer size to balance 'clicks' vs. response time, slower computers need bigger
BASS_SetConfig(BASS_CONFIG_BUFFER,1000);
 
//Создание ползунков
for i:=1 to 18 do
begin
eq[i]:=TScrollBar.Create(Self);
eq[i].Parent:=Panel1;
eq[i].Kind:=sbVertical;
eq[i].Top:=20;
eq[i].Height:=100;
eq[i].Width:=15;
eq[i].Left:=20+20*i;
eq[i].OnChange:=  @updateeq ;
eq[i].Tag:=i;
eq[i].Max:=30;
eq[i].Position:=15;
eq[i].ShowHint:=True;
end;
 
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
var i:integer;
begin
Bass_Stop();
BASS_StreamFree(chan);
BASS_MusicFree(chan);
BASS_Free();
for i:= 1 to 18 do
eq[i].Free;
end;
 
procedure TForm1.Label1Click(Sender: TObject);
begin
 
end;
 
procedure TForm1.Label5Click(Sender: TObject);
begin
 
end;
 
procedure TForm1.Panel1Click(Sender: TObject);
begin
 
end;
 
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
 
end;
 
procedure TForm1.TrackBar3Change(Sender: TObject);
begin
 
end;
 
procedure TForm1.TrackBar4Change(Sender: TObject);
var
v: integer;
begin
v := TrackBar4.position;
BASS_FXGetParameters(fx[19], @pR);
// give exponential quality to trackbar as Bass more sensitive near 0
pR.fReverbMix := -0.012*v*v*v; // gives -96 when bar at 20
BASS_FXSetParameters(fx[19], @pR);
Label5.Caption := inttostr(20-TrackBar4.position);
end;
 
 
 
end.
Вариант для индикации уровня хинтом . Как вывести частоту ? Один из вариантов программы в аттаче.
0
Вложения
Тип файла: zip test1.zip (259.4 Кб, 0 просмотров)
USERPC01
0 / 0 / 0
Регистрация: 29.06.2018
Сообщений: 222
17.08.2018, 07:40  [ТС] 7
Может ли Басс регулировать усиление на частотах до +/- 30...60 дБ, если да, то при каких полосах?
Например, при


Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//Создание ползунков
 
for i:=1 to 18 do
begin
eq[i]:=TScrollBar.Create(Self);
eq[i].Parent:=Panel1;
eq[i].Kind:=sbVertical;
eq[i].Top:=20;
eq[i].Height:=300;
eq[i].Width:=15;
eq[i].Left:=20+20*i;
eq[i].OnChange:=  @updateeq ;
eq[i].Tag:=i;
eq[i].Max:=120;
eq[i].Position:=60;
eq[i].ShowHint:=True;
end;
,




Pascal
1
2
3
4
5
6
7
8
9
10
11
12
procedure TForm1.updateeq(sender: Tobject);
var i:integer;
begin
i:=(sender as TScrollbar).tag;
BASS_FXGetParameters(fx[i], @p);
p.fgain := 60-eq[i].position;
BASS_FXSetParameters(fx[i], @p);
  eq[i].Hint:=  IntToStr(60-eq[i].position) +' dB' ;
 
 
 
end;
Пробовал, недостаточно эффективно, требует оптимизации полосы пропускания/ заграждения для фильтра

Добавлено через 13 минут
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
unit test1;
 
interface
 
uses
Windows,  Messages,  SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, StdCtrls, Bass, ExtCtrls;
 
type
 
{ TForm1 }
 
TForm1 = class(TForm)
Button1: TButton;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
OpenDialog1: TOpenDialog;
Panel1: TPanel;
Label5: TLabel;
Label6: TLabel;
TrackBar1: TTrackBar;
TrackBar2: TTrackBar;
Label1: TLabel;
TrackBar3: TTrackBar;
TrackBar4: TTrackBar;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Label1Click(Sender: TObject);
procedure Label5Click(Sender: TObject);
procedure Panel1Click(Sender: TObject);
procedure TrackBar1Change(Sender: TObject);
procedure TrackBar3Change(Sender: TObject);
procedure TrackBar4Change(Sender: TObject);
procedure updateeq(sender:Tobject);
private
{ Private declarations }
chan: DWORD;
public
{ Public declarations }
end;
 
var
Form1: TForm1;
p: BASS_DX8_PARAMEQ;
pR: BASS_DX8_REVERB;
fx: array[1..19] of integer;
eq: array[1..18] of Tscrollbar;
 
implementation
 
 {$R *.lfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var
 
p1: BASS_CHANNELINFO;
i:integer;
 //chan : HSTREAM;
begin
If OpenDialog1.Execute then begin
// free both MOD and stream, it must be one of them! :)
BASS_MusicFree(chan);
BASS_StreamFree(chan);
chan := BASS_StreamCreateFile(FALSE, PChar(OpenDialog1.FileName), 0, 0, BASS_SAMPLE_FX or BASS_SAMPLE_LOOP);
if (chan = 0) then
chan := BASS_MusicLoad(FALSE, PChar(OpenDialog1.FileName), 0, 0, BASS_MUSIC_LOOP or BASS_MUSIC_RAMP or BASS_SAMPLE_FX,0);
if (chan = 0) then
begin
// not a WAV/MP3 or MOD
Button1.Caption := 'Can''t play the file! Please select another.';
Exit;
end;
 if (p1.flags and BASS_SAMPLE_8BITS) > 0 then
begin
// not 16-bit stereo
Button1.Caption := '16-bit stereo sources only. Please select another.';
BASS_MusicFree(chan);
BASS_StreamFree(chan);
Exit;
end;
Button1.Caption := OpenDialog1.FileName;
for i:= 1 to 18 do
fx[i] := BASS_ChannelSetFX(chan, BASS_FX_DX8_PARAMEQ, 1);
 
fx[19] := BASS_ChannelSetFX(chan, BASS_FX_DX8_REVERB, 1);
// Set equalizer to flat and reverb off to start
 
p.fGain := 0;
p.fBandwidth := 18;  //2.5
 
p.fCenter := 31;
BASS_FXSetParameters(fx[1], @p);
p.fCenter := 63;
BASS_FXSetParameters(fx[2], @p);
p.fCenter := 125;
BASS_FXSetParameters(fx[3], @p);
p.fCenter := 170;
BASS_FXSetParameters(fx[4], @p);
p.fCenter := 250;
BASS_FXSetParameters(fx[5], @p);
p.fCenter := 310;
BASS_FXSetParameters(fx[6], @p);
p.fCenter := 600;
BASS_FXSetParameters(fx[7], @p);
p.fCenter := 1000;
BASS_FXSetParameters(fx[8], @p);
p.fCenter := 1500;
BASS_FXSetParameters(fx[9], @p);
p.fCenter := 2000;
BASS_FXSetParameters(fx[10], @p);
p.fCenter := 3000;
BASS_FXSetParameters(fx[11], @p);
p.fCenter := 4000;
BASS_FXSetParameters(fx[12], @p);
p.fCenter := 6000;
BASS_FXSetParameters(fx[13], @p);
p.fCenter := 8000;
BASS_FXSetParameters(fx[14], @p);
p.fCenter := 10000;
BASS_FXSetParameters(fx[15], @p);
p.fCenter := 12000;
BASS_FXSetParameters(fx[16], @p);
p.fCenter := 14000;
BASS_FXSetParameters(fx[17], @p);
p.fCenter := 16000;
BASS_FXSetParameters(fx[18], @p);
 
 
 
BASS_FXGetParameters(fx[19], @pR);
pR.fReverbMix := -96;
pR.fReverbTime := 1200;
pR.fHighFreqRTRatio := 0.1;
BASS_FXSetParameters(fx[19], @pR);
 
// play both MOD and stream, it must be one of them! :)
BASS_ChannelPlay(chan, False);
end;
end;
 
procedure TForm1.updateeq(sender: Tobject);
var i:integer;
begin
i:=(sender as TScrollbar).tag;
BASS_FXGetParameters(fx[i], @p);
p.fgain := 60-eq[i].position;
BASS_FXSetParameters(fx[i], @p);
  eq[i].Hint:=  IntToStr(60-eq[i].position) +' dB' ;
 
 
 
end;
 
 
 
procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
// check the correct BASS was loaded
if (HIWORD(BASS_GetVersion) <> BASSVERSION) then
begin
 MessageBox(0,'An incorrect version of BASS.DLL was loaded','Error',MB_ICONERROR);
Halt;
end;
// setup output - default device, 44100hz, stereo, 16 bits
if not BASS_Init(-1, 44100, 0, handle, nil) then
begin
Application.MessageBox('Can''t initialize device','Bass Initialize problem');
Halt;
end
else
BASS_Start;
// Adjust buffer size to balance 'clicks' vs. response time, slower computers need bigger
BASS_SetConfig(BASS_CONFIG_BUFFER,1000);
 
//Создание ползунков
for i:=1 to 18 do
begin
eq[i]:=TScrollBar.Create(Self);
eq[i].Parent:=Panel1;
eq[i].Kind:=sbVertical;
eq[i].Top:=20;
eq[i].Height:=300;
eq[i].Width:=15;
eq[i].Left:=20+20*i;
eq[i].OnChange:=  @updateeq ;
eq[i].Tag:=i;
eq[i].Max:=120;
eq[i].Position:=60;
eq[i].ShowHint:=True;
end;
 
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
var i:integer;
begin
Bass_Stop();
BASS_StreamFree(chan);
BASS_MusicFree(chan);
BASS_Free();
for i:= 1 to 18 do
eq[i].Free;
end;
 
procedure TForm1.Label1Click(Sender: TObject);
begin
 
end;
 
procedure TForm1.Label5Click(Sender: TObject);
begin
 
end;
 
procedure TForm1.Panel1Click(Sender: TObject);
begin
 
end;
 
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
 
end;
 
procedure TForm1.TrackBar3Change(Sender: TObject);
begin
 
end;
 
procedure TForm1.TrackBar4Change(Sender: TObject);
var
v: integer;
begin
v := TrackBar4.position;
BASS_FXGetParameters(fx[19], @pR);
// give exponential quality to trackbar as Bass more sensitive near 0
pR.fReverbMix := -0.012*v*v*v; // gives -96 when bar at 20
BASS_FXSetParameters(fx[19], @pR);
Label5.Caption := inttostr(20-TrackBar4.position);
end;
 
 
 
end.
Очень широкие полосы пропускания, -60 дБ ,кажется, при p.fBandwidth := 18 ; (18...20) не дает .
Как изменить порядок фильтров ( с помощью BASS_SetConfig(BASS_CONFIG_BUFFER,1000); ли, сменить 1000 на другое ) .

Добавлено через 4 часа 12 минут
Обработчик для регуляторов громкости и баланса потока chan , открываемого в программе в программе (здесь chan-дескриптор открытого медиапотока ).

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TForm1.TrackBar1Change(Sender: TObject);
var
vol : Integer;
begin
  vol:=TrackBar1.position;
  // BASS_SetVolume(vol) ;  {  system volume }
   //Bass.BASS_ChannelSetAttribute(stream, BASSAttribute.BASS_ATTRIB_VOL, 0.5F)
    BASS_ChannelSetAttribute(chan, BASS_ATTRIB_VOL, vol/100);  {volume of the stream }
    Label2.Caption:=IntToStr(vol);
end;
 
procedure TForm1.TrackBar3Change(Sender: TObject);
var  balance: integer;
begin
   balance:=TrackBar3.position;
   BASS_ChannelSetAttribute(chan, BASS_ATTRIB_PAN, balance/100);
   Label3.Caption:=IntToStr(balance);
 
end;
Добавлено через 2 минуты
Дополнительные сведения на сайте http://www.un4seen.com/doc/#bass/BASS_ChannelSetAttribute.html
0
17.08.2018, 07:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.08.2018, 07:40

Стрелка (вектор) в Лазарусе
Всем добрый день! Подскажите, пожалуйста, есть ли в Лазарусе возможность...

Работа с графикой в лазарусе
Реализовать проект, который графически выводит информацию в окно программы....

График функции в Лазарусе
Добрый день, подскажите пожалуйста, нужно начертить график функции (x+1)^-1....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru