Визуализация звука
Закончил проект
1. Визуализация звуковой волны с использованием библиотеки
Bass.dll
2. Информация о файле
MP3 : ( исполнитель, название, год )
3. Индикатор среднего уровня сигнала
левого и
правого канала.
4. Сохранение параметра громкость во внешнем файле (
функция Preferences)
5. Плейлист адресов радиостанций.
Для компиляции необходим файл:
RLibPlus.res (находится в архиве исходника)
Отвечает за функции:
HIWORD() ; выделяет левый канал
LOWORD() ; выделяет правый канал
Поместить
RLibPlus.res в папку
Residents в PureBasic.
Возможно нужны
библиотеки
Код реализации для версии PB 4.30 :
;-------------------Плеер MP3, Онлайн радио но Bass.dll----------------------
;
; (c) 2009 - mirashic
;
;-----------------------------------------------------------------------------
UsePNGImageDecoder()
UseJPEGImageDecoder()
Enumeration
#Window_0
#WebGadget
#Image_3
#Volume
#im1
#im2
EndEnumeration
Global Val
Global Handle
Global Event
Global width1,height1,color1,m1
Global column,width,height,color,FileName.s,q
;{----------------------Параметры уровня-------------------------------------
x1=10 ;позиция от начала x
y1=97 ;позиция от начала y
width1=385 ;ширина столба
height1=3 ;высота столба
m1=3 ;ширина между столбами
color1=RGB(53, 246, 12) ;цвет
;}----------------------------------------------------------------------------
;{----------------------Параметры спектра-----------------------------------
x=10 ;позиция от начала x
y=22 ;позиция от начала y
column=42 ;колличество столбов
width=8 ;ширина столба
height=70 ;высота столба
h=1 ;ширина между столбами
color=RGB(1, 72, 187) ;цвет
;}----------------------------------------------------------------------------
;{----------------------Индикатор уровня и спектра---------------------------
IncludeFile "bass.pbi"
CreateImage(0,width,height)
CreateImage(#im1,385,9)
Procedure UpdateSpectrum(*xx) ; Функция для создания индикатора
Dim FFT.f(1024)
Repeat
;----------------------------------спектр------------------------------------
BASS_ChannelGetData(Handle,@FFT(),#BASS_DATA_FFT2048)
For f=0 To column
Val= Sqr(fft(f)) * 180 ;получение параметра по частотам
StartDrawing(ImageOutput(0))
Box(0,0,20,height,RGB(17, 17, 17))
Box(0,height-Val,20,Val,color)
a=height
For d=0 To 21
LineXY(0, a-4, width, a-4, RGB(0, 0, 0))
a=a-4
Next d
StopDrawing()
SetGadgetState(303+f,ImageID(0))
Next f
;-----------------------------------------------------------------------------
;-----------------------------уровень-----------------------------------------
If BASS_ChannelIsActive(handle) ; если канал активен
level=BASS_ChannelGetLevel(handle)
L=HIWORD(level)
R=LOWORD(level)
;----------------
Lal= L*width1/32768
StartDrawing(ImageOutput(#im1))
Box(0,0,width1,height1,RGB(17, 17, 17))
Box(0,0,Lal,height1,color1)
Ral= R*width1/32768
Box(0,6,width1,height1,RGB(17, 17, 17))
Box(0,6,Ral,height1,color1)
a1=width1
For d1=0 To 100
LineXY(a1-8, 0, a1-8, height1*2+m1, RGB(0, 0, 0))
a1=a1-8
Next d1
StopDrawing()
SetGadgetState(302,ImageID(#im1))
EndIf
;----------------------------------------------------------------------------
Delay(50)
ForEver
EndProcedure
;}---------------------------------------------------------------------------
;{----------------------Таймер-----------------------------------------------
Global a,b
Procedure.s Secundomer() ;- Сама процедура таймера - всего 3 строчки!
a+1
If a=10:a=0:b=b+1:EndIf
SetGadgetText(233,FormatDate("%ii:%ss", b)+":"+ Str(a))
EndProcedure
;}---------------------------------------------------------------------------
CatchImage(#Image_3, ?Im7, ?Im7End-?Im7)
;{----------------------Открыть MP3------------------------------------------
Procedure LoadMP3()
BASS_StreamFree(Handle)
FileName.s = OpenFileRequester("","","*.*|*.*",0)
Name.s= GetFilePart(FileName.s) ;выделяем имя файла
Debug Name$
If FileName
Handle=BASS_StreamCreateFile(0, @FileName, 0, 0, 0)
BASS_SetVolume(100)
BASS_ChannelPlay(Handle,0)
;--------------------------------Teg--------------------------------------
If ReadFile(0,FileName.s)
MemPointer = AllocateMemory(128)
FileSeek(0,Lof(0)-128)
ReadData(0,MemPointer, 128)
artist.s = Trim(PeekS(MemPointer + 33,30)) ; артист
album.s = Trim(PeekS(MemPointer + 63,30)) ; альбом
year.s = Trim(PeekS(MemPointer + 93, 4)) ; год
EndIf
;----------------------------------------------------------------------------
SetGadgetText(230,artist.s+" "+Name.s+" "+year.s)
EndIf
EndProcedure
;}---------------------------------------------------------------------------
;{----Функция для создания потокового звука, получаемыми из сети Интернет----
Procedure Loadfile(url_1$,N)
BASS_StreamFree(Handle) ; Закроем все существующие каналы воспроизведения и освободим системные ресурсы
Handle=BASS_StreamCreateURL(url_1$, 0, 0, #Null, 0)
a=0:b=0
StartTimer( 1 , 100 , @Secundomer())
BASS_ChannelPlay(Handle,0)
SetGadgetText(230,"Станция : "+GetGadgetText(N)+" 128 kbps")
EndProcedure
;}---------------------------------------------------------------------------
;{----------------------Основное окно----------------------------------------
OpenWindow(#Window_0, 0, 0, 410, 220, "Radio Bass", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_Invisible)
BackgroundImage_Window_0_Brush = CreatePatternBrush_(ImageID(#Image_3))
If BackgroundImage_Window_0_Brush
SetClassLong_(WindowID(#Window_0), #GCL_HBRBACKGROUND, BackgroundImage_Window_0_Brush)
RedrawWindow_(WindowID(#Window_0), 0, 0, #RDW_ERASE | #RDW_FRAME | #RDW_INVALIDATE | #RDW_ALLCHILDREN)
EndIf
ImageGadget(302,x1,y1,0,0,ImageID(#im1)) ; вывод индикатора уровня
For f=0 To column
ImageGadget(303+f,x, y,0,0,ImageID(0)) ; вывод спектра
x=x+(width+h)
Next f
HyperLinkGadget(218,24, 190,30,15,"Vol -",RGB(255,0,0))
HyperLinkGadget(219,59, 190,30,15,"Vol +",RGB(255,0,0))
TextGadget (220,100,190,20,15,"50")
SetGadgetColor(220,#PB_Gadget_FrontColor,RGB(1, 161, 254))
SetGadgetColor(220,#PB_Gadget_BackColor, RGB(29, 26, 26))
;{-----Чтение громкость--------
If OpenPreferences("vol.pcs")
SetGadgetText(220,ReadPreferenceString("Громкость", "Нет "))
ClosePreferences()
EndIf
;}-----------------------------
q=Val(GetGadgetText(220))
For j=218 To 219
PureCOLOR_SetGadgetColor(j, #PureCOLOR_SystemColor, #PureCOLOR_DontSetBackColor)
SetGadgetColor(j,#PB_Gadget_FrontColor,RGB(1, 161, 254))
Next j
HyperLinkGadget(221,20, 140,70,15,"A-ROCK", RGB(255,0,0))
HyperLinkGadget(222,100,140,70,15,"Kiss FM", RGB(255,0,0))
HyperLinkGadget(223,180,140,70,15,"Makkirus", RGB(255,0,0))
HyperLinkGadget(224,260,140,70,15,"Радио 13", RGB(255,0,0))
HyperLinkGadget(225,330,140,70,15,"Luga Radio", RGB(255,0,0))
For h=221 To 225
SetGadgetColor(h,#PB_Gadget_FrontColor,RGB(129,129,129))
SetGadgetColor(h,#PB_Gadget_BackColor, RGB(29, 26, 26))
Next h
HyperLinkGadget(240, 270, 163, 55, 15, "Плейлист", RGB(255,0,0))
HyperLinkGadget(241, 340, 163, 55, 15, "Загрузка", RGB(255,0,0))
For o=240 To 241
SetGadgetColor(o,#PB_Gadget_FrontColor,RGB(1, 161, 254))
SetGadgetColor(o,#PB_Gadget_BackColor, RGB(29, 26, 26))
Next o
HyperLinkGadget(226,15, 110,70,15,"Открыть MP3",RGB(255,0,0))
HyperLinkGadget(227,110,110,40,15,"Stop", RGB(255,0,0))
HyperLinkGadget(228,160,110,40,15,"Play", RGB(255,0,0))
HyperLinkGadget(229,200,110,50,15,"Pause", RGB(255,0,0))
TextGadget (230,20,8,350,15,"Информация")
HyperLinkGadget(231, 388, 8, 10, 15, "?",RGB(255,0,0))
HyperLinkGadget(232, 388, 110, 10, 12, "#",RGB(255,0,0))
TextGadget (233, 318, 110, 45, 15, "00:00:0")
HyperLinkGadget(234, 375, 110, 10, 12, "#",RGB(255,0,0))
For b=226 To 234
SetGadgetColor(b,#PB_Gadget_FrontColor,RGB(1, 161, 254))
SetGadgetColor(b,#PB_Gadget_BackColor, RGB(0, 0, 0))
Next b
StringGadget(444, 132, 189, 270, 15, "http://207.200.96.225:8020",#PB_String_BorderLess)
PureCOLOR_SetGadgetColor(444, RGB(129, 129, 129), RGB(29, 26, 26))
BASS_Init(-1, 44100, 0, WindowID(0), #Null)
BASS_SetVolume(q/100)
;}------------------------------------------------------------------------------
CreateThread(@UpdateSpectrum(),0)
HideWindow(#Window_0,0)
Repeat
Event= WaitWindowEvent(10)
Window=EventWindow()
Gadget=EventGadget()
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case 221
Loadfile("http://stream4.radiostyle.ru:8004/a-rock", 221)
Case 222
Loadfile("http://217.20.164.164:8000/kissfm.mp3", 222)
Case 223
Loadfile("http://w02-sw01.akadostream.ru:8111/makkirus128.mp3",223)
Case 224
Loadfile("http://play.radio13.ru:8000/radio13-128-mp3", 224)
Case 225
Loadfile("http://195.5.125.6:8000/", 225)
Case 226
LoadMP3()
a=0:b=0
StartTimer( 1 , 100 , @Secundomer())
Case 227
EndTimer(1)
BASS_ChannelStop(Handle)
BASS_ChannelSetPosition(Handle,0,#BASS_POS_BYTE)
Case 228
BASS_ChannelPlay(Handle,0)
a=0:b=0
StartTimer( 1 , 100 , @Secundomer())
Case 229
EndTimer(1)
BASS_ChannelPause(Handle)
Case 231
;{-----------------------------О программе-------------------------------------
CatchImage(69, ?Im6, ?Im6End-?Im6)
OpenWindow(59, 0, 0, 320, 320, "Информация о программе", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
BackgroundImage_Window_0_Brush = CreatePatternBrush_(ImageID(69))
If BackgroundImage_Window_0_Brush
SetClassLong_(WindowID(59), #GCL_HBRBACKGROUND, BackgroundImage_Window_0_Brush)
RedrawWindow_(WindowID(59), 0, 0, #RDW_ERASE | #RDW_FRAME | #RDW_INVALIDATE | #RDW_ALLCHILDREN)
EndIf
TextGadget (70, 20, 295, 95, 15, "Сайт программы :")
HyperLinkGadget(71, 140, 295, 150,15,"http://www.mirashic.narod.ru/",RGB(255, 4, 0))
TextGadget (72, 120, 124, 65, 15, "Версия : 1.0")
TextGadget (73, 30, 250, 165, 15, "Автор : Мирошниченко Олег")
TextGadget (74, 30, 144, 265, 15, "Онлайн проигрыватель FM радио")
TextGadget (75, 30, 160, 265, 15, "Бесплатная версия")
TextGadget (76, 30, 176, 265, 15, "Сделано в программной среде : ")
HyperLinkGadget(77, 50, 200, 130, 30, "PureBasic",RGB(255, 4, 0))
SetGadgetFont (77, LoadFont(77, "Arial", 20, 16))
SetGadgetColor(77, #PB_Gadget_FrontColor,RGB(255, 81, 78))
SetGadgetColor(77, #PB_Gadget_BackColor, RGB(0, 0, 0))
For k=70 To 76
SetGadgetColor(k, #PB_Gadget_FrontColor,RGB(129, 129, 129))
SetGadgetColor(k,#PB_Gadget_BackColor,RGB(0, 0, 0))
Next k
;}-----------------------------------------------------------------------------
Case 232
Toggle = Toggle ! 1
If Toggle
color1=RGB(228, 17, 1)
Else
color1=RGB(53, 246, 12)
EndIf
Case 234
Toggle = Toggle ! 1
If Toggle
color=RGB(53, 246, 12)
Else
color=RGB(1, 72, 187)
EndIf
Case 218
If q >0
SetGadgetText(220,""+Str(q-2))
q-2
Val=q
BASS_SetVolume(Val/100)
EndIf
Case 219
If q <100
SetGadgetText(220,""+Str(q+2))
q+2
Val=q
BASS_SetVolume(Val/100)
EndIf
Case 241
Loadfile(GetGadgetText(444),241)
Case 240
;{-----------------------------Плейлист----------------------------------------
Enumeration
#ListIconGadget_2
EndEnumeration
CatchImage(3, ?Im3, ?Im3End-?Im3)
OpenWindow(60, 0, 0, 450, 480, "Плейлист", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
SetWindowColor(60,RGB(13, 13, 13))
ImageGadget(61, 0, 0, 450, 140, ImageID(3))
ListIconGadget(#ListIconGadget_2, 5, 100, 440, 350, " http адресс FM радиостанций", 280, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
AddGadgetColumn(0, 1, "Название", 130)
AddGadgetItem(#ListIconGadget_2, -1, "")
AddGadgetItem(#ListIconGadget_2, -1, "http://16bit.fm:9500"+Chr(10)+"Радио 16BIT.FM")
AddGadgetItem(#ListIconGadget_2, -1, "http://94.103.95.39:9000"+Chr(10)+"BestDance.FM")
AddGadgetItem(#ListIconGadget_2, -1, "http://live1.radiogroup.com.ua:8000/europaplus128"+Chr(10)+"Europa Plus")
AddGadgetItem(#ListIconGadget_2, -1, "http://live.galaradio.com:8000/kiev"+Chr(10)+"Radio Gala")
AddGadgetItem(#ListIconGadget_2, -1, "http://stream.loveradio.ru:8000/Loveradio_96_stereo.mp3"+Chr(10)+"Love радио")
AddGadgetItem(#ListIconGadget_2, -1, "http://mixfm.com.ua:8128"+Chr(10)+"MixFm")
AddGadgetItem(#ListIconGadget_2, -1, "http://listen.radiopremium.ru:9000/premium32"+Chr(10)+"Радио Premium")
AddGadgetItem(#ListIconGadget_2, -1, "http://217.20.175.72:3200"+Chr(10)+"RadioBengel")
AddGadgetItem(#ListIconGadget_2, -1, "")
AddGadgetItem(#ListIconGadget_2, -1, "http://sanfm.ru:8000/live"+Chr(10)+"SanRadio")
AddGadgetItem(#ListIconGadget_2, -1, "http://shamrock.kiev.ua:8000/folk128"+Chr(10)+"ShamRock")
AddGadgetItem(#ListIconGadget_2, -1, "http://212.26.129.222:8001"+Chr(10)+"Наше Радио")
AddGadgetItem(#ListIconGadget_2, -1, "http://live.ncradio.ru/256.mp3"+Chr(10)+"Новое Чистое Радио")
AddGadgetItem(#ListIconGadget_2, -1, "http://62.80.190.246:8000/ProstoRadiO128"+Chr(10)+"Просто Ради.О")
AddGadgetItem(#ListIconGadget_2, -1, "http://play.radio13.ru:8000/radio13-128-mp3"+Chr(10)+"Радио 13")
AddGadgetItem(#ListIconGadget_2, -1, "http://server1.radioserver.fm:8000/radiozaryad"+Chr(10)+"Радио Заряд")
AddGadgetItem(#ListIconGadget_2, -1, "http://radioserver.fm:8000/obogrelov-fm"+Chr(10)+"Радио Obogrelov")
AddGadgetItem(#ListIconGadget_2, -1, "http://82.193.116.85:8888/radioplus_hi"+Chr(10)+"Eto Radio Plus")
AddGadgetItem(#ListIconGadget_2, -1, "http://91.193.68.87:8155"+Chr(10)+"Радио-Премьер")
AddGadgetItem(#ListIconGadget_2, -1, "http://213.159.71.19:8000/48.mp3"+Chr(10)+"Радио РОКС")
AddGadgetItem(#ListIconGadget_2, -1, "http://82.193.116.85:8888/eradio_hi"+Chr(10)+"Радио «Є»")
AddGadgetItem(#ListIconGadget_2, -1, "http://91.202.72.22:8000/rusradio-128"+Chr(10)+"Русское Радио (Украина)")
AddGadgetItem(#ListIconGadget_2, -1, "http://online1.uhradio.com.ua:8000/uhradio"+Chr(10)+"УХ радио 101,1 FM")
AddGadgetItem(#ListIconGadget_2, -1, "http://live.ipfm.net:8000/hit-fm-128"+Chr(10)+"Хит FM, Hit FM, XIT FM (Украина)")
AddGadgetItem(#ListIconGadget_2, -1, "http://83.222.4.42:8800/"+Chr(10)+"Радио Шансон (Россия)")
AddGadgetItem(#ListIconGadget_2, -1, "")
AddGadgetItem(#ListIconGadget_2, -1, "http://85.25.86.69:8400"+Chr(10)+"C H R O M A N O V A FM presents Ambient and Chillout Sets 247")
AddGadgetItem(#ListIconGadget_2, -1, "http://64.71.144.178:8060"+Chr(10)+"FM - Club")
AddGadgetItem(#ListIconGadget_2, -1, "http://64.71.145.130:8040"+Chr(10)+"FM - Trance")
AddGadgetItem(#ListIconGadget_2, -1, "http://72.13.93.117:8050"+Chr(10)+"FM - Dance Hits")
AddGadgetItem(#ListIconGadget_2, -1, "http://200.6.157.20:8211"+Chr(10)+"247online HQ High Quality radio - www.247onlineradio.com")
AddGadgetItem(#ListIconGadget_2, -1, "http://89.20.136.213:9800"+Chr(10)+"16BIT.FM IDEA Channel Intelligent Digital Experimental Sound ")
AddGadgetItem(#ListIconGadget_2, -1, "")
AddGadgetItem(#ListIconGadget_2, -1, "http://94.23.0.111:8020"+Chr(10)+"Ambient Lounge Radio")
AddGadgetItem(#ListIconGadget_2, -1, "http://207.200.96.225:8020"+Chr(10)+"Bluemars - Music for the Space Traveler")
AddGadgetItem(#ListIconGadget_2, -1, "http://64.57.105.178:8000"+Chr(10)+"Culture Failure")
AddGadgetItem(#ListIconGadget_2, -1, "http://207.200.96.225:8022"+Chr(10)+"Cryosleep - Zero Beat Guaranteed")
AddGadgetItem(#ListIconGadget_2, -1, "")
AddGadgetItem(#ListIconGadget_2, -1, "http://64.62.252.141:8100"+Chr(10)+"FM - Disco Ball")
AddGadgetItem(#ListIconGadget_2, -1, "http://64.71.145.130:8095"+Chr(10)+"FM - 80s Channel")
AddGadgetItem(#ListIconGadget_2, -1, "http://66.103.27.11:14700"+Chr(10)+"CLUB.FM 80 - Freestyle Express 128k")
AddGadgetItem(#ListIconGadget_2, -1, "http://66.103.27.11:13900"+Chr(10)+"000Audio.com - 90s Dance Hits 128k")
AddGadgetItem(#ListIconGadget_2, -1, "")
AddGadgetItem(#ListIconGadget_2, -1, "http://66.90.73.17:9000"+Chr(10)+"A9 RADIO")
AddGadgetItem(#ListIconGadget_2, -1, "http://stream.bollywoodmusicradio.com"+Chr(10)+"Индия Bollywood Music Radio")
AddGadgetItem(#ListIconGadget_2, -1, ""+Chr(10)+"")
AddGadgetItem(#ListIconGadget_2, -1, ""+Chr(10)+"")
AddGadgetItem(#ListIconGadget_2, -1, ""+Chr(10)+"")
AddGadgetItem(#ListIconGadget_2, -1, ""+Chr(10)+"")
AddGadgetItem(#ListIconGadget_2, -1, ""+Chr(10)+"")
AddGadgetItem(#ListIconGadget_2, -1, ""+Chr(10)+"")
AddGadgetItem(#ListIconGadget_2, -1, ""+Chr(10)+"")
AddGadgetItem(#ListIconGadget_2, -1, ""+Chr(10)+"")
Case #ListIconGadget_2
Loadfile(GetGadgetText(#ListIconGadget_2),240)
;}-------------------------------------------------------------------------------
EndSelect
EndSelect
If Event=#PB_Event_CloseWindow
;{----Запись громкость-----------
If OpenPreferences("vol.pcs")
WritePreferenceString("Громкость",GetGadgetText(220))
ClosePreferences()
EndIf
;}-------------------------------
CloseWindow(Window)
EndIf
Until Event=#PB_Event_CloseWindow And Window=#Window_0
;{---------------------------загрузка изоброжений------------------------------
DataSection
Im3:
IncludeBinary "img_2.jpg"
Im3End:
Im6:
IncludeBinary "info.png"
Im6End:
Im7:
IncludeBinary "фон3.png"
Im7End:
EndDataSection
;}-----------------------------------------------------------------------------
Скачать
архив