Bon d'abord, une définition
ADSR , définiton du mot ADSR , Attack, Decay, Sustain, Release, soit Attaque, Chute, Entretien et Extinction. Décrit la vie d'un phénomène audio.
Les points A, B, C, D et E repèrent ces différentes zones.
A quoi sert ce programme ?
A créer des sons au format wav directement dans une application.
[EDIT]possibilité de sauvegarder au format .wav[EDIT]
La création se fait avec l'appel d'une procédure que l'on récupère dans le presse-papier(faire coller puis NE PAS OUBLIER de changer les paramètres "ID" et "*son")(voir deuxième code) du type:
creation_son(ID,*son,type_signal,duree.l,freq_A.f,freq_B.f,freq_C.f,freq_D.f,freq_E.f,x_A.f,x_B.f,x_C.f,x_D.f,x_E.f,ampl_A.f,ampl_B.f,ampl_C.f,ampl_D.f,ampl_E.f,mod_ampl_A.b,mod_ampl_B.b,mod_ampl_C.b,mod_ampl_D.b,mod_freq_A.b,mod_freq_B.b,mod_freq_C.b,mod_freq_D.b)
C'est encore de l'expérimental, mais c'est fonctionnel!
Les paramètres de la procédure se trouvent dans le presse-papier.
Je mettrai une version plus propre et mieux commentée mais en ce moment en Guadeloupe ça craint un peu !
J'utilise un code de CODEARCHIV. L'utilisation de "structureunion" n'est pas claire pour moi mais c'est super efficace .
J'ai laissé la place pour d'autres options mais là, j'avais ma dose de gadgets.
Code : Tout sélectionner
;pure_ADSR
;ADSR , définiton du mot ADSR , Attack, Decay, Sustain, Release, soit « Attaque, Chute, Entretien et Extinction. Décrit la vie d'un phénomène audio
;auteur Huitbit
;PB v4.30
;version brouillon
;idée de base tonton
;utilisation d'un code de codearchiv Froggerprogger (updated for PB 4.00 by Andre)
#largeur_ecran=1024
#hauteur_ecran=768
#marge=12
#frequence_min=20
#frequence_max=10000
#e=2.71828182845904
duree_signal.f
couleur.f
amplitude.f
frequence.f
nbre_ech_par_periode.l
alternance.b=-1
zone_frequence.f
compo_rgb.f
sauvegarde.b=0
;origine du repère
x_origine.f=#marge
y_origine.f=#hauteur_ecran*0.75
x_courbe_ancien.f=#marge
y_courbe_ancien.f=y_origine
#mod_10T=0.1
#mod_100T=0.01
;-déclaration pour l'enregistrement
totalsamples.l
datachunkBytes.l
Structure PBUnion
StructureUnion
b.b
w.w
l.l
f.f
s.s
EndStructureUnion
EndStructure
*sound.l
*mem.PBUnion
;- Gadget Constants
Enumeration
#Button_test
#Button_fichier_wav
#Text_signal : #Text_duree_signal : #Text_ampl : #Text_mod_ampl : #Text_freq : #Text_mod_freq
#Text_a_freq : #Text_b_freq : #Text_c_freq : #Text_d_freq : #Text_e_freq
#Text_a_ampl : #Text_b_ampl : #Text_c_ampl : #Text_d_ampl : #Text_e_ampl
#Combo_type_signal
#Combo_a_mod_ampl : #Combo_b_mod_ampl : #Combo_c_mod_ampl : #Combo_d_mod_ampl : #Combo_e_mod_ampl
#Combo_a_mod_freq : #Combo_b_mod_freq : #Combo_c_mod_freq : #Combo_d_mod_freq : #Combo_e_mod_freq
#Text_type_signal
#TrackBar_a_ampl : #TrackBar_b_ampl : #TrackBar_c_ampl : #TrackBar_d_ampl : #TrackBar_e_ampl
#TrackBar_a_freq : #TrackBar_b_freq : #TrackBar_c_freq : #TrackBar_d_freq : #TrackBar_e_freq
#TrackBar_duree : #TrackBar_ab_duree : #TrackBar_bc_duree : #TrackBar_cd_duree : #TrackBar_de_duree
#Text_duree : #Text_ab_duree : #Text_bc_duree : #Text_cd_duree : #Text_de_duree
#Text_duree_val : #Text_ab_duree_val : #Text_bc_duree_val : #Text_cd_duree_val : #Text_de_duree_val
#Text_a_ampl_val : #Text_b_ampl_val : #Text_c_ampl_val : #Text_d_ampl_val : #Text_e_ampl_val
#Text_a_freq_val : #Text_b_freq_val : #Text_c_freq_val : #Text_d_freq_val : #Text_e_freq_val
EndEnumeration
Macro affine(a,b,xA,yA,xB,yB)
a.f=(yB-yA)/(xB-xA)
b.f=(yA*xB-yB*xA)/(xB-xA)
EndMacro
Macro exp(x)
Pow(#e,x)
EndMacro
Macro modulation_amplitude(ID_combo,ampl,a_aff,b_aff,a_exp,x_ech_point,b_exp)
Select GetGadgetState(ID_combo)
Case 0 ;aucune modulation
amplitude=ampl
Case 1 ;affine
amplitude=(a_aff*x_echantillon+b_aff)
Case 2 ;exponentielle
amplitude=(a_exp*exp((x_echantillon-x_ech_point)*b_exp))
Case 3 ;sinusoïdale 10T
amplitude=(a_aff*x_echantillon+b_aff)*(0.5+0.5*Sin(#mod_10T*2 * #PI * frequence*x_echantillon/freq_ech))
Case 4 ;sinusoïdale 100T
amplitude=(a_aff*x_echantillon+b_aff)*(0.5+0.5*Sin(#mod_100T*2 * #PI * frequence*x_echantillon/freq_ech))
Case 5 ; dents de scie 10T
If x_echantillon=x_ech_point
x_origine_dent_mod=x_ech_point
nbre_ech_par_10T=Int(Round(freq_ech/(frequence*#mod_10T),#PB_Round_Nearest))
EndIf
If (x_echantillon-x_origine_dent_mod)%nbre_ech_par_10T=0
x_origine_dent_mod=x_echantillon
nbre_ech_par_10T=Int(Round(freq_ech/(frequence*#mod_10T),#PB_Round_Nearest))
EndIf
amplitude=(ampl/nbre_ech_par_10T)*(x_echantillon-x_origine_dent_mod)
Case 6 ; dents de scie 100T
If x_echantillon=x_ech_point
x_origine_dent_mod=x_ech_point
nbre_ech_par_100T=Int(Round(freq_ech/(frequence*#mod_100T),#PB_Round_Nearest))
EndIf
If (x_echantillon-x_origine_dent_mod)%nbre_ech_par_100T=0
x_origine_dent_mod=x_echantillon
nbre_ech_par_100T=Int(Round(freq_ech/(frequence*#mod_100T),#PB_Round_Nearest))
EndIf
amplitude=(ampl/nbre_ech_par_100T)*(x_echantillon-x_origine_dent_mod)
EndSelect
EndMacro
Macro modulation_frequence(ID_combo,freq,a_ff,b_ff,a_exp,x_ech_point,b_exp)
Select GetGadgetState(ID_combo)
Case 0 ;aucune modulation
frequence=freq
Case 1 ;affine
frequence=(a_ff*x_echantillon+b_ff)
Case 2 ;exponentielle
frequence=(a_exp*exp((x_echantillon-x_ech_point)*b_exp))
Case 3 ;sinusoïdale 10T
frequence=freq*(0.6+0.4*Sin(#mod_10T*2 * #PI * freq*x_echantillon/freq_ech))
Case 4 ;sinusoïdale 100T
frequence=freq*(0.6+0.4*Sin(#mod_100T*2 * #PI * freq*x_echantillon/freq_ech))
Case 5 ; dents de scie 10T
If x_echantillon=x_ech_point
x_origine_dent_mod=x_ech_point
nbre_ech_par_10T=Int(Round(freq_ech/(freq*#mod_10T),#PB_Round_Nearest))
EndIf
If (x_echantillon-x_origine_dent_mod)%nbre_ech_par_10T=0
x_origine_dent_mod=x_echantillon
nbre_ech_par_10T=Int(Round(freq_ech/(freq*#mod_10T),#PB_Round_Nearest))
EndIf
frequence=(freq/nbre_ech_par_10T)*(x_echantillon-x_origine_dent_mod)+#frequence_min
Case 6 ; dents de scie 100T
If x_echantillon=x_ech_point
x_origine_dent_mod=x_ech_point
nbre_ech_par_100T=Int(Round(freq_ech/(freq*#mod_100T),#PB_Round_Nearest))
EndIf
If (x_echantillon-x_origine_dent_mod)%nbre_ech_par_100T=0
x_origine_dent_mod=x_echantillon
nbre_ech_par_100T=Int(Round(freq_ech/(freq*#mod_100T),#PB_Round_Nearest))
EndIf
frequence=(freq/nbre_ech_par_100T)*(x_echantillon-x_origine_dent_mod)+#frequence_min
Case 7 ;aléatoire
frequence=#frequence_min+Random(freq)
EndSelect
EndMacro
Macro exponentielle(a,b,xA,yA,xB,yB)
;test pour les amplitudes yA nulles!
If yA=0
yA=0.001*ampl_max
EndIf
If yB=0
yB=0.001*ampl_max
EndIf
b.f=Log(yB/yA)/(xB-xA)
a.f=yA*exp(b*xA)
EndMacro
Macro trace_courbe
If StartDrawing(WindowOutput(0))
;-on efface la courbe précédente
Box(0,#hauteur_ecran*0.5,#largeur_ecran,#hauteur_ecran*0.5,RGB(0,0,0))
;-tracé de la courbe
frequence=freq_A
nbre_ech_par_periode=freq_ech/freq_A
nbre_ech_par_10T=Int(Round(freq_ech/(freq_A*#mod_10T),#PB_Round_Nearest))
nbre_ech_par_100T=Int(Round(freq_ech/(freq_A*#mod_100T),#PB_Round_Nearest))
amplitude=ampl_A
For x_echantillon=0 To nbre_ech_total
If x_echantillon<x_ech_B
modulation_amplitude(#Combo_a_mod_ampl,ampl_A,a_ampl_AB_aff,b_ampl_AB_aff,a_ampl_AB_exp,x_ech_A,b_ampl_AB_exp)
modulation_frequence(#Combo_a_mod_freq,freq_A, a_freq_AB_aff,b_freq_AB_aff,a_freq_AB_exp,x_ech_A,b_freq_AB_exp)
ElseIf x_echantillon>=x_ech_B And x_echantillon<x_ech_C
modulation_amplitude(#Combo_b_mod_ampl,ampl_B,a_ampl_BC_aff,b_ampl_BC_aff,a_ampl_BC_exp,x_ech_B,b_ampl_BC_exp)
modulation_frequence(#Combo_b_mod_freq,freq_B, a_freq_BC_aff,b_freq_BC_aff,a_freq_BC_exp,x_ech_B,b_freq_BC_exp)
ElseIf x_echantillon>=x_ech_C And x_echantillon<x_ech_D
modulation_amplitude(#Combo_c_mod_ampl,ampl_C,a_ampl_CD_aff,b_ampl_CD_aff,a_ampl_CD_exp,x_ech_C,b_ampl_CD_exp)
modulation_frequence(#Combo_c_mod_freq,freq_C, a_freq_CD_aff,b_freq_CD_aff,a_freq_CD_exp,x_ech_C,b_freq_CD_exp)
Else
modulation_amplitude(#Combo_d_mod_ampl,ampl_d,a_ampl_DE_aff,b_ampl_DE_aff,a_ampl_DE_exp,x_ech_D,b_ampl_DE_exp)
modulation_frequence(#Combo_d_mod_freq,freq_D, a_freq_DE_aff,b_freq_DE_aff,a_freq_DE_exp,x_ech_D,b_freq_DE_exp)
EndIf
x_courbe=Round(x_echantillon/(nbre_ech_total/1000)+x_origine,#PB_Round_Nearest)
amplitude_trace=amplitude/(ampl_max/180)
;-type de courbe
Select GetGadgetState(#Combo_type_signal)
;tracé sinus
Case 0
y_courbe=y_origine-amplitude_trace*Sin(2 * #PI * frequence*x_echantillon/freq_ech); x_echantillon/frequence_echantillonnage=temps en seconde car 44100 échantillons correspondent à 1s
;tracé carré
Case 1
If x_echantillon%Int(nbre_ech_par_periode*0.5)=0
nbre_ech_par_periode=Int(Round(freq_ech/frequence,#PB_Round_Nearest))
alternance=-alternance
EndIf
y_courbe=y_origine-amplitude_trace*alternance
;tracé triangle
Case 2
If x_echantillon%Int(nbre_ech_par_periode*0.5)=0
nbre_ech_par_periode=Int(Round(freq_ech/frequence,#PB_Round_Nearest))
x_origine_triangle=x_echantillon
alternance=-alternance
EndIf
y_courbe=y_origine-(4*(amplitude_trace/nbre_ech_par_periode)*(x_echantillon-x_origine_triangle)-amplitude_trace)*alternance
;tracé dents de scie
Case 3
If x_echantillon%nbre_ech_par_periode=0
nbre_ech_par_periode=Int(Round(freq_ech/frequence,#PB_Round_Nearest))
x_origine_dent=x_echantillon
EndIf
y_courbe=y_origine-(2*(amplitude_trace/nbre_ech_par_periode)*(x_echantillon-x_origine_dent)-amplitude_trace)
;tracé bruit sinusoïdal
Case 4
y_courbe=y_origine-Random(amplitude_trace)*Sin(2 * #PI * frequence*x_echantillon/freq_ech); x_echantillon/frequence_echantillonnage=temps en seconde car 44100 échantillons correspondent à 1s
;tracé bruit carré
Case 5
If x_echantillon%nbre_ech_par_periode=0
nbre_ech_par_periode=Int(Round(freq_ech/frequence,#PB_Round_Nearest))
EndIf
If x_echantillon%nbre_ech_par_periode<Int(nbre_ech_par_periode*0.5)
y_courbe=y_origine-Random(amplitude_trace)
Else
y_courbe=y_origine+Random(amplitude_trace)
EndIf
EndSelect
couleur_frequence(frequence,#frequence_max)
LineXY(x_courbe_ancien,y_courbe_ancien,x_courbe,y_courbe,couleur)
x_courbe_ancien=x_courbe
y_courbe_ancien=y_courbe
Next x_echantillon
;-dessin des axes
Line(x_origine,y_origine,#largeur_ecran-2*#marge,0,RGB(255,255,255))
Line(#marge,#hauteur_ecran*0.5+#marge,0,#hauteur_ecran*0.5-2*#marge,RGB(255,255,255))
StopDrawing()
EndIf;StartDrawing
EndMacro
Macro recuperation_donnees
;-duree
duree_signal=GetGadgetState(#TrackBar_duree)
;-fréquences
freq_A=GetGadgetState(#TrackBar_a_freq)
freq_B=GetGadgetState(#TrackBar_b_freq)
freq_C=GetGadgetState(#TrackBar_c_freq)
freq_D=GetGadgetState(#TrackBar_d_freq)
freq_E=GetGadgetState(#TrackBar_e_freq)
frequence=freq_A
;-nombre d'échantillons
nbre_ech_total=(GetGadgetState(#TrackBar_duree)/1000)*freq_ech
nbre_ech_AB=(GetGadgetState(#TrackBar_ab_duree)/1000)*freq_ech
nbre_ech_BC=(GetGadgetState(#TrackBar_bc_duree)/1000)*freq_ech
nbre_ech_CD=(GetGadgetState(#TrackBar_cd_duree)/1000)*freq_ech
nbre_ech_DE=(GetGadgetState(#TrackBar_de_duree)/1000)*freq_ech
nbre_ech_par_periode=freq_ech/freq_A
nbre_ech_par_10T=Int(Round(freq_ech/(freq_A*#mod_10T),#PB_Round_Nearest))
nbre_ech_par_100T=Int(Round(freq_ech/(freq_A*#mod_100T),#PB_Round_Nearest))
;-amplitudes
ampl_A=GetGadgetState(#TrackBar_a_ampl)*(ampl_max/180)
ampl_B=GetGadgetState(#TrackBar_b_ampl)*(ampl_max/180)
ampl_C=GetGadgetState(#TrackBar_c_ampl)*(ampl_max/180)
ampl_d=GetGadgetState(#TrackBar_d_ampl)*(ampl_max/180)
ampl_E=GetGadgetState(#TrackBar_e_ampl)*(ampl_max/180)
amplitude=ampl_A
;-coordonnées des échantillons
x_ech_A.f=0
x_ech_B.f=x_ech_A+nbre_ech_AB
x_ech_C.f=x_ech_B+nbre_ech_BC
x_ech_D.f=x_ech_C+nbre_ech_CD
x_ech_E.f=x_ech_D+nbre_ech_DE
;-modulation affine des amplitudes (y=a*x+b)
affine(a_ampl_AB_aff,b_ampl_AB_aff,x_ech_A,ampl_A,x_ech_B,ampl_B)
affine(a_ampl_BC_aff,b_ampl_BC_aff,x_ech_B,ampl_B,x_ech_C,ampl_C)
affine(a_ampl_CD_aff,b_ampl_CD_aff,x_ech_C,ampl_C,x_ech_D,ampl_d)
affine(a_ampl_DE_aff,b_ampl_DE_aff,x_ech_D,ampl_d,x_ech_E,ampl_E)
;-modulation exponentielle des amplitudes (y=a*exp(b*x)) !!!!penser au changement d'origine pour le calcul de a et b
exponentielle(a_ampl_AB_exp,b_ampl_AB_exp,0,ampl_A,x_ech_B,ampl_B)
exponentielle(a_ampl_BC_exp,b_ampl_BC_exp,0,ampl_B,x_ech_C-x_ech_B,ampl_C)
exponentielle(a_ampl_CD_exp,b_ampl_CD_exp,0,ampl_C,x_ech_D-x_ech_C,ampl_d)
exponentielle(a_ampl_DE_exp,b_ampl_DE_exp,0,ampl_d,x_ech_E-x_ech_D,ampl_E)
;-modulation affine des fréquences (f=a*x+b)
affine(a_freq_AB_aff,b_freq_AB_aff,x_ech_A,freq_A,x_ech_B,freq_B)
affine(a_freq_BC_aff,b_freq_BC_aff,x_ech_B,freq_B,x_ech_C,freq_C)
affine(a_freq_CD_aff,b_freq_CD_aff,x_ech_C,freq_C,x_ech_D,freq_D)
affine(a_freq_DE_aff,b_freq_DE_aff,x_ech_D,freq_D,x_ech_E,freq_E)
;-modulation exponentielle des fréquences (y=a*exp(b*x)) !!!!penser au changement d'origine pour le calcul de a et b
exponentielle(a_freq_AB_exp,b_freq_AB_exp,x_ech_A,freq_A,x_ech_B,freq_B)
exponentielle(a_freq_BC_exp,b_freq_BC_exp,0,freq_B,x_ech_C-x_ech_B,freq_C)
exponentielle(a_freq_CD_exp,b_freq_CD_exp,0,freq_C,x_ech_D-x_ech_C,freq_D)
exponentielle(a_freq_DE_exp,b_freq_DE_exp,0,freq_D,x_ech_E-x_ech_D,freq_E)
;-pour le tracé
x_courbe_ancien.f=#marge
y_courbe_ancien.f=y_origine
EndMacro
Macro enregistrement
#samplerate = 44100 ; samplerate
#bitrate = 16 ; Bits per sample, #bitrate Mod 8 must be 0 !
#channels = 2 ; number of channels
totalsamples =(duree_signal/1000)*#samplerate ; length in samples
#avBytesPerSec = #channels*#bitrate/8*#samplerate ; calculate the average bytes per second
datachunkBytes = totalsamples * #channels * #bitrate/8 +1
*sound = AllocateMemory(44 + datachunkBytes)
*mem = *sound
*mem\l = 'FFIR' : *mem+4 ; riff-chunk-ID "RIFF"
*mem\l = 36 + datachunkBytes : *mem+4 ; normally filesize minus (these) 8 Bytes
*mem\l = 'EVAW' : *mem+4 ; wave-chunk-ID "WAVE"
*mem\l = ' tmf' : *mem+4 ; format-chunk-ID "FMT "
*mem\l = 16 : *mem+4 ; chunk data size (+ Extra Format Bytes)
*mem\w = 1 : *mem+2 ; compression code
*mem\w = #channels : *mem+2 ; number of channels
*mem\l = #samplerate : *mem+4 ; samplerate
*mem\l = #avBytesPerSec : *mem+4 ; average bytes per second, (channels)*(block align)*(samplerate)
*mem\w = #bitrate/8*#channels : *mem+2 ; Block Align ('bytes per sample')
*mem\w = #bitrate : *mem+2 ; Bits per sample
*mem\l = 'atad' : *mem+4 ; data-chunk-ID "DATA"
*mem\l = datachunkBytes : *mem+4 ; data chunk size in bytes
;/ Now lets write #totalsamples
;/ work only for 16 Bit or more. 8-Bit has zero-line at value 128, so it is unsigned
For x_echantillon=0 To nbre_ech_total
For actchannel = 1 To #channels
If x_echantillon<x_ech_B
modulation_amplitude(#Combo_a_mod_ampl,ampl_A,a_ampl_AB_aff,b_ampl_AB_aff,a_ampl_AB_exp,x_ech_A,b_ampl_AB_exp)
modulation_frequence(#Combo_a_mod_freq,freq_A, a_freq_AB_aff,b_freq_AB_aff,a_freq_AB_exp,x_ech_A,b_freq_AB_exp)
ElseIf x_echantillon>=x_ech_B And x_echantillon<x_ech_C
modulation_amplitude(#Combo_b_mod_ampl,ampl_B,a_ampl_BC_aff,b_ampl_BC_aff,a_ampl_BC_exp,x_ech_B,b_ampl_BC_exp)
modulation_frequence(#Combo_b_mod_freq,freq_B, a_freq_BC_aff,b_freq_BC_aff,a_freq_BC_exp,x_ech_B,b_freq_BC_exp)
ElseIf x_echantillon>=x_ech_C And x_echantillon<x_ech_D
modulation_amplitude(#Combo_c_mod_ampl,ampl_C,a_ampl_CD_aff,b_ampl_CD_aff,a_ampl_CD_exp,x_ech_C,b_ampl_CD_exp)
modulation_frequence(#Combo_c_mod_freq,freq_C, a_freq_CD_aff,b_freq_CD_aff,a_freq_CD_exp,x_ech_C,b_freq_CD_exp)
Else
modulation_amplitude(#Combo_d_mod_ampl,ampl_d,a_ampl_DE_aff,b_ampl_DE_aff,a_ampl_DE_exp,x_ech_D,b_ampl_DE_exp)
modulation_frequence(#Combo_d_mod_freq,freq_D, a_freq_DE_aff,b_freq_DE_aff,a_freq_DE_exp,x_ech_D,b_freq_DE_exp)
EndIf
Select GetGadgetState(#Combo_type_signal)
;signal sinusoïdal
Case 0
*mem\w=amplitude*Sin(2 * #PI * frequence*x_echantillon/freq_ech); x_echantillon/frequence_echantillonnage=temps en seconde car 44100 échantillons correspondent à 1s
*mem+2
;signal carré
Case 1
If x_echantillon%Int(nbre_ech_par_periode*0.5)=0
nbre_ech_par_periode=Int(Round(freq_ech/frequence,#PB_Round_Nearest))
alternance=-alternance
EndIf
*mem\w=amplitude*alternance
*mem+2
;signal triangle
Case 2
If x_echantillon%Int(nbre_ech_par_periode*0.5)=0
nbre_ech_par_periode=Int(Round(freq_ech/frequence,#PB_Round_Nearest))
x_origine_triangle=x_echantillon
alternance=-alternance
EndIf
*mem\w=(4*(amplitude/nbre_ech_par_periode)*(x_echantillon-x_origine_triangle)-amplitude)*alternance
*mem+2
;signal dents de scie
Case 3
If x_echantillon%Int(nbre_ech_par_periode)=0
nbre_ech_par_periode=Int(Round(freq_ech/frequence,#PB_Round_Nearest))
x_origine_dent=x_echantillon
EndIf
*mem\w=2*(amplitude/nbre_ech_par_periode)*(x_echantillon-x_origine_dent)-amplitude
*mem+2
;signal bruit sinusoïdal
Case 4
*mem\w=Random(amplitude)*Sin(2 * #PI * frequence*x_echantillon/freq_ech); x_echantillon/frequence_echantillonnage=temps en seconde car 44100 échantillons correspondent à 1s
*mem+2
;signal bruit carré
Case 5
If x_echantillon%Int(nbre_ech_par_periode*0.5)=0
nbre_ech_par_periode=Int(Round(freq_ech/frequence,#PB_Round_Nearest))
alternance=-alternance
EndIf
*mem\w=Random(amplitude)*alternance
*mem+2
EndSelect
Next actchannel
Next x_echantillon
EndMacro
Macro couleur_frequence(f,fmax)
zone_frequence=fmax/5
If f<zone_frequence
compo_rgb=f*255/zone_frequence
couleur=RGB(255,compo_rgb,0)
ElseIf f>=zone_frequence And f<2*zone_frequence
compo_rgb=f*255/zone_frequence-255
couleur=RGB(255-compo_rgb,255,0)
ElseIf f>=2*zone_frequence And f<3*zone_frequence
compo_rgb=f*255/zone_frequence-2*255
couleur=RGB(0,255,compo_rgb)
ElseIf f>=3*zone_frequence And f<4*zone_frequence
compo_rgb=f*255/zone_frequence-3*255
couleur=RGB(0,255-compo_rgb,255)
ElseIf f>=4*zone_frequence
compo_rgb=f*255/zone_frequence-4*255
couleur=RGB(compo_rgb,0,255)
EndIf
EndMacro
;-PROGRAMME PRINCIPAL
;-INITIALISATION
;-durée secondes
duree_signal.f=1000
duree_AB.f=0.1*duree_signal
duree_BC.f=0.1*duree_signal
duree_CD.f=0.5*duree_signal
duree_DE.f=0.3*duree_signal
;-fréquences
freq_A.f=440
freq_B.f=880
freq_C.f=440
freq_D.f=220
freq_E.f=440
freq_ech.f=44100
;-nombre d'échantillons
nbre_ech_total.f=(duree_signal/1000)*freq_ech
nbre_ech_AB.f=(duree_AB/1000)*freq_ech
nbre_ech_BC.f=(duree_BC/1000)*freq_ech
nbre_ech_CD.f=(duree_CD/1000)*freq_ech
nbre_ech_DE.f=(duree_DE/1000)*freq_ech
;-amplitudes
ampl_max.f=32767 ;Pow(2, #bitrate-1)-1
ampl_A.f=0.1*ampl_max
ampl_B.f=1*ampl_max
ampl_C.f=0.4*ampl_max
ampl_d.f=0.3*ampl_max
ampl_E.f=0
InitSound()
OpenWindow(0, 0, 0, #largeur_ecran, #hauteur_ecran, "pure_ADSR (>>>données dans le presse-papier après enregistrement<<<)", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
;-gadgets>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ButtonGadget(#Button_test,0,0,40,20,"Test")
ButtonGadget(#Button_fichier_wav,0,#hauteur_ecran*0.5-20,200,20,"Sauvegarder au format .wav")
;-SIGNAL
TextGadget(#Text_signal, 10, 10, 130, 20, "SIGNAL", #PB_Text_Center)
TextGadget(#Text_type_signal, 20, 120, 120, 20, "TYPE", #PB_Text_Center)
TextGadget(#Text_duree_signal, 10, 40, 130, 20, "DUREE (en ms)", #PB_Text_Center)
TrackBarGadget(#TrackBar_duree, 10, 80, 140, 20, 40, 10000)
SetGadgetState(#TrackBar_duree,duree_signal)
ComboBoxGadget(#Combo_type_signal, 20, 140, 120, 20)
AddGadgetItem(#Combo_type_signal,0,"Sinusoïdal")
AddGadgetItem(#Combo_type_signal,1,"Carré")
AddGadgetItem(#Combo_type_signal,2,"Triangle")
AddGadgetItem(#Combo_type_signal,3,"Dents de scie")
AddGadgetItem(#Combo_type_signal,4,"Bruit sinusoïdal")
AddGadgetItem(#Combo_type_signal,5,"Bruit carré")
SetGadgetState(#Combo_type_signal,0)
TextGadget(#Text_duree_val, 10, 60, 130, 20, Str(duree_signal), #PB_Text_Center)
;-DUREE
TextGadget(#Text_duree, 160, 10, 140, 20, "DUREE (en ms)", #PB_Text_Center)
TextGadget(#Text_ab_duree, 150, 50, 30, 20, "(AB)", #PB_Text_Center)
TextGadget(#Text_bc_duree, 150, 80, 30, 20, "(BC)", #PB_Text_Center)
TextGadget(#Text_cd_duree, 150, 110, 30, 20, "(CD)", #PB_Text_Center)
TextGadget(#Text_de_duree, 150, 140, 30, 20, "(DE)", #PB_Text_Center)
TrackBarGadget(#TrackBar_ab_duree, 210, 50, 90, 20, 10,9970)
TrackBarGadget(#TrackBar_bc_duree, 210, 80, 90, 20, 10, 9970)
TrackBarGadget(#TrackBar_cd_duree, 210, 110, 90, 20, 10, 9970)
TrackBarGadget(#TrackBar_de_duree, 210, 140, 90, 20, 10, 9970)
SetGadgetState(#TrackBar_ab_duree, duree_AB)
SetGadgetState(#TrackBar_bc_duree, duree_BC)
SetGadgetState(#TrackBar_cd_duree, duree_CD)
SetGadgetState(#TrackBar_de_duree, duree_DE)
TextGadget(#Text_ab_duree_val, 180, 50, 30, 20, Str(duree_AB), #PB_Text_Center)
TextGadget(#Text_bc_duree_val, 180, 80, 30, 20, Str(duree_BC), #PB_Text_Center)
TextGadget(#Text_cd_duree_val, 180, 110, 30, 20, Str(duree_CD), #PB_Text_Center)
TextGadget(#Text_de_duree_val, 180, 140, 30, 20, Str(duree_DE), #PB_Text_Center)
;-AMPLITUDE
TextGadget(#Text_ampl, 310, 10, 140, 20, "AMPLITUDE (en %)", #PB_Text_Center)
TextGadget(#Text_mod_ampl, 460, 10, 80, 20, "MODULATION", #PB_Text_Center)
ComboBoxGadget(#Combo_a_mod_ampl, 460, 40, 80, 20)
TextGadget(#Text_a_ampl, 310, 30, 20, 20, "A", #PB_Text_Center)
TextGadget(#Text_b_ampl, 340, 30, 20, 20, "B", #PB_Text_Center)
TextGadget(#Text_c_ampl, 370, 30, 20, 20, "C", #PB_Text_Center)
TextGadget(#Text_d_ampl, 400, 30, 20, 20, "D", #PB_Text_Center)
TextGadget(#Text_e_ampl, 430, 30, 20, 20, "E", #PB_Text_Center)
TrackBarGadget(#TrackBar_a_ampl, 310, 70, 20, 110, 0,180, #PB_TrackBar_Vertical)
TrackBarGadget(#TrackBar_b_ampl, 340, 70, 20, 110, 0, 180, #PB_TrackBar_Vertical)
TrackBarGadget(#TrackBar_c_ampl, 370, 70, 20, 110, 0, 180, #PB_TrackBar_Vertical)
TrackBarGadget(#TrackBar_d_ampl, 400, 70, 20, 110, 0, 180, #PB_TrackBar_Vertical)
TrackBarGadget(#TrackBar_e_ampl, 430, 70, 20, 110, 0, 180, #PB_TrackBar_Vertical)
SetGadgetState(#TrackBar_a_ampl,ampl_A/(ampl_max/180))
SetGadgetState(#TrackBar_b_ampl,ampl_B/(ampl_max/180))
SetGadgetState(#TrackBar_c_ampl,ampl_C/(ampl_max/180))
SetGadgetState(#TrackBar_d_ampl,ampl_d/(ampl_max/180))
SetGadgetState(#TrackBar_e_ampl,ampl_E/(ampl_max/180))
TextGadget(#Text_a_ampl_val, 310, 50, 20, 20, Str(ampl_A/ampl_max*100), #PB_Text_Center)
TextGadget(#Text_b_ampl_val, 340, 50, 20, 20, Str(ampl_B/ampl_max*100), #PB_Text_Center)
TextGadget(#Text_c_ampl_val, 370, 50, 20, 20, Str(ampl_C/ampl_max*100), #PB_Text_Center)
TextGadget(#Text_d_ampl_val, 400, 50, 20, 20, Str(ampl_d/ampl_max*100), #PB_Text_Center)
TextGadget(#Text_e_ampl_val, 430, 50, 20, 20, Str(ampl_E/ampl_max*100), #PB_Text_Center)
ComboBoxGadget(#Combo_a_mod_ampl, 460, 40, 80, 20)
AddGadgetItem(#Combo_a_mod_ampl,0,"Aucune")
AddGadgetItem(#Combo_a_mod_ampl,1,"Affine")
AddGadgetItem(#Combo_a_mod_ampl,2, "Exponentielle")
AddGadgetItem(#Combo_a_mod_ampl,3,"Sinus_10T" )
AddGadgetItem(#Combo_a_mod_ampl,4,"Sinus_100T" )
AddGadgetItem(#Combo_a_mod_ampl,5,"Scie_10T" )
AddGadgetItem(#Combo_a_mod_ampl,6,"Scie_100T" )
SetGadgetState(#Combo_a_mod_ampl,0)
ComboBoxGadget(#Combo_b_mod_ampl, 460, 70, 80, 20)
AddGadgetItem(#Combo_b_mod_ampl,0,"Aucune")
AddGadgetItem(#Combo_b_mod_ampl,1,"Affine")
AddGadgetItem(#Combo_b_mod_ampl,2, "Exponentielle")
AddGadgetItem(#Combo_b_mod_ampl,3,"Sinus_10T" )
AddGadgetItem(#Combo_b_mod_ampl,4,"Sinus_100T" )
AddGadgetItem(#Combo_b_mod_ampl,5,"Scie_10T" )
AddGadgetItem(#Combo_b_mod_ampl,6,"Scie_100T" )
SetGadgetState(#Combo_b_mod_ampl,0)
ComboBoxGadget(#Combo_c_mod_ampl, 460, 100, 80, 20)
AddGadgetItem(#Combo_c_mod_ampl,0,"Aucune")
AddGadgetItem(#Combo_c_mod_ampl,1,"Affine")
AddGadgetItem(#Combo_c_mod_ampl,2, "Exponentielle")
AddGadgetItem(#Combo_c_mod_ampl,3,"Sinus_10T" )
AddGadgetItem(#Combo_c_mod_ampl,4,"Sinus_100T" )
AddGadgetItem(#Combo_c_mod_ampl,5,"Scie_10T" )
AddGadgetItem(#Combo_c_mod_ampl,6,"Scie_100T" )
SetGadgetState(#Combo_c_mod_ampl,1)
ComboBoxGadget(#Combo_d_mod_ampl, 460, 130, 80, 20)
AddGadgetItem(#Combo_d_mod_ampl,0,"Aucune")
AddGadgetItem(#Combo_d_mod_ampl,1,"Affine")
AddGadgetItem(#Combo_d_mod_ampl,2, "Exponentielle")
AddGadgetItem(#Combo_d_mod_ampl,3,"Sinus_10T" )
AddGadgetItem(#Combo_d_mod_ampl,4,"Sinus_100T" )
AddGadgetItem(#Combo_d_mod_ampl,5,"Scie_10T" )
AddGadgetItem(#Combo_d_mod_ampl,6,"Scie_100T" )
SetGadgetState(#Combo_d_mod_ampl,1)
;-FREQUENCE
TextGadget(#Text_freq, 570, 10, 350, 20, "FREQUENCE (en Hz)", #PB_Text_Center)
TextGadget(#Text_mod_freq, 930, 10, 80, 20, "MODULATION", #PB_Text_Center)
TextGadget(#Text_a_freq, 550, 40, 20, 20, "A", #PB_Text_Center)
TextGadget(#Text_b_freq, 550, 70, 20, 20, "B", #PB_Text_Center)
TextGadget(#Text_c_freq, 550, 100, 20, 20, "C", #PB_Text_Center)
TextGadget(#Text_d_freq, 550, 130, 20, 20, "D", #PB_Text_Center)
TextGadget(#Text_e_freq, 550, 160, 20, 20, "E", #PB_Text_Center)
TrackBarGadget(#TrackBar_a_freq, 600, 40, 320, 20, 20, 10000)
TrackBarGadget(#TrackBar_b_freq, 600, 70, 320, 20, 20, 10000)
TrackBarGadget(#TrackBar_c_freq, 600, 100, 320, 20, 20, 10000)
TrackBarGadget(#TrackBar_d_freq, 600, 130, 320, 20, 20, 10000)
TrackBarGadget(#TrackBar_e_freq, 600, 160, 320, 20, 20, 10000)
SetGadgetState(#TrackBar_a_freq, freq_A)
SetGadgetState(#TrackBar_b_freq, freq_B)
SetGadgetState(#TrackBar_c_freq, freq_C)
SetGadgetState(#TrackBar_d_freq, freq_D)
SetGadgetState(#TrackBar_e_freq, freq_E)
TextGadget(#Text_a_freq_val, 570, 40, 30, 20, Str(freq_A), #PB_Text_Center)
TextGadget(#Text_b_freq_val, 570, 70, 30, 20,Str(freq_B), #PB_Text_Center)
TextGadget(#Text_c_freq_val, 570, 100, 30, 20,Str(freq_C), #PB_Text_Center)
TextGadget(#Text_d_freq_val, 570, 130, 30, 20, Str(freq_D), #PB_Text_Center)
TextGadget(#Text_e_freq_val, 570, 160, 30, 20, Str(freq_E), #PB_Text_Center)
ComboBoxGadget(#Combo_a_mod_freq, 930, 40, 80, 20)
AddGadgetItem(#Combo_a_mod_freq,0,"Aucune")
AddGadgetItem(#Combo_a_mod_freq,1,"Affine")
AddGadgetItem(#Combo_a_mod_freq,2, "Exponentielle")
AddGadgetItem(#Combo_a_mod_freq,3,"Sinus_10T" )
AddGadgetItem(#Combo_a_mod_freq,4,"Sinus_100T" )
AddGadgetItem(#Combo_a_mod_freq,5,"Scie_10T" )
AddGadgetItem(#Combo_a_mod_freq,6,"Scie_100T" )
AddGadgetItem(#Combo_a_mod_freq,7,"Aléatoire" )
SetGadgetState(#Combo_a_mod_freq,0)
ComboBoxGadget(#Combo_b_mod_freq, 930, 70, 80, 20)
AddGadgetItem(#Combo_b_mod_freq,0,"Aucune")
AddGadgetItem(#Combo_b_mod_freq,1,"Affine")
AddGadgetItem(#Combo_b_mod_freq,2, "Exponentielle")
AddGadgetItem(#Combo_b_mod_freq,3,"Sinus_10T" )
AddGadgetItem(#Combo_b_mod_freq,4,"Sinus_100T" )
AddGadgetItem(#Combo_b_mod_freq,5,"Scie_10T" )
AddGadgetItem(#Combo_b_mod_freq,6,"Scie_100T" )
AddGadgetItem(#Combo_b_mod_freq,7,"Aléatoire" )
SetGadgetState(#Combo_b_mod_freq,0)
ComboBoxGadget(#Combo_c_mod_freq, 930, 100, 80, 20)
AddGadgetItem(#Combo_c_mod_freq,0,"Aucune")
AddGadgetItem(#Combo_c_mod_freq,1,"Affine")
AddGadgetItem(#Combo_c_mod_freq,2, "Exponentielle")
AddGadgetItem(#Combo_c_mod_freq,3,"Sinus_10T" )
AddGadgetItem(#Combo_c_mod_freq,4,"Sinus_100T" )
AddGadgetItem(#Combo_c_mod_freq,5,"Scie_10T" )
AddGadgetItem(#Combo_c_mod_freq,6,"Scie_100T" )
AddGadgetItem(#Combo_c_mod_freq,7,"Aléatoire" )
SetGadgetState(#Combo_c_mod_freq,0)
ComboBoxGadget(#Combo_d_mod_freq, 930, 130, 80, 20)
AddGadgetItem(#Combo_d_mod_freq,0,"Aucune")
AddGadgetItem(#Combo_d_mod_freq,1,"Affine")
AddGadgetItem(#Combo_d_mod_freq,2, "Exponentielle")
AddGadgetItem(#Combo_d_mod_freq,3,"Sinus_10T" )
AddGadgetItem(#Combo_d_mod_freq,4,"Sinus_100T" )
AddGadgetItem(#Combo_d_mod_freq,5,"Scie_10T" )
AddGadgetItem(#Combo_d_mod_freq,6,"Scie_100T" )
AddGadgetItem(#Combo_d_mod_freq,7,"Aléatoire" )
SetGadgetState(#Combo_d_mod_freq,0)
StartDrawing(WindowOutput(0))
;-dessin de l'écran
Box(0,#hauteur_ecran*0.5,#largeur_ecran,#hauteur_ecran*0.5,RGB(0,0,0))
;-dessin spectre
For l=0 To 310
couleur_frequence(l,320)
Line(605+l,30 , 0, 10,couleur)
Next l
;-dessin des axes
Line(x_origine,y_origine,#largeur_ecran-2*#marge,0,RGB(255,255,255))
Line(#marge,#hauteur_ecran*0.5+#marge,0,#hauteur_ecran*0.5-2*#marge,RGB(255,255,255))
StopDrawing()
;-BOUCLE PRINCIPALE
Repeat
Repeat
Event = WindowEvent()
Select Event
Case #PB_Event_CloseWindow
End
Case #PB_Event_Gadget
difference.l=GetGadgetState(#TrackBar_duree)-(GetGadgetState(#TrackBar_ab_duree)+GetGadgetState(#TrackBar_bc_duree)+GetGadgetState(#TrackBar_cd_duree)+GetGadgetState(#TrackBar_de_duree))
Select EventGadget()
Case #TrackBar_duree
SetGadgetText(#Text_duree_val,Str(GetGadgetState(#TrackBar_duree)))
duree_partagee.l=GetGadgetState(#TrackBar_duree)*0.25
SetGadgetState(#TrackBar_ab_duree, duree_partagee)
SetGadgetState(#TrackBar_bc_duree, duree_partagee)
SetGadgetState(#TrackBar_cd_duree, duree_partagee)
SetGadgetState(#TrackBar_de_duree, duree_partagee)
SetGadgetText(#Text_ab_duree_val,Str(GetGadgetState(#TrackBar_ab_duree)))
SetGadgetText(#Text_bc_duree_val,Str(GetGadgetState(#TrackBar_bc_duree)))
SetGadgetText(#Text_cd_duree_val,Str(GetGadgetState(#TrackBar_cd_duree)))
SetGadgetText(#Text_de_duree_val,Str(GetGadgetState(#TrackBar_de_duree)))
Case #TrackBar_ab_duree
SetGadgetText(#Text_ab_duree_val,Str(GetGadgetState(#TrackBar_ab_duree)))
If GetGadgetState(#TrackBar_de_duree)>10
SetGadgetState(#TrackBar_de_duree,GetGadgetState(#TrackBar_de_duree)+difference)
SetGadgetText(#Text_de_duree_val,Str(GetGadgetState(#TrackBar_de_duree)))
ElseIf GetGadgetState(#TrackBar_de_duree)=10 And GetGadgetState(#TrackBar_cd_duree)>10
SetGadgetState(#TrackBar_cd_duree,GetGadgetState(#TrackBar_cd_duree)+difference)
SetGadgetText(#Text_cd_duree_val,Str(GetGadgetState(#TrackBar_cd_duree)))
ElseIf GetGadgetState(#TrackBar_de_duree)=10 And GetGadgetState(#TrackBar_cd_duree)=10 And GetGadgetState(#TrackBar_bc_duree)>=10
SetGadgetState(#TrackBar_bc_duree,GetGadgetState(#TrackBar_bc_duree)+difference)
SetGadgetText(#Text_bc_duree_val,Str(GetGadgetState(#TrackBar_bc_duree)))
;blocage de l'index à la valeur max en fonction de la durée choisie
If GetGadgetState(#TrackBar_de_duree)+ GetGadgetState(#TrackBar_cd_duree)+ GetGadgetState(#TrackBar_bc_duree)=30
SetGadgetState(#TrackBar_ab_duree,GetGadgetState(#TrackBar_duree)-30)
SetGadgetText(#Text_ab_duree_val,Str(GetGadgetState(#TrackBar_ab_duree)))
EndIf
EndIf
Case #TrackBar_bc_duree
SetGadgetText(#Text_bc_duree_val,Str(GetGadgetState(#TrackBar_bc_duree)))
If GetGadgetState(#TrackBar_de_duree)>10
SetGadgetState(#TrackBar_de_duree,GetGadgetState(#TrackBar_de_duree)+difference)
SetGadgetText(#Text_de_duree_val,Str(GetGadgetState(#TrackBar_de_duree)))
ElseIf GetGadgetState(#TrackBar_de_duree)=10 And GetGadgetState(#TrackBar_cd_duree)>10
SetGadgetState(#TrackBar_cd_duree,GetGadgetState(#TrackBar_cd_duree)+difference)
SetGadgetText(#Text_cd_duree_val,Str(GetGadgetState(#TrackBar_cd_duree)))
ElseIf GetGadgetState(#TrackBar_de_duree)=10 And GetGadgetState(#TrackBar_cd_duree)=10 And GetGadgetState(#TrackBar_ab_duree)>=10
SetGadgetState(#TrackBar_ab_duree,GetGadgetState(#TrackBar_ab_duree)+difference)
SetGadgetText(#Text_ab_duree_val,Str(GetGadgetState(#TrackBar_ab_duree)))
;blocage de l'index à la valeur max en fonction de la durée choisie
If GetGadgetState(#TrackBar_de_duree)+ GetGadgetState(#TrackBar_cd_duree)+ GetGadgetState(#TrackBar_ab_duree)=30
SetGadgetState(#TrackBar_bc_duree,GetGadgetState(#TrackBar_duree)-30)
SetGadgetText(#Text_bc_duree_val,Str(GetGadgetState(#TrackBar_bc_duree)))
EndIf
EndIf
Case #TrackBar_cd_duree
SetGadgetText(#Text_cd_duree_val,Str(GetGadgetState(#TrackBar_cd_duree)))
If GetGadgetState(#TrackBar_de_duree)>10
SetGadgetState(#TrackBar_de_duree,GetGadgetState(#TrackBar_de_duree)+difference)
SetGadgetText(#Text_de_duree_val,Str(GetGadgetState(#TrackBar_de_duree)))
ElseIf GetGadgetState(#TrackBar_de_duree)=10 And GetGadgetState(#TrackBar_bc_duree)>10
SetGadgetState(#TrackBar_bc_duree,GetGadgetState(#TrackBar_bc_duree)+difference)
SetGadgetText(#Text_bc_duree_val,Str(GetGadgetState(#TrackBar_bc_duree)))
ElseIf GetGadgetState(#TrackBar_de_duree)=10 And GetGadgetState(#TrackBar_bc_duree)=10 And GetGadgetState(#TrackBar_ab_duree)>=10
SetGadgetState(#TrackBar_ab_duree,GetGadgetState(#TrackBar_ab_duree)+difference)
SetGadgetText(#Text_ab_duree_val,Str(GetGadgetState(#TrackBar_ab_duree)))
;blocage de l'index à la valeur max en fonction de la durée choisie
If GetGadgetState(#TrackBar_de_duree)+ GetGadgetState(#TrackBar_bc_duree)+ GetGadgetState(#TrackBar_ab_duree)=30
SetGadgetState(#TrackBar_cd_duree,GetGadgetState(#TrackBar_duree)-30)
SetGadgetText(#Text_cd_duree_val,Str(GetGadgetState(#TrackBar_cd_duree)))
EndIf
EndIf
Case #TrackBar_de_duree
SetGadgetText(#Text_de_duree_val,Str(GetGadgetState(#TrackBar_de_duree)))
If GetGadgetState(#TrackBar_cd_duree)>10
SetGadgetState(#TrackBar_cd_duree,GetGadgetState(#TrackBar_cd_duree)+difference)
SetGadgetText(#Text_cd_duree_val,Str(GetGadgetState(#TrackBar_cd_duree)))
ElseIf GetGadgetState(#TrackBar_cd_duree)=10 And GetGadgetState(#TrackBar_bc_duree)>10
SetGadgetState(#TrackBar_bc_duree,GetGadgetState(#TrackBar_bc_duree)+difference)
SetGadgetText(#Text_bc_duree_val,Str(GetGadgetState(#TrackBar_bc_duree)))
ElseIf GetGadgetState(#TrackBar_cd_duree)=10 And GetGadgetState(#TrackBar_bc_duree)=10 And GetGadgetState(#TrackBar_ab_duree)>=10
SetGadgetState(#TrackBar_ab_duree,GetGadgetState(#TrackBar_ab_duree)+difference)
SetGadgetText(#Text_ab_duree_val,Str(GetGadgetState(#TrackBar_ab_duree)))
;blocage de l'index à la valeur max en fonction de la durée choisie
If GetGadgetState(#TrackBar_cd_duree)+ GetGadgetState(#TrackBar_bc_duree)+ GetGadgetState(#TrackBar_ab_duree)=30
SetGadgetState(#TrackBar_de_duree,GetGadgetState(#TrackBar_duree)-30)
SetGadgetText(#Text_de_duree_val,Str(GetGadgetState(#TrackBar_de_duree)))
EndIf
EndIf
Case #TrackBar_a_ampl
SetGadgetText(#Text_a_ampl_val,Str(GetGadgetState(#TrackBar_a_ampl)*100/180))
Case #TrackBar_b_ampl
SetGadgetText(#Text_b_ampl_val,Str(GetGadgetState(#TrackBar_b_ampl)*100/180))
Case #TrackBar_c_ampl
SetGadgetText(#Text_c_ampl_val,Str(GetGadgetState(#TrackBar_c_ampl)*100/180))
Case #TrackBar_d_ampl
SetGadgetText(#Text_d_ampl_val,Str(GetGadgetState(#TrackBar_d_ampl)*100/180))
Case #TrackBar_e_ampl
SetGadgetText(#Text_e_ampl_val,Str(GetGadgetState(#TrackBar_e_ampl)*100/180))
Case #TrackBar_a_freq
SetGadgetText(#Text_a_freq_val,Str(GetGadgetState(#TrackBar_a_freq)))
Case #TrackBar_b_freq
SetGadgetText(#Text_b_freq_val,Str(GetGadgetState(#TrackBar_b_freq)))
Case #TrackBar_c_freq
SetGadgetText(#Text_c_freq_val,Str(GetGadgetState(#TrackBar_c_freq)))
Case #TrackBar_d_freq
SetGadgetText(#Text_d_freq_val,Str(GetGadgetState(#TrackBar_d_freq)))
Case #TrackBar_e_freq
SetGadgetText(#Text_e_freq_val,Str(GetGadgetState(#TrackBar_e_freq)))
Case #Button_fichier_wav
recuperation_donnees
enregistrement
NomFichier$=SaveFileRequester("Enregistrement du fichier(ne pas saisir l'extension .wav)","c:\","Sons (*.wav)| *.wav",0)
CreateFile(0,NomFichier$+".wav")
For i=0 To (44 + datachunkBytes)
WriteByte(0,PeekB(*sound+i))
Next i
CloseFile(0)
Case #Button_test
recuperation_donnees
;-copie dans le presse-papier
donnees_procedure$="creation_son(0,*son,"+Str(GetGadgetState(#Combo_type_signal))+","+Str(duree_signal)
donnees_procedure$=donnees_procedure$+","+Str(freq_A)+","+Str(freq_B)+","+Str(freq_C)+","+Str(freq_D)+","+Str(freq_E)
donnees_procedure$=donnees_procedure$+","+Str(x_ech_A)+","+Str(x_ech_B)+","+Str(x_ech_C)+","+Str(x_ech_D)+","+Str(x_ech_E)
donnees_procedure$=donnees_procedure$+","+Str(ampl_A)+","+Str(ampl_B)+","+Str(ampl_C)+","+Str(ampl_d)+","+Str(ampl_E)
donnees_procedure$=donnees_procedure$+","+Str(GetGadgetState(#Combo_a_mod_ampl))+","+Str(GetGadgetState(#Combo_b_mod_ampl))+","+Str(GetGadgetState(#Combo_c_mod_ampl))+","+Str(GetGadgetState(#Combo_d_mod_ampl))
donnees_procedure$=donnees_procedure$+","+Str(GetGadgetState(#Combo_a_mod_freq))+","+Str(GetGadgetState(#Combo_b_mod_freq))+","+Str(GetGadgetState(#Combo_c_mod_freq))+","+Str(GetGadgetState(#Combo_d_mod_freq))+")"
SetClipboardText(donnees_procedure$)
enregistrement
trace_courbe
; catch and play the sound
CatchSound(0, *sound)
PlaySound(0)
EndSelect
EndSelect
Until Event = 0
Delay(1)
ForEver
Code : Tout sélectionner
;pure_ADSR_procedure
#largeur_ecran=100
#hauteur_ecran=100
Declare creation_son(ID,*son,type_signal.b,duree.f,freq_A.f,freq_B.f,freq_C.f,freq_D.f,freq_E.f,x_A.f,x_B.f,x_C.f,x_D.f,x_E.f,ampl_A.f,ampl_B.f,ampl_C.f,ampl_D.f,ampl_E.f,mod_ampl_A.b,mod_ampl_B.b,mod_ampl_C.b,mod_ampl_D.b,mod_freq_A.b,mod_freq_B.b,mod_freq_C.b,mod_freq_D.b)
;-PROGRAMME PRINCIPAL
InitSound()
OpenWindow(0, 0, 0, #largeur_ecran, #hauteur_ecran, "Exemple d'utilisation de pure_ADSR", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
creation_son(0,*son1,4,6707,517,86,550,20,451,0,73956,147911,221867,295823,33,32767,13107,9830,33,3,3,3,3,1,1,1,2)
creation_son(1,*son2,2,4403,4231,20,285,220,20,0,48554,48995,97549,194172,32767,33,32767,9830,33,1,1,1,2,2,7,7,7)
PlaySound(0 )
Delay(6000)
PlaySound(1)
;-BOUCLE PRINCIPALE
Repeat
Repeat
Event = WindowEvent()
Select Event
Case #PB_Event_CloseWindow
End
EndSelect
Until Event = 0
Delay(1)
ForEver
Macro affine(a,b,xA,yA,xB,yB)
a.f=(yB-yA)/(xB-xA)
b.f=(yA*xB-yB*xA)/(xB-xA)
EndMacro
Macro exp(x)
Pow(#e,x)
EndMacro
Macro modulation_amplitude(type_mod_ampl,ampl,a_aff,b_aff,a_exp,x_ech_point,b_exp)
Select type_mod_ampl
Case 0 ;aucune modulation
amplitude=ampl
Case 1 ;affine
amplitude=(a_aff*x_echantillon+b_aff)
Case 2 ;exponentielle
amplitude=(a_exp*exp((x_echantillon-x_ech_point)*b_exp))
Case 3 ;sinusoïdale 10T
amplitude=(a_aff*x_echantillon+b_aff)*(0.5+0.5*Sin(#mod_10T*2 * #PI * frequence*x_echantillon/freq_ech))
Case 4 ;sinusoïdale 100T
amplitude=(a_aff*x_echantillon+b_aff)*(0.5+0.5*Sin(#mod_100T*2 * #PI * frequence*x_echantillon/freq_ech))
Case 5 ; dents de scie 10T
If x_echantillon=x_ech_point
x_origine_dent_mod=x_ech_point
nbre_ech_par_10T=Int(Round(freq_ech/(frequence*#mod_10T),#PB_Round_Nearest))
EndIf
If (x_echantillon-x_origine_dent_mod)%nbre_ech_par_10T=0
x_origine_dent_mod=x_echantillon
nbre_ech_par_10T=Int(Round(freq_ech/(frequence*#mod_10T),#PB_Round_Nearest))
EndIf
amplitude=(ampl/nbre_ech_par_10T)*(x_echantillon-x_origine_dent_mod)
Case 6 ; dents de scie 100T
If x_echantillon=x_ech_point
x_origine_dent_mod=x_ech_point
nbre_ech_par_100T=Int(Round(freq_ech/(frequence*#mod_100T),#PB_Round_Nearest))
EndIf
If (x_echantillon-x_origine_dent_mod)%nbre_ech_par_100T=0
x_origine_dent_mod=x_echantillon
nbre_ech_par_100T=Int(Round(freq_ech/(frequence*#mod_100T),#PB_Round_Nearest))
EndIf
amplitude=(ampl/nbre_ech_par_100T)*(x_echantillon-x_origine_dent_mod)
EndSelect
EndMacro
Macro modulation_frequence(type_mod_freq,freq,a_ff,b_ff,a_exp,x_ech_point,b_exp)
Select type_mod_freq
Case 0 ;aucune modulation
frequence=freq
Case 1 ;affine
frequence=(a_ff*x_echantillon+b_ff)
Case 2 ;exponentielle
frequence=(a_exp*exp((x_echantillon-x_ech_point)*b_exp))
Case 3 ;sinusoïdale 10T
frequence=freq*(0.6+0.4*Sin(#mod_10T*2 * #PI * freq*x_echantillon/freq_ech))
Case 4 ;sinusoïdale 100T
frequence=freq*(0.6+0.4*Sin(#mod_100T*2 * #PI * freq*x_echantillon/freq_ech))
Case 5 ; dents de scie 10T
If x_echantillon=x_ech_point
x_origine_dent_mod=x_ech_point
nbre_ech_par_10T=Int(Round(freq_ech/(freq*#mod_10T),#PB_Round_Nearest))
EndIf
If (x_echantillon-x_origine_dent_mod)%nbre_ech_par_10T=0
x_origine_dent_mod=x_echantillon
nbre_ech_par_10T=Int(Round(freq_ech/(freq*#mod_10T),#PB_Round_Nearest))
EndIf
frequence=(freq/nbre_ech_par_10T)*(x_echantillon-x_origine_dent_mod)+#frequence_min
Case 6 ; dents de scie 100T
If x_echantillon=x_ech_point
x_origine_dent_mod=x_ech_point
nbre_ech_par_100T=Int(Round(freq_ech/(freq*#mod_100T),#PB_Round_Nearest))
EndIf
If (x_echantillon-x_origine_dent_mod)%nbre_ech_par_100T=0
x_origine_dent_mod=x_echantillon
nbre_ech_par_100T=Int(Round(freq_ech/(freq*#mod_100T),#PB_Round_Nearest))
EndIf
frequence=(freq/nbre_ech_par_100T)*(x_echantillon-x_origine_dent_mod)+#frequence_min
Case 7 ;aléatoire
frequence=#frequence_min+Random(freq)
EndSelect
EndMacro
Macro exponentielle(a,b,xA,yA,xB,yB)
;test pour les amplitudes yA nulles!
If yA=0
yA=0.001*ampl_max
EndIf
If yB=0
yB=0.001*ampl_max
EndIf
b.f=Log(yB/yA)/(xB-xA)
a.f=yA*exp(b*xA)
EndMacro
Procedure creation_son(ID,*son,type_signal.b,duree.f,freq_A.f,freq_B.f,freq_C.f,freq_D.f,freq_E.f,x_A.f,x_B.f,x_C.f,x_D.f,x_E.f,ampl_A.f,ampl_B.f,ampl_C.f,ampl_D.f,ampl_E.f,mod_ampl_A.b,mod_ampl_B.b,mod_ampl_C.b,mod_ampl_D.b,mod_freq_A.b,mod_freq_B.b,mod_freq_C.b,mod_freq_D.b)
#frequence_min=20
#frequence_max=10000
#e=2.71828182845904
#mod_10T=0.1
#mod_100T=0.01
amplitude.f
ampl_max.f=32767 ;Pow(2, #bitrate-1)-1
frequence.f
freq_ech.f=44100
nbre_ech_par_periode=freq_ech/freq_A
nbre_ech_par_10T=Int(Round(freq_ech/(freq_A*#mod_10T),#PB_Round_Nearest))
nbre_ech_par_100T=Int(Round(freq_ech/(freq_A*#mod_100T),#PB_Round_Nearest))
alternance.b=-1
;-modulation affine des amplitudes (y=a*x+b)
affine(a_ampl_AB_aff,b_ampl_AB_aff,x_A,ampl_A,x_B,ampl_B)
affine(a_ampl_BC_aff,b_ampl_BC_aff,x_B,ampl_B,x_C,ampl_C)
affine(a_ampl_CD_aff,b_ampl_CD_aff,x_C,ampl_C,x_D,ampl_D)
affine(a_ampl_DE_aff,b_ampl_DE_aff,x_D,ampl_D,x_E,ampl_E)
;-modulation exponentielle des amplitudes (y=a*exp(b*x)) !!!!penser au changement d'origine pour le calcul de a et b
exponentielle(a_ampl_AB_exp,b_ampl_AB_exp,0,ampl_A,x_B,ampl_B)
exponentielle(a_ampl_BC_exp,b_ampl_BC_exp,0,ampl_B,x_C-x_B,ampl_C)
exponentielle(a_ampl_CD_exp,b_ampl_CD_exp,0,ampl_C,x_D-x_C,ampl_D)
exponentielle(a_ampl_DE_exp,b_ampl_DE_exp,0,ampl_D,x_E-x_D,ampl_E)
;-modulation affine des fréquences (f=a*x+b)
affine(a_freq_AB_aff,b_freq_AB_aff,x_A,freq_A,x_B,freq_B)
affine(a_freq_BC_aff,b_freq_BC_aff,x_B,freq_B,x_C,freq_C)
affine(a_freq_CD_aff,b_freq_CD_aff,x_C,freq_C,x_D,freq_D)
affine(a_freq_DE_aff,b_freq_DE_aff,x_D,freq_D,x_E,freq_E)
;-modulation exponentielle des fréquences (y=a*exp(b*x)) !!!!penser au changement d'origine pour le calcul de a et b
exponentielle(a_freq_AB_exp,b_freq_AB_exp,x_A,freq_A,x_B,freq_B)
exponentielle(a_freq_BC_exp,b_freq_BC_exp,0,freq_B,x_C-x_B,freq_C)
exponentielle(a_freq_CD_exp,b_freq_CD_exp,0,freq_C,x_D-x_C,freq_D)
exponentielle(a_freq_DE_exp,b_freq_DE_exp,0,freq_D,x_E-x_D,freq_E)
#samplerate = 44100 ; samplerate
#bitrate = 16 ; Bits per sample, #bitrate Mod 8 must be 0 !
#channels = 2 ; number of channels
totalsamples.l =(duree/1000)*#samplerate ; length in samples
nbre_ech_total.l=totalsamples
#avBytesPerSec = #channels*#bitrate/8*#samplerate ; calculate the average bytes per second
datachunkBytes.l = totalsamples * #channels * #bitrate/8 +1
Structure PBUnion
StructureUnion
b.b
w.w
l.l
f.f
s.s
EndStructureUnion
EndStructure
*son = AllocateMemory(44 + datachunkBytes)
*mem.PBUnion = *son
*mem\l = 'FFIR' : *mem+4 ; riff-chunk-ID "RIFF"
*mem\l = 36 + datachunkBytes : *mem+4 ; normally filesize minus (these) 8 Bytes
*mem\l = 'EVAW' : *mem+4 ; wave-chunk-ID "WAVE"
*mem\l = ' tmf' : *mem+4 ; format-chunk-ID "FMT "
*mem\l = 16 : *mem+4 ; chunk data size (+ Extra Format Bytes)
*mem\w = 1 : *mem+2 ; compression code
*mem\w = #channels : *mem+2 ; number of channels
*mem\l = #samplerate : *mem+4 ; samplerate
*mem\l = #avBytesPerSec : *mem+4 ; average bytes per second, (channels)*(block align)*(samplerate)
*mem\w = #bitrate/8*#channels : *mem+2 ; Block Align ('bytes per sample')
*mem\w = #bitrate : *mem+2 ; Bits per sample
*mem\l = 'atad' : *mem+4 ; data-chunk-ID "DATA"
*mem\l = datachunkBytes : *mem+4 ; data chunk size in bytes
;/ Now lets write #totalsamples
;/ work only for 16 Bit or more. 8-Bit has zero-line at value 128, so it is unsigned
For x_echantillon=0 To nbre_ech_total
For actchannel = 1 To #channels
If x_echantillon<x_B
modulation_amplitude(mod_ampl_A,ampl_A,a_ampl_AB_aff,b_ampl_AB_aff,a_ampl_AB_exp,x_A,b_ampl_AB_exp)
modulation_frequence(mod_freq_A,freq_A, a_freq_AB_aff,b_freq_AB_aff,a_freq_AB_exp,x_A,b_freq_AB_exp)
ElseIf x_echantillon>=x_B And x_echantillon<x_C
modulation_amplitude(mod_ampl_B,ampl_B,a_ampl_BC_aff,b_ampl_BC_aff,a_ampl_BC_exp,x_B,b_ampl_BC_exp)
modulation_frequence(mod_freq_B,freq_B, a_freq_BC_aff,b_freq_BC_aff,a_freq_BC_exp,x_B,b_freq_BC_exp)
ElseIf x_echantillon>=x_C And x_echantillon<x_D
modulation_amplitude(mod_ampl_C,ampl_C,a_ampl_CD_aff,b_ampl_CD_aff,a_ampl_CD_exp,x_C,b_ampl_CD_exp)
modulation_frequence(mod_freq_C,freq_C, a_freq_CD_aff,b_freq_CD_aff,a_freq_CD_exp,x_C,b_freq_CD_exp)
Else
modulation_amplitude(mod_ampl_D,ampl_d,a_ampl_DE_aff,b_ampl_DE_aff,a_ampl_DE_exp,x_D,b_ampl_DE_exp)
modulation_frequence(mod_freq_D,freq_D, a_freq_DE_aff,b_freq_DE_aff,a_freq_DE_exp,x_D,b_freq_DE_exp)
EndIf
Select type_signal
;signal sinusoïdal
Case 0
*mem\w=amplitude*Sin(2 * #PI * frequence*x_echantillon/freq_ech) : *mem+2
;signal carré
Case 1
If x_echantillon%Int(nbre_ech_par_periode*0.5)=0
nbre_ech_par_periode=Int(Round(freq_ech/frequence,#PB_Round_Nearest))
alternance=-alternance
EndIf
*mem\w=amplitude*alternance : *mem+2
;signal triangle
Case 2
If x_echantillon%Int(nbre_ech_par_periode*0.5)=0
nbre_ech_par_periode=Int(Round(freq_ech/frequence,#PB_Round_Nearest))
x_origine_triangle=x_echantillon
alternance=-alternance
EndIf
*mem\w=(4*(amplitude/nbre_ech_par_periode)*(x_echantillon-x_origine_triangle)-amplitude)*alternance : *mem+2
;signal dents de scie
Case 3
If x_echantillon%Int(nbre_ech_par_periode)=0
nbre_ech_par_periode=Int(Round(freq_ech/frequence,#PB_Round_Nearest))
x_origine_dent=x_echantillon
EndIf
*mem\w=2*(amplitude/nbre_ech_par_periode)*(x_echantillon-x_origine_dent)-amplitude : *mem+2
;signal bruit sinusoïdal
Case 4
*mem\w=Random(amplitude)*Sin(2 * #PI * frequence*x_echantillon/freq_ech) : *mem+2
;signal bruit carré
Case 5
If x_echantillon%Int(nbre_ech_par_periode*0.5)=0
nbre_ech_par_periode=Int(Round(freq_ech/frequence,#PB_Round_Nearest))
alternance=-alternance
EndIf
*mem\w=Random(amplitude)*alternance : *mem+2
EndSelect
Next actchannel
Next x_echantillon
CatchSound(ID, *son)
EndProcedure
Je ferai un post avec une bibliothèque de sons (quand j'aurai commencé la phase "recherche de sons!" )
J'ai des questions qui vont arriver sur le MIDI! Accrochez-vous, c'est pour bientôt !
Hasta lavista !