J'ai regardé ton site de référence pour voir ce que tu souhaitais faire.
https://www.maxlaumeister.com/tonematrix/
il faut passer sur chaque petit carré avec la souris avec la touche gauche de la souris pressée.
On peut aussi marquer chaque carré par un simple clic.
Avec les mêmes méthode que précédemment on peut désélectionner les carrés.
Au fur et à mesure de la sélection des carrés, les notes sont jouées simultanément en colonne en progressant sur l'axe des x.
Voici un exemple de code utilisant le canvas pour dessiner une grille comparable à celle du site interner en question.
J'ai volontairement pas mis en place tes drapeaux de traduction et ton menu.
Tu pourra passer sur chaque carré avec la souris en maintenant le bouton gauche de la souris pressé.
Pour chaque carré j'ai assigné une fréquence de note.
Petite précision je ne sais pas jouer les 16 sons verticaux simultanément et la fluidité n'est pas au rendez vous

.
Code : Tout sélectionner
EnableExplicit
Enumeration window
#mf
EndEnumeration
Enumeration gadget
#mfGrid
EndEnumeration
Enumeration misc
#timer
EndEnumeration
Structure Plot
; Coordonnée coin haut gauche
x0.i
y0.i
; Coordonnée coin bas droit
x1.i
y1.i
; Chaque plot est associé à une fréquence
freq.i
; Le plot est sélectionné (ou pas)
isSelect.b
EndStructure
; Construction du grid composé de plot (16x16)
Global Dim Grid.Plot(15,15)
Global Dim Freqencies(15)
; Définition des couleurs de plot
Global PlotColorInactif = RGB(105, 105, 105)
Global PlotColorActif = RGB(245, 245, 245)
Global PlotColorPlay = RGB(255, 105, 180)
;Sommaire
Declare Start()
Declare InitFrequencies()
Declare DrawGrid()
Declare PlayGrid()
Declare onPlot()
Declare Exit()
Start()
Procedure Start()
Protected MarginLeft = (800 - (16*22))/2, MarginTop = (600 - (16*22))/2
Protected x, y, Plot
InitFrequencies()
OpenWindow(#mf, 0, 0, 800, 600, "ToneMatrix Redux", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
SetWindowColor(#mf, RGB(0, 0, 0))
; Installation de la grille
CanvasGadget(#mfGrid, MarginLeft, MarginTop, 16*24, 16*24, #PB_Canvas_ClipMouse)
DrawGrid()
; Ajout d'un timer pour jouer les notes
AddWindowTimer(#mf, #Timer, 1)
; Déclencheur
BindGadgetEvent(#mfGrid, @onPlot())
BindEvent(#PB_Event_Timer, @PLayGrid())
BindEvent(#PB_Event_CloseWindow, @Exit())
; Loop
Repeat : WaitWindowEvent() : ForEver
EndProcedure
Procedure InitFrequencies()
Freqencies(0) = 2100
Freqencies(1) = 1780
Freqencies(2) = 1580
Freqencies(3) = 1380
Freqencies(4) = 1180
Freqencies(5) = 1060
Freqencies(6) = 890
Freqencies(7) = 790
Freqencies(8) = 710
Freqencies(9) = 600
Freqencies(10) = 530
Freqencies(11) = 450
Freqencies(12) = 400
Freqencies(13) = 350
Freqencies(14) = 300
Freqencies(15) = 262
EndProcedure
; Dessiner le grid
; Initialiser la fréquence de chaque plot
Procedure DrawGrid()
Protected x, y
; Fond du grid
StartDrawing(CanvasOutput(#mfGrid))
Box(0, 0, 16*24, 16*24, RGB(0, 0, 0))
; Dessin des 16x16 plots
For x = 0 To 15
For y = 0 To 15
With Grid(x,y)
\x0 = x*24
\y0 = y*24
\x1 = \x0 + 20
\y1 = \y0 + 20
\freq = Freqencies(y)
Box(Grid(x,y)\x0, Grid(x,y)\y0, 20, 20, PlotColorInactif)
EndWith
Next
Next
StopDrawing()
EndProcedure
; Jouer la fréquence associé au plot
Procedure PlayGrid()
Static x, y
With Grid(x,y)
If \isSelect
StartDrawing(CanvasOutput(#mfGrid))
Box(\x0, \y0, 20, 20, PlotColorPlay)
StopDrawing()
Beep_(\freq, 100)
StartDrawing(CanvasOutput(#mfGrid))
Box(\x0, \y0, 20, 20, PlotColorActif)
StopDrawing()
EndIf
EndWith
; Balayage de haut en bas (Axe y)
; Puis de gauche à froite (Axe X)
y+1
; La derniere ligne est traitée
If y = 16
y = 0
x + 1
EndIf
; La derniéere colonne est traitée
If x = 16
x = 0
y = 0
EndIf
EndProcedure
; Un plot est sélectionné
; - On passe dessus avec le clic gauche de la souris préssé
; - Quand on le clic (Non traité dans cet exemple)
;
; La déselection d'un plot n'est pas traité
Procedure onPlot()
Protected x, y
Protected px = GetGadgetAttribute(#mfGrid, #PB_Canvas_MouseX)
Protected py = GetGadgetAttribute(#mfGrid, #PB_Canvas_MouseY)
; La souris est en mouvement et la touche gauche de la soutis est préssée
If (EventType() = #PB_EventType_MouseMove And
GetGadgetAttribute(#mfGrid, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
For x = 0 To 15
For y = 0 To 15
With Grid(x,y)
If px >= \x0 And py>= \y0 And px <= \x1 And py <= \y1
StartDrawing(CanvasOutput(#mfGrid))
Box(\x0, \y0, 20, 20, PlotColorActif)
StopDrawing()
; Le plot est sélectionné
\isSelect = #True
EndIf
EndWith
Next
Next
EndIf
EndProcedure
Procedure Exit()
End
EndProcedure

Regarde les évènements gérés le CanvasGadget()
https://www.purebasic.com/french/docume ... adget.html