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 !