К нашему проекту подключим ScrollBar, регулятор громкости, баланса и сделаем выбор песен из PlayList.




И так начнем со ScrollBar.

В процедуру procedure TForm_Player.Player; добавим следующие строки

//полоса проигрывания
scrollbar1.Min:=0; //минимальное значение
scrollbar1.Max:=bass_ChannelGEtLength(Channel, 0)-1;//максимальное значение

Здесь и далее добавляемый код выделен красным цветом.

procedure TForm_Player.Player;
begin
//проверяем, если не пауза
if mode<>paused then begin
//то проверяем существует ли файл загружаемый из PlayList
//если файл не существует, то выходим
if not FileExists(FileName) then begin ShowMessage('Файл не существует');exit;end;
//иначе пытаемся загрузить файл и получить дескриптор канала
Channel:= BASS_StreamCreateFile(FALSE, PChar(FileName), 0, 0, 0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF});
//если дескриптор канала=0 (файл по какой то причине не может быть загружен),
//выдаем сообщение об ошибке и выходим
if Channel=0 then begin ShowMessage('Ошибка загрузки Файла');exit;end;
end;


//командой BASS_ChannelPlay(Channel, False) пытаемся воспроизвести файл,
//если это невозможно, то выдаем сообщение об ошибке
if not BASS_ChannelPlay(Channel, False) then
begin ShowMessage('Ошибка воспроизведения файла');exit;end;

//полоса проигрывания
scrollbar1.Min:=0; //минимальное значение
scrollbar1.Max:=bass_ChannelGEtLength(Channel, 0)-1;//максимальное значение

//присваеваем заголовку формы имя проигрываемого файла
Form_Player.Caption:=ExtractFileName(FileName);
//Устанавливаем PlayMode - play
mode:=play;
end;


Для события OnScroll компонента ScrollBar1 пишем:

procedure TForm_player.ScrollBar1Scroll(Sender: TObject;
ScrollCode: TScrollCode; var ScrollPos: Integer);
begin
//устанавливаем позицию воспроизведения трека в зависимости от положения scrollbar
bass_ChannelSetPosition(Channel, scrollbar1.position, 0);
end;

Изменять положение ScrollBar мы будем по таймеру, для этого в событии OnTimer компонента Timer1 пишем следующий код:

procedure TForm_player.Timer1Timer(Sender: TObject);
var
TrackLen, TrackPos: Double;
ValPos: Double;
ValLen: Double;
begin
//проверяем режим воспроизведения, если не Play то выходим
if mode<>play then Exit;

//устанавливаем позицию scrollbar в зависимоти от позиции трека
scrollbar1.Position:=bass_channelGetPosition(channel,0);

//время проигрывания трека
//считаваем сколько секунд прошло от начала воспроизведения
TrackPos:=BASS_ChannelBytes2Seconds(Channel, BASS_ChannelGetPosition(Channel,0));
//считываем всю длину песню в секундах
TrackLen:=BASS_ChannelBytes2Seconds(Channel, BASS_ChannelGetLength(Channel,0));
//переводим секунды в часы
ValPos:=TrackPos / (24 * 3600);
ValLen:=TrackLen / (24 * 3600);
//Выводим данные о времени на форму в Label1 и Label2
Label1.Caption:=FormatDateTime('hh:mm:ss',ValPos);
Label2.Caption:=FormatDateTime('hh:mm:ss',ValLen);
end;

Далее подключим управление громкостью и балансем.

В событии OnCreate формы зададим начальные настройки для TrackBar1(громкость) и TrackBar2(баланс).

//установка громкости
trackbar1.Min:=0;
trackbar1.Max:=10;
trackbar1.Position:=5;
//установка баланса
trackbar2.Min:=-5;
trackbar2.Max:=5;
trackbar2.Position:=0;

procedure TForm_player.FormCreate(Sender: TObject);
begin
//установка громкости
trackbar1.Min:=0;
trackbar1.Max:=10;
trackbar1.Position:=5;
//установка баланса
trackbar2.Min:=-5;
trackbar2.Max:=5;
trackbar2.Position:=0;

// проверка корректности загруженной BASS.DLL
if (HIWORD(BASS_GetVersion) <> BASSVERSION) then
begin
MessageBox(0,'Не корректная версия BASS.DLL',nil,MB_ICONERROR);
Halt;
end;

// Инициализация аудио - по умолчанию, 44100hz, stereo, 16 bits
if not BASS_Init(-1, 44100, 0, Handle, nil) then
begin
MessageBox(0,'Ошибка инициализация аудио',nil,MB_ICONERROR);
Halt;
end;
end;

В событии OnTimer компонента Timer1 добавим следующий код:

/ /установка громкости звука
BASS_ChannelSetAttribute(Channel,BASS_ATTRIB_VOL, trackBar1.Position/10);
//установка баланса
BASS_ChannelSetAttribute(Channel,BASS_ATTRIB_PAN, Trackbar2.Position/5);


procedure TForm_player.Timer1Timer(Sender: TObject);
var
TrackLen, TrackPos: Double;
ValPos: Double;
ValLen: Double;
begin
//проверяем режим воспроизведения, если не Play то выходим
if mode<>play then Exit;

//устанавливаем позицию scrollbar в зависимоти от позиции трека
scrollbar1.Position:=bass_channelGetPosition(channel,0);

//время проигрывания трека
//считаваем сколько секунд прошло от начала воспроизведения
TrackPos:=BASS_ChannelBytes2Seconds(Channel, BASS_ChannelGetPosition(Channel,0));
//считываем всю длину песню в секундах
TrackLen:=BASS_ChannelBytes2Seconds(Channel, BASS_ChannelGetLength(Channel,0));
//переводим секунды в часы
ValPos:=TrackPos / (24 * 3600);
ValLen:=TrackLen / (24 * 3600);
//Выводим данные о времени на форму в Label1 и Label2
Label1.Caption:=FormatDateTime('hh:mm:ss',ValPos);
Label2.Caption:=FormatDateTime('hh:mm:ss',ValLen);

//установка громкости звука
BASS_ChannelSetAttribute(Channel,BASS_ATTRIB_VOL, trackBar1.Position/10);
//установка баланса
BASS_ChannelSetAttribute(Channel,BASS_ATTRIB_PAN, Trackbar12.Position/5);

end;


Теперь научим наш проигрыватель выбирать песни из плейлиста.

Для этого в событии OnTimer компонента Timer1 добавим следующий код:

//воспроизведение следующей песни
//если время проигрывания равно длине песни по времени,
if BASS_ChannelGetPosition(channel, 0)= BASS_ChannelGetLength(channel, 0) then

// в место if BASS_ChannelGetPosition(channel, 0)=BASS_ChannelGetLength(channel, 0) then
// можно сделать так: if BASS_ChannelIsActive(channel)=BASS_ACTIVE_STOPPED then
// Практика показывает, что второй вариант более предпочтительный,
// т.к. проверка по длине трека иногда приводит к ошибкам в работе плеера.
begin
//то выбираем следующую песню из плейлиста
if i<ListBox1.Items.Count-1 then
begin
inc(i);
Filename:=ListBox1.Items.Strings[i];
ListBox1.ItemIndex:=i;
mode:=stop;
player;
end
//если лист закончился - выходим
else exit;
end;

procedure TForm_player.Timer1Timer(Sender: TObject);
var
TrackLen, TrackPos: Double;
ValPos: Double;
ValLen: Double;
begin
//проверяем режим воспроизведения, если не Play то выходим
if mode<>play then Exit;

//воспроизведение следующей песни
//если время проигрывания равно длине песни по времени,
if BASS_ChannelGetPosition(channel, 0)= BASS_ChannelGetLength(channel, 0) then

// в место if BASS_ChannelGetPosition(channel, 0)=BASS_ChannelGetLength(channel, 0) then
// можно сделать так: if BASS_ChannelIsActive(channel)=BASS_ACTIVE_STOPPED then
// Практика показывает, что второй вариант более предпочтительный,
// т.к. проверка по длине трека иногда приводит к ошибкам в работе плеера.
begin
//то выбираем следующую песню из плейлиста
if i<ListBox1.Items.Count-1 then
begin
inc(i);
Filename:=ListBox1.Items.Strings[i];
ListBox1.ItemIndex:=i;
mode:=stop;
player;
end else exit;
end;

//устанавливаем позицию scrollbar в зависимости от позиции трека
scrollbar1.Position:=bass_channelGetPosition(channel,0);

//время проигрывания трека
//считываем сколько секунд прошло от начала воспроизведения
TrackPos:=BASS_ChannelBytes2Seconds(Channel, BASS_ChannelGetPosition(Channel,0));
//считываем всю длину песню в секундах
TrackLen:=BASS_ChannelBytes2Seconds(Channel, BASS_ChannelGetLength(Channel,0));
//переводим секунды в часы
ValPos:=TrackPos / (24 * 3600);
ValLen:=TrackLen / (24 * 3600);
//Выводим данные о времени на форму в Label1 и Label2
Label1.Caption:=FormatDateTime('hh:mm:ss',ValPos);
Label2.Caption:=FormatDateTime('hh:mm:ss',ValLen);

//установка громкости звука
BASS_ChannelSetAttribute(Channel,BASS_ATTRIB_VOL, trackBar1.Position/10);
//установка баланса
BASS_ChannelSetAttribute(Channel,BASS_ATTRIB_PAN, Trackbar12.Position/5);

end;

Выбор песни двойным щелчком мыши на ней в плейлисте.
Для события OnDblClick компонента ListBox1 пишем код:

procedure TForm_player.ListBox1DblClick(Sender: TObject);
begin
i:=ListBox1.Itemindex;
Filename:=ListBox1.Items.Strings[i];
mode:=stop;
player;
end;

Очистка плейлиста.

Для события Onclick кнопки Очистить пишем следующий код:

procedure TForm_player.Button5Click(Sender: TObject);
begin
//очистка плейлиста
ListBox1.Clear;
end;

подключим эквалайзер и сделаем визуализацию проигрывания трека для нашего mp3 проигрывателя.
Начнем с начальных настроек TrackBar ов эквалайзера. Для этого в инспекторе объектов для всех десяти TrackBa r ов эквалайзера устанавливаем свойство Min->0, Max->30, Position->15, TickMarks->tmBoth.

в разделе Var добавляем еще две переменные необходимые для настройки эквалайзера:

//переменные для настройки эквалайзера
p: BASS_DX8_PARAMEQ;
fx: array[1..10] of integer

Здесь и далее добавляемый код выделен красным цветом.

var
Form_player: TForm_player;
i:integer; //номер проигрываемой песни в playlist
filename: string;//имя файла
Channel: DWORD;//
Mode: TPlayerMode;//PlayMode
//переменные для настройки эквалайзера
p: BASS_DX8_PARAMEQ;
fx: array[1..10] of integer

А в процедуре procedure TForm_Player.Player;

добавляем следующий код:


//настройка эквалайзера
fx[1]:= BASS_ChannelSetFX(channel, BASS_FX_DX8_PARAMEQ, 1); //первый канал эквалайзера
fx[2]:= BASS_ChannelSetFX(channel, BASS_FX_DX8_PARAMEQ, 1); //второй канал
fx[3]:= BASS_ChannelSetFX(channel, BASS_FX_DX8_PARAMEQ, 1);
fx[4]:= BASS_ChannelSetFX(channel, BASS_FX_DX8_PARAMEQ, 1);
fx[5]:= BASS_ChannelSetFX(channel, BASS_FX_DX8_PARAMEQ, 1);
fx[6]:= BASS_ChannelSetFX(channel, BASS_FX_DX8_PARAMEQ, 1);
fx[7]:= BASS_ChannelSetFX(channel, BASS_FX_DX8_PARAMEQ, 1);
fx[8]:= BASS_ChannelSetFX(channel, BASS_FX_DX8_PARAMEQ, 1);
fx[9]:= BASS_ChannelSetFX(channel, BASS_FX_DX8_PARAMEQ, 1);
fx[10]:= BASS_ChannelSetFX(channel, BASS_FX_DX8_PARAMEQ, 1);

//настройка первого канала эквалайзера
p.fGain:=15-trackbar3.Position; //усиление может изменяться от -15 до 15
p.fBandwidth:= 3; //ширина полосы пропускания
p.fCenter:= 80; //частота регулирования
BASS_FXSetParameters(fx[1], @p);//применение заданных настроек

//настройка второго канала эквалайзера
p.fGain:= 15-trackbar4.Position;
p.fBandwidth:= 3;
p.fCenter:= 170;
BASS_FXSetParameters(fx[2], @p);
//и т.д.

p.fGain:= 15-trackbar5.Position;
p.fBandwidth:= 3;
p.fCenter:= 310;
BASS_FXSetParameters(fx[3], @p);

p.fGain:= 15-trackbar6.Position;
p.fBandwidth:= 3;
p.fCenter:= 600;
BASS_FXSetParameters(fx[4], @p);

p.fGain:= 15-trackbar7.Position;
p.fBandwidth:= 3;
p.fCenter:= 1000;
BASS_FXSetParameters(fx[5], @p);

p.fGain:= 15-trackbar8.Position;
p.fBandwidth:= 3;
p.fCenter:= 3000;
BASS_FXSetParameters(fx[6], @p);

p.fGain:= 15-trackbar9.Position;
p.fBandwidth:= 3;
p.fCenter:= 6000;
BASS_FXSetParameters(fx[7], @p);

p.fGain:= 15-trackbar10.Position;
p.fBandwidth:=3;
p.fCenter:= 10000;
BASS_FXSetParameters(fx[8], @p);

p.fGain:= 15-trackbar11.Position;
p.fBandwidth:= 3;
p.fCenter:= 12000;
BASS_FXSetParameters(fx[9], @p);

p.fGain:= 15-trackbar12.Position;
p.fBandwidth:= 3;
p.fCenter:= 14000;
BASS_FXSetParameters(fx[10], @p);

 


procedure TForm_Player.Player;
begin
//проверяем, если не пауза
if mode<>paused then begin
//то проверяем существует ли файл загружаемый из PlayList
//если файл не существует, то выходим
if not FileExists(FileName) then begin ShowMessage('Файл не существует');exit;end;
//останавливаем и освобождаем канал воспроизведения
BASS_ChannelStop(Channel);BASS_StreamFree(Channel);
//пытаемся загрузить файл и получить дескриптор канала
Channel:= BASS_StreamCreateFile(FALSE, PChar(FileName), 0, 0, 0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF});
//если дескриптор канала=0 (файл по какой то причине не может быть загружен),
//выдаем сообщение об ошибке и выходим
if Channel=0 then begin ShowMessage('Ошибка загрузки Файла'); exit; end;
end;

//настройка эквалайзера
fx[1]:= BASS_ChannelSetFX(channel, BASS_FX_DX8_PARAMEQ, 1);//первый канал эквалайзера
fx[2]:= BASS_ChannelSetFX(channel, BASS_FX_DX8_PARAMEQ, 1);//второй канал
fx[3]:= BASS_ChannelSetFX(channel, BASS_FX_DX8_PARAMEQ, 1);
fx[4]:= BASS_ChannelSetFX(channel, BASS_FX_DX8_PARAMEQ, 1);
fx[5]:= BASS_ChannelSetFX(channel, BASS_FX_DX8_PARAMEQ, 1);
fx[6]:= BASS_ChannelSetFX(channel, BASS_FX_DX8_PARAMEQ, 1);
fx[7]:= BASS_ChannelSetFX(channel, BASS_FX_DX8_PARAMEQ, 1);
fx[8]:= BASS_ChannelSetFX(channel, BASS_FX_DX8_PARAMEQ, 1);
fx[9]:= BASS_ChannelSetFX(channel, BASS_FX_DX8_PARAMEQ, 1);
fx[10]:= BASS_ChannelSetFX(channel, BASS_FX_DX8_PARAMEQ, 1);

//настройка первого канала эквалайзера
p.fGain:=15-trackbar3.Position; //усиление
p.fBandwidth:= 3; //ширина полосы пропускания
p.fCenter:= 80; //частота регулирования
BASS_FXSetParameters(fx[1], @p);//применение заданных настроек

//настройка второго канала эквалайзера
p.fGain:= 15-trackbar4.Position;
p.fBandwidth:= 3;
p.fCenter:= 170;
BASS_FXSetParameters(fx[2], @p);
//и т.д.

p.fGain:= 15-trackbar5.Position;
p.fBandwidth:= 3;
p.fCenter:= 310;
BASS_FXSetParameters(fx[3], @p);

p.fGain:= 15-trackbar6.Position;
p.fBandwidth:= 3;
p.fCenter:= 600;
BASS_FXSetParameters(fx[4], @p);

p.fGain:= 15-trackbar7.Position;
p.fBandwidth:= 3;
p.fCenter:= 1000;
BASS_FXSetParameters(fx[5], @p);

p.fGain:= 15-trackbar8.Position;
p.fBandwidth:= 3;
p.fCenter:= 3000;
BASS_FXSetParameters(fx[6], @p);

p.fGain:= 15-trackbar9.Position;
p.fBandwidth:= 3;
p.fCenter:= 6000;
BASS_FXSetParameters(fx[7], @p);

p.fGain:= 15-trackbar10.Position;
p.fBandwidth:=3;
p.fCenter:= 10000;
BASS_FXSetParameters(fx[8], @p);

p.fGain:= 15-trackbar11.Position;
p.fBandwidth:= 3;
p.fCenter:= 12000;
BASS_FXSetParameters(fx[9], @p);

p.fGain:= 15-trackbar12.Position;
p.fBandwidth:= 3;
p.fCenter:= 14000;
BASS_FXSetParameters(fx[10], @p);

//командой BASS_ChannelPlay(Channel, False) пытаемся воспроизвести файл,
//если это невозможно, то выдаем сообщение об ошибке
if not BASS_ChannelPlay(Channel, False) then
begin ShowMessage('Ошибка воспроизведения файла');exit;end;

//полоса проигрывания
scrollbar1.Min:=0; //минимальное значение
scrollbar1.Max:=bass_ChannelGEtLength(Channel, 0)-1;//максимальное значение

//присваеваем заголовку формы имя проигрываемого файла
Form_Player.Caption:=ExtractFileName(FileName);
//Устанавливаем PlayMode - play
mode:=play;
end;

procedure TForm_player.ScrollBar1Scroll(Sender: TObject;
ScrollCode: TScrollCode; var ScrollPos: Integer);
begin
//устанавливаем позицию воспроизведения трека в зависимости от положения scrollbar
bass_ChannelSetPosition(Channel, scrollbar1.position, 0);
end;


Для каждого TrackBar эквалайзера в событии OnChange пишем код:


procedure TForm_player.TrackBar3Change(Sender: TObject);
begin
BASS_FXGetParameters(fx[1], @p);//считываем параметры канала
p.fgain:= 15-TrackBar3.position;//задаем усиление в зависимости от позиции TrackBar
BASS_FXSetParameters(fx[1], @p);//устанавливаем измененные параметры
end;

procedure TForm_player.TrackBar4Change(Sender: TObject);
begin
BASS_FXGetParameters(fx[2], @p);//считываем параметры канала
p.fgain:= 15-TrackBar4.position;//задаем усиление в зависимости от позиции TrackBar
BASS_FXSetParameters(fx[2], @p);//устанавливаем измененные параметры
end;

procedure TForm_player.TrackBar5Change(Sender: TObject);
begin
BASS_FXGetParameters(fx[3], @p);//считываем параметры канала
p.fgain:= 15-TrackBar5.position;//задаем усиление в зависимости от позиции TrackBar
BASS_FXSetParameters(fx[3], @p);//устанавливаем измененные параметры
end;

procedure TForm_player.TrackBar6Change(Sender: TObject);
begin
BASS_FXGetParameters(fx[4], @p);//считываем параметры канала
p.fgain:= 15-TrackBar6.position;//задаем усиление в зависимости от позиции TrackBar
BASS_FXSetParameters(fx[4], @p);//устанавливаем измененные параметры
end;

procedure TForm_player.TrackBar7Change(Sender: TObject);
begin
BASS_FXGetParameters(fx[5], @p);//считываем параметры канала
p.fgain:= 15-TrackBar7.position;//задаем усиление в зависимости от позиции TrackBar
BASS_FXSetParameters(fx[5], @p);//устанавливаем измененные параметры
end;

procedure TForm_player.TrackBar8Change(Sender: TObject);
begin
BASS_FXGetParameters(fx[6], @p);//считываем параметры канала
p.fgain:= 15-TrackBar8.position;//задаем усиление в зависимости от позиции TrackBar
BASS_FXSetParameters(fx[6], @p);//устанавливаем измененные параметры
end;

procedure TForm_player.TrackBar9Change(Sender: TObject);
begin
BASS_FXGetParameters(fx[7], @p);//считываем параметры канала
p.fgain:= 15-TrackBar9.position;//задаем усиление в зависимости от позиции TrackBar
BASS_FXSetParameters(fx[7], @p);//устанавливаем измененные параметры
end;

procedure TForm_player.TrackBar10Change(Sender: TObject);
begin
BASS_FXGetParameters(fx[8], @p);//считываем параметры канала
p.fgain:= 15-TrackBar10.position;//задаем усиление в зависимости от позиции TrackBar
BASS_FXSetParameters(fx[8], @p);//устанавливаем измененные параметры
end;

procedure TForm_player.TrackBar11Change(Sender: TObject);
begin
BASS_FXGetParameters(fx[9], @p);//считываем параметры канала
p.fgain:= 15-TrackBar11.position;//задаем усиление в зависимости от позиции TrackBar
BASS_FXSetParameters(fx[9], @p);//устанавливаем измененные параметры
end;

procedure TForm_player.TrackBar12Change(Sender: TObject);
begin
BASS_FXGetParameters(fx[10], @p);//считываем параметры канала
p.fgain:= 15-TrackBar12.position;//задаем усиление в зависимости от позиции TrackBar
BASS_FXSetParameters(fx[10], @p);//устанавливаем измененные параметры
end;

Вот и все эквалайзе готов. Если вас не устраивает качество регулировки звука, то можно поиграть с параметрами p.fBandwidth и p.fCenterполосой пропускания и центральной частотой канала регулирования).

Далее делаем визуализацию проигрывания музыки. Для этого я использую готовую визуализацию из примеров по Bass.dll.

{ Spectrum Visualyzation by Alessandro Cappellozza
version 0.8 05/2002
https://digilander.iol.it/Kappe/audioobject}

немного переделав ее под свой проигрыватель.

В разделе Type добавим следующую строку:

TFFTData = array [0..512] of Single;

type
TFFTData = array [0..512] of Single;
TPlayerMode = (Stop, Play, Paused);
TForm_player = class(TForm)
pb1: TPaintBox;
Label1: TLabel;

В разделе Var добавим строки

//переменные визуализации
FFTPeacks: array [0..128] of Integer;
FFTFallOff: array [0..128] of Integer;

var
Form_player: TForm_player;
i:integer; //номер проигрываемой песни в playlist
filename: string;//имя файла
Channel: DWORD;//
Mode: TPlayerMode;//PlayMode
//переменные для настройки эквалайзера
p: BASS_DX8_PARAMEQ;
fx: array[1..10] of integer;
//переменные визуализации
FFTPeacks: array [0..128] of Integer;
FFTFallOff: array [0..128] of Integer;

Создаем процедуру визуализации, для этого в разделе Type перед разделом private описываем процедуру Draw;

procedure Draw(HWND: THandle; FFTData: TFFTData; X, Y: Integer);

private
{ Private declarations }

public
{ Public declarations }
end;

После раздела

implementation
{$R *.dfm}

Прописываем саму процедуру:

procedure TForm_Player.Draw(HWND: THandle; FFTData: TFFTData; X, Y: Integer);
var i, YPos: LongInt; YVal: Single;
begin
//очистка области визуализации
pb1.Canvas.Pen.Color:= clBlack;
pb1.Canvas.Brush.Color:= clBlack;
pb1.Canvas.Rectangle(0, 0, pb1.Width, pb1.Height);
//визуализация
// pb1.Canvas.Pen.Color:= clRed;
for i:= 0 to 127 do begin // количество столбиков
YVal:= Abs(FFTData[i]);
YPos:= trunc((YVal) * 500);
if YPos > pb1.Height then YPos:= pb1.Height;

if YPos >= FFTPeacks[i] then FFTPeacks[i]:= YPos
else FFTPeacks[i]:= FFTPeacks[i] - 1;

if YPos >= FFTFallOff[i] then FFTFallOff[i]:= YPos
else FFTFallOff[i]:= FFTFallOff[i] - 3;
//рисование пика
pb1.Canvas.Pen.Color:= clYellow;
pb1.Canvas.MoveTo(X + i*(3+1), Y + pb1.Height - FFTPeacks[i]);
pb1.Canvas.LineTo(X + i*(3+1) + 3, Y + pb1.Height - FFTPeacks[i]);
//рисование столбика
pb1.Canvas.Pen.Color:= clRed;
pb1.Canvas.Brush.Color:= clRed;
pb1.Canvas.Rectangle(X + i*(3+1), Y + pb1.Height - FFTFallOff[i], X + i*(3+1) + 3, Y + pb1.Height);

end;

end;


В событии OnTime компонента Timer1 добавим строки вызова визуализации
в var FFTFata: TFFTData;


в самой процедуре:

//вызов визуализации
BASS_ChannelGetData(Channel, @FFTFata, BASS_DATA_FFT1024);
Draw (pb1.Canvas.Handle, FFTFata, 0,-5);


procedure TForm_player.Timer1Timer(Sender: TObject);
var FFTFata: TFFTData;
TrackLen, TrackPos: Double;
ValPos: Double;
ValLen: Double;
begin
//проверяем режим воспроизведения, если не Play то выходим
if mode<>play then Exit;

//воспроизведение следующей песни
//если время проигрывания равно длине песни по времени,
if BASS_ChannelGetPosition(channel, 0)= BASS_ChannelGetLength(channel, 0) then

// в место if BASS_ChannelGetPosition(channel, 0)=BASS_ChannelGetLength(channel, 0) then
// можно сделать так: if BASS_ChannelIsActive(channel)=BASS_ACTIVE_STOPPED then
// Практика показывает, что второй вариант более предпочтительный,
// т.к. проверка по длине трека иногда приводит к ошибкам в работе плеера.
begin
//то выбираем следующую песню из плейлиста
if i<ListBox1.Items.Count-1 then
begin
inc(i);
Filename:=ListBox1.Items.Strings[i];
ListBox1.ItemIndex:=i;
mode:=stop;
player;
end
//если лист закончился - выходим
else exit;
end;

//вызов визуализации
BASS_ChannelGetData(Channel, @FFTFata, BASS_DATA_FFT1024);
Draw (pb1.Canvas.Handle, FFTFata, 0,-5);

//устанавливаем позицию scrollbar в зависимоти от позиции трека
scrollbar1.Position:=bass_channelGetPosition(channel,0);

//время проигрывания трека
//считаваем сколько секунд прошло от начала воспроизведения
TrackPos:=BASS_ChannelBytes2Seconds(Channel, BASS_ChannelGetPosition(Channel,0));
//считываем всю длину песню в секундах
TrackLen:=BASS_ChannelBytes2Seconds(Channel, BASS_ChannelGetLength(Channel,0));
//переводим секунды в часы
ValPos:=TrackPos / (24 * 3600);
ValLen:=TrackLen / (24 * 3600);
//Выводим данные о времени на форму в Label1 и Label2
Label1.Caption:=FormatDateTime('hh:mm:ss',ValPos);
Label2.Caption:=FormatDateTime('hh:mm:ss',ValLen);

//установка громкости звука
BASS_ChannelSetAttribute(Channel,BASS_ATTRIB_VOL, trackBar1.Position/10);
//установка баланса
BASS_ChannelSetAttribute(Channel,BASS_ATTRIB_PAN, Trackbar2.Position/5);

end;

в событии OnPaint компонента pb1(TPaintBox) пишем следующий код:

procedure TForm_player.pb1Paint(Sender: TObject);
begin
//фон окна визуализации
pb1.Canvas.Pen.Color:=clBlack; //цвет пера
pb1.Canvas.Brush.Color:=clBlack;//цвет кисти
pb1.Canvas.Rectangle(0,0,pb1.Width,pb1.Height); //рисуем прямоугольник фон
end;

На этом визуализация закончена.

 


работа с ini - файлами


Для того, чтобы программа могла работать с такими файлами, необходимо в разделе interface в uses в дополнение имеющегося списка дать ссылку на соответствующую библиотеку:

uses iniFiles;

добавим ее в наш проект.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-06-21 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: