Code : Tout sélectionner
Declare MIDIOpen()
Declare SendMIDIMessage(nStatus.l,nCanal.l,nData1.l,nData2.l)
Declare PlayNoteMIDI(Canal.b,Note.b,VelociteDown.b,VelociteUp.b)
Declare ChargeInstrument(Canal.b,Instrument.b)
Global m_hMidiOut,m_MIDIOpen.b
Enumeration 35
#Kick_Drum_2
#Kick_Drum_1
#Side_Stick
#Snare_Drum_1
#Hand_clap
#Snare_Drum_2
#Low_Tom_2
#Closed_Hi_Hat
#Low_Tom_1
#Pedal_Hi_Hat
#Mid_Tom_2
#Open_Hi_Hat
#Mid_Tom_1
#High_Tom_2
#Crash_Cymbal_1
#High_Tom_1
#Ride_Cymbal_1
#Chinese_Cymbal
#Ride_Bell
#Tambourine
#Splash_Cymbal
#Cow_Bell
#Crash_Cymbal_2
#Vibra_Slap
#Ride_Cymbal_2
#High_Bongo
#Low_Bongo
#Mute_High_Conga
#Open_High_Conga
#Low_Conga
#High_Timbale
#Low_Timbale
#High_Agogo
#Low_Agogo
#Cabasa
#Maracas
#Short_Hi_Whistle
#Low_Hi_Whistle
#Short_Guiro
#Long_Guiro
#Claves
#High_Wood_Block
#Low_Wood_Block
#Mute_Cuica
#Open_Cuica
#Mute_Triangle
#Open_Triangle
EndEnumeration
OpenConsole()
PrintN("Boite a Rythme Midi (Base sur ce auquel j'ai tjr cru : 2^x)")
PrintN("SPH(2006)")
MIDIOpen()
ChargeInstrument(9,0)
PrintN("")
ry=43+Random(12)*2
PrintN("Rythme : "+Str(ry))
Dim canal.l(47,4)
; (instrument,0) = pause avant de voir si on peux le jouer
; (instrument,1) = temps a attendre pour le jouer (voir (instrument,2))
; (instrument,2) = incrementation puis comparatif avec (instrument,1)
; 3 = frequence
; 4 = volume
cmb=0
For i=1 To 47
Read lourd
canal(i,4)=100+Random(27)
If i<=4
canal(i,4)-40
EndIf
canal(i,0)=(Random(cmb/1.7+3))*20
If Random(16)>10
If Random(lourd)=3
lourd-Random(lourd/3)
EndIf
canal(i,1)=Pow(2,lourd)
canal(i,3)=127+Random(60)+Random(60)
EndIf
If canal(i,1)>0
cmb+1
EndIf
Next
For i=1 To 180
la=1+Random(46)
canal(la,1)*2
If canal(la,1)>1000000
u=3+Random(7)
While u>0
canal(la,1)/2
u-1
Wend
EndIf
Next
PrintN("Nombre d'instruments : "+Str(cmb))
PrintN("")
PrintN("ZzzZZzzz")
PrintN("")
PrintN("")
cmb2=0
Repeat
For zik = 1 To 47
If canal(zik,1)<>0 ; alors on joue de cette instrument
If canal(zik,0)>0 ; alors ce n'est pas encore le moment pour demarrer l'instrument
canal(zik,0)-1
Else
canal(zik,2)+1
If canal(zik,2)=canal(zik,1)
PlayNoteMIDI(9,34+zik,canal(zik,3),canal(zik,4))
canal(zik,2)=0
If canal(zik,0)=0
cmb2+1
Print(Str(zik)+"..")
canal(zik,0)=-1
If cmb=cmb2
PrintN("Ok")
EndIf
EndIf
EndIf
EndIf
EndIf
Next
Delay(ry)
ForEver
; ********************** Procedures ****************************************
Procedure SendMIDIMessage(nStatus.l,nCanal.l,nData1.l,nData2.l)
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 MIDIOpen()
If m_MIDIOpen = 0
If midiOutOpen_ (@m_hMidiOut,MIDIMAPPER,0,0,0) <> 0
MessageRequester ( "Problème" , "Impossible d'ouvrir le périphérique MIDI" ,0)
Else
SendMIDIMessage($C0,0,0,0)
m_MIDIOpen = 1
EndIf
EndIf
EndProcedure
Procedure PlayNoteMIDI(Canal.b,Note.b,VelociteDown.b,VelociteUp.b)
If m_MIDIOpen
SendMIDIMessage($80 | Canal,0,Note,VelociteDown)
SendMIDIMessage($90 | Canal,0,Note,VelociteUp)
EndIf
EndProcedure
Procedure ChargeInstrument(Canal.b,Instrument.b)
If m_MIDIOpen
SendMIDIMessage($C0 | Canal,0,Instrument,0)
EndIf
EndProcedure
DataSection
Data.l 1,1,1,3,2,3,5,2,5,2,5,7,6,6,7,6,5,5,5,2,6,3,7,7,7,2,2,1,4,4,5,5,2,3,2,2,5,7,3,6,2,2,2,5,6,2,6
EndDataSection