Il est MIDI 😉
Publié : jeu. 13/avr./2023 14:18
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é...).
Quelqu'un aurait une didée ?
"Accessoirement" comment transformer un entier long en une chaine de caractère hexa ?
.
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
"Accessoirement" comment transformer un entier long en une chaine de caractère hexa ?
.