Code : Tout sélectionner
; Notes sur la base Do, Do#, Re, Re#, Mi, Fa, Fa#, Sol, Sol#, La, La#, Si :
; P = Pause, Do3 = Do octave 3, Re4 = Ré octave 4, Sol2 = Sol Octave 2, etc ...
; Les Tempo :
; R = Ronde, B = Blanche, N = Noire, C = Croche, DC = Double Croche, TC = Triple Croche, QC = Quadruple Croche
;
; Pour jouer une musique, il suffit de lancer la fonction _PlaySong($sSong, $iTempo) avec comme paramètres :
; $sSong = Une chaine de caractère représentant les notes séparée par un espace.
; Chaque note est ecrite sous la forme : Do3-n (NoteOctave-tempo)
;, $iTempo = Un nombre qui servira de base de calcul du tempo des notes (par défaut égal à 100).
_PlaySong('Do3-n Re3-c Mi3-c Fa3-c Sol3-c La3-n Si3-c P-n Do4-n Re4-n Mi4-n Fa4-n Sol4-n La4-n Si4-n Do5-n')
_InitTempo(30)
_PlaySong('Do3-n Re3-c Mi3-c Fa3-c Sol3-c La3-n Si3-c P-n Do4-n Re4-n Mi4-n Fa4-n Sol4-n La4-n Si4-n Do5-n')
; #################################################################################################
; Fonctions
; #################################################################################################
Func _PlaySong($sSong)
If Not IsDeclared('do0') Then _InitNotes()
If Not IsDeclared('r') Then _InitTempo()
$aSong = StringSplit($sSong, ' ')
For $i = 1 To $aSong[0]
$aNote = StringSplit($aSong[$i], '-')
If (Eval($aNote[1]) And Eval($aNote[2])) Then
Beep(Eval($aNote[1]), Eval($aNote[2]))
EndIf
Next
EndFunc ;==>_PlaySong
Func _InitNotes()
; La calcul exacte des notes devrait être :
; Fn = Fo * a^n Avec a Avec a la racine douzième de deux et n le nombre de demi-tons au-dessus de la note de départ Fo.
; La racine douzième est : 2^(1/12)
; La note de référence est le La 3ième octave d'une fréquence de 440Hz.
; Voir http://fr.wikipedia.org/wiki/Note_de_musique pour plus de renseignements.
Local $aNotes[12] = ['do', 'do#', 're', 're#', 'mi', 'fa', 'fa#', 'sol', 'sol#', 'la', 'la#', 'si']
Local $aFreq[12] = [32.7, 34.65, 36.71, 38.89, 41.20, 43.65, 46.25, 49, 51.91, 55, 58.27, 61.74]
$Coef = 1
For $Oct = 0 To 7
For $i = 0 To UBound($aNotes) - 1
Assign($aNotes[$i] & $Oct, $aFreq[$i] * $Coef, 2)
Next
$Coef = $Coef * 2
Next
EndFunc
Func _InitTempo($iTempo = 100)
Local $i, $Tempo = $iTempo * 10
Global $P = 37
Global $aTempo[7] = ['r', 'b', 'n', 'c', 'dc', 'tc', 'qc']
Global $aDuree[7] = [$Tempo * 4, $Tempo * 2, $Tempo * 1, $Tempo / 2, $Tempo / 4, $Tempo / 8, $Tempo / 16]
For $i = 0 To UBound($aTempo) - 1
Assign($aTempo[$i], $aDuree[$i], 2)
Next
EndFunc