Le midi avec Purebasic
Question tres bete si j'etais un vilain mechant car je te dirais par exemple :Frenchy Pilou a écrit :heu : peux-tu mettre un petit texte explicatif avant qu'on ne charge un programme en confiance les yeux fermés pour savoir de quoi il retourne
"Haaaa, mon lien ?? ha bin, c'est simplement un programme qui explose tout et qui crée aleatoirement des musiques geniales"
alors que c'est un virus...

Bin, toi aussi (comme beaucoup), tu as des exe sans le code : regarde par exemple ta signatureDobro a écrit :je suis d'accord avec Frenchy !!
d'abord puisque tu profite du savoir du forum ce serai normal de metre le source ici meme !....

-
- Messages : 2194
- Inscription : jeu. 27/janv./2005 19:07
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

Dernière modification par SPH le lun. 18/sept./2006 8:13, modifié 2 fois.
Alors, tout est basé sur 2^x (2,4,8,16,32,64...)Dobro a écrit :pourquoi cette algorythme ?
a t'il une signification particuliere ?
le principe simplifié de cette algorithme ? (l'explication)
J'etais persuadé que ca marchait pour la musique. Quand tu entend une chanson, tu remarqueras que tous les 4 repetitions de rythmes, les instruments peuvent changer. Pas a 3, ni a 5 : a 4. J'ai toujours remarqué ca. Ca crée une armonie musicale.
Voila pourquoi j'ai ecris :
Code : Tout sélectionner
canal(i,1)=Pow(2,lourd)
Hmmm, je sais que j'ai peut etre mal decris la maniere de coder ca mais ca m'a parut intuitif tellement j'avais remarqué ce "phenomene" il y a longtemps.
vala vala

ah mon avis ce que tu dis est plus ou moins vrai pour du 4/4 pas forcément pour du 3/4 par exempletu remarqueras que tous les 4 repetitions de rythmes, les instruments peuvent changer
(pas tres constructifs tes commentaires au fait)
Quelques manoucheries : I can't give you anything but love / Stompin' at decca
du 3/4 oui mais pas du x/3 ou x/5. C ca que je voulais dire.bombseb a écrit :ah mon avis ce que tu dis est plus ou moins vrai pour du 4/4 pas forcément pour du 3/4 par exempletu remarqueras que tous les 4 repetitions de rythmes, les instruments peuvent changer
(pas tres constructifs tes commentaires au fait)
J'optimiserais par 1000 ma routine et intruduirais la notion de changements de rythme/instruments/notes.
??x/3 ou x/5
je ne sais pas où tu a vu des morceaux écrits en x/3 ou x/5....ca devais être une faute de frappe forcément
Quelques manoucheries : I can't give you anything but love / Stompin' at decca
héhé sympas ta boite à rythme 

Quelques manoucheries : I can't give you anything but love / Stompin' at decca