Page 1 sur 1

Mur de LED sonores

Publié : mar. 07/avr./2026 18:36
par Jacobus
Hello,
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
Amusez-vous bien :)

Re: Mur de LED sonores

Publié : mer. 08/avr./2026 11:01
par Jacobus
Le code dans le premier post a été optimisé.
Le zip aussi :
Updated zip file: LED_Wall.zip
- Files = Mur_de_LED.pb and Progressbar_ImagesLED.pb
- LED24 = 23 dual-format icons (24x24/16x16)
- LED48 = 30 quadruple icons 48x48/32x32/24x24/16x16

Une petite vidéo du programme en action :)
LED_Wall.mp4

Re: Mur de LED sonores

Publié : mer. 08/avr./2026 14:34
par SPH
C'est... rigolo...

... mais ça sert à quoi, à part communiquer avec des extra-terrestres ? :wink:

Re: Mur de LED sonores

Publié : mer. 08/avr./2026 18:56
par Kwai chang caine
C'est un appareil de mesure, qu'on appelle un VU-METRE normalement toi qui est pas jeune non plus tu devrais connaitre :mrgreen:
T'as jamais vu ça sur une chaine hi-fi, ou une table de mixage, quand j'étais gamin, c'est à dire le siècle dernier :mrgreen: j'adorais les regarder évoluer sous mes yeux ébahis 8O
Cela peut servir pour mesurer quoi que ce soit, une tension en volts, un son en DB, une intensité en amperes, etc ... mais visuellement
Avant tu avais les VU-METRES à aiguilles

Image

Puis avec l'aire de l'électronique, ils ont eu la géniale idée de remplacer l'aiguille par des LED (Moins cheres à construire et plus "IN" :mrgreen: )et faire un mouvement principalement de bas en haut ou a l'horizontale de gauche à droite :wink:

Re: Mur de LED sonores

Publié : mer. 08/avr./2026 19:35
par Jacobus
Bien vu KCC, en effet on peut utiliser les principes mis en oeuvre dans ce code pour créer un type de vumètre personalisé.
En général les LED sont de 3 couleurs, vert, jaune et rouge, pour aller du mini au maxi.
Le code que j'ai présenté montre seulement comment jouer avec les possibilités de PB pour ce type de "gadget".
Pour l'instant je n'ai pas trouvé comment récupérer le niveau de fréquence des sons d'un morceau de music type mp3 avec PB.

@SPH, je me doutais bien que tu étais un extraterrestre, tu es le seul à avoir compris que c'était pour communiquer avec ET. :D
As-tu déchiffré le message lumineux sonore émis par le programme ? :wink: