pure ADSR (+procédure+save) ça, c'est la faute à tonton !
Bientôt !(le code est prêt , je fais un peu de ménage )
En attendant, les signaux(1ère ligne) et un petit aperçu de quelques modulations.
Hasta la proxima!
En attendant, les signaux(1ère ligne) et un petit aperçu de quelques modulations.
Hasta la proxima!
Dernière modification par Huitbit le dim. 05/avr./2009 16:22, modifié 1 fois.
si j'ai cité ces synthes , c'est parce qu'ils disposaient de filtres, et que tu pouvais composer ton son en utilisant des generateurs de signaux (carre,triangulaire)Ollivier a écrit :Attends parce que là, ce n'est que la création d'un son. C'est déjà tout un Univers gigantesque de possibilités.
et les parametres ADRS !!
Re: pure ADSR (+procédure+save) ça, c'est la faute à tonton
Mise a jour du Code de huitBit en Pb V 5.22
Code 1
Code 1
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)
; mis en Version 5.22 par Dobro
#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
EndStructureUnion
s.s
EndStructure
;*sund
*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
*sund = AllocateMemory(44 + datachunkBytes)
*mem = *sund
*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 (*av)| *av",0)
CreateFile(0,NomFichier$+".wav")
For i=0 To (44 + datachunkBytes)
WriteByte(0,PeekB(*sund+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, *sund)
PlaySound(0)
EndSelect
EndSelect
Until Event = 0
Delay(1)
ForEver
; Epb
Dernière modification par Backup le lun. 07/juil./2014 20:38, modifié 1 fois.
Re: pure ADSR (+procédure+save) ça, c'est la faute à tonton
et le code 2
Code : Tout sélectionner
;pure_ADSR_procedure
;#largeur_ecran=100
;#hauteur_ecran=100
;Mis a jour V 5.22 par Dobro
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, 100, 100, "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
EndStructureUnion
s.s
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
; Epb
- TazNormand
- Messages : 1294
- Inscription : ven. 27/oct./2006 12:19
- Localisation : Calvados (14)
Re: pure ADSR (+procédure+save) ça, c'est la faute à tonton
Ligne 797 erreur de dépassement de type long ???
EDIT : trouvé : décocher UNICODE dans les options du compilo
EDIT : trouvé : décocher UNICODE dans les options du compilo
Re: pure ADSR (+procédure+save) ça, c'est la faute à tonton
@Dobro
Merci pour l'effort ! Il faut avoir du courage pour mettre le nez dans un de mes anciens codes (maintenant, ça va mieux, heureusement) !!
@TazNormand
Bien trouvé !
A noter :
A remplacer par(ça fait quelques calculs en moins !):
J'ai commencé mon PurePunch (version allégée de mon jeu en chantier, je finis avec le bac demain, enfin !!)
Ollivier a pointé son nez de puncher, si je n'arrive pas à le faire en 50 lignes, je peux toujours essayer de négocier pour qu'il me le fasse en 40 lignes les fingers in the nose ! !
Hasta la vista !
PS : il y avait une version plus complète en bas de page, ici (code non mis à jour) :
http://purebasic.fr/french/viewtopic.ph ... hilit=adsr
Merci pour l'effort ! Il faut avoir du courage pour mettre le nez dans un de mes anciens codes (maintenant, ça va mieux, heureusement) !!
@TazNormand
Bien trouvé !
A noter :
Code : Tout sélectionner
Macro affine(a,b,xA,yA,xB,yB)
a.f=(yB-yA)/(xB-xA)
b.f=(yA * xB-yB * xA)/(xB-xA)
EndMacro
Code : Tout sélectionner
Macro affine(a,b,xA,yA,xB,yB)
a.f=(yB-yA)/(xB-xA)
b.f=yA-a*xA
EndMacro
Ollivier a pointé son nez de puncher, si je n'arrive pas à le faire en 50 lignes, je peux toujours essayer de négocier pour qu'il me le fasse en 40 lignes les fingers in the nose ! !
Hasta la vista !
PS : il y avait une version plus complète en bas de page, ici (code non mis à jour) :
http://purebasic.fr/french/viewtopic.ph ... hilit=adsr
Elevé au MSX !
Re: pure ADSR (+procédure+save) ça, c'est la faute à tonton
je viens de mettre le code a jour , il n'y avait quasi rien a faireHuitbit a écrit : PS : il y avait une version plus complète en bas de page, ici (code non mis à jour) :
http://purebasic.fr/french/viewtopic.ph ... hilit=adsr
ce qui serai bien , c'est que tu copie mes mises a jours a la place de ton code
comme ça , je pourrai effacer mes codes, cela fera un Topic moins surchargé
surtout que franchement j'ai juste deplacé un membre de Structure
et mis en commentaire la constante #e
dans le premier code , pareil sauf que j'ai dé-typé quelques Pointeurs
Re: pure ADSR (+procédure+save) ça, c'est la faute à tonton
Merci pour ce nouveau boulot,
C'est une bonne idée d'éditer mais avant, il faut que je jette un coup d'œil au code(je ne sais pas quand !) pour régler ce problème d'Unicode.
Hasta la visa !
C'est une bonne idée d'éditer mais avant, il faut que je jette un coup d'œil au code(je ne sais pas quand !) pour régler ce problème d'Unicode.
Hasta la visa !
Elevé au MSX !
Re: pure ADSR (+procédure+save) ça, c'est la faute à tonton
En fait, ce process est libre depuis... un mois!
http://www.google.com/patents/US4335277
(Il faudra songer à pardonner Googole qui a laissé une faute à la 2ème phrase de cette page web :
" One example of such a system is a speed*
synthesis device controlled by the central processing unit of a computer."
*: C'est "speech" pas "speed"
)
http://www.google.com/patents/US4335277
(Il faudra songer à pardonner Googole qui a laissé une faute à la 2ème phrase de cette page web :
" One example of such a system is a speed*
synthesis device controlled by the central processing unit of a computer."
*: C'est "speech" pas "speed"
)