Problème avec la Priorité d'Event

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Stan_fr
Messages : 84
Inscription : mar. 07/mars/2023 20:01
Localisation : NANTES

Problème avec la Priorité d'Event

Message par Stan_fr »

Bonjour,

J'ai un problème avec la priorité des Event :

J'ai d'une part une fonction playgrid "bindée" avec un timer :

Code : Tout sélectionner

Procedure Playgrid()
  
  Static col, row, sw = 0
  Protected i, j
  
  If sw < 1
    Debug col
    For row = 0 To 15
      With Grid(col,row)
        If \isSelect
          Midi_PlayNote(Chann, P_Gam(15-row),VelocityDown,VelocityUp) 
        EndIf
      EndWith
      
    Next
    col = col +1
    If col > 15
      col = 0
      sw = 1
      
    EndIf
  Else
    For row = 0 To 15
    Next
    col = col +1
    If col > 15
      col = 0
      sw = 0
      
    EndIf
    
  EndIf
  
EndProcedure
et d'autre part une boucle de gestion :

Code : Tout sélectionner

  Repeat
    
    Event = WaitWindowEvent() 
                              
    If Event = #PB_EventType_LeftClick 

    EndIf
    
    Select Event
      Case #PB_Event_Gadget
        If EventGadget() >= grmin And EventGadget() <= grmax
          For ix = 0 To 15
            For iy = 0 To 15
              If gdgr(ix, iy) = EventGadget()
                A$ = " x "+ Str(ix) + " y " + Str(iy)+ "  " + Str(EventGadget())
                
              EndIf
            Next
          Next
        EndIf
        Select EventGadget()
            
          Case #drapeauFR
            
            If EventType() = #PB_EventType_LeftClick
              IDX_LAN = 0
              mk_menus()
              SetLan()
              Mk_Txt()
            EndIf
          Case #drapeauUS
            
            If EventType() = #PB_EventType_LeftClick
              IDX_LAN = 1
              mk_menus()
              SetLan()
              Mk_Txt()
            EndIf          
          Case #drapeauGE
            
            If EventType() = #PB_EventType_LeftClick
              IDX_LAN = 2
              mk_menus()
              SetLan()
              Mk_Txt()
            EndIf 
          Case #reset ; remet la grille à 0
            
            DrawGrid()
            
            
        EndSelect
      Case #PB_Event_Menu
        Select EventMenu()
          Case #GA_CHR  
      
            IDX_GAM = 0
            
            Midi_Mk_Gam() ;IDX_GAM, Index_Ton)
          Case #GA_DIAMA 
   
            IDX_GAM = 1
            Midi_Mk_Gam() ;IDX_GAM, Index_Ton)
          Case #GA_DIAMI  
      
            IDX_GAM = 2
            Midi_Mk_Gam();IDX_GAM, Index_Ton)
          Case #GA_PMA  
      
            IDX_GAM = 3
            Midi_Mk_Gam() ;IDX_GAM, Index_Ton)
          Case #GA_PMI  
         
            IDX_GAM = 4
            Midi_Mk_Gam() ;IDX_GAM, Index_Ton)
            
            ; Menu tonalié      
          Case #TO_C  
            IDX_TON = 0
    
            
            Midi_Mk_Gam();Index_gam, Index_Ton)
          Case #TO_Db            
            IDX_TON = 1
         
            
            Midi_Mk_Gam() ;Index_gam, Index_Ton)
          Case #TO_D   
            IDX_TON = 2
   
            
            Midi_Mk_Gam();Index_gam, Index_Ton)
          Case #TO_Eb 
            IDX_TON = 3
     
            
            Midi_Mk_Gam();Index_gam, Index_Ton)
          Case #TO_E
            IDX_TON = 4
        
            
            Midi_Mk_Gam();Index_gam, Index_Ton)
          Case #TO_F  
            IDX_TON = 5
          
            
            Midi_Mk_Gam(); Index_gam, Index_Ton)
          Case #TO_Gb
            IDX_TON = 6
    
            Midi_Mk_Gam(); Index_gam, Index_Ton)
          Case #TO_G 
            IDX_TON = 7
       
            Midi_Mk_Gam(); Index_gam, Index_Ton)
          Case #TO_Ab
            IDX_TON = 8
        
            Midi_Mk_Gam() ;Index_gam, Index_Ton)
          Case #TO_A 
            IDX_TON = 9
            
            Midi_Mk_Gam(); Index_gam, Index_Ton)
          Case #TO_Bb 
            IDX_TON = 10
            
            Midi_Mk_Gam();Index_gam, Index_Ton)
          Case #TO_B 
            IDX_TON = 11
            
            Midi_Mk_Gam(); Index_gam, Index_Ton)
        EndSelect
        
      Default
  
    EndSelect
    
    
  Until Event = #PB_Event_CloseWindow
EndIf


Tant que je n’atteins pas la boucle la fonction playgrid fonctionne correctement, par contre dès que j'y suis il y a un "hoquet" à la fin (i.e : un intervalle plus long) à la fin de playgrid.

Je suppose que c'est dû à la priorité faible de l'Event du timer, y-at-il un moyen de contourner cela ?
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Problème avec la Priorité d'Event

Message par falsam »

Dans ta boucle je ne vois pas de playgrid.
Ton playgrid est lié à un timer ? un callback ?
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Stan_fr
Messages : 84
Inscription : mar. 07/mars/2023 20:01
Localisation : NANTES

Re: Problème avec la Priorité d'Event

Message par Stan_fr »

falsam a écrit : ven. 07/avr./2023 11:35 Dans ta boucle je ne vois pas de playgrid.
Ton playgrid est lié à un timer ? un callback ?
Bonjour, j'ai écrit :
Stan_fr a écrit : ven. 07/avr./2023 2:11 Bonjour,

J'ai un problème avec la priorité des Event :

J'ai d'une part une fonction playgrid "bindée" avec un timer :
C'était peut-être mal exprimé mais cela voulait dire que ma fonction Playgrid est la Callback d'un timer :

Je mets l'intégralité du code :

Code : Tout sélectionner

EnableExplicit 


;{ DEÉCLARATIONS

; ************ ÉNUMÉRATIONS *************
Enumeration Window
  #mf 
  
EndEnumeration

Enumeration Langage #PB_Compiler_EnumerationValue
  #FRA
  #ANG
  #ALL
  #bien
EndEnumeration

Enumeration gadget #PB_Compiler_EnumerationValue
  #drapeauFR
  #drapeauUS
  #drapeauGE
  #grille
  #reset
  #mfGrid 
  #tim1
EndEnumeration

Enumeration Gadget_lang #PB_Compiler_EnumerationValue
  #G1
  #G2
  #G3
  #G4
EndEnumeration

; Langue
Enumeration Langue #PB_Compiler_EnumerationValue
  #GB 
  #FR
  #GE
EndEnumeration

; TITRES DES MENUS
Enumeration menus #PB_Compiler_EnumerationValue
  #ME_GAM
  #ME_TON
  #ME_HLP
EndEnumeration  

; ITEMS DU MENU GAMME
Enumeration Gamme #PB_Compiler_EnumerationValue
  #GA_CHR
  #GA_DIAMA
  #GA_DIAMI
  #GA_PMA 
  #GA_PMI 
EndEnumeration

; ITEMS DU MENU TONALITÉ
Enumeration Tonalite #PB_Compiler_EnumerationValue
  #TO_C
  #TO_Db
  #TO_D
  #TO_Eb
  #TO_E
  #TO_F
  #TO_Gb
  #TO_G
  #TO_Ab
  #TO_A
  #TO_Bb
  #TO_B
EndEnumeration 

; ITEMS DU MENU AIDE
Enumeration Aide #PB_Compiler_EnumerationValue
  #HLP1
  #HLP2
  #HLP3
  #HLP4
  #HLP5
  #HLP6
EndEnumeration 

#FID = #PB_Compiler_EnumerationValue

#T_GR = 16
#T_PL = 16
Structure Plot
  ; Point de coordonnée haut gauche 
  x0.i
  y0.i
  
  ; Point de coordonnée bas droit
  x1.i
  y1.i
  
  ; Le plot est sélectionné (ou pas)
  isSelect.b
EndStructure

; Configuration de la grille 
Global gnbCol = #T_GR ; Nombre de colonnes
Global gnbLig = #T_GR ; Nombre de lignes

; Configuration d'un plot 
Global pInnerSize = #T_PL ; Taille d'un plot
Global pOuterSize = #T_PL+2 ; Dimension exterieur d'un plot
Global pSpace     = 2       ; Espacement avant et aprés le plot 

; Construction du grid
Global Dim Grid.Plot(gnbCol, gnbLig)

Global Tona.b = 0 ; par défaut tonalité Do

Global G_Base.b = 48 ; Par défaut Octave 2

Global T_Gamme.b = 0 ; par défaut Gamme chromatique

Global flag
Global Dim N_T_Gamme.s(8)

; N_T_Gamme(0) = "Chromatique"
; N_T_Gamme(1) = "Diatonique Majeure"
; N_T_Gamme(2) = "Diatonique Mineure"
; N_T_Gamme(3) = "Pentatonique Majeure"
; N_T_Gamme(4) = "Pentatonique Mineure"
; N_T_Gamme(5) = "Blues"
; 
; N_T_Gamme(0) = "Chromatic"
; N_T_Gamme(1) = "Diatonic Major"
; N_T_Gamme(2) = "Diatonic Minor"
; N_T_Gamme(3) = "Pentatonic Major"
; N_T_Gamme(4) = "Pentatonic Minor"
; N_T_Gamme(5) = "Blues"

; Global IDX_LAN = 0, IDX_TON = 0, IDX_GAM = 0, A$
; A$ = #chem2
; 
; If ReadFile(#FID, A$ + "sav") <> 0
;   ReadFile(#FID, A$ + "sav")
;   T_IL = ReadInteger(#FID) ; Index_Lan
;   IDX_LAN = ReadInteger(#FID)
;   IDX_TON = ReadInteger(#FID)
;   IDX_GAM = ReadInteger(#FID)
;   CloseFile(#FID)
;   Debug A$
; Else
;   IDX_LAN = 0
;   IDX_TON = 0
;   IDX_GAM = 0
; EndIf
;Gammes
Global Dim Gchr.b(16)
; Majeure
Global Dim Gmaj.b(16)
; Mineure
Global Dim Gmin.b(16)
; Penta Maj
Global Dim Gpma.b(16)
; Penta min
Global Dim Gpmi.b(16)
; Blues
Global Dim Gblu.b(16)


Global Dim P_Gam.b(16) ; Gamme utilisée au final 

;{ Structure des différentes gammes

Gchr(0) = 0
Gchr(1) = 1
Gchr(2) = 2
Gchr(3) = 3
Gchr(4) = 4 
Gchr(5) = 5
Gchr(6) = 6
Gchr(7) = 7
Gchr(8) = 8
Gchr(9) = 9
Gchr(10) = 10
Gchr(11) = 11
Gchr(12) = 12
Gchr(13) = 13
Gchr(14) = 14
Gchr(15) = 15

Gmaj(0) = 0
Gmaj(1) = 2
Gmaj(2) = 4
Gmaj(3) = 5
Gmaj(4) = 7 
Gmaj(5) = 9
Gmaj(6) = 11
Gmaj(7) = 12
Gmaj(8) = 14
Gmaj(9) = 16
Gmaj(10) = 17
Gmaj(11) = 19
Gmaj(12) = 21
Gmaj(13) = 23
Gmaj(14) = 24
Gmaj(15) = 26

Gmin(0) = 0
Gmin(1) = 2
Gmin(2) = 3
Gmin(3) = 5
Gmin(4) = 7 
Gmin(5) = 8
Gmin(6) = 10
Gmin(7) = 12
Gmin(8) = 14
Gmin(9) = 15
Gmin(10) = 17
Gmin(11) = 19
Gmin(12) = 20
Gmin(13) = 22
Gmin(14) = 24
Gmin(15) = 26

; 
Gpma(0) = 0
Gpma(1) = 2
Gpma(2) = 3
Gpma(3) = 5
Gpma(4) = 7 
Gpma(5) = 8
Gpma(6) = 10
Gpma(7) = 12
Gpma(8) = 14
Gpma(9) = 15
Gpma(10) = 17
Gpma(11) = 19
Gpma(12) = 20
Gpma(13) = 22
Gpma(14) = 24
Gpma(15) = 26

Gpmi(0) = 0
Gpmi(1) = 2
Gpmi(2) = 3
Gpmi(3) = 5
Gpmi(4) = 7 
Gpmi(5) = 8
Gpmi(6) = 10
Gpmi(7) = 12
Gpmi(8) = 14
Gpmi(9) = 15
Gpmi(10) = 17
Gpmi(11) = 19
Gpmi(12) = 20
Gpmi(13) = 22
Gpmi(14) = 24
Gpmi(15) = 26

Gblu(0) = 0
Gblu(1) = 2
Gblu(2) = 3
Gblu(3) = 5
Gblu(4) = 7 
Gblu(5) = 8
Gblu(6) = 10
Gblu(7) = 12
Gblu(8) = 14
Gblu(9) = 15
Gblu(10) = 17
Gblu(11) = 19
Gblu(12) = 20
Gblu(13) = 22
Gblu(14) = 24
Gblu(15) = 26
;}


; Définition des couleurs de plot 
Global PlotColorInactif = RGB(105, 105, 105)
Global PlotColorActif = RGB(245, 245, 245)

;Sommaire




#chemin="E:\PB-DATA\"
#chem2= "E:\! ! ! PureBasic\"

Global IDX_LAN = 0, IDX_TON = 0, IDX_GAM = 0, A$


; Lecture préférences utilisateur.

A$ = #chem2
If ReadFile(#FID, A$ + "sav") <> 0
  ReadFile(#FID, A$ + "sav")

  IDX_LAN = ReadInteger(#FID)
  IDX_TON = ReadInteger(#FID)
  IDX_GAM = ReadInteger(#FID)
  CloseFile(#FID)

Else
  IDX_LAN = 0
  IDX_TON = 0
  IDX_GAM = 0
EndIf
;}


;/// INTERFACE UTILISATEUR (FENETRE, MENU, ETC ...)
#LA_FEN = 1024
#HA_FEN = 768
#CA_SIZE = 20
#GD_SIZE = 16 * (#CA_SIZE + 2) + 2
#GD_YST = (#HA_FEN-#GD_SIZE) / 2
#GD_XST = (#LA_FEN-#GD_SIZE) / 2
#TXT_X = #GD_XST + #GD_SIZE / 2 
#TXT_Y = #GD_YST + #GD_SIZE + 10
#CLEAR = "RESET"


;/// DECLARATION DES VARIABLES

Global event, police, drapeauFR, drapeauUSdrapeauAL, drapeauFR, drapeauUK, drapeauUI, drapeauUO, drapeauFI, drapeauFO, drapeauAI, drapeauAO, Bout_fr, Bout_uk, Bout_al
Global ix, iy, xx, yy, TX_LEN, TX_HA, XF, Event, Lang, Areset, Rst, Rst_w, Xg, Igr, jn, gr, on, ijn, igr, grmax, grmin, bien, B_WID, index.b, Te_Ga, T_Not$,Ty_ton

Global m_hMidiOut.l ; handle du périphérique de sortie MIDI
Global m_MIDIOpen.b ; 1 = périphérique de sortie MIDI ouvert      0 = non ouvert
Global VelocityDown = 127
Global VelocityUp = 50
Global index, instrument, Index
Global Chann.b = 0
Global Inst.b = 80
Global Index_gam.b = 0
Global Index_Ton.b = 0
;/// Déclaration des procédures

Declare DrawGrid()
Declare Exit()
Declare Midi_ChargeInstrument(Canal.b,Instrument.b)
Declare Midi_Mk_Gam()
Declare Midi_Open()
Declare Midi_PlayNote(Canal.b,Note.b,VelociteDown.b,VelociteUp.b)
Declare Midi_SendMessage(nStatus.l,nCanal.l,nData1.l,nData2.l)

Declare Mk_Txt ()
Declare mk_menus ()
Declare onPlot()
Declare Playgrid()
Declare SetLan()
Declare Start()
Declare Bug(a.s)


Global Dim Gdgr(16, 16)
Global Dim IsNote.b(16)


;/////// Ca commence ici

Procedure Midi_Mk_Gam()
  Protected i

  Select IDX_GAM
      
    Case 0:  ; Croma
      For i = 0 To 15
        P_Gam(i) = Gchr(i) + G_Base + IDX_TON
      Next
      
    Case 1: ; Dia Majeure
      For i = 0 To 15
        P_Gam(i) = Gmaj(i) + G_Base + IDX_TON 
      Next  
      
    Case 2: ; Dia Mineure
      For i = 0 To 15
        P_Gam(i) = Gmin(i) + G_Base + IDX_TON 
      Next      
      
    Case 3: ; Penta Maj
      For i = 0 To 15
        P_Gam(i) = Gpma(i) + G_Base + IDX_TON 
      Next      
      
    Case 4: ; Penta Min
      For i = 0 To 15
        P_Gam(i) = Gpmi(i) + G_Base + IDX_TON 
      Next
      
    Case 5: ; Blues
      For i = 0 To 15
        P_Gam(i) = Gblu(i) + G_Base + IDX_TON 
      Next      
      
    Case 6: ; Par ton
      For i = 0 To 15
        P_Gam(i) = Gblu(i) + G_Base + IDX_TON 
                                              
      Next
      
  EndSelect
  ;Bug("Mk_Midi_Gam_2")
  Mk_Txt()
  
EndProcedure

; Ouverture de la fenetre
If OpenWindow(#mf, 0, 0, #LA_FEN, #HA_FEN, "GRID_ZIK",  #PB_Window_ScreenCentered | #PB_Window_TitleBar | #PB_Window_SystemMenu)
  LoadFont(1, "Arial", 18)
  SetGadgetFont(#PB_Default, FontID(1))
  SetWindowColor(#mf, RGB(70, 70, 70))
  ;   SetGadgetColor(Te_Ga, #PB_Gadget_FrontColor , RGB(255, 217, 0))
  Te_Ga = TextGadget(#PB_Any, 25, 25, 300, 38, "") ;) ;, Y, Largeur, Hauteur,
  SetGadgetColor(Te_Ga, #PB_Gadget_FrontColor , RGB(255, 217, 0))
  SetGadgetColor(Te_Ga, #PB_Gadget_BackColor , RGB(70, 70, 70))
  
  SetWindowColor(#mf, RGB(70, 70, 70))
  AddWindowTimer(#mf, 200, 500)
  BindEvent(#PB_Event_Timer,@Playgrid(),#mf)
  
  Midi_Mk_Gam( ) ;Index_gam, Index_Ton) ; crée la gamme à utiliser par défaut : chromatique en Do
  Midi_Open()
  Midi_ChargeInstrument(Chann,Inst)
 ; AddWindowTimer(#mf, 200, 400)
  
  Start()
  UseJPEGImageDecoder()
  
  ; Gestion de la langue
  
  CanvasGadget(#drapeauFR, #LA_FEN-3*48, 20, 46, 33, 0)
  CanvasGadget(#drapeauUS, #LA_FEN-2*48, 20, 46, 33, 0)
  CanvasGadget(#drapeauGE, #LA_FEN-48, 20, 46, 33, 0)
  

  
  bien = CatchImage(#PB_Any, ?bienv)
  ResizeImage(bien, #GD_SIZE, #GD_SIZE) 
  B_WID = (#LA_FEN-ImageWidth(bien))/2
  drapeauFI = CatchImage(#PB_Any, ?drapeauFI)
  drapeauUO = CatchImage(#PB_Any, ?drapeauUO)
  drapeauAO = CatchImage(#PB_Any, ?drapeauAO)
  drapeauFO = CatchImage(#PB_Any, ?drapeauFO)
  drapeauUI = CatchImage(#PB_Any, ?drapeauUI)
  drapeauAI = CatchImage(#PB_Any, ?drapeauAI)
  ijn = CatchImage(#PB_Any, ?jn)
  igr = CatchImage(#PB_Any, ?gr)
  Rst = CatchImage(#PB_Any, ?Areset)
  Rst_w=ImageWidth(Rst)
  
  

  mk_menus()

  DrawGrid()

  
  
  
  SetLan()
  
  
  ; Mémorisation des dimensions du reset
  
  TX_LEN = Rst_W
  TX_HA = ImageHeight(Rst)
  StopDrawing() 
  
  ButtonImageGadget(#reset, (#LA_FEN-TX_LEN)/2, (#HA_FEN+#GD_SIZE)/2 + 20, TX_LEN, TX_HA, ImageID(Rst)) 
  

  ;{  ; Gestion des événements
  
  Repeat
    
    Event = WaitWindowEvent() 
                              
    If Event = #PB_EventType_LeftClick 

    EndIf
    
    Select Event
      Case #PB_Event_Gadget
        If EventGadget() >= grmin And EventGadget() <= grmax
          For ix = 0 To 15
            For iy = 0 To 15
              If gdgr(ix, iy) = EventGadget()
                A$ = " x "+ Str(ix) + " y " + Str(iy)+ "  " + Str(EventGadget())
                
              EndIf
            Next
          Next
        EndIf
        Select EventGadget()
            
          Case #drapeauFR
            
            If EventType() = #PB_EventType_LeftClick
              IDX_LAN = 0
              mk_menus()
              SetLan()
              Mk_Txt()
            EndIf
          Case #drapeauUS
            
            If EventType() = #PB_EventType_LeftClick
              IDX_LAN = 1
              mk_menus()
              SetLan()
              Mk_Txt()
            EndIf          
          Case #drapeauGE
            
            If EventType() = #PB_EventType_LeftClick
              IDX_LAN = 2
              mk_menus()
              SetLan()
              Mk_Txt()
            EndIf 
          Case #reset ; remet la grille à 0
            
            DrawGrid()
            
            
        EndSelect
      Case #PB_Event_Menu
        Select EventMenu()
          Case #GA_CHR  
      
            IDX_GAM = 0
            
            Midi_Mk_Gam() ;IDX_GAM, Index_Ton)
          Case #GA_DIAMA 
   
            IDX_GAM = 1
            Midi_Mk_Gam() ;IDX_GAM, Index_Ton)
          Case #GA_DIAMI  
      
            IDX_GAM = 2
            Midi_Mk_Gam();IDX_GAM, Index_Ton)
          Case #GA_PMA  
      
            IDX_GAM = 3
            Midi_Mk_Gam() ;IDX_GAM, Index_Ton)
          Case #GA_PMI  
         
            IDX_GAM = 4
            Midi_Mk_Gam() ;IDX_GAM, Index_Ton)
            
            ; Menu tonalié      
          Case #TO_C  
            IDX_TON = 0
    
            
            Midi_Mk_Gam();Index_gam, Index_Ton)
          Case #TO_Db            
            IDX_TON = 1
         
            
            Midi_Mk_Gam() ;Index_gam, Index_Ton)
          Case #TO_D   
            IDX_TON = 2
   
            
            Midi_Mk_Gam();Index_gam, Index_Ton)
          Case #TO_Eb 
            IDX_TON = 3
     
            
            Midi_Mk_Gam();Index_gam, Index_Ton)
          Case #TO_E
            IDX_TON = 4
        
            
            Midi_Mk_Gam();Index_gam, Index_Ton)
          Case #TO_F  
            IDX_TON = 5
          
            
            Midi_Mk_Gam(); Index_gam, Index_Ton)
          Case #TO_Gb
            IDX_TON = 6
    
            Midi_Mk_Gam(); Index_gam, Index_Ton)
          Case #TO_G 
            IDX_TON = 7
       
            Midi_Mk_Gam(); Index_gam, Index_Ton)
          Case #TO_Ab
            IDX_TON = 8
        
            Midi_Mk_Gam() ;Index_gam, Index_Ton)
          Case #TO_A 
            IDX_TON = 9
            
            Midi_Mk_Gam(); Index_gam, Index_Ton)
          Case #TO_Bb 
            IDX_TON = 10
            
            Midi_Mk_Gam();Index_gam, Index_Ton)
          Case #TO_B 
            IDX_TON = 11
            
            Midi_Mk_Gam(); Index_gam, Index_Ton)
        EndSelect
        
      Default
  
    EndSelect
    
    
  Until Event = #PB_Event_CloseWindow
EndIf ;}



;- Procédures

Procedure Midi_SendMessage(nStatus.l,nCanal.l,nData1.l,nData2.l)
  Protected dwFlags.l = nStatus | nCanal | (nData1 << 8) | (nData2 << 16)
  Protected temp.l = midiOutShortMsg_(m_hMidiOut,dwFlags);
  dwFlags.l = nStatus | nCanal | (nData1 << 8) | (nData2 << 16)
  temp.l = midiOutShortMsg_(m_hMidiOut,dwFlags);
  If temp<>0 
    ;MessageRequester("Problème", "Erreur dans l'envoi du message MIDI",0)
  EndIf
EndProcedure
;-----------------------------------------------------------------------------------------------------------
Procedure Midi_Open()
  If m_MIDIOpen = 0
    If midiOutOpen_(@m_hMidiOut,0,0,0,0) <> 0 
      ;MessageRequester("Problème", "Impossible d'ouvrir le périphérique MIDI",0)
    Else
      Midi_SendMessage($c0,0,0,0)
      ;      Midi_SendMessage($B1 ,0,75,0)
      m_MIDIOpen = 1
    EndIf
  EndIf
EndProcedure
;-----------------------------------------------------------------------------------------------------------
Procedure Midi_PlayNote(Canal.b,Note.b,VelociteDown.b,VelociteUp.b)
  If m_MIDIOpen = 0
    Midi_Open()
  EndIf
  If m_MIDIOpen = 1
    Midi_SendMessage($80 | Canal,0,Note,VelociteDown)
    Midi_SendMessage($90 | Canal,0,Note,VelociteUp)
  EndIf          
EndProcedure
;-----------------------------------------------------------------------------------------------------------
Procedure Midi_ChargeInstrument(Canal.b,Instrument.b)
  If m_MIDIOpen = 0
    Midi_Open()
  EndIf
  If m_MIDIOpen = 1
    Midi_SendMessage($c0 | Canal,0,Instrument,0)
  EndIf          
EndProcedure





Procedure mk_menus ()
  Select IDX_LAN
    Case 1
      CreateMenu(#ME_GAM, WindowID(0)) 
      
      ; MENU GAMME
      MenuTitle("Scale")
      MenuItem(#GA_CHR, "Chromatic Scale")
      MenuItem(#GA_DIAMA, "Major Diatonic Scale")
      MenuItem(#GA_DIAMI, "Minor Diatonic Scale")
      MenuItem(#GA_PMA, "Major Pentatonic Scale")
      MenuItem(#GA_PMI , "Minor Pentatonic Scale")
      
      ; MENU TONALITÉ de DO à SI Par demis-tons
      MenuTitle("Key")
      MenuItem(#TO_C, "C")
      MenuItem(#TO_Db, "C#")
      MenuItem(#TO_D, "D")
      MenuItem(#TO_Eb, "Eb")
      MenuItem(#TO_E, "E")
      MenuItem(#TO_F, "F")
      MenuItem(#TO_Gb, "F#")
      MenuItem(#TO_G, "G")
      MenuItem(#TO_Ab, "Ab")
      MenuItem(#TO_A, "A")
      MenuItem(#TO_Bb, "Bb")
      MenuItem(#TO_B, "B")
      
      MenuTitle("?")
      MenuItem(#HLP1, "Rules")
      MenuItem(#HLP2, "Rules")
      MenuItem(#HLP3, "Rules")
      MenuItem(#HLP4, "Rules")
      MenuItem(#HLP5, "Rules")
      
    Case 0
      CreateMenu(#ME_GAM, WindowID(0))  
      
      ; MENU GAMME
      MenuTitle("Gamme")
      MenuItem(#GA_CHR, "Gamme Chromatique")
      MenuItem(#GA_DIAMA, "Gamme Diatonique Majeure")
      MenuItem(#GA_DIAMI, "Gamme Diatonique Mineure")
      MenuItem(#GA_PMA, "Gamme Pentatonique Majeure")
      MenuItem(#GA_PMI , "Gamme Pentatonique Mineure")
      
      ; MENU TONALITÉ de DO à SI Par demis-tons
      MenuTitle("Tonalité")
      MenuItem(#TO_C, "Do")
      MenuItem(#TO_Db, "Do#")
      MenuItem(#TO_D, "Ré")
      MenuItem(#TO_Eb, "Mib")
      MenuItem(#TO_E, "Mi")
      MenuItem(#TO_F, "Fa")
      MenuItem(#TO_Gb, "Fa#")
      MenuItem(#TO_G, "Sol")
      MenuItem(#TO_Ab, "Lab")
      MenuItem(#TO_A, "La")
      MenuItem(#TO_Bb, "Sib")
      MenuItem(#TO_B, "Si")
      
      ; MENU AIDE
      MenuTitle("?")
      MenuItem(#HLP1, "Rules")
      MenuItem(#HLP2, "Rules")
      
    Case 2
      CreateMenu(#ME_GAM, WindowID(0))  
      
      ; MENU GAMME
      MenuTitle("Tonleiter")
      MenuItem(#GA_CHR, "Chromatische Tonleiter")
      MenuItem(#GA_DIAMA, "Diatonique Dur-Tonleiter")
      MenuItem(#GA_DIAMI, "Diatonique Moll-Tonleiter")
      MenuItem(#GA_PMA, "Pentatonische Dur-Tonleiter")
      MenuItem(#GA_PMI , "Pentatonische Moll-Tonleiter")
      
      ; MENU TONALITÉ de DO à SI Par demis-tons
      MenuTitle("Tonart")
      MenuItem(#TO_C, "C")
      MenuItem(#TO_Db, "C#")
      MenuItem(#TO_D, "D")
      MenuItem(#TO_Eb, "Eb")
      MenuItem(#TO_E, "E")
      MenuItem(#TO_F, "F")
      MenuItem(#TO_Gb, "F#")
      MenuItem(#TO_G, "G")
      MenuItem(#TO_Ab, "Ab")
      MenuItem(#TO_A, "A")
      MenuItem(#TO_Bb, "Bb")
      MenuItem(#TO_B, "B")
      
      ; MENU AIDE
      MenuTitle("?")
      MenuItem(#HLP1, "Rules")
      MenuItem(#HLP1, "Rules")
      MenuItem(#HLP2, "Rules")
  EndSelect
  ;Bug("mk_menus")
  ; Mk_Txt()
EndProcedure
;
;
;
Procedure onPlot()
  ; Parcours de la grille de plots
  Protected x, y
  
  ; Position x y de la souris 
  Protected px = GetGadgetAttribute(#mfGrid, #PB_Canvas_MouseX)
  Protected py = GetGadgetAttribute(#mfGrid, #PB_Canvas_MouseY)
  
  ; Plot en cours de traitement
  Static PreviousPlot.i
  
  ; Action a effectuer 0 (Aucune, 1 : Selection, 2 : Déselection)
  Static CurrentAction.i
  
  ; La Souris est sur la grille : Affichage de la main
  If EventType() = #PB_EventType_MouseEnter
    SetGadgetAttribute(#mfGrid, #PB_Canvas_Cursor, #PB_Cursor_Hand) 
  EndIf
  
  ; 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)
    StartDrawing(CanvasOutput(#mfGrid))  
    ; Parcours de la grille 
    For x = 0 To gnbCol - 1
      ;       A$ = "X= "+Str(x)
      ;       Debug A$
      For y = 0 To gnbLig - 1
        With Grid(x,y)
          
          ; Le surseur de la souris est sur un plot
          ; Ce nouveau plot doit etre différent du précédent 
          If (px > \x0 And py> \y0 And px < \x1 And py < \y1) And (Grid(x,y) <> PreviousPlot) 
            
            ; C'est un nouveau plot. Mémorisation du plot en cours
            PreviousPlot = Grid(x,y)
            
            ; Action à effectuer 
            ; 0 : On ne sait pas encore
            ; 1 : Le plot sera sélectionné
            ; 2 : Le plot sera déselectionné
            If CurrentAction = 0 
              If \isSelect = #False  
                CurrentAction = 1
              Else
                CurrentAction = 2
              EndIf
            EndIf
            
            If CurrentAction = 1
              
              Box(\x0 + pSpace, \y0 + pSpace, pInnerSize, pInnerSize, PlotColorActif)
              
              \isSelect = #True
            EndIf  
            If CurrentAction = 2
              
              Box(\x0 + pSpace, \y0 + pSpace, pInnerSize, pInnerSize, PlotColorInactif)
              
              \isSelect = #False
            EndIf  
          EndIf

        EndWith
      Next 
     
    Next 
    ;Delay(200)
    StopDrawing()
  EndIf
  ;Delay(250)
  ; Le bouton gauche de la souris est relaché
  If EventType() = #PB_EventType_LeftButtonUp 
    PreviousPlot = #False  
    CurrentAction = 0
  EndIf 
  ; Delay(250)
EndProcedure

Procedure SetLan()
  Select IDX_LAN ;
    Case 0
      SetGadgetAttribute(#drapeauFR, #PB_Button_Image, ImageID(drapeauFI))
      SetGadgetAttribute(#drapeauUS, #PB_Button_Image, ImageID(drapeauUO))
      SetGadgetAttribute(#drapeauGE, #PB_Button_Image, ImageID(drapeauAO))
      
    Case 1 ;#ANG
      SetGadgetAttribute(#drapeauFR, #PB_Button_Image, ImageID(drapeauFO))
      SetGadgetAttribute(#drapeauUS, #PB_Button_Image, ImageID(drapeauUI))
      SetGadgetAttribute(#drapeauGE, #PB_Button_Image, ImageID(drapeauAO))
      
    Case 2, #ALL
      SetGadgetAttribute(#drapeauFR, #PB_Button_Image, ImageID(drapeauFO))
      SetGadgetAttribute(#drapeauUS, #PB_Button_Image, ImageID(drapeauUO))
      SetGadgetAttribute(#drapeauGE, #PB_Button_Image, ImageID(drapeauAI))
  EndSelect
  Mk_Txt()
  ;Bug("Setlan")
EndProcedure

Procedure Playgrid()
  
  Static col, row, sw = 0
  Protected i, j
  
  If sw < 1
    Debug col
    For row = 0 To 15
      With Grid(col,row)
        If \isSelect
          Midi_PlayNote(Chann, P_Gam(15-row),VelocityDown,VelocityUp) 
        EndIf
      EndWith
      
    Next
    col = col +1
    If col > 15
      col = 0
      sw = 1
      
    EndIf
  Else
    For row = 0 To 15
    Next
    col = col +1
    If col > 15
      col = 0
      sw = 0
      
    EndIf
    
  EndIf
  
EndProcedure
  
  
  Procedure DrawGrid()
    ; Création de la grille de plots
    Protected x, y
    
    ; Fond du grid
    StartDrawing(CanvasOutput(#mfGrid))
    Box(0, 0, gnbCol*pOuterSize, gnbLig*pOuterSize, RGB(0, 0, 0))
    
    ; Dessin des plots
    For x = 0 To gnbCol - 1
      For y = 0 To gnbLig -1
        With Grid(x,y)
          \x0 = x*pOuterSize
          \y0 = y*pOuterSize
          \x1 = \x0 + pInnerSize
          \y1 = \y0 + pInnerSize      
          \isSelect = #False
          Box( \x0 + pSpace, \y0 + pSpace, pInnerSize, pInnerSize, PlotColorInactif)
        EndWith 
      Next
    Next
    StopDrawing()
    
  EndProcedure
  
  ; Un plot est sélectionné 
  ; - On passe dessus avec le clic gauche de la souris préssé
  ; - Quand on le clic 
  
  
  
  ; Parcours de la grille de plots
  
  ;
  ;
  ;
  Procedure CreRst()
    
    If CreateImage(1, TX_LEN, TX_HA ) And StartDrawing(ImageOutput(1)) 
      ; Affichage du bouton reset
      ButtonImageGadget(#reset, (gnbCol*pOuterSize/4-TX_LEN)/200, (#HA_FEN+#GD_SIZE)/2+50, TX_LEN, TX_HA, Rst)
    EndIf
  EndProcedure
  
  Procedure Exit()
    Protected r
    A$ = #chem2
    
    r = CreateFile(#FID, A$ + "sav") ; <> 0 ; Sauvegarde Paramètres utilisateur.
    
    If r <>0
      WriteInteger(#FID, IDX_LAN )
      WriteInteger(#FID, IDX_TON)
      WriteInteger(#FID, IDX_GAM)
      ;    WriteInteger(#FID, Index_Men)
      CloseFile(#FID)
    EndIf
    End
  EndProcedure 
  
  Procedure Start()
    ; Dimension fenetre
    Protected ww = 1022
    Protected wh = 750
    
    ; Marge haute et gauche de la grille
    Protected MarginLeft = (ww - (gnbCol*pOuterSize))/2, MarginTop = (wh - (gnbLig*pOuterSize))/2 
    
    ; Installation de la grille 
    CanvasGadget(#mfGrid, MarginLeft, MarginTop, gnbCol*pOuterSize, gnbLig*pOuterSize, #PB_Canvas_ClipMouse)
    BindGadgetEvent(#mfGrid, @onPlot())
    ;  DrawGrid()
    
    ; Déclencheurs
    ; BindGadgetEvent(#mfGrid, @onPlot())
    BindEvent(#PB_Event_CloseWindow, @Exit())
    

  EndProcedure
  
  Procedure Mk_Txt ()

    Protected t_gm$
    
    Select IDX_LAN
      Case 0
        N_T_Gamme(0) = "Chromatique"
        N_T_Gamme(1) = "Majeur"
        N_T_Gamme(2) = "Mineur"
        N_T_Gamme(3) = "Maj. Penta."
        N_T_Gamme(4) = "Min. Penta."
        N_T_Gamme(5) = "Blues"
        
        Select IDX_TON
          Case 0
            T_Not$ = "Do"
          Case 1
            T_Not$ = "Do#"
          Case 2
            T_Not$ = "Ré"
          Case 3
            T_Not$ = "Mib"
            T_Not$ = "Do"
          Case 1
            T_Not$ = "Do#"
          Case 2
            T_Not$ = "Ré"
          Case 3
            T_Not$ = "Mib"            
          Case 4
            T_Not$ = "Mi"
          Case 5
            T_Not$ = "Fa"
          Case 6
            T_Not$ = "Fa#"
          Case 7
            T_Not$ = "Sol"   
          Case 8
            T_Not$ = "Lab"
            Case 9
            T_Not$ = "La"
          Case 10
            T_Not$ = "Sib"
          Case 11
            T_Not$ = "Si"
        EndSelect
        
      Case 1
        
        
        N_T_Gamme(0) = "Chromatic"
        N_T_Gamme(1) = "Major"
        N_T_Gamme(2) = "Minor"
        N_T_Gamme(3) = "Maj. Penta."
        N_T_Gamme(4) = "Min. Penta."
        N_T_Gamme(5) = "Blues"
        
        
        
        Select IDX_TON
          Case 0
            T_Not$ = "C"
          Case 1
            T_Not$ = "C#"   
          Case 2
            T_Not$ = "D"
          Case 3
            T_Not$ = "Eb"           
          Case 4
            T_Not$ = "E"
          Case 5
            T_Not$ = "F"   
          Case 6
            T_Not$ = "F#"
          Case 7
            T_Not$ = "G"
          Case 8
            T_Not$ = "Ab"      
          Case 9
            T_Not$ = "A"
          Case 10
            T_Not$ = "Bb"
          Case 11
            T_Not$ = "B"
        EndSelect
        
        
      Case 2
        
        N_T_Gamme(0) = "Chromatic"
        N_T_Gamme(1) = "Major"
        N_T_Gamme(2) = "Minor"
        N_T_Gamme(3) = "Maj. Penta."
        N_T_Gamme(4) = "Min. Penta."
        N_T_Gamme(5) = "Blues"
        
        Select IDX_TON
          Case 0
            T_Not$ = "C"
          Case 1
            T_Not$ = "C#"   
          Case 2
            T_Not$ = "D"
          Case 3
            T_Not$ = "Eb"           
          Case 4
            T_Not$ = "E"
          Case 5
            T_Not$ = "F"   
          Case 6
            T_Not$ = "F#"
          Case 7
            T_Not$ = "G"
          Case 8
            T_Not$ = "Ab"      
          Case 9
            T_Not$ = "A"
          Case 10
            T_Not$ = "Bb"
          Case 11
            T_Not$ = "B"
        EndSelect
        
        
    EndSelect
    t_Gm$ = T_Not$ + " " + N_T_Gamme(IDX_GAM) 
    SetGadgetText(Te_Ga, t_Gm$)

  EndProcedure
  
  Procedure Bug(A$)
    ; Protected B$
    ; B$ = A$+"  IDX_LAN " + Str(IDX_LAN)+ " IDX_GAM "+Str(IDX_GAM)+" IDX_TON "+Str(IDX_TON)
    ; Debug B$
    ; Delay(1000)
  EndProcedure
  
  
  DataSection
    drapeauFR:
    IncludeBinary #chemin+"DF.jpg"
    
    drapeauUK:
    IncludeBinary #chemin+"DG.jpg"
    
    drapeauAL:
    IncludeBinary #chemin+"DA.jpg"
    
    drapeauUI:
    IncludeBinary #chemin+"DUI.jpg"
    
    drapeauUO:
    IncludeBinary #chemin+"DUO.jpg"
    
    drapeauFI:
    IncludeBinary #chemin+"DFI.jpg"
    
    drapeauFO:
    IncludeBinary #chemin+"DFO.jpg"
    
    drapeauAI:
    IncludeBinary #chemin+"DAI.jpg"
    
    drapeauAO:
    IncludeBinary #chemin+"DAO.jpg"
    
    Areset:
    IncludeBinary #chemin+"Reset.jpg"
    
    jn:
    IncludeBinary #chemin+"jaune.jpg"
    
    gr:
    IncludeBinary #chemin+"gris.jpg"
    
    bienv:
    IncludeBinary #chemin+"Bienvenue.jpg"
    
    
  EndDataSection

Tu y reconnaitras beaucoup de ce que tu m'avais aimablement donné et dont je te remercie !

À tout hasard les jpg nécessaires pour recompiler sont là :

https://drive.google.com/drive/folders/ ... sp=sharing

.
.
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: Problème avec la Priorité d'Event

Message par TazNormand »

Salut

réponse à l'arrache car n'ayant pas tes include, je ne peux pas tester et j'ai la flemme (et le manque de temps) de changer par d'autres images :

as-tu essayé de remplacer waitwindowevent() par windowevent() car je cite la doc :
Description

Attend qu'un nouvel évènement se produise.

Cette fonction est identique à WindowEvent(), mais en plus, elle bloque l'exécution du programme, ce qui est très important dans un environnement multi-tâches.
Image
Image
Stan_fr
Messages : 84
Inscription : mar. 07/mars/2023 20:01
Localisation : NANTES

Re: Problème avec la Priorité d'Event

Message par Stan_fr »

TazNormand a écrit : ven. 07/avr./2023 17:38 Salut

réponse à l'arrache car n'ayant pas tes include, je ne peux pas tester et j'ai la flemme (et le manque de temps) de changer par d'autres images :

as-tu essayé de remplacer waitwindowevent() par windowevent() car je cite la doc :
Description

Attend qu'un nouvel évènement se produise.

Cette fonction est identique à WindowEvent(), mais en plus, elle bloque l'exécution du programme, ce qui est très important dans un environnement multi-tâches.
Salut,

Merci, mais ça ne change rien !

Toutes les images sont là :

https://drive.google.com/drive/folders/ ... share_link

Il suffit de les charger dans un répertoire et modifier #chemin #Chem2 en fonction de ce dossier pour que ça se compile.
.
nemerod
Messages : 40
Inscription : mer. 24/août/2022 0:58

Re: Problème avec la Priorité d'Event

Message par nemerod »

si tu veux un programme qui tien tres bien le timer, c'est de passé par un thread qui fera uniquement la gestion du timer et qui drop la valeur dans une variable global, cela te fera deja ton timer et a partir de se point, tu peu avoir sois un post event qui sera traité normalement mais qui aura au moins plus de priorité que les timer de base de purebasic
OU sinon tu peu te faire un thread dédié a la gestion, car si a un moment ton programme a visuellement un truc qui prendre du temps, ton séquenceur va avoir des freeze
donc si tu peu avoir ton propre thread qui ne fais aucun gestion visuel mais fais tout la gestion de ta grille et juste la grille tu aura dans un premier temps une stabilité minimum mais une priorité maximal (car si la boucle prendre un peu trop de temps car une fonction a demandé plus de temps que la normal, tu va avoir du temps en trop)

je te conseil de te tourné du coté des thread pour avoir ta propre gestion de timer

cela devrai t'aidé pour viré les timer de base de purebasic :)

Code : Tout sélectionner

PostEvent(#le_nom_que_tu_veux_pour_ton_event_constant, valeur_1, valeur_2, valeur_3, valeur_4)
du coté des event tu peu prendre les valeur de 1 a 4 avec les fonction suivant :)

Code : Tout sélectionner

EventWindow();contien ta valeur 1
EventGadget();contien ta valeur 2
EventType();contien ta valeur 3
EventData();contien ta valeur 4
tu peu donné TOUT valeur meme si c'est pas un windows ID valide ou autre, quant c'est un event personnalisé, les 4 fonction que je tes listé, pourrais juste avoir le nom de EventData1 a EventData4, que le truc s'en fou, se n'est que des nom :)

pour le numero de l'event, prendre des precaution pour ne pas posé de probleme avec les valeur interne si tu veux suivre le conseil de purebasic
donc ton event doit avoir la valeur de #PB_Event_FirstCustomValue ensuit tu est libre de faire + le_chiffre_que_tu_veux

se qui fera
#le_nom_que_tu_veux_pour_ton_event_constant = #PB_Event_FirstCustomValue + le_chiffre_que_tu_veux
Stan_fr
Messages : 84
Inscription : mar. 07/mars/2023 20:01
Localisation : NANTES

Re: Problème avec la Priorité d'Event

Message par Stan_fr »

Merci pour ces suggestions qui pourront me servir dans d'autres circonstances.

Là j'avais fait une erreur de logique, j'ai rectifié et ça marche parfaitement :il me reste à écrire l'aide, peut-être rajouter des gammes, l'exécutable est là :

https://drive.google.com/file/d/1PxF_I0 ... sp=sharing

Pour les téméraires tentés d'essayer : en cliquant sur la grille on active ou déactive des "plots" et quand la grille est parcourue, les plots actifs font jouer une note, avec l'instrument choisi en utilisant la gamme et la tonalité choisies.

En sortant les réglages sont sauvegardé dans un fichier : "sav_GRID_ziq" dans le même répertoire que l'exécutable.

Par contre il semblerait que le synthé logiciel de Windows, ne reconnaisse pas le contrôle de volume par canal (CC 7) ?

.
Stan_fr
Messages : 84
Inscription : mar. 07/mars/2023 20:01
Localisation : NANTES

Re: Problème avec la Priorité d'Event

Message par Stan_fr »

Le volume marche, banane... :roll:
Répondre