poursuivant sur le principe d'animation après ceci viewtopic.php?t=19522
voici un petit amusement dont les principes peuvent être adaptés pour diverses applications.
Vous trouverez les codes sources et les icônes nécessaires dans un zip ici : LED_Wall.zip
Je vous laisse découvrir
le code (créé et testé sur PB 6.40 B7 x64, Windows11):
Code : Tout sélectionner
;=========================
; sound-enhancing LED wall
; Mur de LED sonores
; By Jacobus 07/04/2026
;
; Fichier zip contenant / Zip file containing:
; - Files = Mur_de_LED.pb and Progressbar_ImagesLED.pb
; - LED24 = 23 icônes double format 24x24/16x16
; - LED48 = 30 icônes quadruple format 48x48/32x32/24x24/16x16
;
; Disponible ici : / Available here:
; https://wolforan.com/wolforansoftware/DevPBimg/LED_Wall.zip
; https://wolforan.com/wolforansoftware/DevPBimg/LED_Wall.mp4
;=========================
;-CONSTANTES
Enumeration
#WinMain
EndEnumeration
Enumeration
#ContainerAction
#Txt_Freq
#TrackBarFreq
#Txt_TrackBarFreq
#TrackBarValT
#Txt_TrackBarValT
#TrackBarTime
#Txt_TrackBarTime
#Btn_Quit
EndEnumeration
;-VARIABLES
Global PROGRAMNAME$ = "sound-enhancing LED wall"
Global numico.i = 0, x = 0
Global ValT.i = 100 ; time/tempo
Global Time.i = 50 ; Timer time
Global FreqMax.i = 1000 ; fréquence max
Global ValBlock.i = FreqMax/60 ; divisé par le nombre d'icônes utilisées / divided by the number of icons used
;-IMAGES
Global Image0,Image1,Image2,Image3,Image4,Image5,Image6
Global Image7,Image8,Image9
Image0 = CatchImage(0, ?Image0)
Image1 = CatchImage(1, ?Image1)
Image2 = CatchImage(2, ?Image2)
Image3 = CatchImage(3, ?Image3)
Image4 = CatchImage(4, ?Image4)
Image5 = CatchImage(5, ?Image5)
Image6 = CatchImage(6, ?Image6)
Image7 = CatchImage(7, ?Image7)
Image8 = CatchImage(8, ?Image8)
Image9 = CatchImage(9, ?Image9)
DataSection
; icônes rectangulaires 48/32/24/16, LED wall
Image0: : IncludeBinary "LED48\Rectangle_bleu.ico"
Image1: : IncludeBinary "LED48\Rectangle_jaune.ico"
Image2: : IncludeBinary "LED48\Rectangle_noir.ico"
Image3: : IncludeBinary "LED48\Rectangle_rouge.ico"
Image4: : IncludeBinary "LED48\Rectangle_turquoise.ico"
Image5: : IncludeBinary "LED48\Rectangle_vert.ico"
Image6: : IncludeBinary "LED48\Rectangle_violet.ico"
; icônes rectangulaires 24/16, progressbar
Image7: : IncludeBinary "LED24\Square_vert.ico"
Image8: : IncludeBinary "LED24\Square_jaune.ico"
Image9: : IncludeBinary "LED24\Square_rouge.ico"
EndDataSection
;-STRUCTURES
Structure IcLed
ledIcone.i
EndStructure
Global NewList ShowledIcone.IcLed()
Structure PrLed
ProgIcone.i
EndStructure
Global NewList ProgledIcone.PrLed()
;-DECLARATIONS
Declare SetProgressBarFrequence(Freqhz.i)
Declare TheLEDShow()
Declare.i SelectProgressbarLED(a)
;-PROCEDURES
Procedure BipSonore()
b = Random(FreqMax, ValT)
Beep_(b,ValT)
SetGadgetText(#Txt_Freq, "Fréquence bip : "+Str(b)+" Hz")
SetProgressBarFrequence(b)
EndProcedure
Procedure ShowAllLED()
For j = 0 To ListSize(ShowledIcone.IcLed())-1
ledIcone = SelectElement(ShowledIcone.IcLed(), j)
HideGadget(ShowledIcone()\ledIcone, #False)
Next
EndProcedure
Procedure TheLEDShow()
For j = 0 To ListSize(ShowledIcone.IcLed())-1
ledIcone = SelectElement(ShowledIcone.IcLed(), j)
If j = Random(100, 1)
HideGadget(ShowledIcone()\ledIcone, #False)
BipSonore()
For L = 0 To ListSize(ProgledIcone.PrLed())-1
ProgIcone = SelectElement(ProgledIcone.PrLed(), L)
HideGadget(ProgledIcone()\ProgIcone, #True)
Next
Else
HideGadget(ShowledIcone()\ledIcone, #True)
EndIf
Next
EndProcedure
Procedure.i SelectLED(a)
; sélection de la couleur de l'icône pour chaque ligne du mur
If a >=1 And a<=4
led = Image0
ElseIf a >=5 And a <=8
led = Image5
ElseIf a >=9 And a <=12
led = Image1
ElseIf a >=13 And a <=16
led = Image3
ElseIf a >= 17 And a <= 20
led = Image6
EndIf
ProcedureReturn led
EndProcedure
Procedure.i SelectProgressbarLED(a)
; sélection de la couleur de l'icône pour la progressbar
If a >=1 And a<=20
Pled = Image7
ElseIf a >=21 And a <=40
Pled = Image8
ElseIf a >=41 And a <=60
Pled = Image9
EndIf
ProcedureReturn Pled
EndProcedure
Procedure SetProgressBarFrequence(Freqhz)
; Adaptation de la progressbar pour un affichage cohérent / Adapting the progress bar for consistent display
ValBlock = FreqMax/60 ; divisé par le nombre d'icônes utilisées / divided by the number of icons used
; ValBlock = 16.66 (ou 166.6 pour 10 000) les chiffres après la virgule sont ignorés / The digits after the decimal point are ignored.
NbIco.i = Freqhz/ValBlock
If NbIco > 60 : NbIco = 60 : EndIf
For L = 0 To NbIco -1
ProgIcone = SelectElement(ProgledIcone.PrLed(), L)
HideGadget(ProgledIcone()\ProgIcone, #False)
Next
EndProcedure
Procedure CreateLedWall(y)
x = 0
For a = 1 To 20 ;{
ledIcone = ImageGadget(#PB_Any, x, y, 48, 48, SelectLED(a))
*Element.IcLed = AddElement(ShowledIcone.IcLed())
If *Element <> 0
*Element\ledIcone = ledIcone
EndIf
HideGadget(ledIcone, #True)
x+48 ;}
Next
EndProcedure
;-FENETRE
If OpenWindow(#WinMain, 0, 0, 960, 300, PROGRAMNAME$, #PB_Window_BorderLess | #PB_Window_ScreenCentered)
SetWindowColor(#WinMain, RGB(0,0,0)) ; fond noir / black background
StickyWindow(#WinMain, #True) ; toujours au premier plan pour ne pas la perdre / always in the foreground so as not to lose it
; Création dynamique des 100 ImageGadget()
; 5 rangées de 20 LED, soit un total de 100 LED pour le spectacle
; 5 rows of 20 LEDs, for a total of 100 LEDs for the show
CreateLedWall(0) ; une ligne de 20 icônes de 5 couleurs différentes
CreateLedWall(48)
CreateLedWall(96)
CreateLedWall(144)
CreateLedWall(192)
;-CONTAINER
ContainerGadget(#ContainerAction, 0, 245, 960, 55, #PB_Container_Flat)
TextGadget(#Txt_Freq, 5, 5, 150, 15, "")
;variateur de fréquence de 1000 à 10000 hz / frequency inverter from 1000 to 10000 Hz
TrackBarGadget(#TrackBarFreq, 160, 5, 150, 20, 1000, 10000) : GadgetToolTip(#TrackBarFreq,"Varier la fréquence de 1000 à 10000 hz")
TextGadget(#Txt_TrackBarFreq, 315, 5, 50, 15, "") : SetGadgetText(#Txt_TrackBarFreq, Str(FreqMax)+" hz")
; variateur de tempo / tempo control
TrackBarGadget(#TrackBarValT, 370, 5, 150, 20, 10, 1000) : GadgetToolTip(#TrackBarValT,"Varier le tempo de 10 à 1000 ms")
TextGadget(#Txt_TrackBarValT, 525, 5, 50, 15, "") : SetGadgetText(#Txt_TrackBarValT, Str(ValT)+" tmp")
; variateur de temps en millisecondes / millisecond timer
TrackBarGadget(#TrackBarTime, 580, 5, 150, 20, 50, 1000) : GadgetToolTip(#TrackBarTime,"Varier le timer de 50 à 1000 ms")
TextGadget(#Txt_TrackBarTime, 735, 5, 50, 15, "") : SetGadgetText(#Txt_TrackBarTime, Str(Time)+" ms")
ButtonGadget(#Btn_Quit, 895, 2, 60, 25, "Quitter")
;-PROGRESSBAR
; Fréquence des sons / Frequency of sounds
; création dynamique d'une progressbar de 60 icônes 16x16 de 3 couleurs différentes
x = 0
For a = 1 To 60 ;{
ProgIcone = ImageGadget(#PB_Any, x, 30, 16, 16, SelectProgressbarLED(a), #PB_Image_Border)
*ItemLed.PrLed = AddElement(ProgledIcone.PrLed())
If *ItemLed <> 0
*ItemLed\ProgIcone = ProgIcone
EndIf
HideGadget(ProgIcone, #True)
x+16 ;}
Next
CloseGadgetList()
; Pour tout afficher avant de lancer le spectacle / To display everything before starting the show
ShowAllLED()
;-TIMER
AddWindowTimer(#WinMain, 1, Time)
;-EVENTLOOP
Repeat
EventID = WaitWindowEvent()
If EventID = #PB_Event_Timer And EventTimer() = 1
TheLEDShow()
EndIf
If EventID = #PB_Event_Gadget
Select EventGadget()
Case #TrackBarFreq : FreqMax = GetGadgetState(#TrackBarFreq) : SetGadgetText(#Txt_TrackBarFreq, Str(FreqMax)+" hz")
Case #TrackBarValT : ValT = GetGadgetState(#TrackBarValT) : SetGadgetText(#Txt_TrackBarValT, Str(ValT)+" tmp")
Case #TrackBarTime : Time = GetGadgetState(#TrackBarTime) : SetGadgetText(#Txt_TrackBarTime, Str(Time)+" ms")
Case #Btn_Quit : RemoveWindowTimer(#WinMain, 1) : Quit = 1
EndSelect
EndIf
;-FERMETURE
If EventID = #PB_Event_CloseWindow
Quit = 1
EndIf
Until Quit = 1
End
EndIf
