Il est MIDI 😉

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

Il est MIDI 😉

Message par Stan_fr »

Dans un souci d'aider les gens intéressés par le MIDI, j'ai voulu récapituler dans des tableaux les différents instruments de la norme GM et faire une programme de démonstration, montrant les différents noms d'instruments, or ceux-ci ne s'affichent pas toujours correctement sans que j'arrive à trouver pourquoi ? (Comme le tableau a été créé avec LibreOffice j'ai passé le tableau dans LibreOffice writer : il ne semble pas y avoir de caractère non affiché...).

Code : Tout sélectionner

EnableExplicit 

; Nom des instruments GENERAL MIDI : un changement d'instrument SUR UN CANAL 
; AUTRE QUE LE 10, fera jouer ce son sur la canal pour les notes suivantes.

Global Dim MIDI_Instrument$(129)

MIDI_Instrument$ (0) = "Acoustic Grand Piano"
MIDI_Instrument$ (1) = "Bright Acoustic Piano"
MIDI_Instrument$ (2) = "Electric Grand Piano"
MIDI_Instrument$ (3) = "Honky-tonk Piano"
MIDI_Instrument$ (4) = "Electric Piano 1"
MIDI_Instrument$ (5) = "Electric Piano 2"
MIDI_Instrument$ (6) = "Harpsichord"
MIDI_Instrument$ (7) = "Clavi"
MIDI_Instrument$ (8) = "Celesta"
MIDI_Instrument$ (9) = "Glockenspiel"
MIDI_Instrument$ (10) = "Music Box"
MIDI_Instrument$ (11) = "Vibraphone"
MIDI_Instrument$ (12) = "Marimba"
MIDI_Instrument$ (13) = "Xylophone"
MIDI_Instrument$ (14) = "Tubular Bells"
MIDI_Instrument$ (15) = "Dulcimer"
MIDI_Instrument$ (16) = "Drawbar Organ"
MIDI_Instrument$ (17) = "Percussive Organ"
MIDI_Instrument$ (18) = "Rock Organ"
MIDI_Instrument$ (19) = "Church Organ"
MIDI_Instrument$ (20) = "Reed Organ"
MIDI_Instrument$ (21) = "Accordion"
MIDI_Instrument$ (22) = "Harmonica"
MIDI_Instrument$ (23) = "Tango Accordion"
MIDI_Instrument$ (24) = "Acoustic Guitar (nylon)"
MIDI_Instrument$ (25) = "Acoustic Guitar (steel)"
MIDI_Instrument$ (26) = "Electric Guitar (jazz)"
MIDI_Instrument$ (27) = "Electric Guitar (clean)"
MIDI_Instrument$ (28) = "Electric Guitar (muted)"
MIDI_Instrument$ (29) = "Overdriven Guitar"
MIDI_Instrument$ (30) = "Distortion Guitar"
MIDI_Instrument$ (31) = "Guitar harmonics"
MIDI_Instrument$ (32) = "Acoustic Bass"
MIDI_Instrument$ (33) = "Electric Bass (finger)"
MIDI_Instrument$ (34) = "Electric Bass (pick)"
MIDI_Instrument$ (35) = "Fretless Bass"
MIDI_Instrument$ (36) = "Slap Bass 1"
MIDI_Instrument$ (37) = "Slap Bass 2"
MIDI_Instrument$ (38) = "Synth Bass 1"
MIDI_Instrument$ (39) = "Synth Bass 2"
MIDI_Instrument$ (40) = "Violin"
MIDI_Instrument$ (41) = "Viola"
MIDI_Instrument$ (42) = "Cello"
MIDI_Instrument$ (43) = "Contrabass"
MIDI_Instrument$ (44) = "Tremolo Strings"
MIDI_Instrument$ (45) = "Pizzicato Strings"
MIDI_Instrument$ (46) = "Orchestral Harp"
MIDI_Instrument$ (47) = "Timpani"
MIDI_Instrument$ (48) = "String Ensemble 1"
MIDI_Instrument$ (49) = "String Ensemble 2"
MIDI_Instrument$ (50) = "SynthStrings 1"
MIDI_Instrument$ (51) = "SynthStrings 2"
MIDI_Instrument$ (52) = "Choir Aahs"
MIDI_Instrument$ (53) = "Voice Oohs"
MIDI_Instrument$ (54) = "Synth Voice"
MIDI_Instrument$ (55) = "Orchestra Hit"
MIDI_Instrument$ (56) = "Trumpet"
MIDI_Instrument$ (57) = "Trombone"
MIDI_Instrument$ (58) = "Tuba"
MIDI_Instrument$ (59) = "Muted Trumpet"
MIDI_Instrument$ (60) = "French Horn"
MIDI_Instrument$ (61) = "Brass Section"
MIDI_Instrument$ (62) = "SynthBrass 1"
MIDI_Instrument$ (63) = "SynthBrass 2"
MIDI_Instrument$ (64) = "Soprano Sax"
MIDI_Instrument$ (65) = "Alto Sax"
MIDI_Instrument$ (66) = "Tenor Sax"
MIDI_Instrument$ (67) = "Baritone Sax"
MIDI_Instrument$ (68) = "Oboe"
MIDI_Instrument$ (69) = "English Horn"
MIDI_Instrument$ (70) = "Bassoon"
MIDI_Instrument$ (71) = "Clarinet"
MIDI_Instrument$ (72) = "Piccolo"
MIDI_Instrument$ (73) = "Flute"
MIDI_Instrument$ (74) = "Recorder"
MIDI_Instrument$ (75) = "Pan Flute"
MIDI_Instrument$ (76) = "Blown Bottle"
MIDI_Instrument$ (77) = "Shakuhachi"
MIDI_Instrument$ (78) = "Whistle"
MIDI_Instrument$ (79) = "Ocarina"
MIDI_Instrument$ (80) = "Lead 1 (square)"
MIDI_Instrument$ (81) = "Lead 2 (sawtooth)"
MIDI_Instrument$ (82) = "Lead 3 (calliope)"
MIDI_Instrument$ (83) = "Lead 4 (chiff)"
MIDI_Instrument$ (84) = "Lead 5 (charang)"
MIDI_Instrument$ (85) = "Lead 6 (voice)"
MIDI_Instrument$ (86) = "Lead 7 (fifths)"
MIDI_Instrument$ (87) = "Lead 8 (bass + lead)"
MIDI_Instrument$ (88) = "Pad 1 (new age)"
MIDI_Instrument$ (89) = "Pad 2 (warm)"
MIDI_Instrument$ (90) = "Pad 3 (polysynth)"
MIDI_Instrument$ (91) = "Pad 4 (choir)"
MIDI_Instrument$ (92) = "Pad 5 (bowed)"
MIDI_Instrument$ (93) = "Pad 6 (metallic)"
MIDI_Instrument$ (94) = "Pad 7 (halo)"
MIDI_Instrument$ (95) = "Pad 8 (sweep)"
MIDI_Instrument$ (96) = "FX 1 (rain)"
MIDI_Instrument$ (97) = "FX 2 (soundtrack)"
MIDI_Instrument$ (98) = "FX 3 (crystal)"
MIDI_Instrument$ (99) = "FX 4 (atmosphere)"
MIDI_Instrument$ (100) = "FX 5 (brightness)"
MIDI_Instrument$ (101) = "FX 6 (goblins)"
MIDI_Instrument$ (102) = "FX 7 (echoes)"
MIDI_Instrument$ (103) = "FX 8 (sci-fi)"
MIDI_Instrument$ (104) = "Sitar"
MIDI_Instrument$ (105) = "Banjo"
MIDI_Instrument$ (106) = "Shamisen"
MIDI_Instrument$ (107) = "Koto"
MIDI_Instrument$ (108) = "Kalimba"
MIDI_Instrument$ (109) = "Bag pipe"
MIDI_Instrument$ (110) = "Fiddle"
MIDI_Instrument$ (111) = "Shanai"
MIDI_Instrument$ (112) = "Tinkle Bell"
MIDI_Instrument$ (113) = "Agogo"
MIDI_Instrument$ (114) = "Steel Drums"
MIDI_Instrument$ (115) = "Woodblock"
MIDI_Instrument$ (116) = "Taiko Drum"
MIDI_Instrument$ (117) = "Melodic Tom"
MIDI_Instrument$ (118) = "Synth Drum"
MIDI_Instrument$ (119) = "Reverse Cymbal"
MIDI_Instrument$ (120) = "Guitar Fret Noise"
MIDI_Instrument$ (121) = "Breath Noise"
MIDI_Instrument$ (122) = "Seashore"
MIDI_Instrument$ (123) = "Bird Tweet"
MIDI_Instrument$ (124) = "Telephone Ring"
MIDI_Instrument$ (125) = "Helicopter"
MIDI_Instrument$ (126) = "Applause"
MIDI_Instrument$ (127) = "Gunshot"



; Percussions MIDI : la c'est différent : jouer SUR LE CANAL 10 la note 35 : 
; fera entendre un coup d'Acoustic Bass Drum, la note 36 un coup de Bass Drum 1, etc.
; enfin ça devrait, parce que ça ne marche pas...

Global Dim MIDI_PERCU$(82)

MIDI_PERCU$ (35) = "Acoustic Bass Drum"
MIDI_PERCU$ (36) = "Bass Drum 1"
MIDI_PERCU$ (37) = "Side Stick"
MIDI_PERCU$ (38) = "Acoustic Snare"
MIDI_PERCU$ (39) = "Hand Clap"
MIDI_PERCU$ (40) = "Electric Snare"
MIDI_PERCU$ (41) = "Low Floor Tom"
MIDI_PERCU$ (42) = "Closed Hi Hat"
MIDI_PERCU$ (43) = "High Floor Tom"
MIDI_PERCU$ (44) = "Pedal Hi-Hat"
MIDI_PERCU$ (45) = "Low Tom"
MIDI_PERCU$ (46) = "Open Hi-Hat"
MIDI_PERCU$ (47) = "Low-Mid Tom"
MIDI_PERCU$ (48) = "Hi-Mid Tom"
MIDI_PERCU$ (49) = "Crash Cymbal 1"
MIDI_PERCU$ (50) = "High Tom"
MIDI_PERCU$ (51) = "Ride Cymbal 1"
MIDI_PERCU$ (52) = "Chinese Cymbal"
MIDI_PERCU$ (53) = "Ride Bell"
MIDI_PERCU$ (54) = "Tambourine"
MIDI_PERCU$ (55) = "Splash Cymbal"
MIDI_PERCU$ (56) = "Cowbell"
MIDI_PERCU$ (57) = "Crash Cymbal 2"
MIDI_PERCU$ (58) = "Vibraslap"
MIDI_PERCU$ (59) = "Ride Cymbal 2"
MIDI_PERCU$ (60) = "Hi Bongo"
MIDI_PERCU$ (61) = "Low Bongo"
MIDI_PERCU$ (62) = "Mute Hi Conga"
MIDI_PERCU$ (63) = "Open Hi Conga"
MIDI_PERCU$ (64) = "Low Conga"
MIDI_PERCU$ (65) = "High Timbale"
MIDI_PERCU$ (66) = "Low Timbale"
MIDI_PERCU$ (67) = "High Agogo"
MIDI_PERCU$ (68) = "Low Agogo"
MIDI_PERCU$ (69) = "Cabasa"
MIDI_PERCU$ (70) = "Maracas"
MIDI_PERCU$ (71) = "Short Whistle"
MIDI_PERCU$ (72) = "Long Whistle"
MIDI_PERCU$ (73) = "Short Guiro"
MIDI_PERCU$ (74) = "Long Guiro"
MIDI_PERCU$ (75) = "Claves"
MIDI_PERCU$ (76) = "Hi Wood Block"
MIDI_PERCU$ (77) = "Low Wood Block"
MIDI_PERCU$ (78) = "Mute Cuica"
MIDI_PERCU$ (79) = "Open Cuica"
MIDI_PERCU$ (80) = "Mute Triangle"
MIDI_PERCU$ (81) = "Open Triangle"


; Percussions MIDI : la même chose avec un tableau plus petit jouer sur le canal 10 la note 35+0 : 
; fera entendre un coup d'Acoustic Bass Drum, 
; la note 35+1 un coup de Bass Drum 1, etc. 
; Global Dim MIDI_PERCU_OFFSET$(47)

; MIDI_PERCU_OFFSET$ (0) = "Acoustic Bass Drum"
; MIDI_PERCU_OFFSET$ (1) = "Bass Drum 1"
; MIDI_PERCU_OFFSET$ (2) = "Side Stick"
; MIDI_PERCU_OFFSET$ (3) = "Acoustic Snare"
; MIDI_PERCU_OFFSET$ (4) = "Hand Clap"
; MIDI_PERCU_OFFSET$ (5) = "Electric Snare"
; MIDI_PERCU_OFFSET$ (6) = "Low Floor Tom"
; MIDI_PERCU_OFFSET$ (7) = "Closed Hi Hat"
; MIDI_PERCU_OFFSET$ (8) = "High Floor Tom"
; MIDI_PERCU_OFFSET$ (9) = "Pedal Hi-Hat"
; MIDI_PERCU_OFFSET$ (10) = "Low Tom"
; MIDI_PERCU_OFFSET$ (11) = "Open Hi-Hat"
; MIDI_PERCU_OFFSET$ (12) = "Low-Mid Tom"
; MIDI_PERCU_OFFSET$ (13) = "Hi-Mid Tom"
; MIDI_PERCU_OFFSET$ (14) = "Crash Cymbal 1"
; MIDI_PERCU_OFFSET$ (15) = "High Tom"
; MIDI_PERCU_OFFSET$ (16) = "Ride Cymbal 1"
; MIDI_PERCU_OFFSET$ (17) = "Chinese Cymbal"
; MIDI_PERCU_OFFSET$ (18) = "Ride Bell"
; MIDI_PERCU_OFFSET$ (19) = "Tambourine"
; MIDI_PERCU_OFFSET$ (20) = "Splash Cymbal"
; MIDI_PERCU_OFFSET$ (21) = "Cowbell"
; MIDI_PERCU_OFFSET$ (22) = "Crash Cymbal 2"
; MIDI_PERCU_OFFSET$ (23) = "Vibraslap"
; MIDI_PERCU_OFFSET$ (24) = "Ride Cymbal 2"
; MIDI_PERCU_OFFSET$ (25) = "Hi Bongo"
; MIDI_PERCU_OFFSET$ (26) = "Low Bongo"
; MIDI_PERCU_OFFSET$ (27) = "Mute Hi Conga"
; MIDI_PERCU_OFFSET$ (28) = "Open Hi Conga"
; MIDI_PERCU_OFFSET$ (29) = "Low Conga"
; MIDI_PERCU_OFFSET$ (30) = "High Timbale"
; MIDI_PERCU_OFFSET$ (31) = "Low Timbale"
; MIDI_PERCU_OFFSET$ (32) = "High Agogo"
; MIDI_PERCU_OFFSET$ (33) = "Low Agogo"
; MIDI_PERCU_OFFSET$ (34) = "Cabasa"
; MIDI_PERCU_OFFSET$ (35) = "Maracas"
; MIDI_PERCU_OFFSET$ (36) = "Short Whistle"
; MIDI_PERCU_OFFSET$ (37) = "Long Whistle"
; MIDI_PERCU_OFFSET$ (38) = "Short Guiro"
; MIDI_PERCU_OFFSET$ (39) = "Long Guiro"
; MIDI_PERCU_OFFSET$ (40) = "Claves"
; MIDI_PERCU_OFFSET$ (41) = "Hi Wood Block"
; MIDI_PERCU_OFFSET$ (42) = "Low Wood Block"
; MIDI_PERCU_OFFSET$ (43) = "Mute Cuica"
; MIDI_PERCU_OFFSET$ (44) = "Open Cuica"
; MIDI_PERCU_OFFSET$ (45) = "Mute Triangle"
; MIDI_PERCU_OFFSET$ (46) = "Open Triangle"

;{ DEÉCLARATIONS

; ************ ÉNUMÉRATIONS *************
Enumeration Window
  #mf
  #mf2
  #mf3
  #BLANK
EndEnumeration



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

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 = 100
Global index, instrument, Index
Global Chann.l = 0
Global Inst.b = 80
Global Index_gam.b = 0
Global Index_Ton.b = 0
Global IDX_LAN = 0, IDX_TON = 0, IDX_GAM = 0, IDX_INS = 0, A$

CUR_DIR$ = GetCurrentDirectory()


;}


;/// INTERFACE UTILISATEUR (FENETRE, MENU, ETC ...)
#LA_FEN = 800
#HA_FEN = 600
#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"
Global ButtonImageBC
Global GA_SAV

;/// 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)


Global RD_G = 0, RD_T= 0, RD_V=0, RD_I = 0
Global fontid
Global i.b



;/////// Ca commence ici


; 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(0,"arial.ttf", 24)
  SetGadgetFont(#PB_Default, FontID(0))
  SetWindowColor(#mf, RGB(70, 70, 70))
  
  Te_Ga = TextGadget(#PB_Any, 25, 25, 500, 38, "") ;) ;, Y, Largeur, Hauteur,
  SetGadgetColor(Te_Ga, #PB_Gadget_FrontColor , RGB(70, 70, 0))
  SetGadgetFont(Te_Ga, FontID(0))
  SetGadgetColor(Te_Ga, #PB_Gadget_FrontColor , RGB(255, 217, 0))
  SetGadgetColor(Te_Ga, #PB_Gadget_BackColor , RGB(70, 70, 70))
  
  
  Midi_Open()
  
  Midi_ChargeInstrument(Chann,0)
  Midi_SendMessage($B0 ,0, 7, 127) ; Volume Max !
  
  
  
  ; NOTES
  For i = 48 To 60                                 ; (gamme chromatique de Do)
    SetGadgetText(Te_Ga, "Note : "+Str(i))
    Midi_PlayNote(Chann, i, VelocityDown,VelocityUp)
    Delay(500)
    Midi_SendMessage($B0 ,0,123,0) ; All notes off
    Delay(100)
  Next
  ;   
  ; Volume joue un Do puis un accord de Do Majeur
  For i= 50 To 125 Step 5
    SetGadgetText(Te_Ga, "Volume : "+Str(i))
    Midi_SendMessage($B0 ,0, 7, i) 
    Midi_PlayNote(Chann, 48, VelocityDown,VelocityUp)
    
    Delay(250)
    Midi_PlayNote(Chann, 48, VelocityDown,VelocityUp)
    Midi_PlayNote(Chann, 52, VelocityDown,VelocityUp)
    Midi_PlayNote(Chann, 55, VelocityDown,VelocityUp)
    Delay(500)
    Midi_SendMessage($B0 ,0,123,0) ; All notes off
    Delay(100)
  Next
  
  ; Instruments normaux, mais il y a des problèmes d'affichage de certains instruments ????
  ; joue un Do puis un accord de Do Majeur
  For i= 0 To 127 
    SetGadgetText(Te_Ga, "Instrument : "+ Str(i) + " [" + MIDI_Instrument$(i) + "]")
    
    Midi_ChargeInstrument(Chann, i)
    Midi_PlayNote(Chann, 48, VelocityDown,VelocityUp)
    
    Delay(250)
    Midi_PlayNote(Chann, 48, VelocityDown,VelocityUp)
    Midi_PlayNote(Chann, 52, VelocityDown,VelocityUp)
    Midi_PlayNote(Chann, 55, VelocityDown,VelocityUp)
    Delay(1000)
    Midi_SendMessage($B0 ,0,123,0) ; All notes off
    Delay(100)
  Next
  
  ; Percussions... Ne marche pas ??? Joue des notes normales
  ;   Chann.l = 10
  ;   Midi_SendMessage($BA ,0, 7, 127)
  ; 
  ;   For i= 35 To 81 
  ;     SetGadgetText(Te_Ga, "Note : "+ Str(i) + " [" + MIDI_PERCU$(i) + "]")
  ;     
  ;     
  ;     Midi_PlayNote(Chann, i, VelocityDown,VelocityUp)
  ;    
  ;     Delay(500)
  ;     Midi_SendMessage($BA ,0,123,0) ; All notes off
  ;   Next
  
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
Quelqu'un aurait une didée ?

"Accessoirement" comment transformer un entier long en une chaine de caractère hexa ?
.
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: Il est MIDI

Message par TazNormand »

Salut,

je pense que ton problème d'affichage vient de la largeur de ton gadget en ligne 321, passe le de 500 à 600

pour la transformation en hexa ==> Hex(valeur)

Code : Tout sélectionner

toto.q=9223372036854775800
Debug toto ; va afficher 9223372036854775800 dans la fenêtre "debug"

htoto.s=Hex(toto,#PB_Quad)
Debug htoto ; va afficher 7FFFFFFFFFFFFFF8 dans la fenêtre "debug"
dolhtoto.s="$"+htoto ; ajouter un dollar avant la variable convertie htoto afin de récupérer sa valeur de Hexa vers Dec
Debug Val(dolhtoto) ; va afficher 9223372036854775800 
Image
Image
Stan_fr
Messages : 84
Inscription : mar. 07/mars/2023 20:01
Localisation : NANTES

Re: Il est MIDI.

Message par Stan_fr »

TazNormand a écrit : jeu. 13/avr./2023 15:01 Salut,

je pense que ton problème d'affichage vient de la largeur de ton gadget en ligne 321, passe le de 500 à 600

pour la transformation en hexa ==> Hex(valeur)

Code : Tout sélectionner

toto.q=9223372036854775800
Debug toto ; va afficher 9223372036854775800 dans la fenêtre "debug"

htoto.s=Hex(toto,#PB_Quad)
Debug htoto ; va afficher 7FFFFFFFFFFFFFF8 dans la fenêtre "debug"
dolhtoto.s="$"+htoto ; ajouter un dollar avant la variable convertie htoto afin de récupérer sa valeur de Hexa vers Dec
Debug Val(dolhtoto) ; va afficher 9223372036854775800 
GRAND MERCI !, je n'avais pas pensé à la largeur du gadget :oops: : en l'augmentant plus de problème !

Je vais essayer d'utiliser ta routine de conversion pour trouver pourquoi ça ne marche pas pour les percussions.
Stan_fr
Messages : 84
Inscription : mar. 07/mars/2023 20:01
Localisation : NANTES

Re: Il est MIDI.

Message par Stan_fr »

EUREKA ! :idea:

Ça marche parfaitement : le Canal 10 MIDI est Le Canal 9 vu de l'ordi !

Ah ces musiciens :roll:

Donc demo MIDI...

Code : Tout sélectionner

EnableExplicit 

; Nom des instruments GENERAL MIDI : un changement d'instrument SUR UN CANAL 
; AUTRE QUE LE 10, fera jouer ce son sur la canal pour les notes suivantes.

Global Dim MIDI_Instrument$(129)

MIDI_Instrument$ (0) = "Acoustic Grand Piano"
MIDI_Instrument$ (1) = "Bright Acoustic Piano"
MIDI_Instrument$ (2) = "Electric Grand Piano"
MIDI_Instrument$ (3) = "Honky-tonk Piano"
MIDI_Instrument$ (4) = "Electric Piano 1"
MIDI_Instrument$ (5) = "Electric Piano 2"
MIDI_Instrument$ (6) = "Harpsichord"
MIDI_Instrument$ (7) = "Clavi"
MIDI_Instrument$ (8) = "Celesta"
MIDI_Instrument$ (9) = "Glockenspiel"
MIDI_Instrument$ (10) = "Music Box"
MIDI_Instrument$ (11) = "Vibraphone"
MIDI_Instrument$ (12) = "Marimba"
MIDI_Instrument$ (13) = "Xylophone"
MIDI_Instrument$ (14) = "Tubular Bells"
MIDI_Instrument$ (15) = "Dulcimer"
MIDI_Instrument$ (16) = "Drawbar Organ"
MIDI_Instrument$ (17) = "Percussive Organ"
MIDI_Instrument$ (18) = "Rock Organ"
MIDI_Instrument$ (19) = "Church Organ"
MIDI_Instrument$ (20) = "Reed Organ"
MIDI_Instrument$ (21) = "Accordion"
MIDI_Instrument$ (22) = "Harmonica"
MIDI_Instrument$ (23) = "Tango Accordion"
MIDI_Instrument$ (24) = "Acoustic Guitar (nylon)"
MIDI_Instrument$ (25) = "Acoustic Guitar (steel)"
MIDI_Instrument$ (26) = "Electric Guitar (jazz)"
MIDI_Instrument$ (27) = "Electric Guitar (clean)"
MIDI_Instrument$ (28) = "Electric Guitar (muted)"
MIDI_Instrument$ (29) = "Overdriven Guitar"
MIDI_Instrument$ (30) = "Distortion Guitar"
MIDI_Instrument$ (31) = "Guitar harmonics"
MIDI_Instrument$ (32) = "Acoustic Bass"
MIDI_Instrument$ (33) = "Electric Bass (finger)"
MIDI_Instrument$ (34) = "Electric Bass (pick)"
MIDI_Instrument$ (35) = "Fretless Bass"
MIDI_Instrument$ (36) = "Slap Bass 1"
MIDI_Instrument$ (37) = "Slap Bass 2"
MIDI_Instrument$ (38) = "Synth Bass 1"
MIDI_Instrument$ (39) = "Synth Bass 2"
MIDI_Instrument$ (40) = "Violin"
MIDI_Instrument$ (41) = "Viola"
MIDI_Instrument$ (42) = "Cello"
MIDI_Instrument$ (43) = "Contrabass"
MIDI_Instrument$ (44) = "Tremolo Strings"
MIDI_Instrument$ (45) = "Pizzicato Strings"
MIDI_Instrument$ (46) = "Orchestral Harp"
MIDI_Instrument$ (47) = "Timpani"
MIDI_Instrument$ (48) = "String Ensemble 1"
MIDI_Instrument$ (49) = "String Ensemble 2"
MIDI_Instrument$ (50) = "SynthStrings 1"
MIDI_Instrument$ (51) = "SynthStrings 2"
MIDI_Instrument$ (52) = "Choir Aahs"
MIDI_Instrument$ (53) = "Voice Oohs"
MIDI_Instrument$ (54) = "Synth Voice"
MIDI_Instrument$ (55) = "Orchestra Hit"
MIDI_Instrument$ (56) = "Trumpet"
MIDI_Instrument$ (57) = "Trombone"
MIDI_Instrument$ (58) = "Tuba"
MIDI_Instrument$ (59) = "Muted Trumpet"
MIDI_Instrument$ (60) = "French Horn"
MIDI_Instrument$ (61) = "Brass Section"
MIDI_Instrument$ (62) = "SynthBrass 1"
MIDI_Instrument$ (63) = "SynthBrass 2"
MIDI_Instrument$ (64) = "Soprano Sax"
MIDI_Instrument$ (65) = "Alto Sax"
MIDI_Instrument$ (66) = "Tenor Sax"
MIDI_Instrument$ (67) = "Baritone Sax"
MIDI_Instrument$ (68) = "Oboe"
MIDI_Instrument$ (69) = "English Horn"
MIDI_Instrument$ (70) = "Bassoon"
MIDI_Instrument$ (71) = "Clarinet"
MIDI_Instrument$ (72) = "Piccolo"
MIDI_Instrument$ (73) = "Flute"
MIDI_Instrument$ (74) = "Recorder"
MIDI_Instrument$ (75) = "Pan Flute"
MIDI_Instrument$ (76) = "Blown Bottle"
MIDI_Instrument$ (77) = "Shakuhachi"
MIDI_Instrument$ (78) = "Whistle"
MIDI_Instrument$ (79) = "Ocarina"
MIDI_Instrument$ (80) = "Lead 1 (square)"
MIDI_Instrument$ (81) = "Lead 2 (sawtooth)"
MIDI_Instrument$ (82) = "Lead 3 (calliope)"
MIDI_Instrument$ (83) = "Lead 4 (chiff)"
MIDI_Instrument$ (84) = "Lead 5 (charang)"
MIDI_Instrument$ (85) = "Lead 6 (voice)"
MIDI_Instrument$ (86) = "Lead 7 (fifths)"
MIDI_Instrument$ (87) = "Lead 8 (bass + lead)"
MIDI_Instrument$ (88) = "Pad 1 (new age)"
MIDI_Instrument$ (89) = "Pad 2 (warm)"
MIDI_Instrument$ (90) = "Pad 3 (polysynth)"
MIDI_Instrument$ (91) = "Pad 4 (choir)"
MIDI_Instrument$ (92) = "Pad 5 (bowed)"
MIDI_Instrument$ (93) = "Pad 6 (metallic)"
MIDI_Instrument$ (94) = "Pad 7 (halo)"
MIDI_Instrument$ (95) = "Pad 8 (sweep)"
MIDI_Instrument$ (96) = "FX 1 (rain)"
MIDI_Instrument$ (97) = "FX 2 (soundtrack)"
MIDI_Instrument$ (98) = "FX 3 (crystal)"
MIDI_Instrument$ (99) = "FX 4 (atmosphere)"
MIDI_Instrument$ (100) = "FX 5 (brightness)"
MIDI_Instrument$ (101) = "FX 6 (goblins)"
MIDI_Instrument$ (102) = "FX 7 (echoes)"
MIDI_Instrument$ (103) = "FX 8 (sci-fi)"
MIDI_Instrument$ (104) = "Sitar"
MIDI_Instrument$ (105) = "Banjo"
MIDI_Instrument$ (106) = "Shamisen"
MIDI_Instrument$ (107) = "Koto"
MIDI_Instrument$ (108) = "Kalimba"
MIDI_Instrument$ (109) = "Bag pipe"
MIDI_Instrument$ (110) = "Fiddle"
MIDI_Instrument$ (111) = "Shanai"
MIDI_Instrument$ (112) = "Tinkle Bell"
MIDI_Instrument$ (113) = "Agogo"
MIDI_Instrument$ (114) = "Steel Drums"
MIDI_Instrument$ (115) = "Woodblock"
MIDI_Instrument$ (116) = "Taiko Drum"
MIDI_Instrument$ (117) = "Melodic Tom"
MIDI_Instrument$ (118) = "Synth Drum"
MIDI_Instrument$ (119) = "Reverse Cymbal"
MIDI_Instrument$ (120) = "Guitar Fret Noise"
MIDI_Instrument$ (121) = "Breath Noise"
MIDI_Instrument$ (122) = "Seashore"
MIDI_Instrument$ (123) = "Bird Tweet"
MIDI_Instrument$ (124) = "Telephone Ring"
MIDI_Instrument$ (125) = "Helicopter"
MIDI_Instrument$ (126) = "Applause"
MIDI_Instrument$ (127) = "Gunshot"



; Percussions MIDI : la c'est différent : jouer SUR LE CANAL 10** la note 35 : 
; fera entendre un coup d'Acoustic Bass Drum, la note 36 un coup de Bass Drum 1, etc.
; ** le canal 10 des musiciens est le canal 9 en informatique !!!

Global Dim MIDI_PERCU$(82)

MIDI_PERCU$ (35) = "Acoustic Bass Drum"
MIDI_PERCU$ (36) = "Bass Drum 1"
MIDI_PERCU$ (37) = "Side Stick"
MIDI_PERCU$ (38) = "Acoustic Snare"
MIDI_PERCU$ (39) = "Hand Clap"
MIDI_PERCU$ (40) = "Electric Snare"
MIDI_PERCU$ (41) = "Low Floor Tom"
MIDI_PERCU$ (42) = "Closed Hi Hat"
MIDI_PERCU$ (43) = "High Floor Tom"
MIDI_PERCU$ (44) = "Pedal Hi-Hat"
MIDI_PERCU$ (45) = "Low Tom"
MIDI_PERCU$ (46) = "Open Hi-Hat"
MIDI_PERCU$ (47) = "Low-Mid Tom"
MIDI_PERCU$ (48) = "Hi-Mid Tom"
MIDI_PERCU$ (49) = "Crash Cymbal 1"
MIDI_PERCU$ (50) = "High Tom"
MIDI_PERCU$ (51) = "Ride Cymbal 1"
MIDI_PERCU$ (52) = "Chinese Cymbal"
MIDI_PERCU$ (53) = "Ride Bell"
MIDI_PERCU$ (54) = "Tambourine"
MIDI_PERCU$ (55) = "Splash Cymbal"
MIDI_PERCU$ (56) = "Cowbell"
MIDI_PERCU$ (57) = "Crash Cymbal 2"
MIDI_PERCU$ (58) = "Vibraslap"
MIDI_PERCU$ (59) = "Ride Cymbal 2"
MIDI_PERCU$ (60) = "Hi Bongo"
MIDI_PERCU$ (61) = "Low Bongo"
MIDI_PERCU$ (62) = "Mute Hi Conga"
MIDI_PERCU$ (63) = "Open Hi Conga"
MIDI_PERCU$ (64) = "Low Conga"
MIDI_PERCU$ (65) = "High Timbale"
MIDI_PERCU$ (66) = "Low Timbale"
MIDI_PERCU$ (67) = "High Agogo"
MIDI_PERCU$ (68) = "Low Agogo"
MIDI_PERCU$ (69) = "Cabasa"
MIDI_PERCU$ (70) = "Maracas"
MIDI_PERCU$ (71) = "Short Whistle"
MIDI_PERCU$ (72) = "Long Whistle"
MIDI_PERCU$ (73) = "Short Guiro"
MIDI_PERCU$ (74) = "Long Guiro"
MIDI_PERCU$ (75) = "Claves"
MIDI_PERCU$ (76) = "Hi Wood Block"
MIDI_PERCU$ (77) = "Low Wood Block"
MIDI_PERCU$ (78) = "Mute Cuica"
MIDI_PERCU$ (79) = "Open Cuica"
MIDI_PERCU$ (80) = "Mute Triangle"
MIDI_PERCU$ (81) = "Open Triangle"


; Percussions MIDI : la même chose avec un tableau plus petit jouer sur le canal 10 la note 35+0 : 
; fera entendre un coup d'Acoustic Bass Drum, 
; la note 35+1 un coup de Bass Drum 1, etc. 
; Global Dim MIDI_PERCU_OFFSET$(47)

; MIDI_PERCU_OFFSET$ (0) = "Acoustic Bass Drum"
; MIDI_PERCU_OFFSET$ (1) = "Bass Drum 1"
; MIDI_PERCU_OFFSET$ (2) = "Side Stick"
; MIDI_PERCU_OFFSET$ (3) = "Acoustic Snare"
; MIDI_PERCU_OFFSET$ (4) = "Hand Clap"
; MIDI_PERCU_OFFSET$ (5) = "Electric Snare"
; MIDI_PERCU_OFFSET$ (6) = "Low Floor Tom"
; MIDI_PERCU_OFFSET$ (7) = "Closed Hi Hat"
; MIDI_PERCU_OFFSET$ (8) = "High Floor Tom"
; MIDI_PERCU_OFFSET$ (9) = "Pedal Hi-Hat"
; MIDI_PERCU_OFFSET$ (10) = "Low Tom"
; MIDI_PERCU_OFFSET$ (11) = "Open Hi-Hat"
; MIDI_PERCU_OFFSET$ (12) = "Low-Mid Tom"
; MIDI_PERCU_OFFSET$ (13) = "Hi-Mid Tom"
; MIDI_PERCU_OFFSET$ (14) = "Crash Cymbal 1"
; MIDI_PERCU_OFFSET$ (15) = "High Tom"
; MIDI_PERCU_OFFSET$ (16) = "Ride Cymbal 1"
; MIDI_PERCU_OFFSET$ (17) = "Chinese Cymbal"
; MIDI_PERCU_OFFSET$ (18) = "Ride Bell"
; MIDI_PERCU_OFFSET$ (19) = "Tambourine"
; MIDI_PERCU_OFFSET$ (20) = "Splash Cymbal"
; MIDI_PERCU_OFFSET$ (21) = "Cowbell"
; MIDI_PERCU_OFFSET$ (22) = "Crash Cymbal 2"
; MIDI_PERCU_OFFSET$ (23) = "Vibraslap"
; MIDI_PERCU_OFFSET$ (24) = "Ride Cymbal 2"
; MIDI_PERCU_OFFSET$ (25) = "Hi Bongo"
; MIDI_PERCU_OFFSET$ (26) = "Low Bongo"
; MIDI_PERCU_OFFSET$ (27) = "Mute Hi Conga"
; MIDI_PERCU_OFFSET$ (28) = "Open Hi Conga"
; MIDI_PERCU_OFFSET$ (29) = "Low Conga"
; MIDI_PERCU_OFFSET$ (30) = "High Timbale"
; MIDI_PERCU_OFFSET$ (31) = "Low Timbale"
; MIDI_PERCU_OFFSET$ (32) = "High Agogo"
; MIDI_PERCU_OFFSET$ (33) = "Low Agogo"
; MIDI_PERCU_OFFSET$ (34) = "Cabasa"
; MIDI_PERCU_OFFSET$ (35) = "Maracas"
; MIDI_PERCU_OFFSET$ (36) = "Short Whistle"
; MIDI_PERCU_OFFSET$ (37) = "Long Whistle"
; MIDI_PERCU_OFFSET$ (38) = "Short Guiro"
; MIDI_PERCU_OFFSET$ (39) = "Long Guiro"
; MIDI_PERCU_OFFSET$ (40) = "Claves"
; MIDI_PERCU_OFFSET$ (41) = "Hi Wood Block"
; MIDI_PERCU_OFFSET$ (42) = "Low Wood Block"
; MIDI_PERCU_OFFSET$ (43) = "Mute Cuica"
; MIDI_PERCU_OFFSET$ (44) = "Open Cuica"
; MIDI_PERCU_OFFSET$ (45) = "Mute Triangle"
; MIDI_PERCU_OFFSET$ (46) = "Open Triangle"

;{ DEÉCLARATIONS

; ************ ÉNUMÉRATIONS *************
Enumeration Window
  #mf
  #mf2
  #mf3
  #BLANK
EndEnumeration



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

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 = 100
Global index, instrument, Index
Global Chann.l = 0
Global Inst.b = 80
Global Index_gam.b = 0
Global Index_Ton.b = 0
Global IDX_LAN = 0, IDX_TON = 0, IDX_GAM = 0, IDX_INS = 0, A$

CUR_DIR$ = GetCurrentDirectory()


;}


;/// INTERFACE UTILISATEUR (FENETRE, MENU, ETC ...)
#LA_FEN = 900
#HA_FEN = 600
#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"
Global ButtonImageBC
Global GA_SAV

;/// 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)


Global RD_G = 0, RD_T= 0, RD_V=0, RD_I = 0
Global fontid
Global i.b



;/////// Ca commence ici


; Ouverture de la fenetre
If OpenWindow(#mf, 0, 0, #LA_FEN, #HA_FEN, "DEMO MIDI",  #PB_Window_ScreenCentered | #PB_Window_TitleBar | #PB_Window_SystemMenu)
  
  LoadFont(0,"arial.ttf", 24)
  SetGadgetFont(#PB_Default, FontID(0))
  SetWindowColor(#mf, RGB(70, 70, 70))
  
  Te_Ga = TextGadget(#PB_Any, 25, 25, 800, 38, "") ;) ;, Y, Largeur, Hauteur,
  SetGadgetColor(Te_Ga, #PB_Gadget_FrontColor , RGB(70, 70, 0))
  SetGadgetFont(Te_Ga, FontID(0))
  SetGadgetColor(Te_Ga, #PB_Gadget_FrontColor , RGB(255, 217, 0))
  SetGadgetColor(Te_Ga, #PB_Gadget_BackColor , RGB(70, 70, 70))
  
  
  Midi_Open()
  
  Midi_ChargeInstrument(Chann,0)
  Midi_SendMessage($B0 ,0, 7, 127) ; Volume Max !
  
  
  ;
  ; NOTES
  
  For i = 48 To 60                                 ; (gamme chromatique de Do)
    SetGadgetText(Te_Ga, "Note : "+Str(i))
    Midi_PlayNote(Chann, i, VelocityDown,VelocityUp)
    Delay(500)
    Midi_SendMessage($B0 ,0,123,0) ; All notes off
    Delay(100)
  Next
  
  
  ;   
  ; Volume joue un Do puis un accord de Do Majeur
  
  For i= 50 To 125 Step 5
    SetGadgetText(Te_Ga, "Volume : "+Str(i))
    Midi_SendMessage($B0 ,0, 7, i) 
    Midi_PlayNote(Chann, 48, VelocityDown,VelocityUp)
    
    Delay(250)
    Midi_PlayNote(Chann, 48, VelocityDown,VelocityUp)
    Midi_PlayNote(Chann, 52, VelocityDown,VelocityUp)
    Midi_PlayNote(Chann, 55, VelocityDown,VelocityUp)
    Delay(500)
    Midi_SendMessage($B0 ,0,123,0) ; All notes off
    Delay(100)
  Next
  
  
  ; Instruments normaux
  ; joue un Do puis un accord de Do Majeur
  
  For i= 0 To 127 
    SetGadgetText(Te_Ga, "Instrument : "+ Str(i) + " [" + MIDI_Instrument$(i) + "]")
    
    Midi_ChargeInstrument(Chann, i)
    Midi_PlayNote(Chann, 48, VelocityDown,VelocityUp)
    
    Delay(250)
    Midi_PlayNote(Chann, 48, VelocityDown,VelocityUp)
    Midi_PlayNote(Chann, 52, VelocityDown,VelocityUp)
    Midi_PlayNote(Chann, 55, VelocityDown,VelocityUp)
    Delay(1000)
    Midi_SendMessage($B0 ,0,123,0) ; All notes off
    Delay(100)
  Next
  
  ;  Percussions... CANL 10 MIDI = Canal 9 pour nous !
  Chann.l = 9
  Midi_SendMessage($B9 ,0, 7, 127)
  
  For i= 35 To 81 
    SetGadgetText(Te_Ga, "Percussions : "+ Str(i) + " [" + MIDI_PERCU$(i) + "]")
    
    
    Midi_PlayNote(Chann, i, VelocityDown,VelocityUp)
    
    Delay(500)
    Midi_SendMessage($B9 ,0,123,0) ; All notes off
  Next
  
EndIf
End


;- 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
MERCI à tous pour votre aide !
.
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Il est MIDI 😉

Message par Ar-S »

Très sympa ça merci !
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Stan_fr
Messages : 84
Inscription : mar. 07/mars/2023 20:01
Localisation : NANTES

Re: Il est MIDI 😉

Message par Stan_fr »

Tout d'abord je remercie la personne qui a sorti ça d'un autre sujet pour le mettre plus en évidence !

En suite je précise mon but : utiliser le MIDI en PB, car à la base je suis un musicien. Et je me suis aperçu au détour d'un autre projet que c'était dans mon cas beaucoup plus simple que les sons à base d'échantillons ; et je pensais que ça pouvait en intéresser d'autres.

J'ai eu beaucoup d'aide des membres du forum, disons que c'est ma façon de les remercier en essayant d'aider un peu à mon tour.
Fermez le ban...

Voici une nouvelle version incluant d'autres commandes et des pistes de développement :

Code : Tout sélectionner

EnableExplicit 

;{ DEÉCLARATIONS
; Nom des instruments GENERAL MIDI : un changement d'instrument SUR UN CANAL 
; AUTRE QUE LE 10, fera jouer ce son sur la canal pour les notes suivantes.

Global Dim MIDI_Instrument$(129)

MIDI_Instrument$ (0) = "Acoustic Grand Piano"
MIDI_Instrument$ (1) = "Bright Acoustic Piano"
MIDI_Instrument$ (2) = "Electric Grand Piano"
MIDI_Instrument$ (3) = "Honky-tonk Piano"
MIDI_Instrument$ (4) = "Electric Piano 1"
MIDI_Instrument$ (5) = "Electric Piano 2"
MIDI_Instrument$ (6) = "Harpsichord"
MIDI_Instrument$ (7) = "Clavi"
MIDI_Instrument$ (8) = "Celesta"
MIDI_Instrument$ (9) = "Glockenspiel"
MIDI_Instrument$ (10) = "Music Box"
MIDI_Instrument$ (11) = "Vibraphone"
MIDI_Instrument$ (12) = "Marimba"
MIDI_Instrument$ (13) = "Xylophone"
MIDI_Instrument$ (14) = "Tubular Bells"
MIDI_Instrument$ (15) = "Dulcimer"
MIDI_Instrument$ (16) = "Drawbar Organ"
MIDI_Instrument$ (17) = "Percussive Organ"
MIDI_Instrument$ (18) = "Rock Organ"
MIDI_Instrument$ (19) = "Church Organ"
MIDI_Instrument$ (20) = "Reed Organ"
MIDI_Instrument$ (21) = "Accordion"
MIDI_Instrument$ (22) = "Harmonica"
MIDI_Instrument$ (23) = "Tango Accordion"
MIDI_Instrument$ (24) = "Acoustic Guitar (nylon)"
MIDI_Instrument$ (25) = "Acoustic Guitar (steel)"
MIDI_Instrument$ (26) = "Electric Guitar (jazz)"
MIDI_Instrument$ (27) = "Electric Guitar (clean)"
MIDI_Instrument$ (28) = "Electric Guitar (muted)"
MIDI_Instrument$ (29) = "Overdriven Guitar"
MIDI_Instrument$ (30) = "Distortion Guitar"
MIDI_Instrument$ (31) = "Guitar harmonics"
MIDI_Instrument$ (32) = "Acoustic Bass"
MIDI_Instrument$ (33) = "Electric Bass (finger)"
MIDI_Instrument$ (34) = "Electric Bass (pick)"
MIDI_Instrument$ (35) = "Fretless Bass"
MIDI_Instrument$ (36) = "Slap Bass 1"
MIDI_Instrument$ (37) = "Slap Bass 2"
MIDI_Instrument$ (38) = "Synth Bass 1"
MIDI_Instrument$ (39) = "Synth Bass 2"
MIDI_Instrument$ (40) = "Violin"
MIDI_Instrument$ (41) = "Viola"
MIDI_Instrument$ (42) = "Cello"
MIDI_Instrument$ (43) = "Contrabass"
MIDI_Instrument$ (44) = "Tremolo Strings"
MIDI_Instrument$ (45) = "Pizzicato Strings"
MIDI_Instrument$ (46) = "Orchestral Harp"
MIDI_Instrument$ (47) = "Timpani"
MIDI_Instrument$ (48) = "String Ensemble 1"
MIDI_Instrument$ (49) = "String Ensemble 2"
MIDI_Instrument$ (50) = "SynthStrings 1"
MIDI_Instrument$ (51) = "SynthStrings 2"
MIDI_Instrument$ (52) = "Choir Aahs"
MIDI_Instrument$ (53) = "Voice Oohs"
MIDI_Instrument$ (54) = "Synth Voice"
MIDI_Instrument$ (55) = "Orchestra Hit"
MIDI_Instrument$ (56) = "Trumpet"
MIDI_Instrument$ (57) = "Trombone"
MIDI_Instrument$ (58) = "Tuba"
MIDI_Instrument$ (59) = "Muted Trumpet"
MIDI_Instrument$ (60) = "French Horn"
MIDI_Instrument$ (61) = "Brass Section"
MIDI_Instrument$ (62) = "SynthBrass 1"
MIDI_Instrument$ (63) = "SynthBrass 2"
MIDI_Instrument$ (64) = "Soprano Sax"
MIDI_Instrument$ (65) = "Alto Sax"
MIDI_Instrument$ (66) = "Tenor Sax"
MIDI_Instrument$ (67) = "Baritone Sax"
MIDI_Instrument$ (68) = "Oboe"
MIDI_Instrument$ (69) = "English Horn"
MIDI_Instrument$ (70) = "Bassoon"
MIDI_Instrument$ (71) = "Clarinet"
MIDI_Instrument$ (72) = "Piccolo"
MIDI_Instrument$ (73) = "Flute"
MIDI_Instrument$ (74) = "Recorder"
MIDI_Instrument$ (75) = "Pan Flute"
MIDI_Instrument$ (76) = "Blown Bottle"
MIDI_Instrument$ (77) = "Shakuhachi"
MIDI_Instrument$ (78) = "Whistle"
MIDI_Instrument$ (79) = "Ocarina"
MIDI_Instrument$ (80) = "Lead 1 (square)"
MIDI_Instrument$ (81) = "Lead 2 (sawtooth)"
MIDI_Instrument$ (82) = "Lead 3 (calliope)"
MIDI_Instrument$ (83) = "Lead 4 (chiff)"
MIDI_Instrument$ (84) = "Lead 5 (charang)"
MIDI_Instrument$ (85) = "Lead 6 (voice)"
MIDI_Instrument$ (86) = "Lead 7 (fifths)"
MIDI_Instrument$ (87) = "Lead 8 (bass + lead)"
MIDI_Instrument$ (88) = "Pad 1 (new age)"
MIDI_Instrument$ (89) = "Pad 2 (warm)"
MIDI_Instrument$ (90) = "Pad 3 (polysynth)"
MIDI_Instrument$ (91) = "Pad 4 (choir)"
MIDI_Instrument$ (92) = "Pad 5 (bowed)"
MIDI_Instrument$ (93) = "Pad 6 (metallic)"
MIDI_Instrument$ (94) = "Pad 7 (halo)"
MIDI_Instrument$ (95) = "Pad 8 (sweep)"
MIDI_Instrument$ (96) = "FX 1 (rain)"
MIDI_Instrument$ (97) = "FX 2 (soundtrack)"
MIDI_Instrument$ (98) = "FX 3 (crystal)"
MIDI_Instrument$ (99) = "FX 4 (atmosphere)"
MIDI_Instrument$ (100) = "FX 5 (brightness)"
MIDI_Instrument$ (101) = "FX 6 (goblins)"
MIDI_Instrument$ (102) = "FX 7 (echoes)"
MIDI_Instrument$ (103) = "FX 8 (sci-fi)"
MIDI_Instrument$ (104) = "Sitar"
MIDI_Instrument$ (105) = "Banjo"
MIDI_Instrument$ (106) = "Shamisen"
MIDI_Instrument$ (107) = "Koto"
MIDI_Instrument$ (108) = "Kalimba"
MIDI_Instrument$ (109) = "Bag pipe"
MIDI_Instrument$ (110) = "Fiddle"
MIDI_Instrument$ (111) = "Shanai"
MIDI_Instrument$ (112) = "Tinkle Bell"
MIDI_Instrument$ (113) = "Agogo"
MIDI_Instrument$ (114) = "Steel Drums"
MIDI_Instrument$ (115) = "Woodblock"
MIDI_Instrument$ (116) = "Taiko Drum"
MIDI_Instrument$ (117) = "Melodic Tom"
MIDI_Instrument$ (118) = "Synth Drum"
MIDI_Instrument$ (119) = "Reverse Cymbal"
MIDI_Instrument$ (120) = "Guitar Fret Noise"
MIDI_Instrument$ (121) = "Breath Noise"
MIDI_Instrument$ (122) = "Seashore"
MIDI_Instrument$ (123) = "Bird Tweet"
MIDI_Instrument$ (124) = "Telephone Ring"
MIDI_Instrument$ (125) = "Helicopter"
MIDI_Instrument$ (126) = "Applause"
MIDI_Instrument$ (127) = "Gunshot"



; Percussions MIDI : la c'est différent : jouer SUR LE CANAL 10** la note 35 : 
; fera entendre un coup d'Acoustic Bass Drum, la note 36 un coup de Bass Drum 1, etc.
; ** le canal 10 des musiciens est le canal 9 en informatique !!!

Global Dim MIDI_PERCU$(82)

MIDI_PERCU$ (35) = "Acoustic Bass Drum"
MIDI_PERCU$ (36) = "Bass Drum 1"
MIDI_PERCU$ (37) = "Side Stick"
MIDI_PERCU$ (38) = "Acoustic Snare"
MIDI_PERCU$ (39) = "Hand Clap"
MIDI_PERCU$ (40) = "Electric Snare"
MIDI_PERCU$ (41) = "Low Floor Tom"
MIDI_PERCU$ (42) = "Closed Hi Hat"
MIDI_PERCU$ (43) = "High Floor Tom"
MIDI_PERCU$ (44) = "Pedal Hi-Hat"
MIDI_PERCU$ (45) = "Low Tom"
MIDI_PERCU$ (46) = "Open Hi-Hat"
MIDI_PERCU$ (47) = "Low-Mid Tom"
MIDI_PERCU$ (48) = "Hi-Mid Tom"
MIDI_PERCU$ (49) = "Crash Cymbal 1"
MIDI_PERCU$ (50) = "High Tom"
MIDI_PERCU$ (51) = "Ride Cymbal 1"
MIDI_PERCU$ (52) = "Chinese Cymbal"
MIDI_PERCU$ (53) = "Ride Bell"
MIDI_PERCU$ (54) = "Tambourine"
MIDI_PERCU$ (55) = "Splash Cymbal"
MIDI_PERCU$ (56) = "Cowbell"
MIDI_PERCU$ (57) = "Crash Cymbal 2"
MIDI_PERCU$ (58) = "Vibraslap"
MIDI_PERCU$ (59) = "Ride Cymbal 2"
MIDI_PERCU$ (60) = "Hi Bongo"
MIDI_PERCU$ (61) = "Low Bongo"
MIDI_PERCU$ (62) = "Mute Hi Conga"
MIDI_PERCU$ (63) = "Open Hi Conga"
MIDI_PERCU$ (64) = "Low Conga"
MIDI_PERCU$ (65) = "High Timbale"
MIDI_PERCU$ (66) = "Low Timbale"
MIDI_PERCU$ (67) = "High Agogo"
MIDI_PERCU$ (68) = "Low Agogo"
MIDI_PERCU$ (69) = "Cabasa"
MIDI_PERCU$ (70) = "Maracas"
MIDI_PERCU$ (71) = "Short Whistle"
MIDI_PERCU$ (72) = "Long Whistle"
MIDI_PERCU$ (73) = "Short Guiro"
MIDI_PERCU$ (74) = "Long Guiro"
MIDI_PERCU$ (75) = "Claves"
MIDI_PERCU$ (76) = "Hi Wood Block"
MIDI_PERCU$ (77) = "Low Wood Block"
MIDI_PERCU$ (78) = "Mute Cuica"
MIDI_PERCU$ (79) = "Open Cuica"
MIDI_PERCU$ (80) = "Mute Triangle"
MIDI_PERCU$ (81) = "Open Triangle"


; Percussions MIDI : la même chose avec un tableau plus petit jouer sur le canal 10 la note 35+0 : 
; fera entendre un coup d'Acoustic Bass Drum, 
; la note 35+1 un coup de Bass Drum 1, etc. 

Global Dim MIDI_PERCU_OFFSET$(47)

MIDI_PERCU_OFFSET$ (0) = "Acoustic Bass Drum"
MIDI_PERCU_OFFSET$ (1) = "Bass Drum 1"
MIDI_PERCU_OFFSET$ (2) = "Side Stick"
MIDI_PERCU_OFFSET$ (3) = "Acoustic Snare"
MIDI_PERCU_OFFSET$ (4) = "Hand Clap"
MIDI_PERCU_OFFSET$ (5) = "Electric Snare"
MIDI_PERCU_OFFSET$ (6) = "Low Floor Tom"
MIDI_PERCU_OFFSET$ (7) = "Closed Hi Hat"
MIDI_PERCU_OFFSET$ (8) = "High Floor Tom"
MIDI_PERCU_OFFSET$ (9) = "Pedal Hi-Hat"
MIDI_PERCU_OFFSET$ (10) = "Low Tom"
MIDI_PERCU_OFFSET$ (11) = "Open Hi-Hat"
MIDI_PERCU_OFFSET$ (12) = "Low-Mid Tom"
MIDI_PERCU_OFFSET$ (13) = "Hi-Mid Tom"
MIDI_PERCU_OFFSET$ (14) = "Crash Cymbal 1"
MIDI_PERCU_OFFSET$ (15) = "High Tom"
MIDI_PERCU_OFFSET$ (16) = "Ride Cymbal 1"
MIDI_PERCU_OFFSET$ (17) = "Chinese Cymbal"
MIDI_PERCU_OFFSET$ (18) = "Ride Bell"
MIDI_PERCU_OFFSET$ (19) = "Tambourine"
MIDI_PERCU_OFFSET$ (20) = "Splash Cymbal"
MIDI_PERCU_OFFSET$ (21) = "Cowbell"
MIDI_PERCU_OFFSET$ (22) = "Crash Cymbal 2"
MIDI_PERCU_OFFSET$ (23) = "Vibraslap"
MIDI_PERCU_OFFSET$ (24) = "Ride Cymbal 2"
MIDI_PERCU_OFFSET$ (25) = "Hi Bongo"
MIDI_PERCU_OFFSET$ (26) = "Low Bongo"
MIDI_PERCU_OFFSET$ (27) = "Mute Hi Conga"
MIDI_PERCU_OFFSET$ (28) = "Open Hi Conga"
MIDI_PERCU_OFFSET$ (29) = "Low Conga"
MIDI_PERCU_OFFSET$ (30) = "High Timbale"
MIDI_PERCU_OFFSET$ (31) = "Low Timbale"
MIDI_PERCU_OFFSET$ (32) = "High Agogo"
MIDI_PERCU_OFFSET$ (33) = "Low Agogo"
MIDI_PERCU_OFFSET$ (34) = "Cabasa"
MIDI_PERCU_OFFSET$ (35) = "Maracas"
MIDI_PERCU_OFFSET$ (36) = "Short Whistle"
MIDI_PERCU_OFFSET$ (37) = "Long Whistle"
MIDI_PERCU_OFFSET$ (38) = "Short Guiro"
MIDI_PERCU_OFFSET$ (39) = "Long Guiro"
MIDI_PERCU_OFFSET$ (40) = "Claves"
MIDI_PERCU_OFFSET$ (41) = "Hi Wood Block"
MIDI_PERCU_OFFSET$ (42) = "Low Wood Block"
MIDI_PERCU_OFFSET$ (43) = "Mute Cuica"
MIDI_PERCU_OFFSET$ (44) = "Open Cuica"
MIDI_PERCU_OFFSET$ (45) = "Mute Triangle"
MIDI_PERCU_OFFSET$ (46) = "Open Triangle"

Global Dim Nom_Note$(12)
Nom_Note$(0) = "Do"
Nom_Note$(1) = "Do#"
Nom_Note$(2) = "Ré"
Nom_Note$(3) = "Mib"
Nom_Note$(4) = "Mi"
Nom_Note$(5) = "Fa"
Nom_Note$(6) = "Fa#"
Nom_Note$(7) = "Sol"
Nom_Note$(8) = "Lab"
Nom_Note$(9) = "La"
Nom_Note$(10) = "Sib"
Nom_Note$(11) = "Si"



; ************ ÉNUMÉRATIONS *************
Enumeration Window
  #mf
  #mf2
  #mf3
  #BLANK
EndEnumeration


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 0 = 127
Global Velo.b = 100
Global index, instrument, Index
Global Chann.l = 0
Global Inst.b = 80
Global Index_gam.b = 0
Global Index_Ton.b = 0
Global IDX_LAN = 0, IDX_TON = 0, IDX_GAM = 0, IDX_INS = 0, A$, j, Te_Ga
;}


;/// INTERFACE UTILISATEUR (FENETRE, MENU, ETC ...)
#LA_FEN = 900
#HA_FEN = 600

Global Event, GA_SAV


;/// 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 Midi_Note_On(Chann, Note.b,VelociteUp)
Declare Midi_Note_Off(Chann, Note.b,VelociteUp)
Declare Midi_CtrlChange( Chann.b, Ctrl.b, Value.b) ; envoie un Ctrl change voir la table des CC ici
                                                   ; https://fr.audiofanzine.com/mao/editorial/dossiers/le-midi-les-midi-control-change.html
Declare Midi_PitchBend(Chann, pitch.b)

; Fonctions raccourcies...

; jouer sans représier à chaque fois le canal...

Declare PMidi_ChargeInstrument(Instrument.b)
Declare PMidi_PlayNote(Note.b,VelociteDown.b,VelociteUp.b)
Declare PMidi_SendMessage(nStatus.l,nData1.l,nData2.l)
Declare PMidi_Note_On(Note.b,VelociteUp)
Declare PMidi_Note_Off(Note.b,VelociteUp)
Declare PMidi_CtrlChange(  Ctrl.b, Value.b) ; envoie un Ctrl change voir la table des CC ici
                                            ; https://fr.audiofanzine.com/mao/editorial/dossiers/le-midi-les-midi-control-change.html
Declare PMidi_PitchBend( pitch.b)

; jouer directement les percussions
Declare Bat_Note( i.b, Velo.b) 

; À vous de jouer ! et de créer des fonction raccourcies

Global RD_G = 0, RD_T= 0, RD_V=0, RD_I = 0
Global fontid
Global i.b
Global PChann.b = 0
Global short = 1 ; -1 version longue, 1 version courte
Global Version

;/////// Ca commence ici


; Ouverture de la fenetre
If OpenWindow(#mf, 0, 0, #LA_FEN, #HA_FEN, "DEMO MIDI",  #PB_Window_ScreenCentered | #PB_Window_TitleBar | #PB_Window_SystemMenu)
  
  LoadFont(0,"arial.ttf", 24)
  SetGadgetFont(#PB_Default, FontID(0))
  SetWindowColor(#mf, RGB(70, 70, 70))
  
  Te_Ga = TextGadget(#PB_Any, 15, 25, 810, 38, "") ;) ;, Y, Largeur, Hauteur,
  SetGadgetColor(Te_Ga, #PB_Gadget_BackColor , RGB(70, 70, 70))
  SetGadgetColor(Te_Ga, #PB_Gadget_FrontColor , RGB(70, 70, 0))
  SetGadgetFont(Te_Ga, FontID(0))
  SetGadgetColor(Te_Ga, #PB_Gadget_FrontColor , RGB(255, 217, 0))
  ;SetGadgetColor(Te_Ga, #PB_Gadget_BackColor , RGB(70, 70, 70))
  
  
  Midi_Open()
  
  Midi_ChargeInstrument(Chann,0)
  Midi_CtrlChange(0, 7, 127) ;;Midi_SendMessage($B0 ,0, 7, 127) ; Volume Max !
  Velo = 100
  PChann = 0
  
  Short = -1
  Version = MessageRequester("Choix Version", "Passer à la version courte ?",#PB_MessageRequester_YesNo) 
  If Version = #PB_MessageRequester_Yes 
    Short = 1
  EndIf
  
  If short >0  ; Si Short > 0 on passe à la version courte des procedures
    Goto Label
  EndIf
  ;
  ; NOTES
  
  
  For i = 48 To 60                                 ; (gamme chromatique de Do)
    SetGadgetText(Te_Ga, "Note : "+ Str(i) + " ("+Nom_Note$(i%11)+")")
    Midi_PlayNote(Chann, i, 0,Velo) ; Do isolé
    
    Delay(500)
    
    Midi_SendMessage($B0 ,0,123,0) ; All notes off
    
    Delay(100)
  Next
  
  
  ;
  ; Velocité
  
  Midi_SendMessage($B0 ,0, 7, 127) ; Volume Max !
  For velo = 47 To 127 Step 5      ; (gamme chromatique de Do)
    SetGadgetText(Te_Ga, "Vélocité : "+Str(velo))
    
    Midi_PlayNote(Chann, 48, 0,Velo) ; Do isolé
    
    Delay(500)
    
    Midi_PlayNote(Chann, 48, 0,Velo) ; accord de Do Majeur
    Midi_PlayNote(Chann, 52, 0,Velo)
    Midi_PlayNote(Chann, 55, 0,Velo)
    
    Delay(500) ; on laisse sonner l'accord
    
    Midi_SendMessage($B0 ,0,123,0) ; All notes off
    Delay(100)
  Next
  
  Velo = 100
  ;   
  ; Volume joue un Do puis un accord de Do Majeur
  ;  Velo = 100
  For i= 50 To 125 Step 5
    SetGadgetText(Te_Ga, "Volume : "+Str(i))
    Midi_CtrlChange( Chann, 7, i) ;  Volume = Controleur numéro 7
    Midi_PlayNote(Chann, 48, 0,Velo) ; Do isolé
    
    Delay(500)
    
    Midi_PlayNote(Chann, 48, 0,Velo) ; accord de Do Majeur
    Midi_PlayNote(Chann, 52, 0,Velo)
    Midi_PlayNote(Chann, 55, 0,Velo)
    
    Delay(500) ; on laisse sonner l'accord
    
    Midi_SendMessage($B0 ,0,123,0) ; All notes off
    
    Delay(100)
  Next
  
  
  ; Instruments normaux
  ; joue un Do puis un accord de Do Majeur
  
  For i= 0 To 127 
    SetGadgetText(Te_Ga, "Instrument : "+ Str(i) + " [" + MIDI_Instrument$(i) + "]")
    
    Midi_ChargeInstrument(Chann, i)
    Midi_PlayNote(Chann, 48, 0,Velo) ; Do isolé
    
    Delay(500)
    
    Midi_PlayNote(Chann, 48, 0,Velo) ; accord de Do Majeur
    Midi_PlayNote(Chann, 52, 0,Velo)
    Midi_PlayNote(Chann, 55, 0,Velo)
    
    Delay(1000) ; on laisse sonner l'accord
    
    Midi_SendMessage($B0 ! chann ,0,123,0) ; All notes off
    
    Delay(100)
  Next
  
  ;  Note tenue
  
  Midi_ChargeInstrument(Chann,51)
  Midi_CtrlChange( Chann, 7, 120) ; CTR 7 : volume
  
  ;
  A$ = "1920"
  For i = 1 To 6
    SetGadgetText(Te_Ga, "Patience : "+ A$ + " millisecondes dont 1920 d'effets")
    
    Midi_Note_On(Chann, 60, Velo)
    ; Midi_PlayNote(Chann, 48, 0,Velo)
    For j = 1 To 121 Step 10
      Midi_PitchBend( Chann, j) ; Pitch bend
      Midi_CtrlChange(chann, 1, j)  ; CTRL 1 = Mod wheel
      Delay (80)
    Next
    For j = 121 To 1 Step -10
      Midi_PitchBend( Chann, j) ; Pitch bend
      Midi_CtrlChange(chann, 1, j)  ; CTRL 1 = Mod wheel
      Delay (80)
    Next
    If (800*i-12*160) > 0
      Delay(800* i- 12*160)
      A$ = Str(800*i)
    EndIf
    
    Midi_Note_Off(Chann, 60, Velo)
    Delay(250)
  Next
  
  ;  Percussions... CANL 10 MIDI = Canal 9 pour nous !
  Chann.l = 9
  Midi_SendMessage($B9 ,0, 7, 127)
  
  For i= 35 To 81 
    SetGadgetText(Te_Ga, "Percussions : "+ Str(i) + " [" + MIDI_PERCU$(i) + "]")
    Midi_PlayNote(Chann, i, 0,Velo) 
    Delay(500)
    Midi_SendMessage($B9 ,0,123,0) ; All notes off
  Next
  
  Goto Label2
  
  
  Label:
  
  
  PMidi_CtrlChange( 7, 120)  ; Volume Max !
                             ; Note
  PMidi_ChargeInstrument(1)
  
  For i = 48 To 60                                 ; (gamme chromatique de Do)
    SetGadgetText(Te_Ga, "P-Note : "+ Str(i) + " ("+Nom_Note$(i%11)+")")
    PMidi_PlayNote(i, 0,Velo) ; Do isolé
    
    Delay(500)
    
    PMidi_SendMessage(0,123,0) ; All notes off
    Delay(100)
  Next
  
  ;   
  ; Velocité   
  ; Label:
  PChann.b = 0
  PMidi_CtrlChange( 7, 120)  ; Volume Max !
  For Velo = 47 To 125 Step 5; (gamme chromatique de Do)
    SetGadgetText(Te_Ga, "P-Vélocité : "+Str(velo))
    
    PMidi_PlayNote(48, 0,Velo) ; Do isolé
    
    Delay(500)
    
    PMidi_PlayNote( 48, 0,Velo) ; accord de Do Majeur
    PMidi_PlayNote( 52, 0,Velo)
    PMidi_PlayNote( 55, 0,Velo)
    
    Delay(500) ; on laisse sonner l'accord
    
    PMidi_SendMessage(0,123,0) ; All notes off
    Delay(100)
  Next
  Velo = 100
  
  
  ; Volume joue un Do puis un accord de Do Majeur
  
  For i= 50 To 125 Step 5
    PMidi_CtrlChange(  7, i) ; ctrl 7 :volume
    SetGadgetText(Te_Ga, "P-Volume : "+Str(i))
    ;PMidi_CtrlChange( Chann, 7, 120) ; Midi_CtrlChange(0, 7, i) ;  Volume = Controleur numéro 7
    PMidi_PlayNote(48, 0,Velo) ; Do isolé
    
    Delay(500)
    
    PMidi_PlayNote(48, 0,Velo) ; accord de Do Majeur
    PMidi_PlayNote(52, 0,Velo)
    PMidi_PlayNote(55, 0,Velo)
    
    Delay(500) ; on laisse sonner l'accord
    
    PMidi_SendMessage(0,123,0) ; All notes off
    
    Delay(100)
  Next
  
  ; Instruments normaux
  ; joue un Do puis un accord de Do Majeur
  
  For i= 0 To 127 
    SetGadgetText(Te_Ga, "P-Instrument : "+ Str(i) + " [" + MIDI_Instrument$(i) + "]")
    
    PMidi_ChargeInstrument(i)
    PMidi_PlayNote(48, 0,Velo) ; Do isolé
    
    Delay(500)
    
    PMidi_PlayNote(48, 0,Velo) ; accord de Do Majeur
    PMidi_PlayNote(52, 0,Velo)
    PMidi_PlayNote(55, 0,Velo)
    
    Delay(1000) ; on laisse sonner l'accord
    
    PMidi_SendMessage(0,123,0) ; All notes off
    
    Delay(100)
  Next
  
  PMidi_ChargeInstrument(51)
  PMidi_SendMessage(0,123,0) ; All notes off
  
  ;
  
  A$ = "1920"
  For i = 1 To 6
    SetGadgetText(Te_Ga, "P-Patience : "+ A$ + " millisecondes dont 1920 d'effets")
    
    PMidi_Note_On( 60, Velo)
    
    For j = 1 To 121 Step 10
      PMidi_PitchBend(  j) ; Pitch bend
      PMidi_CtrlChange( 1, j)  ; CTRL 1 = Mod wheel
      Delay (80)
    Next
    For j = 121 To 1 Step -10
      PMidi_PitchBend(  j) ; Pitch bend
      PMidi_CtrlChange( 1, j)  ; CTRL 1 = Mod wheel
      Delay (80)
    Next
    If (800*i-12*160) > 0
      Delay(800* i- 12*160)
      A$ = Str(800*i)
    EndIf
    
    PMidi_Note_Off( 60, Velo)
    Delay(250)
  Next
  ;   
  
  ;  Percussions... CANL 10 MIDI = Canal 9 pour nous ! On utilise le tableau avec offset
  Pchann = 9
  PMidi_SendMessage(0, 7, 127) ; Volume au max !
  
  For i= 0 To 46 
    SetGadgetText(Te_Ga, "P-Percussions : "+ Str(i) + " --> (" + Str(35+i) + ")  " + "[" + MIDI_PERCU_OFFSET$ (i) + "]")
    PMidi_PlayNote(35+i, 0,Velo) 
    Delay(500)
    Midi_SendMessage($B9 ,0,123,0) ; All notes off
  Next
  
  PChann = 0 
  For i= 0 To 46 
    SetGadgetText(Te_Ga, "B-Percussions : "+ Str(i) + "  " + "[" + MIDI_PERCU_OFFSET$ (i) + "]")
    ; PMidi_PlayNote(35+i, 0,Velo) 
    Bat_Note(i,Velo)
    Delay(500)
    PMidi_SendMessage(0,123,0) ; All notes off
  Next
  
  
  
  Velo = 127
  For i= 40 To 56 
    SetGadgetText(Te_Ga, "Mélange Batterie/Note : "+ Str(i) )
    PMidi_PlayNote(i, 0,Velo-80) 
    Delay(200)
    Bat_Note(i,Velo)
    Delay(500)
    Midi_SendMessage($B9 ,0,123,0) ; All notes off
  Next
  ;   
  Label2:
  
EndIf
End


;- Procédures


Procedure Bat_Note( i.b, Velo.b)
  Protected cchan = Pchann
  Pchann = 9
  PMidi_PlayNote(35+i, 0,Velo) 
  PChann = cchan
EndProcedure

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 PMidi_SendMessage(nStatus.l,nData1.l,nData2.l)
  Midi_SendMessage(nStatus.l,$B0|Pchann,nData1.l,nData2.l)
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)
      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_Note_Off(Canal, Note, VelociteUp)
    Midi_Note_On(Canal, Note, VelociteUp)
    
  EndIf    
  
EndProcedure

Procedure PMidi_PlayNote(Note.b,VelociteDown.b,VelociteUp.b)
  Midi_PlayNote(PChann,Note.b,VelociteDown.b,VelociteUp.b)   
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 PMidi_ChargeInstrument(Instrument.b)
  Midi_ChargeInstrument(Pchann,Instrument.b)
EndProcedure

Procedure Midi_Note_On(Chann, Note.b ,VelociteUp)
  If m_MIDIOpen = 0
    Midi_Open()
  EndIf
  If m_MIDIOpen = 1
    Midi_SendMessage($90 | Chann, 0, Note, VelociteUp)
  EndIf    
EndProcedure
Procedure PMidi_Note_On(Note.b,VelociteUp)
  Midi_Note_On(PChann, Note.b,VelociteUp) 
EndProcedure
Procedure Midi_Note_Off(Chann, Note.b,VelociteUp)
  
  
  If m_MIDIOpen = 0
    Midi_Open()
  EndIf
  If m_MIDIOpen = 1
    Midi_SendMessage($80 | Chann, 0, Note, VelociteUp)
  EndIf    
EndProcedure

Procedure PMidi_Note_Off(Note.b,VelociteUp)
  Midi_Note_Off(PChann, Note.b,VelociteUp) 
  
EndProcedure

Procedure Midi_CtrlChange( Chann.b, Ctrl.b, Value.b)
  
  Midi_SendMessage($B0|Chann, 0, Ctrl, Value)
EndProcedure

Procedure PMidi_CtrlChange( Ctrl.b, Value.b)
  
  Midi_CtrlChange(Pchann,  Ctrl, Value)
EndProcedure

Procedure Midi_PitchBend(Chann, pitch.b) 
  Midi_SendMessage($E0|Chann, 0, 0, Pitch)
EndProcedure

Procedure PMidi_PitchBend( pitch.b) 
  Midi_SendMessage($E0|Pchann, 0, 0, Pitch)
EndProcedure
.
Vos critiques et amélioration sont les bienvenues ! (qu'elles concernent le code, ou les idées)

Et si ça intéresse des gens on pourrait faire un projet collaboratif de l'autre projet inspiré de :

https://www.maxlaumeister.com/tonematrix/
.
Stan_fr
Messages : 84
Inscription : mar. 07/mars/2023 20:01
Localisation : NANTES

Re: Il est MIDI 😉

Message par Stan_fr »

Première idée d'amélioration : pouvoir utiliser un synthé externe (qu'il soit logiciel ou matériel)...
Stan_fr
Messages : 84
Inscription : mar. 07/mars/2023 20:01
Localisation : NANTES

Re: Il est MIDI 😉

Message par Stan_fr »

Nouvelle version avec musique de fond par thread... (À compiler avec l'option Threadsafe du compilateur).

Code : Tout sélectionner

EnableExplicit 

;{ DEÉCLARATIONS
; Nom des instruments GENERAL MIDI : un changement d'instrument SUR UN CANAL 
; AUTRE QUE LE 10, fera jouer ce son sur la canal pour les notes suivantes.

Global Dim MIDI_Instrument$(129)

MIDI_Instrument$ (0) = "Acoustic Grand Piano"
MIDI_Instrument$ (1) = "Bright Acoustic Piano"
MIDI_Instrument$ (2) = "Electric Grand Piano"
MIDI_Instrument$ (3) = "Honky-tonk Piano"
MIDI_Instrument$ (4) = "Electric Piano 1"
MIDI_Instrument$ (5) = "Electric Piano 2"
MIDI_Instrument$ (6) = "Harpsichord"
MIDI_Instrument$ (7) = "Clavi"
MIDI_Instrument$ (8) = "Celesta"
MIDI_Instrument$ (9) = "Glockenspiel"
MIDI_Instrument$ (10) = "Music Box"
MIDI_Instrument$ (11) = "Vibraphone"
MIDI_Instrument$ (12) = "Marimba"
MIDI_Instrument$ (13) = "Xylophone"
MIDI_Instrument$ (14) = "Tubular Bells"
MIDI_Instrument$ (15) = "Dulcimer"
MIDI_Instrument$ (16) = "Drawbar Organ"
MIDI_Instrument$ (17) = "Percussive Organ"
MIDI_Instrument$ (18) = "Rock Organ"
MIDI_Instrument$ (19) = "Church Organ"
MIDI_Instrument$ (20) = "Reed Organ"
MIDI_Instrument$ (21) = "Accordion"
MIDI_Instrument$ (22) = "Harmonica"
MIDI_Instrument$ (23) = "Tango Accordion"
MIDI_Instrument$ (24) = "Acoustic Guitar (nylon)"
MIDI_Instrument$ (25) = "Acoustic Guitar (steel)"
MIDI_Instrument$ (26) = "Electric Guitar (jazz)"
MIDI_Instrument$ (27) = "Electric Guitar (clean)"
MIDI_Instrument$ (28) = "Electric Guitar (muted)"
MIDI_Instrument$ (29) = "Overdriven Guitar"
MIDI_Instrument$ (30) = "Distortion Guitar"
MIDI_Instrument$ (31) = "Guitar harmonics"
MIDI_Instrument$ (32) = "Acoustic Bass"
MIDI_Instrument$ (33) = "Electric Bass (finger)"
MIDI_Instrument$ (34) = "Electric Bass (pick)"
MIDI_Instrument$ (35) = "Fretless Bass"
MIDI_Instrument$ (36) = "Slap Bass 1"
MIDI_Instrument$ (37) = "Slap Bass 2"
MIDI_Instrument$ (38) = "Synth Bass 1"
MIDI_Instrument$ (39) = "Synth Bass 2"
MIDI_Instrument$ (40) = "Violin"
MIDI_Instrument$ (41) = "Viola"
MIDI_Instrument$ (42) = "Cello"
MIDI_Instrument$ (43) = "Contrabass"
MIDI_Instrument$ (44) = "Tremolo Strings"
MIDI_Instrument$ (45) = "Pizzicato Strings"
MIDI_Instrument$ (46) = "Orchestral Harp"
MIDI_Instrument$ (47) = "Timpani"
MIDI_Instrument$ (48) = "String Ensemble 1"
MIDI_Instrument$ (49) = "String Ensemble 2"
MIDI_Instrument$ (50) = "SynthStrings 1"
MIDI_Instrument$ (51) = "SynthStrings 2"
MIDI_Instrument$ (52) = "Choir Aahs"
MIDI_Instrument$ (53) = "Voice Oohs"
MIDI_Instrument$ (54) = "Synth Voice"
MIDI_Instrument$ (55) = "Orchestra Hit"
MIDI_Instrument$ (56) = "Trumpet"
MIDI_Instrument$ (57) = "Trombone"
MIDI_Instrument$ (58) = "Tuba"
MIDI_Instrument$ (59) = "Muted Trumpet"
MIDI_Instrument$ (60) = "French Horn"
MIDI_Instrument$ (61) = "Brass Section"
MIDI_Instrument$ (62) = "SynthBrass 1"
MIDI_Instrument$ (63) = "SynthBrass 2"
MIDI_Instrument$ (64) = "Soprano Sax"
MIDI_Instrument$ (65) = "Alto Sax"
MIDI_Instrument$ (66) = "Tenor Sax"
MIDI_Instrument$ (67) = "Baritone Sax"
MIDI_Instrument$ (68) = "Oboe"
MIDI_Instrument$ (69) = "English Horn"
MIDI_Instrument$ (70) = "Bassoon"
MIDI_Instrument$ (71) = "Clarinet"
MIDI_Instrument$ (72) = "Piccolo"
MIDI_Instrument$ (73) = "Flute"
MIDI_Instrument$ (74) = "Recorder"
MIDI_Instrument$ (75) = "Pan Flute"
MIDI_Instrument$ (76) = "Blown Bottle"
MIDI_Instrument$ (77) = "Shakuhachi"
MIDI_Instrument$ (78) = "Whistle"
MIDI_Instrument$ (79) = "Ocarina"
MIDI_Instrument$ (80) = "Lead 1 (square)"
MIDI_Instrument$ (81) = "Lead 2 (sawtooth)"
MIDI_Instrument$ (82) = "Lead 3 (calliope)"
MIDI_Instrument$ (83) = "Lead 4 (chiff)"
MIDI_Instrument$ (84) = "Lead 5 (charang)"
MIDI_Instrument$ (85) = "Lead 6 (voice)"
MIDI_Instrument$ (86) = "Lead 7 (fifths)"
MIDI_Instrument$ (87) = "Lead 8 (bass + lead)"
MIDI_Instrument$ (88) = "Pad 1 (new age)"
MIDI_Instrument$ (89) = "Pad 2 (warm)"
MIDI_Instrument$ (90) = "Pad 3 (polysynth)"
MIDI_Instrument$ (91) = "Pad 4 (choir)"
MIDI_Instrument$ (92) = "Pad 5 (bowed)"
MIDI_Instrument$ (93) = "Pad 6 (metallic)"
MIDI_Instrument$ (94) = "Pad 7 (halo)"
MIDI_Instrument$ (95) = "Pad 8 (sweep)"
MIDI_Instrument$ (96) = "FX 1 (rain)"
MIDI_Instrument$ (97) = "FX 2 (soundtrack)"
MIDI_Instrument$ (98) = "FX 3 (crystal)"
MIDI_Instrument$ (99) = "FX 4 (atmosphere)"
MIDI_Instrument$ (100) = "FX 5 (brightness)"
MIDI_Instrument$ (101) = "FX 6 (goblins)"
MIDI_Instrument$ (102) = "FX 7 (echoes)"
MIDI_Instrument$ (103) = "FX 8 (sci-fi)"
MIDI_Instrument$ (104) = "Sitar"
MIDI_Instrument$ (105) = "Banjo"
MIDI_Instrument$ (106) = "Shamisen"
MIDI_Instrument$ (107) = "Koto"
MIDI_Instrument$ (108) = "Kalimba"
MIDI_Instrument$ (109) = "Bag pipe"
MIDI_Instrument$ (110) = "Fiddle"
MIDI_Instrument$ (111) = "Shanai"
MIDI_Instrument$ (112) = "Tinkle Bell"
MIDI_Instrument$ (113) = "Agogo"
MIDI_Instrument$ (114) = "Steel Drums"
MIDI_Instrument$ (115) = "Woodblock"
MIDI_Instrument$ (116) = "Taiko Drum"
MIDI_Instrument$ (117) = "Melodic Tom"
MIDI_Instrument$ (118) = "Synth Drum"
MIDI_Instrument$ (119) = "Reverse Cymbal"
MIDI_Instrument$ (120) = "Guitar Fret Noise"
MIDI_Instrument$ (121) = "Breath Noise"
MIDI_Instrument$ (122) = "Seashore"
MIDI_Instrument$ (123) = "Bird Tweet"
MIDI_Instrument$ (124) = "Telephone Ring"
MIDI_Instrument$ (125) = "Helicopter"
MIDI_Instrument$ (126) = "Applause"
MIDI_Instrument$ (127) = "Gunshot"



; Percussions MIDI : la c'est différent : jouer SUR LE CANAL 10** la note 35 : 
; fera entendre un coup d'Acoustic Bass Drum, la note 36 un coup de Bass Drum 1, etc.
; ** le canal 10 des musiciens est le canal 9 en informatique !!!

Global Dim MIDI_PERCU$(82)

MIDI_PERCU$ (35) = "Acoustic Bass Drum"
MIDI_PERCU$ (36) = "Bass Drum 1"
MIDI_PERCU$ (37) = "Side Stick"
MIDI_PERCU$ (38) = "Acoustic Snare"
MIDI_PERCU$ (39) = "Hand Clap"
MIDI_PERCU$ (40) = "Electric Snare"
MIDI_PERCU$ (41) = "Low Floor Tom"
MIDI_PERCU$ (42) = "Closed Hi Hat"
MIDI_PERCU$ (43) = "High Floor Tom"
MIDI_PERCU$ (44) = "Pedal Hi-Hat"
MIDI_PERCU$ (45) = "Low Tom"
MIDI_PERCU$ (46) = "Open Hi-Hat"
MIDI_PERCU$ (47) = "Low-Mid Tom"
MIDI_PERCU$ (48) = "Hi-Mid Tom"
MIDI_PERCU$ (49) = "Crash Cymbal 1"
MIDI_PERCU$ (50) = "High Tom"
MIDI_PERCU$ (51) = "Ride Cymbal 1"
MIDI_PERCU$ (52) = "Chinese Cymbal"
MIDI_PERCU$ (53) = "Ride Bell"
MIDI_PERCU$ (54) = "Tambourine"
MIDI_PERCU$ (55) = "Splash Cymbal"
MIDI_PERCU$ (56) = "Cowbell"
MIDI_PERCU$ (57) = "Crash Cymbal 2"
MIDI_PERCU$ (58) = "Vibraslap"
MIDI_PERCU$ (59) = "Ride Cymbal 2"
MIDI_PERCU$ (60) = "Hi Bongo"
MIDI_PERCU$ (61) = "Low Bongo"
MIDI_PERCU$ (62) = "Mute Hi Conga"
MIDI_PERCU$ (63) = "Open Hi Conga"
MIDI_PERCU$ (64) = "Low Conga"
MIDI_PERCU$ (65) = "High Timbale"
MIDI_PERCU$ (66) = "Low Timbale"
MIDI_PERCU$ (67) = "High Agogo"
MIDI_PERCU$ (68) = "Low Agogo"
MIDI_PERCU$ (69) = "Cabasa"
MIDI_PERCU$ (70) = "Maracas"
MIDI_PERCU$ (71) = "Short Whistle"
MIDI_PERCU$ (72) = "Long Whistle"
MIDI_PERCU$ (73) = "Short Guiro"
MIDI_PERCU$ (74) = "Long Guiro"
MIDI_PERCU$ (75) = "Claves"
MIDI_PERCU$ (76) = "Hi Wood Block"
MIDI_PERCU$ (77) = "Low Wood Block"
MIDI_PERCU$ (78) = "Mute Cuica"
MIDI_PERCU$ (79) = "Open Cuica"
MIDI_PERCU$ (80) = "Mute Triangle"
MIDI_PERCU$ (81) = "Open Triangle"


; Percussions MIDI : la même chose avec un tableau plus petit jouer sur le canal 10 la note 35+0 : 
; fera entendre un coup d'Acoustic Bass Drum, 
; la note 35+1 un coup de Bass Drum 1, etc. 

Global Dim MIDI_PERCU_OFFSET$(47)

MIDI_PERCU_OFFSET$ (0) = "Acoustic Bass Drum"
MIDI_PERCU_OFFSET$ (1) = "Bass Drum 1"
MIDI_PERCU_OFFSET$ (2) = "Side Stick"
MIDI_PERCU_OFFSET$ (3) = "Acoustic Snare"
MIDI_PERCU_OFFSET$ (4) = "Hand Clap"
MIDI_PERCU_OFFSET$ (5) = "Electric Snare"
MIDI_PERCU_OFFSET$ (6) = "Low Floor Tom"
MIDI_PERCU_OFFSET$ (7) = "Closed Hi Hat"
MIDI_PERCU_OFFSET$ (8) = "High Floor Tom"
MIDI_PERCU_OFFSET$ (9) = "Pedal Hi-Hat"
MIDI_PERCU_OFFSET$ (10) = "Low Tom"
MIDI_PERCU_OFFSET$ (11) = "Open Hi-Hat"
MIDI_PERCU_OFFSET$ (12) = "Low-Mid Tom"
MIDI_PERCU_OFFSET$ (13) = "Hi-Mid Tom"
MIDI_PERCU_OFFSET$ (14) = "Crash Cymbal 1"
MIDI_PERCU_OFFSET$ (15) = "High Tom"
MIDI_PERCU_OFFSET$ (16) = "Ride Cymbal 1"
MIDI_PERCU_OFFSET$ (17) = "Chinese Cymbal"
MIDI_PERCU_OFFSET$ (18) = "Ride Bell"
MIDI_PERCU_OFFSET$ (19) = "Tambourine"
MIDI_PERCU_OFFSET$ (20) = "Splash Cymbal"
MIDI_PERCU_OFFSET$ (21) = "Cowbell"
MIDI_PERCU_OFFSET$ (22) = "Crash Cymbal 2"
MIDI_PERCU_OFFSET$ (23) = "Vibraslap"
MIDI_PERCU_OFFSET$ (24) = "Ride Cymbal 2"
MIDI_PERCU_OFFSET$ (25) = "Hi Bongo"
MIDI_PERCU_OFFSET$ (26) = "Low Bongo"
MIDI_PERCU_OFFSET$ (27) = "Mute Hi Conga"
MIDI_PERCU_OFFSET$ (28) = "Open Hi Conga"
MIDI_PERCU_OFFSET$ (29) = "Low Conga"
MIDI_PERCU_OFFSET$ (30) = "High Timbale"
MIDI_PERCU_OFFSET$ (31) = "Low Timbale"
MIDI_PERCU_OFFSET$ (32) = "High Agogo"
MIDI_PERCU_OFFSET$ (33) = "Low Agogo"
MIDI_PERCU_OFFSET$ (34) = "Cabasa"
MIDI_PERCU_OFFSET$ (35) = "Maracas"
MIDI_PERCU_OFFSET$ (36) = "Short Whistle"
MIDI_PERCU_OFFSET$ (37) = "Long Whistle"
MIDI_PERCU_OFFSET$ (38) = "Short Guiro"
MIDI_PERCU_OFFSET$ (39) = "Long Guiro"
MIDI_PERCU_OFFSET$ (40) = "Claves"
MIDI_PERCU_OFFSET$ (41) = "Hi Wood Block"
MIDI_PERCU_OFFSET$ (42) = "Low Wood Block"
MIDI_PERCU_OFFSET$ (43) = "Mute Cuica"
MIDI_PERCU_OFFSET$ (44) = "Open Cuica"
MIDI_PERCU_OFFSET$ (45) = "Mute Triangle"
MIDI_PERCU_OFFSET$ (46) = "Open Triangle"

Global Dim Nom_Note$(12)
Nom_Note$(0) = "Do"
Nom_Note$(1) = "Do#"
Nom_Note$(2) = "Ré"
Nom_Note$(3) = "Mib"
Nom_Note$(4) = "Mi"
Nom_Note$(5) = "Fa"
Nom_Note$(6) = "Fa#"
Nom_Note$(7) = "Sol"
Nom_Note$(8) = "Lab"
Nom_Note$(9) = "La"
Nom_Note$(10) = "Sib"
Nom_Note$(11) = "Si"



; ************ ÉNUMÉRATIONS *************
Enumeration Window
  #mf
  #mf2
  #mf3
  #BLANK
EndEnumeration


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 0 = 127
Global Velo.b = 100
Global index, instrument, Index
Global Chann.l = 0
Global Inst.b = 80
Global Index_gam.b = 0
Global Index_Ton.b = 0
Global IDX_LAN = 0, IDX_TON = 0, IDX_GAM = 0, IDX_INS = 0, A$, j, Te_Ga
;}


;/// INTERFACE UTILISATEUR (FENETRE, MENU, ETC ...)
#LA_FEN = 900
#HA_FEN = 600

Global Event, GA_SAV, TREAD


;/// 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 Midi_Note_On(Chann, Note.b,VelociteUp)
Declare Midi_Note_Off(Chann, Note.b,VelociteUp)
Declare Midi_CtrlChange( Chann.b, Ctrl.b, Value.b) ; envoie un Ctrl change voir la table des CC ici
                                                   ; https://fr.audiofanzine.com/mao/editorial/dossiers/le-midi-les-midi-control-change.html
Declare Midi_PitchBend(Chann, pitch.b)

; Fonctions raccourcies...

; jouer sans représier à chaque fois le canal...

Declare PMidi_ChargeInstrument(Instrument.b)
Declare PMidi_PlayNote(Note.b,VelociteDown.b,VelociteUp.b)
Declare PMidi_SendMessage(nStatus.l,nData1.l,nData2.l)
Declare PMidi_Note_On(Note.b,VelociteUp)
Declare PMidi_Note_Off(Note.b,VelociteUp)
Declare PMidi_CtrlChange(  Ctrl.b, Value.b) ; envoie un Ctrl change voir la table des CC ici
                                            ; https://fr.audiofanzine.com/mao/editorial/dossiers/le-midi-les-midi-control-change.html
Declare PMidi_PitchBend( pitch.b)

; jouer directement les percussions
Declare Bat_Note( i.b, Velo.b) 
Declare Arpege(baba.i)

; À vous de jouer ! et de créer des fonction raccourcies

Global RD_G = 0, RD_T= 0, RD_V=0, RD_I = 0
Global fontid
Global i.b
Global PChann.b = 0
Global short = 1 ; -1 version longue, 1 version courte
Global Version

;/////// Ca commence ici


; Ouverture de la fenetre
If OpenWindow(#mf, 0, 0, #LA_FEN, #HA_FEN, "DEMO MIDI",  #PB_Window_ScreenCentered | #PB_Window_TitleBar | #PB_Window_SystemMenu)
  
  LoadFont(0,"arial.ttf", 24)
  SetGadgetFont(#PB_Default, FontID(0))
  SetWindowColor(#mf, RGB(70, 70, 70))
  
  Te_Ga = TextGadget(#PB_Any, 15, 25, 810, 38, "") ;) ;, Y, Largeur, Hauteur,
  SetGadgetColor(Te_Ga, #PB_Gadget_BackColor , RGB(70, 70, 70))
  SetGadgetColor(Te_Ga, #PB_Gadget_FrontColor , RGB(70, 70, 0))
  SetGadgetFont(Te_Ga, FontID(0))
  SetGadgetColor(Te_Ga, #PB_Gadget_FrontColor , RGB(255, 217, 0))
  ;SetGadgetColor(Te_Ga, #PB_Gadget_BackColor , RGB(70, 70, 70))
  
  
  Midi_Open()
  
  ;  Arpege(baba.i)
  TREAD = CreateThread(@Arpege(), 1)
  
  Midi_ChargeInstrument(Chann,0)
  Midi_CtrlChange(0, 7, 127) ;;Midi_SendMessage($B0 ,0, 7, 127) ; Volume Max !
  Velo = 100
  PChann = 0
  
  Short = -1
  Version = MessageRequester("Choix Version", "Passer à la version courte ?",#PB_MessageRequester_YesNo) 
  If Version = #PB_MessageRequester_Yes 
    Short = 1
  EndIf
  
  If short >0  ; Si Short > 0 on passe à la version courte des procedures
    Goto Label
  EndIf
  ;
  ; NOTES
  
  
  For i = 48 To 60                                 ; (gamme chromatique de Do)
    SetGadgetText(Te_Ga, "Note : "+ Str(i) + " ("+Nom_Note$(i%11)+")")
    Midi_PlayNote(Chann, i, 0,Velo) ; Do isolé
    
    Delay(500)
    
    Midi_SendMessage($B0 ,0,123,0) ; All notes off
    
    Delay(100)
  Next
  
  ;   KillThread(TREAD)
  ;   Midi_SendMessage($B2 ,0,123,0) ; All notes off
  ;
  ; Velocité
  
  Midi_SendMessage($B0 ,0, 7, 127) ; Volume Max !
  For velo = 47 To 127 Step 5      ; (gamme chromatique de Do)
    SetGadgetText(Te_Ga, "Vélocité : "+Str(velo))
    
    Midi_PlayNote(Chann, 48, 0,Velo) ; Do isolé
    
    Delay(500)
    
    Midi_PlayNote(Chann, 48, 0,Velo) ; accord de Do Majeur
    Midi_PlayNote(Chann, 52, 0,Velo)
    Midi_PlayNote(Chann, 55, 0,Velo)
    
    Delay(500) ; on laisse sonner l'accord
    
    Midi_SendMessage($B0 ,0,123,0) ; All notes off
    Delay(100)
  Next
  
  Velo = 100
  ;   
  ; Volume joue un Do puis un accord de Do Majeur
  ;  Velo = 100
  For i= 50 To 125 Step 5
    SetGadgetText(Te_Ga, "Volume : "+Str(i))
    Midi_CtrlChange( Chann, 7, i) ;  Volume = Controleur numéro 7
    Midi_PlayNote(Chann, 48, 0,Velo) ; Do isolé
    
    Delay(500)
    
    Midi_PlayNote(Chann, 48, 0,Velo) ; accord de Do Majeur
    Midi_PlayNote(Chann, 52, 0,Velo)
    Midi_PlayNote(Chann, 55, 0,Velo)
    
    Delay(500) ; on laisse sonner l'accord
    
    Midi_SendMessage($B0 ,0,123,0) ; All notes off
    
    Delay(100)
  Next
  KillThread(TREAD)
  Midi_SendMessage($B2 ,0,123,0) ; All notes off
  
  ; Instruments normaux
  ; joue un Do puis un accord de Do Majeur
  
  For i= 0 To 127 
    SetGadgetText(Te_Ga, "Instrument : "+ Str(i) + " [" + MIDI_Instrument$(i) + "]")
    
    Midi_ChargeInstrument(Chann, i)
    Midi_PlayNote(Chann, 48, 0,Velo) ; Do isolé
    
    Delay(500)
    
    Midi_PlayNote(Chann, 48, 0,Velo) ; accord de Do Majeur
    Midi_PlayNote(Chann, 52, 0,Velo)
    Midi_PlayNote(Chann, 55, 0,Velo)
    
    Delay(1000) ; on laisse sonner l'accord
    
    Midi_SendMessage($B0 ! chann ,0,123,0) ; All notes off
    
    Delay(100)
  Next
  
  ;  Note tenue
  
  Midi_ChargeInstrument(Chann,51)
  Midi_CtrlChange( Chann, 7, 120) ; CTR 7 : volume
  
  ;
  A$ = "1920"
  For i = 1 To 6
    SetGadgetText(Te_Ga, "Patience : "+ A$ + " millisecondes dont 1920 d'effets")
    
    Midi_Note_On(Chann, 60, Velo)
    ; Midi_PlayNote(Chann, 48, 0,Velo)
    For j = 1 To 121 Step 10
      Midi_PitchBend( Chann, j) ; Pitch bend
      Midi_CtrlChange(chann, 1, j)  ; CTRL 1 = Mod wheel
      Delay (80)
    Next
    For j = 121 To 1 Step -10
      Midi_PitchBend( Chann, j) ; Pitch bend
      Midi_CtrlChange(chann, 1, j)  ; CTRL 1 = Mod wheel
      Delay (80)
    Next
    If (800*i-12*160) > 0
      Delay(800* i- 12*160)
      A$ = Str(800*i)
    EndIf
    
    Midi_Note_Off(Chann, 60, Velo)
    Delay(250)
  Next
  
  ;  Percussions... CANL 10 MIDI = Canal 9 pour nous !
  Chann.l = 9
  Midi_SendMessage($B9 ,0, 7, 127)
  
  For i= 35 To 81 
    SetGadgetText(Te_Ga, "Percussions : "+ Str(i) + " [" + MIDI_PERCU$(i) + "]")
    Midi_PlayNote(Chann, i, 0,Velo) 
    Delay(500)
    Midi_SendMessage($B9 ,0,123,0) ; All notes off
  Next
  
  Goto Label2
  
  
  Label:
  
  
  PMidi_CtrlChange( 7, 120)  ; Volume Max !
                             ; Note
  PMidi_ChargeInstrument(1)
  
  For i = 48 To 60                                 ; (gamme chromatique de Do)
    SetGadgetText(Te_Ga, "P-Note : "+ Str(i) + " ("+Nom_Note$(i%11)+")")
    PMidi_PlayNote(i, 0,Velo) ; Do isolé
    
    Delay(500)
    
    PMidi_SendMessage(0,123,0) ; All notes off
    Delay(100)
  Next
  
  ;   
  ; Velocité   
  ; Label:
  PChann.b = 0
  PMidi_CtrlChange( 7, 120)  ; Volume Max !
  For Velo = 47 To 125 Step 5; (gamme chromatique de Do)
    SetGadgetText(Te_Ga, "P-Vélocité : "+Str(velo))
    
    PMidi_PlayNote(48, 0,Velo) ; Do isolé
    
    Delay(500)
    
    PMidi_PlayNote( 48, 0,Velo) ; accord de Do Majeur
    PMidi_PlayNote( 52, 0,Velo)
    PMidi_PlayNote( 55, 0,Velo)
    
    Delay(500) ; on laisse sonner l'accord
    
    PMidi_SendMessage(0,123,0) ; All notes off
    Delay(100)
  Next
  Velo = 100
  
  KillThread(TREAD)
  Midi_SendMessage($B2 ,0,123,0) ; All notes off
  
  ; Volume joue un Do puis un accord de Do Majeur
  
  For i= 50 To 125 Step 5
    PMidi_CtrlChange(  7, i) ; ctrl 7 :volume
    SetGadgetText(Te_Ga, "P-Volume : "+Str(i))
    ;PMidi_CtrlChange( Chann, 7, 120) ; Midi_CtrlChange(0, 7, i) ;  Volume = Controleur numéro 7
    PMidi_PlayNote(48, 0,Velo) ; Do isolé
    
    Delay(500)
    
    PMidi_PlayNote(48, 0,Velo) ; accord de Do Majeur
    PMidi_PlayNote(52, 0,Velo)
    PMidi_PlayNote(55, 0,Velo)
    
    Delay(500) ; on laisse sonner l'accord
    
    PMidi_SendMessage(0,123,0) ; All notes off
    
    Delay(100)
  Next
  
  ; Instruments normaux
  ; joue un Do puis un accord de Do Majeur
  
  For i= 0 To 127 
    SetGadgetText(Te_Ga, "P-Instrument : "+ Str(i) + " [" + MIDI_Instrument$(i) + "]")
    
    PMidi_ChargeInstrument(i)
    PMidi_PlayNote(48, 0,Velo) ; Do isolé
    
    Delay(500)
    
    PMidi_PlayNote(48, 0,Velo) ; accord de Do Majeur
    PMidi_PlayNote(52, 0,Velo)
    PMidi_PlayNote(55, 0,Velo)
    
    Delay(1000) ; on laisse sonner l'accord
    
    PMidi_SendMessage(0,123,0) ; All notes off
    
    Delay(100)
  Next
  
  PMidi_ChargeInstrument(51)
  PMidi_SendMessage(0,123,0) ; All notes off
  
  ;
  
  A$ = "1920"
  For i = 1 To 6
    SetGadgetText(Te_Ga, "P-Patience : "+ A$ + " millisecondes dont 1920 d'effets")
    
    PMidi_Note_On( 60, Velo)
    
    For j = 1 To 121 Step 10
      PMidi_PitchBend(  j) ; Pitch bend
      PMidi_CtrlChange( 1, j)  ; CTRL 1 = Mod wheel
      Delay (80)
    Next
    For j = 121 To 1 Step -10
      PMidi_PitchBend(  j) ; Pitch bend
      PMidi_CtrlChange( 1, j)  ; CTRL 1 = Mod wheel
      Delay (80)
    Next
    If (800*i-12*160) > 0
      Delay(800* i- 12*160)
      A$ = Str(800*i)
    EndIf
    
    PMidi_Note_Off( 60, Velo)
    Delay(250)
  Next
  ;   
  
  ;  Percussions... CANL 10 MIDI = Canal 9 pour nous ! On utilise le tableau avec offset
  Pchann = 9
  PMidi_SendMessage(0, 7, 127) ; Volume au max !
  
  For i= 0 To 46 
    SetGadgetText(Te_Ga, "P-Percussions : "+ Str(i) + " --> (" + Str(35+i) + ")  " + "[" + MIDI_PERCU_OFFSET$ (i) + "]")
    PMidi_PlayNote(35+i, 0,Velo) 
    Delay(500)
    Midi_SendMessage($B9 ,0,123,0) ; All notes off
  Next
  
  PChann = 0 
  For i= 0 To 46 
    SetGadgetText(Te_Ga, "B-Percussions : "+ Str(i) + "  " + "[" + MIDI_PERCU_OFFSET$ (i) + "]")
    ; PMidi_PlayNote(35+i, 0,Velo) 
    Bat_Note(i,Velo)
    Delay(500)
    PMidi_SendMessage(0,123,0) ; All notes off
  Next
  
  
  
  Velo = 127
  For i= 40 To 56 
    SetGadgetText(Te_Ga, "Mélange Batterie/Note : "+ Str(i) )
    PMidi_PlayNote(i, 0,Velo-80) 
    Delay(200)
    Bat_Note(i,Velo)
    Delay(500)
    Midi_SendMessage($B9 ,0,123,0) ; All notes off
  Next
  ;   
  Label2:
  
EndIf
End


;- Procédures


Procedure Bat_Note( i.b, Velo.b)
  Protected cchan = Pchann
  Pchann = 9
  PMidi_PlayNote(35+i, 0,Velo) 
  PChann = cchan
EndProcedure

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 PMidi_SendMessage(nStatus.l,nData1.l,nData2.l)
  Midi_SendMessage(nStatus.l,$B0|Pchann,nData1.l,nData2.l)
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)
      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_Note_Off(Canal, Note, VelociteUp)
    Midi_Note_On(Canal, Note, VelociteUp)
    
  EndIf    
  
EndProcedure

Procedure PMidi_PlayNote(Note.b,VelociteDown.b,VelociteUp.b)
  Midi_PlayNote(PChann,Note.b,VelociteDown.b,VelociteUp.b)   
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 PMidi_ChargeInstrument(Instrument.b)
  Midi_ChargeInstrument(Pchann,Instrument.b)
EndProcedure

Procedure Midi_Note_On(Chann, Note.b ,VelociteUp)
  If m_MIDIOpen = 0
    Midi_Open()
  EndIf
  If m_MIDIOpen = 1
    Midi_SendMessage($90 | Chann, 0, Note, VelociteUp)
  EndIf    
EndProcedure
Procedure PMidi_Note_On(Note.b,VelociteUp)
  Midi_Note_On(PChann, Note.b,VelociteUp) 
EndProcedure
Procedure Midi_Note_Off(Chann, Note.b,VelociteUp)
  
  
  If m_MIDIOpen = 0
    Midi_Open()
  EndIf
  If m_MIDIOpen = 1
    Midi_SendMessage($80 | Chann, 0, Note, VelociteUp)
  EndIf    
EndProcedure

Procedure PMidi_Note_Off(Note.b,VelociteUp)
  Midi_Note_Off(PChann, Note.b,VelociteUp) 
  
EndProcedure

Procedure Midi_CtrlChange( Chann.b, Ctrl.b, Value.b)
  
  Midi_SendMessage($B0|Chann, 0, Ctrl, Value)
EndProcedure

Procedure PMidi_CtrlChange( Ctrl.b, Value.b)
  
  Midi_CtrlChange(Pchann,  Ctrl, Value)
EndProcedure

Procedure Midi_PitchBend(Chann, pitch.b) 
  Midi_SendMessage($E0|Chann, 0, 0, Pitch)
EndProcedure

Procedure PMidi_PitchBend( pitch.b) 
  Midi_SendMessage($E0|Pchann, 0, 0, Pitch)
EndProcedure

Procedure Arpege(baba.i)
  Protected canal.b, velo.b, inst, i, delais
  canal = 2
  velo = 60
  inst = 52
  delais = 500
  Midi_ChargeInstrument(2,inst)
  Midi_CtrlChange(2, 7, 80) 
  
  Repeat
    Midi_Note_On(2, 60 ,velo)
    Delay(delais)
    Midi_Note_On(2, 64 ,velo)
    Delay(delais)
    Midi_Note_On(2, 67 ,velo)
    Delay(delais*4)
    Midi_SendMessage($B2 ,0,123,0) ; All notes off
  ForEver
  
EndProcedure
Stan_fr
Messages : 84
Inscription : mar. 07/mars/2023 20:01
Localisation : NANTES

Re: Il est MIDI 😉

Message par Stan_fr »

Un requester personnalisé : :wink:

Code : Tout sélectionner

EnableExplicit 

;{ DEÉCLARATIONS
; Nom des instruments GENERAL MIDI : un changement d'instrument SUR UN CANAL 
; AUTRE QUE LE 10, fera jouer ce son sur la canal pour les notes suivantes.

Global Dim MIDI_Instrument$(129)

MIDI_Instrument$ (0) = "Acoustic Grand Piano"
MIDI_Instrument$ (1) = "Bright Acoustic Piano"
MIDI_Instrument$ (2) = "Electric Grand Piano"
MIDI_Instrument$ (3) = "Honky-tonk Piano"
MIDI_Instrument$ (4) = "Electric Piano 1"
MIDI_Instrument$ (5) = "Electric Piano 2"
MIDI_Instrument$ (6) = "Harpsichord"
MIDI_Instrument$ (7) = "Clavi"
MIDI_Instrument$ (8) = "Celesta"
MIDI_Instrument$ (9) = "Glockenspiel"
MIDI_Instrument$ (10) = "Music Box"
MIDI_Instrument$ (11) = "Vibraphone"
MIDI_Instrument$ (12) = "Marimba"
MIDI_Instrument$ (13) = "Xylophone"
MIDI_Instrument$ (14) = "Tubular Bells"
MIDI_Instrument$ (15) = "Dulcimer"
MIDI_Instrument$ (16) = "Drawbar Organ"
MIDI_Instrument$ (17) = "Percussive Organ"
MIDI_Instrument$ (18) = "Rock Organ"
MIDI_Instrument$ (19) = "Church Organ"
MIDI_Instrument$ (20) = "Reed Organ"
MIDI_Instrument$ (21) = "Accordion"
MIDI_Instrument$ (22) = "Harmonica"
MIDI_Instrument$ (23) = "Tango Accordion"
MIDI_Instrument$ (24) = "Acoustic Guitar (nylon)"
MIDI_Instrument$ (25) = "Acoustic Guitar (steel)"
MIDI_Instrument$ (26) = "Electric Guitar (jazz)"
MIDI_Instrument$ (27) = "Electric Guitar (clean)"
MIDI_Instrument$ (28) = "Electric Guitar (muted)"
MIDI_Instrument$ (29) = "Overdriven Guitar"
MIDI_Instrument$ (30) = "Distortion Guitar"
MIDI_Instrument$ (31) = "Guitar harmonics"
MIDI_Instrument$ (32) = "Acoustic Bass"
MIDI_Instrument$ (33) = "Electric Bass (finger)"
MIDI_Instrument$ (34) = "Electric Bass (pick)"
MIDI_Instrument$ (35) = "Fretless Bass"
MIDI_Instrument$ (36) = "Slap Bass 1"
MIDI_Instrument$ (37) = "Slap Bass 2"
MIDI_Instrument$ (38) = "Synth Bass 1"
MIDI_Instrument$ (39) = "Synth Bass 2"
MIDI_Instrument$ (40) = "Violin"
MIDI_Instrument$ (41) = "Viola"
MIDI_Instrument$ (42) = "Cello"
MIDI_Instrument$ (43) = "Contrabass"
MIDI_Instrument$ (44) = "Tremolo Strings"
MIDI_Instrument$ (45) = "Pizzicato Strings"
MIDI_Instrument$ (46) = "Orchestral Harp"
MIDI_Instrument$ (47) = "Timpani"
MIDI_Instrument$ (48) = "String Ensemble 1"
MIDI_Instrument$ (49) = "String Ensemble 2"
MIDI_Instrument$ (50) = "SynthStrings 1"
MIDI_Instrument$ (51) = "SynthStrings 2"
MIDI_Instrument$ (52) = "Choir Aahs"
MIDI_Instrument$ (53) = "Voice Oohs"
MIDI_Instrument$ (54) = "Synth Voice"
MIDI_Instrument$ (55) = "Orchestra Hit"
MIDI_Instrument$ (56) = "Trumpet"
MIDI_Instrument$ (57) = "Trombone"
MIDI_Instrument$ (58) = "Tuba"
MIDI_Instrument$ (59) = "Muted Trumpet"
MIDI_Instrument$ (60) = "French Horn"
MIDI_Instrument$ (61) = "Brass Section"
MIDI_Instrument$ (62) = "SynthBrass 1"
MIDI_Instrument$ (63) = "SynthBrass 2"
MIDI_Instrument$ (64) = "Soprano Sax"
MIDI_Instrument$ (65) = "Alto Sax"
MIDI_Instrument$ (66) = "Tenor Sax"
MIDI_Instrument$ (67) = "Baritone Sax"
MIDI_Instrument$ (68) = "Oboe"
MIDI_Instrument$ (69) = "English Horn"
MIDI_Instrument$ (70) = "Bassoon"
MIDI_Instrument$ (71) = "Clarinet"
MIDI_Instrument$ (72) = "Piccolo"
MIDI_Instrument$ (73) = "Flute"
MIDI_Instrument$ (74) = "Recorder"
MIDI_Instrument$ (75) = "Pan Flute"
MIDI_Instrument$ (76) = "Blown Bottle"
MIDI_Instrument$ (77) = "Shakuhachi"
MIDI_Instrument$ (78) = "Whistle"
MIDI_Instrument$ (79) = "Ocarina"
MIDI_Instrument$ (80) = "Lead 1 (square)"
MIDI_Instrument$ (81) = "Lead 2 (sawtooth)"
MIDI_Instrument$ (82) = "Lead 3 (calliope)"
MIDI_Instrument$ (83) = "Lead 4 (chiff)"
MIDI_Instrument$ (84) = "Lead 5 (charang)"
MIDI_Instrument$ (85) = "Lead 6 (voice)"
MIDI_Instrument$ (86) = "Lead 7 (fifths)"
MIDI_Instrument$ (87) = "Lead 8 (bass + lead)"
MIDI_Instrument$ (88) = "Pad 1 (new age)"
MIDI_Instrument$ (89) = "Pad 2 (warm)"
MIDI_Instrument$ (90) = "Pad 3 (polysynth)"
MIDI_Instrument$ (91) = "Pad 4 (choir)"
MIDI_Instrument$ (92) = "Pad 5 (bowed)"
MIDI_Instrument$ (93) = "Pad 6 (metallic)"
MIDI_Instrument$ (94) = "Pad 7 (halo)"
MIDI_Instrument$ (95) = "Pad 8 (sweep)"
MIDI_Instrument$ (96) = "FX 1 (rain)"
MIDI_Instrument$ (97) = "FX 2 (soundtrack)"
MIDI_Instrument$ (98) = "FX 3 (crystal)"
MIDI_Instrument$ (99) = "FX 4 (atmosphere)"
MIDI_Instrument$ (100) = "FX 5 (brightness)"
MIDI_Instrument$ (101) = "FX 6 (goblins)"
MIDI_Instrument$ (102) = "FX 7 (echoes)"
MIDI_Instrument$ (103) = "FX 8 (sci-fi)"
MIDI_Instrument$ (104) = "Sitar"
MIDI_Instrument$ (105) = "Banjo"
MIDI_Instrument$ (106) = "Shamisen"
MIDI_Instrument$ (107) = "Koto"
MIDI_Instrument$ (108) = "Kalimba"
MIDI_Instrument$ (109) = "Bag pipe"
MIDI_Instrument$ (110) = "Fiddle"
MIDI_Instrument$ (111) = "Shanai"
MIDI_Instrument$ (112) = "Tinkle Bell"
MIDI_Instrument$ (113) = "Agogo"
MIDI_Instrument$ (114) = "Steel Drums"
MIDI_Instrument$ (115) = "Woodblock"
MIDI_Instrument$ (116) = "Taiko Drum"
MIDI_Instrument$ (117) = "Melodic Tom"
MIDI_Instrument$ (118) = "Synth Drum"
MIDI_Instrument$ (119) = "Reverse Cymbal"
MIDI_Instrument$ (120) = "Guitar Fret Noise"
MIDI_Instrument$ (121) = "Breath Noise"
MIDI_Instrument$ (122) = "Seashore"
MIDI_Instrument$ (123) = "Bird Tweet"
MIDI_Instrument$ (124) = "Telephone Ring"
MIDI_Instrument$ (125) = "Helicopter"
MIDI_Instrument$ (126) = "Applause"
MIDI_Instrument$ (127) = "Gunshot"



; Percussions MIDI : la c'est différent : jouer SUR LE CANAL 10** la note 35 : 
; fera entendre un coup d'Acoustic Bass Drum, la note 36 un coup de Bass Drum 1, etc.
; ** le canal 10 des musiciens est le canal 9 en informatique !!!

Global Dim MIDI_PERCU$(82)

MIDI_PERCU$ (35) = "Acoustic Bass Drum"
MIDI_PERCU$ (36) = "Bass Drum 1"
MIDI_PERCU$ (37) = "Side Stick"
MIDI_PERCU$ (38) = "Acoustic Snare"
MIDI_PERCU$ (39) = "Hand Clap"
MIDI_PERCU$ (40) = "Electric Snare"
MIDI_PERCU$ (41) = "Low Floor Tom"
MIDI_PERCU$ (42) = "Closed Hi Hat"
MIDI_PERCU$ (43) = "High Floor Tom"
MIDI_PERCU$ (44) = "Pedal Hi-Hat"
MIDI_PERCU$ (45) = "Low Tom"
MIDI_PERCU$ (46) = "Open Hi-Hat"
MIDI_PERCU$ (47) = "Low-Mid Tom"
MIDI_PERCU$ (48) = "Hi-Mid Tom"
MIDI_PERCU$ (49) = "Crash Cymbal 1"
MIDI_PERCU$ (50) = "High Tom"
MIDI_PERCU$ (51) = "Ride Cymbal 1"
MIDI_PERCU$ (52) = "Chinese Cymbal"
MIDI_PERCU$ (53) = "Ride Bell"
MIDI_PERCU$ (54) = "Tambourine"
MIDI_PERCU$ (55) = "Splash Cymbal"
MIDI_PERCU$ (56) = "Cowbell"
MIDI_PERCU$ (57) = "Crash Cymbal 2"
MIDI_PERCU$ (58) = "Vibraslap"
MIDI_PERCU$ (59) = "Ride Cymbal 2"
MIDI_PERCU$ (60) = "Hi Bongo"
MIDI_PERCU$ (61) = "Low Bongo"
MIDI_PERCU$ (62) = "Mute Hi Conga"
MIDI_PERCU$ (63) = "Open Hi Conga"
MIDI_PERCU$ (64) = "Low Conga"
MIDI_PERCU$ (65) = "High Timbale"
MIDI_PERCU$ (66) = "Low Timbale"
MIDI_PERCU$ (67) = "High Agogo"
MIDI_PERCU$ (68) = "Low Agogo"
MIDI_PERCU$ (69) = "Cabasa"
MIDI_PERCU$ (70) = "Maracas"
MIDI_PERCU$ (71) = "Short Whistle"
MIDI_PERCU$ (72) = "Long Whistle"
MIDI_PERCU$ (73) = "Short Guiro"
MIDI_PERCU$ (74) = "Long Guiro"
MIDI_PERCU$ (75) = "Claves"
MIDI_PERCU$ (76) = "Hi Wood Block"
MIDI_PERCU$ (77) = "Low Wood Block"
MIDI_PERCU$ (78) = "Mute Cuica"
MIDI_PERCU$ (79) = "Open Cuica"
MIDI_PERCU$ (80) = "Mute Triangle"
MIDI_PERCU$ (81) = "Open Triangle"


; Percussions MIDI : la même chose avec un tableau plus petit jouer sur le canal 10 la note 35+0 : 
; fera entendre un coup d'Acoustic Bass Drum, 
; la note 35+1 un coup de Bass Drum 1, etc. 

Global Dim MIDI_PERCU_OFFSET$(47)

MIDI_PERCU_OFFSET$ (0) = "Acoustic Bass Drum"
MIDI_PERCU_OFFSET$ (1) = "Bass Drum 1"
MIDI_PERCU_OFFSET$ (2) = "Side Stick"
MIDI_PERCU_OFFSET$ (3) = "Acoustic Snare"
MIDI_PERCU_OFFSET$ (4) = "Hand Clap"
MIDI_PERCU_OFFSET$ (5) = "Electric Snare"
MIDI_PERCU_OFFSET$ (6) = "Low Floor Tom"
MIDI_PERCU_OFFSET$ (7) = "Closed Hi Hat"
MIDI_PERCU_OFFSET$ (8) = "High Floor Tom"
MIDI_PERCU_OFFSET$ (9) = "Pedal Hi-Hat"
MIDI_PERCU_OFFSET$ (10) = "Low Tom"
MIDI_PERCU_OFFSET$ (11) = "Open Hi-Hat"
MIDI_PERCU_OFFSET$ (12) = "Low-Mid Tom"
MIDI_PERCU_OFFSET$ (13) = "Hi-Mid Tom"
MIDI_PERCU_OFFSET$ (14) = "Crash Cymbal 1"
MIDI_PERCU_OFFSET$ (15) = "High Tom"
MIDI_PERCU_OFFSET$ (16) = "Ride Cymbal 1"
MIDI_PERCU_OFFSET$ (17) = "Chinese Cymbal"
MIDI_PERCU_OFFSET$ (18) = "Ride Bell"
MIDI_PERCU_OFFSET$ (19) = "Tambourine"
MIDI_PERCU_OFFSET$ (20) = "Splash Cymbal"
MIDI_PERCU_OFFSET$ (21) = "Cowbell"
MIDI_PERCU_OFFSET$ (22) = "Crash Cymbal 2"
MIDI_PERCU_OFFSET$ (23) = "Vibraslap"
MIDI_PERCU_OFFSET$ (24) = "Ride Cymbal 2"
MIDI_PERCU_OFFSET$ (25) = "Hi Bongo"
MIDI_PERCU_OFFSET$ (26) = "Low Bongo"
MIDI_PERCU_OFFSET$ (27) = "Mute Hi Conga"
MIDI_PERCU_OFFSET$ (28) = "Open Hi Conga"
MIDI_PERCU_OFFSET$ (29) = "Low Conga"
MIDI_PERCU_OFFSET$ (30) = "High Timbale"
MIDI_PERCU_OFFSET$ (31) = "Low Timbale"
MIDI_PERCU_OFFSET$ (32) = "High Agogo"
MIDI_PERCU_OFFSET$ (33) = "Low Agogo"
MIDI_PERCU_OFFSET$ (34) = "Cabasa"
MIDI_PERCU_OFFSET$ (35) = "Maracas"
MIDI_PERCU_OFFSET$ (36) = "Short Whistle"
MIDI_PERCU_OFFSET$ (37) = "Long Whistle"
MIDI_PERCU_OFFSET$ (38) = "Short Guiro"
MIDI_PERCU_OFFSET$ (39) = "Long Guiro"
MIDI_PERCU_OFFSET$ (40) = "Claves"
MIDI_PERCU_OFFSET$ (41) = "Hi Wood Block"
MIDI_PERCU_OFFSET$ (42) = "Low Wood Block"
MIDI_PERCU_OFFSET$ (43) = "Mute Cuica"
MIDI_PERCU_OFFSET$ (44) = "Open Cuica"
MIDI_PERCU_OFFSET$ (45) = "Mute Triangle"
MIDI_PERCU_OFFSET$ (46) = "Open Triangle"

Global Dim Nom_Note$(12)
Nom_Note$(0) = "Do"
Nom_Note$(1) = "Do#"
Nom_Note$(2) = "Ré"
Nom_Note$(3) = "Mib"
Nom_Note$(4) = "Mi"
Nom_Note$(5) = "Fa"
Nom_Note$(6) = "Fa#"
Nom_Note$(7) = "Sol"
Nom_Note$(8) = "Lab"
Nom_Note$(9) = "La"
Nom_Note$(10) = "Sib"
Nom_Note$(11) = "Si"



; ************ ÉNUMÉRATIONS *************
Enumeration Window
  #mf
  #mf2
  #mf3
  #BLANK
EndEnumeration


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 0 = 127
Global Velo.b = 100
Global index, instrument, Index
Global Chann.l = 0
Global Inst.b = 80
Global Index_gam.b = 0
Global Index_Ton.b = 0
Global IDX_LAN = 0, IDX_TON = 0, IDX_GAM = 0, IDX_INS = 0, A$, j, Te_Ga
;}


;/// INTERFACE UTILISATEUR (FENETRE, MENU, ETC ...)
#LA_FEN = 900
#HA_FEN = 600

Global Event, GA_SAV, TREAD, tour


;/// 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 Midi_Note_On(Chann, Note.b,VelociteUp)
Declare Midi_Note_Off(Chann, Note.b,VelociteUp)
Declare Midi_CtrlChange( Chann.b, Ctrl.b, Value.b) ; envoie un Ctrl change voir la table des CC ici
                                                   ; https://fr.audiofanzine.com/mao/editorial/dossiers/le-midi-les-midi-control-change.html
Declare Midi_PitchBend(Chann, pitch.b)

; Fonctions raccourcies...

; jouer sans représier à chaque fois le canal...

Declare PMidi_ChargeInstrument(Instrument.b)
Declare PMidi_PlayNote(Note.b,VelociteDown.b,VelociteUp.b)
Declare PMidi_SendMessage(nStatus.l,nData1.l,nData2.l)
Declare PMidi_Note_On(Note.b,VelociteUp)
Declare PMidi_Note_Off(Note.b,VelociteUp)
Declare PMidi_CtrlChange(  Ctrl.b, Value.b) ; envoie un Ctrl change voir la table des CC ici
                                            ; https://fr.audiofanzine.com/mao/editorial/dossiers/le-midi-les-midi-control-change.html
Declare PMidi_PitchBend( pitch.b)

Declare My_requester( a.s, b.s, c.i)

; jouer directement les percussions
Declare Bat_Note( i.b, Velo.b) 
Declare  Arpege(baba.i)
Declare  Arpege2(baba.i)


; À vous de jouer ! et de créer des fonction raccourcies

Global RD_G = 0, RD_T= 0, RD_V=0, RD_I = 0
Global fontid
Global i.b
Global PChann.b = 0
Global short = 1 ; -1 version longue, 1 version courte
Global Version

;/////// Ca commence ici


; Ouverture de la fenetre
If OpenWindow(#mf, 0, 0, #LA_FEN, #HA_FEN, "DEMO MIDI : My Requester",  #PB_Window_ScreenCentered | #PB_Window_TitleBar | #PB_Window_SystemMenu)
  
  LoadFont(0,"arial.ttf", 24)
  SetGadgetFont(#PB_Default, FontID(0))
  SetWindowColor(#mf, RGB(70, 70, 70))
  
  Te_Ga = TextGadget(#PB_Any, 15, 25, 810, 38, "") ;) ;, Y, Largeur, Hauteur,
  SetGadgetColor(Te_Ga, #PB_Gadget_BackColor , RGB(70, 70, 70))
  SetGadgetColor(Te_Ga, #PB_Gadget_FrontColor , RGB(70, 70, 0))
  SetGadgetFont(Te_Ga, FontID(0))
  SetGadgetColor(Te_Ga, #PB_Gadget_FrontColor , RGB(255, 217, 0))
  ;SetGadgetColor(Te_Ga, #PB_Gadget_BackColor , RGB(70, 70, 70))
  
  
  Midi_Open()
  
  ;  Arpege(baba.i)
  TREAD = CreateThread(@Arpege(), 1)
  tour = 0
  Repeat 
    Midi_ChargeInstrument(0,tour)
    Midi_CtrlChange(0, 7, 127) ;;Midi_SendMessage($B0 ,0, 7, 127) ; Volume Max !
    Velo = 100
    PChann = 0
    Delay(1000)
    Short = -1
    ; KillThread(TREAD)
    Version = My_requester("Demo My_requester avec changement d'instruments", "Continuer la démo ? ??",#PB_MessageRequester_YesNo) 
    If Version = #PB_MessageRequester_No
      End
    EndIf
    
    ;
    ; NOTES
    SetGadgetText(Te_Ga, "Instrement : "+ Str(tour) + " [" + MIDI_Instrument$(tour) + "]")
    
    For i = 48 To 54                                 ; (gamme chromatique de Do)
                                                     ; SetGadgetText(Te_Ga, "Instrement : "+ Str(tour) + " [" + MIDI_Instrument$(tour) + "]")
      
      Midi_PlayNote(Chann, i, 0,Velo) ; Do isolé
      
      Delay(500)
      
      Midi_SendMessage($B0 ,0,123,0) ; All notes off
      
      Delay(100)
    Next
    tour = tour + 1
    If tour > 127
      tour = 0
    EndIf
  ForEver
  
  
  
EndIf



;- Procédures


Procedure Bat_Note( i.b, Velo.b)
  Protected cchan = Pchann
  Pchann = 9
  PMidi_PlayNote(35+i, 0,Velo) 
  PChann = cchan
EndProcedure

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 PMidi_SendMessage(nStatus.l,nData1.l,nData2.l)
  Midi_SendMessage(nStatus.l,$B0|Pchann,nData1.l,nData2.l)
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)
      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_Note_Off(Canal, Note, VelociteUp)
    Midi_Note_On(Canal, Note, VelociteUp)
    
  EndIf    
  
EndProcedure

Procedure PMidi_PlayNote(Note.b,VelociteDown.b,VelociteUp.b)
  Midi_PlayNote(PChann,Note.b,VelociteDown.b,VelociteUp.b)   
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 PMidi_ChargeInstrument(Instrument.b)
  Midi_ChargeInstrument(Pchann,Instrument.b)
EndProcedure

Procedure Midi_Note_On(Chann, Note.b ,VelociteUp)
  If m_MIDIOpen = 0
    Midi_Open()
  EndIf
  If m_MIDIOpen = 1
    Midi_SendMessage($90 | Chann, 0, Note, VelociteUp)
  EndIf    
EndProcedure
Procedure PMidi_Note_On(Note.b,VelociteUp)
  Midi_Note_On(PChann, Note.b,VelociteUp) 
EndProcedure
Procedure Midi_Note_Off(Chann, Note.b,VelociteUp)
  
  
  If m_MIDIOpen = 0
    Midi_Open()
  EndIf
  If m_MIDIOpen = 1
    Midi_SendMessage($80 | Chann, 0, Note, VelociteUp)
  EndIf    
EndProcedure

Procedure PMidi_Note_Off(Note.b,VelociteUp)
  Midi_Note_Off(PChann, Note.b,VelociteUp) 
  
EndProcedure

Procedure Midi_CtrlChange( Chann.b, Ctrl.b, Value.b)
  
  Midi_SendMessage($B0|Chann, 0, Ctrl, Value)
EndProcedure

Procedure PMidi_CtrlChange( Ctrl.b, Value.b)
  
  Midi_CtrlChange(Pchann,  Ctrl, Value)
EndProcedure

Procedure Midi_PitchBend(Chann, pitch.b) 
  Midi_SendMessage($E0|Chann, 0, 0, Pitch)
EndProcedure

Procedure PMidi_PitchBend( pitch.b) 
  Midi_SendMessage($E0|Pchann, 0, 0, Pitch)
EndProcedure

Procedure Arpege(baba.i)
  Protected canal.b, velo.b, inst, i, delais
  canal = 2
  velo = 60
  inst = 52
  delais = 500
  Midi_ChargeInstrument(2,inst)
  Midi_CtrlChange(2, 7, 80) 
  
  Repeat
    Midi_Note_On(2, 60 ,velo)
    Delay(delais)
    Midi_Note_On(2, 64 ,velo)
    Delay(delais)
    Midi_Note_On(2, 67 ,velo)
    Delay(delais*4)
    Midi_SendMessage($B2 ,0,123,0) ; All notes off
  ForEver
  
EndProcedure

Procedure Arpege2(baba.i)
  Protected canal.b, velo.b, inst, i, delais, delais2
  canal.b = 3
  velo = 90
  inst = 124
  delais = 500
  delais2 = 400
  Midi_ChargeInstrument(canal,inst)
  Midi_CtrlChange(canal, 7, 120) 
  
  Repeat
    Midi_Note_On(canal, 60 ,velo)
    Delay(delais)
    Midi_Note_Off(canal, 60 ,velo)
    Delay(delais2)
    Midi_Note_On(canal, 60 ,velo)
    Delay(delais)
    Midi_Note_Off(canal, 60 ,velo)
    Midi_Note_On(canal, 60 ,velo)
    Delay(delais2)
    Midi_SendMessage($B|canal ,0,123,0) ; All notes off
  ForEver
  
EndProcedure

Procedure My_requester(a.s,b.s, c.i)
  Protected aa
  
  Protected M_TREAD
  KillThread(TREAD)
  Midi_SendMessage($B2 ,0,123,0) ; All notes off
  M_TREAD = CreateThread(@Arpege2(), 1)
  aa = MessageRequester(a,b,  #PB_MessageRequester_YesNo )
  KillThread(M_TREAD)
  Midi_SendMessage($B3 ,0,123,0) ; All notes of
  TREAD=  CreateThread(@Arpege(), 1)
  ProcedureReturn aa
EndProcedure
Stan_fr
Messages : 84
Inscription : mar. 07/mars/2023 20:01
Localisation : NANTES

Re: Il est MIDI 😉

Message par Stan_fr »

Dans le même ordre d'idée, y-a-t-il un Event qui corresponde au clic sur le titre d'un menu ?

En fait un moyen de savoir si un menu est ouvert par l'utilisateur : parce qu'il semble qu'on a un événement #PB_Event_Menu que si on clique sur un des MenuiItems ?
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Il est MIDI 😉

Message par falsam »

Stan_fr a écrit : sam. 15/avr./2023 2:51 Dans le même ordre d'idée, y-a-t-il un Event qui corresponde au clic sur le titre d'un menu ?
Avec une fonctionnalité PureBasic pas de possibilité de tester le clique sur le titre d'un menu.

Par contre avec avec un peu d'API Windows et PureBasic oui c'est possible dans un callback.

Code : Tout sélectionner

EnableExplicit

Procedure MyCallBack(hwnd, msg, wparam, lparam)
  Protected result = #PB_ProcessPureBasicEvents
  If msg = #WM_INITMENUPOPUP
    Select lparam
      Case 0
        Debug "Click Menu fichier"
      Case 1
        Debug "Click A propos"
    EndSelect
  EndIf
  ProcedureReturn result
EndProcedure


If OpenWindow(0, 0, 0, 800, 600, "Exemple menu")
  SetWindowCallback(@MyCallBack())
  
  UsePNGImageDecoder()
  If CreateImageMenu(0, WindowID(0))
    MenuTitle("Fichier")
    MenuItem(1, "Ouvre"   +Chr(9)+"Ctrl+O", LoadImage(0, #PB_Compiler_Home + "examples/sources/Data/ToolBar/Open.png"))
    MenuItem(2, "Enregistrer sous ..."   +Chr(9)+"Ctrl+S", LoadImage(1, #PB_Compiler_Home + "examples/sources/Data/ToolBar/Save.png"))
    MenuBar()
    MenuItem(3, "Quitter"  +Chr(9)+"Ctrl+Q")
    
    MenuTitle("A propos")
    MenuItem(4, "De moi")
    MenuItem(5, "Me soutenir")
  EndIf
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_Menu
        Debug "-Click item " + GetMenuItemText(0, EventMenu())
        
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver 
EndIf
La question est ? Quel est l'intérêt de tester le clique sur un titre de menu ? 😉
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: Il est MIDI 😉

Message par Stan_fr »

falsam a écrit : sam. 15/avr./2023 10:00
Stan_fr a écrit : sam. 15/avr./2023 2:51 Dans le même ordre d'idée, y-a-t-il un Event qui corresponde au clic sur le titre d'un menu ?
Avec une fonctionnalité PureBasic pas de possibilité de tester le clique sur le titre d'un menu.

Par contre avec avec un peu d'API Windows et PureBasic oui c'est possible dans un callback.

La question est ? Quel est l'intérêt de tester le clique sur un titre de menu ? 😉
Merci pour la solution !

"L'intérêt" serait que quand tu déroules un menu, il y ait une musique MIDI qui joue, comme dans mon requester où on entend une sonnerie de tél tant qu'on a pas répondu...

Bon d'accord c'est sans vrai intérêt à part d'apprendre à mieux utiliser le MIDI avec PUreBasic, et peut-être que dans des jeux...
Stan_fr
Messages : 84
Inscription : mar. 07/mars/2023 20:01
Localisation : NANTES

Re: Il est MIDI 😉

Message par Stan_fr »

falsam a écrit : sam. 15/avr./2023 10:00
Stan_fr a écrit : sam. 15/avr./2023 2:51 Dans le même ordre d'idée, y-a-t-il un Event qui corresponde au clic sur le titre d'un menu ?
Avec une fonctionnalité PureBasic pas de possibilité de tester le clique sur le titre d'un menu.

Par contre avec avec un peu d'API Windows et PureBasic oui c'est possible dans un callback.
La question est ? Quel est l'intérêt de tester le clique sur un titre de menu ? 😉
Où peut-on trouver un bon bouquin sur les API Windows ?

Parce que j'aimerai créer le callback détectant qu'on "relâche" le menu c'est à dire qu'on clique ailleurs que sur un des item du menu.
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Il est MIDI 😉

Message par falsam »

Stan_fr a écrit : sam. 15/avr./2023 11:20 Où peut-on trouver un bon bouquin sur les API Windows ?
■ Incontournable avec des exemples utilisant le langage PureBasic
https://www.rsbasic.de/winapi-library/
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: Il est MIDI 😉

Message par Stan_fr »

falsam a écrit : sam. 15/avr./2023 11:49
Stan_fr a écrit : sam. 15/avr./2023 11:20 Où peut-on trouver un bon bouquin sur les API Windows ?
■ Incontournable avec des exemples utilisant le langage PureBasic
https://www.rsbasic.de/winapi-library/
OK, MERCI !
Répondre