pure ADSR (+procédure+save) ça, c'est la faute à tonton !

Programmation d'applications complexes
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

pas encore testé , mais bon boulot !! :D
Avatar de l’utilisateur
Huitbit
Messages : 939
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Message par Huitbit »

Bientôt !(le code est prêt , je fais un peu de ménage :P )
En attendant, les signaux(1ère ligne) et un petit aperçu de quelques modulations.

Image
Hasta la proxima!
Dernière modification par Huitbit le dim. 05/avr./2009 16:22, modifié 1 fois.
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

HuitBit the "Tech" Creator!!
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Ollivier a écrit :HuitBit the "Tech" Creator!!
tout petit il bavait sur les synthetiseurs de pink floyd :)

(qui se souviens du Korg Delta ? )
Image

ou du Moog opus3
Image
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

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.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

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.
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)
et les parametres ADRS !! ;)
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Ben ouais mais, en la matière, là tu parles à un gros ignorant!!!
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: pure ADSR (+procédure+save) ça, c'est la faute à tonton

Message par Backup »

Mise a jour du Code de huitBit en Pb V 5.22

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.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: pure ADSR (+procédure+save) ça, c'est la faute à tonton

Message par Backup »

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

Avatar de l’utilisateur
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

Message par TazNormand »

Ligne 797 erreur de dépassement de type long ???

EDIT : trouvé : décocher UNICODE dans les options du compilo
Image
Image
Avatar de l’utilisateur
Huitbit
Messages : 939
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Re: pure ADSR (+procédure+save) ça, c'est la faute à tonton

Message par Huitbit »

@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 :

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
A remplacer par(ça fait quelques calculs en moins !):

Code : Tout sélectionner

  Macro affine(a,b,xA,yA,xB,yB)
      a.f=(yB-yA)/(xB-xA)
      b.f=yA-a*xA
   EndMacro
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 ! :P !

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 !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: pure ADSR (+procédure+save) ça, c'est la faute à tonton

Message par Backup »

Huitbit 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
je viens de mettre le code a jour , il n'y avait quasi rien a faire

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 :)
Avatar de l’utilisateur
Huitbit
Messages : 939
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Re: pure ADSR (+procédure+save) ça, c'est la faute à tonton

Message par Huitbit »

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 !
Elevé au MSX !
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: pure ADSR (+procédure+save) ça, c'est la faute à tonton

Message par Ollivier »

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"

)
Répondre