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

Programmation d'applications complexes
Avatar de l’utilisateur
Huitbit
Messages : 939
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

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

Message par Huitbit »

Hello !

Bon d'abord, une définition
ADSR , définiton du mot ADSR , Attack, Decay, Sustain, Release, soit Attaque, Chute, Entretien et Extinction. Décrit la vie d'un phénomène audio.

Les points A, B, C, D et E repèrent ces différentes zones.

A quoi sert ce programme ?
A créer des sons au format wav directement dans une application.
[EDIT]possibilité de sauvegarder au format .wav[EDIT]
La création se fait avec l'appel d'une procédure que l'on récupère dans le presse-papier(faire coller puis NE PAS OUBLIER de changer les paramètres "ID" et "*son")(voir deuxième code) du type:
creation_son(ID,*son,type_signal,duree.l,freq_A.f,freq_B.f,freq_C.f,freq_D.f,freq_E.f,x_A.f,x_B.f,x_C.f,x_D.f,x_E.f,ampl_A.f,ampl_B.f,ampl_C.f,ampl_D.f,ampl_E.f,mod_ampl_A.b,mod_ampl_B.b,mod_ampl_C.b,mod_ampl_D.b,mod_freq_A.b,mod_freq_B.b,mod_freq_C.b,mod_freq_D.b)

Image

C'est encore de l'expérimental, mais c'est fonctionnel!
Les paramètres de la procédure se trouvent dans le presse-papier.
Je mettrai une version plus propre et mieux commentée mais en ce moment en Guadeloupe ça craint un peu :lol: !

J'utilise un code de CODEARCHIV. L'utilisation de "structureunion" n'est pas claire pour moi mais c'est super efficace :P.
J'ai laissé la place pour d'autres options mais là, j'avais ma dose de gadgets.

Code : Tout sélectionner

;pure_ADSR
;ADSR , définiton du mot ADSR , Attack, Decay, Sustain, Release, soit « Attaque, Chute, Entretien et Extinction. Décrit la vie d'un phénomène audio
;auteur Huitbit
;PB v4.30
;version brouillon
;idée de base tonton
;utilisation d'un code de codearchiv Froggerprogger (updated for PB 4.00 by Andre)
#largeur_ecran=1024
#hauteur_ecran=768
#marge=12
#frequence_min=20
#frequence_max=10000
#e=2.71828182845904
duree_signal.f
couleur.f
amplitude.f
frequence.f
nbre_ech_par_periode.l
alternance.b=-1
zone_frequence.f
compo_rgb.f
sauvegarde.b=0
  ;origine du repère
x_origine.f=#marge
y_origine.f=#hauteur_ecran*0.75
x_courbe_ancien.f=#marge
y_courbe_ancien.f=y_origine
#mod_10T=0.1
#mod_100T=0.01
;-déclaration pour l'enregistrement
totalsamples.l 
datachunkBytes.l 
Structure PBUnion 
  StructureUnion 
    b.b 
    w.w 
    l.l 
    f.f 
    s.s 
  EndStructureUnion 
EndStructure 
*sound.l 
*mem.PBUnion
;- Gadget Constants
Enumeration
  #Button_test
  #Button_fichier_wav
  #Text_signal : #Text_duree_signal : #Text_ampl :  #Text_mod_ampl :  #Text_freq :  #Text_mod_freq 
  #Text_a_freq : #Text_b_freq : #Text_c_freq : #Text_d_freq : #Text_e_freq
  #Text_a_ampl : #Text_b_ampl : #Text_c_ampl : #Text_d_ampl : #Text_e_ampl
  #Combo_type_signal 
  #Combo_a_mod_ampl : #Combo_b_mod_ampl : #Combo_c_mod_ampl : #Combo_d_mod_ampl : #Combo_e_mod_ampl
  #Combo_a_mod_freq : #Combo_b_mod_freq : #Combo_c_mod_freq : #Combo_d_mod_freq : #Combo_e_mod_freq
  #Text_type_signal
  #TrackBar_a_ampl : #TrackBar_b_ampl : #TrackBar_c_ampl : #TrackBar_d_ampl : #TrackBar_e_ampl
  #TrackBar_a_freq : #TrackBar_b_freq : #TrackBar_c_freq : #TrackBar_d_freq : #TrackBar_e_freq
  #TrackBar_duree : #TrackBar_ab_duree : #TrackBar_bc_duree : #TrackBar_cd_duree : #TrackBar_de_duree
  #Text_duree : #Text_ab_duree : #Text_bc_duree : #Text_cd_duree : #Text_de_duree  
  #Text_duree_val : #Text_ab_duree_val : #Text_bc_duree_val : #Text_cd_duree_val : #Text_de_duree_val
  #Text_a_ampl_val : #Text_b_ampl_val : #Text_c_ampl_val : #Text_d_ampl_val : #Text_e_ampl_val
  #Text_a_freq_val : #Text_b_freq_val : #Text_c_freq_val : #Text_d_freq_val : #Text_e_freq_val
EndEnumeration
Macro affine(a,b,xA,yA,xB,yB)
a.f=(yB-yA)/(xB-xA)
b.f=(yA*xB-yB*xA)/(xB-xA)
EndMacro
Macro exp(x)
Pow(#e,x)
EndMacro
Macro modulation_amplitude(ID_combo,ampl,a_aff,b_aff,a_exp,x_ech_point,b_exp)
Select GetGadgetState(ID_combo)
  Case 0 ;aucune modulation
    amplitude=ampl
  Case 1 ;affine
    amplitude=(a_aff*x_echantillon+b_aff)
  Case 2 ;exponentielle
    amplitude=(a_exp*exp((x_echantillon-x_ech_point)*b_exp))
  Case 3 ;sinusoïdale 10T
    amplitude=(a_aff*x_echantillon+b_aff)*(0.5+0.5*Sin(#mod_10T*2 * #PI * frequence*x_echantillon/freq_ech))
  Case 4 ;sinusoïdale 100T
    amplitude=(a_aff*x_echantillon+b_aff)*(0.5+0.5*Sin(#mod_100T*2 * #PI * frequence*x_echantillon/freq_ech))
  Case 5 ; dents de scie 10T
    If x_echantillon=x_ech_point
      x_origine_dent_mod=x_ech_point
      nbre_ech_par_10T=Int(Round(freq_ech/(frequence*#mod_10T),#PB_Round_Nearest))
    EndIf
    If (x_echantillon-x_origine_dent_mod)%nbre_ech_par_10T=0
      x_origine_dent_mod=x_echantillon
      nbre_ech_par_10T=Int(Round(freq_ech/(frequence*#mod_10T),#PB_Round_Nearest))
    EndIf
    amplitude=(ampl/nbre_ech_par_10T)*(x_echantillon-x_origine_dent_mod)
  Case 6 ; dents de scie 100T
    If x_echantillon=x_ech_point
      x_origine_dent_mod=x_ech_point
      nbre_ech_par_100T=Int(Round(freq_ech/(frequence*#mod_100T),#PB_Round_Nearest))
    EndIf
    If (x_echantillon-x_origine_dent_mod)%nbre_ech_par_100T=0
      x_origine_dent_mod=x_echantillon
      nbre_ech_par_100T=Int(Round(freq_ech/(frequence*#mod_100T),#PB_Round_Nearest))
    EndIf
    amplitude=(ampl/nbre_ech_par_100T)*(x_echantillon-x_origine_dent_mod)
EndSelect 
EndMacro
Macro modulation_frequence(ID_combo,freq,a_ff,b_ff,a_exp,x_ech_point,b_exp)
Select GetGadgetState(ID_combo)
  Case 0 ;aucune modulation
    frequence=freq
  Case 1 ;affine
    frequence=(a_ff*x_echantillon+b_ff)
  Case 2 ;exponentielle
    frequence=(a_exp*exp((x_echantillon-x_ech_point)*b_exp))
  Case 3 ;sinusoïdale 10T
    frequence=freq*(0.6+0.4*Sin(#mod_10T*2 * #PI * freq*x_echantillon/freq_ech))
  Case 4 ;sinusoïdale 100T
    frequence=freq*(0.6+0.4*Sin(#mod_100T*2 * #PI * freq*x_echantillon/freq_ech))
  Case 5 ; dents de scie 10T
    If x_echantillon=x_ech_point
      x_origine_dent_mod=x_ech_point
      nbre_ech_par_10T=Int(Round(freq_ech/(freq*#mod_10T),#PB_Round_Nearest))
    EndIf
    If (x_echantillon-x_origine_dent_mod)%nbre_ech_par_10T=0
      x_origine_dent_mod=x_echantillon
      nbre_ech_par_10T=Int(Round(freq_ech/(freq*#mod_10T),#PB_Round_Nearest))
    EndIf
    frequence=(freq/nbre_ech_par_10T)*(x_echantillon-x_origine_dent_mod)+#frequence_min
  Case 6 ; dents de scie 100T
    If x_echantillon=x_ech_point
      x_origine_dent_mod=x_ech_point
      nbre_ech_par_100T=Int(Round(freq_ech/(freq*#mod_100T),#PB_Round_Nearest))
    EndIf
    If (x_echantillon-x_origine_dent_mod)%nbre_ech_par_100T=0
      x_origine_dent_mod=x_echantillon
      nbre_ech_par_100T=Int(Round(freq_ech/(freq*#mod_100T),#PB_Round_Nearest))
    EndIf
    frequence=(freq/nbre_ech_par_100T)*(x_echantillon-x_origine_dent_mod)+#frequence_min
  Case 7 ;aléatoire
    frequence=#frequence_min+Random(freq)
EndSelect

EndMacro
Macro exponentielle(a,b,xA,yA,xB,yB)
 ;test pour les amplitudes yA nulles!
If yA=0
  yA=0.001*ampl_max
EndIf
If yB=0
  yB=0.001*ampl_max
EndIf

b.f=Log(yB/yA)/(xB-xA)
a.f=yA*exp(b*xA)
EndMacro
Macro trace_courbe
If StartDrawing(WindowOutput(0))
  ;-on efface la courbe précédente
  Box(0,#hauteur_ecran*0.5,#largeur_ecran,#hauteur_ecran*0.5,RGB(0,0,0))
  
  ;-tracé de la courbe
  frequence=freq_A
  nbre_ech_par_periode=freq_ech/freq_A
  nbre_ech_par_10T=Int(Round(freq_ech/(freq_A*#mod_10T),#PB_Round_Nearest))
  nbre_ech_par_100T=Int(Round(freq_ech/(freq_A*#mod_100T),#PB_Round_Nearest))
  amplitude=ampl_A
  
  
  For x_echantillon=0 To nbre_ech_total
    
    If x_echantillon<x_ech_B
      modulation_amplitude(#Combo_a_mod_ampl,ampl_A,a_ampl_AB_aff,b_ampl_AB_aff,a_ampl_AB_exp,x_ech_A,b_ampl_AB_exp)
      modulation_frequence(#Combo_a_mod_freq,freq_A, a_freq_AB_aff,b_freq_AB_aff,a_freq_AB_exp,x_ech_A,b_freq_AB_exp)
      
    ElseIf x_echantillon>=x_ech_B And x_echantillon<x_ech_C
      modulation_amplitude(#Combo_b_mod_ampl,ampl_B,a_ampl_BC_aff,b_ampl_BC_aff,a_ampl_BC_exp,x_ech_B,b_ampl_BC_exp)
      modulation_frequence(#Combo_b_mod_freq,freq_B, a_freq_BC_aff,b_freq_BC_aff,a_freq_BC_exp,x_ech_B,b_freq_BC_exp)
      
    ElseIf x_echantillon>=x_ech_C And x_echantillon<x_ech_D
      modulation_amplitude(#Combo_c_mod_ampl,ampl_C,a_ampl_CD_aff,b_ampl_CD_aff,a_ampl_CD_exp,x_ech_C,b_ampl_CD_exp)
      modulation_frequence(#Combo_c_mod_freq,freq_C, a_freq_CD_aff,b_freq_CD_aff,a_freq_CD_exp,x_ech_C,b_freq_CD_exp)
      
    Else
      modulation_amplitude(#Combo_d_mod_ampl,ampl_d,a_ampl_DE_aff,b_ampl_DE_aff,a_ampl_DE_exp,x_ech_D,b_ampl_DE_exp)
      modulation_frequence(#Combo_d_mod_freq,freq_D, a_freq_DE_aff,b_freq_DE_aff,a_freq_DE_exp,x_ech_D,b_freq_DE_exp)
      
      
    EndIf
    
    x_courbe=Round(x_echantillon/(nbre_ech_total/1000)+x_origine,#PB_Round_Nearest)
    amplitude_trace=amplitude/(ampl_max/180)
    ;-type de courbe
    
    Select GetGadgetState(#Combo_type_signal)
      
      ;tracé sinus
      Case 0
        y_courbe=y_origine-amplitude_trace*Sin(2 * #PI * frequence*x_echantillon/freq_ech); x_echantillon/frequence_echantillonnage=temps en seconde car 44100 échantillons correspondent à 1s
        
        ;tracé carré 
      Case 1
        If x_echantillon%Int(nbre_ech_par_periode*0.5)=0 
          nbre_ech_par_periode=Int(Round(freq_ech/frequence,#PB_Round_Nearest))
          alternance=-alternance
        EndIf
        y_courbe=y_origine-amplitude_trace*alternance
        
        ;tracé triangle
      Case 2
        If x_echantillon%Int(nbre_ech_par_periode*0.5)=0 
          nbre_ech_par_periode=Int(Round(freq_ech/frequence,#PB_Round_Nearest))
          x_origine_triangle=x_echantillon
          alternance=-alternance
        EndIf
        y_courbe=y_origine-(4*(amplitude_trace/nbre_ech_par_periode)*(x_echantillon-x_origine_triangle)-amplitude_trace)*alternance
        
        ;tracé dents de scie
      Case 3
        If x_echantillon%nbre_ech_par_periode=0
          nbre_ech_par_periode=Int(Round(freq_ech/frequence,#PB_Round_Nearest))
          x_origine_dent=x_echantillon
        EndIf
        y_courbe=y_origine-(2*(amplitude_trace/nbre_ech_par_periode)*(x_echantillon-x_origine_dent)-amplitude_trace)
        
        ;tracé  bruit sinusoïdal
      Case 4
        y_courbe=y_origine-Random(amplitude_trace)*Sin(2 * #PI * frequence*x_echantillon/freq_ech); x_echantillon/frequence_echantillonnage=temps en seconde car 44100 échantillons correspondent à 1s
        
        ;tracé bruit carré
      Case 5
        If x_echantillon%nbre_ech_par_periode=0
          nbre_ech_par_periode=Int(Round(freq_ech/frequence,#PB_Round_Nearest))
        EndIf
        If x_echantillon%nbre_ech_par_periode<Int(nbre_ech_par_periode*0.5) 
          y_courbe=y_origine-Random(amplitude_trace)
        Else
          y_courbe=y_origine+Random(amplitude_trace)
        EndIf
        
    EndSelect
    
    couleur_frequence(frequence,#frequence_max)
    
    LineXY(x_courbe_ancien,y_courbe_ancien,x_courbe,y_courbe,couleur)
    x_courbe_ancien=x_courbe
    y_courbe_ancien=y_courbe
    
  Next x_echantillon
  
  ;-dessin des axes
  Line(x_origine,y_origine,#largeur_ecran-2*#marge,0,RGB(255,255,255))
  Line(#marge,#hauteur_ecran*0.5+#marge,0,#hauteur_ecran*0.5-2*#marge,RGB(255,255,255))
  StopDrawing()   
EndIf;StartDrawing
EndMacro
Macro recuperation_donnees
;-duree
duree_signal=GetGadgetState(#TrackBar_duree)

;-fréquences 
freq_A=GetGadgetState(#TrackBar_a_freq)
freq_B=GetGadgetState(#TrackBar_b_freq)
freq_C=GetGadgetState(#TrackBar_c_freq)
freq_D=GetGadgetState(#TrackBar_d_freq)
freq_E=GetGadgetState(#TrackBar_e_freq)
frequence=freq_A

;-nombre d'échantillons
nbre_ech_total=(GetGadgetState(#TrackBar_duree)/1000)*freq_ech
nbre_ech_AB=(GetGadgetState(#TrackBar_ab_duree)/1000)*freq_ech
nbre_ech_BC=(GetGadgetState(#TrackBar_bc_duree)/1000)*freq_ech
nbre_ech_CD=(GetGadgetState(#TrackBar_cd_duree)/1000)*freq_ech
nbre_ech_DE=(GetGadgetState(#TrackBar_de_duree)/1000)*freq_ech
nbre_ech_par_periode=freq_ech/freq_A
nbre_ech_par_10T=Int(Round(freq_ech/(freq_A*#mod_10T),#PB_Round_Nearest))
nbre_ech_par_100T=Int(Round(freq_ech/(freq_A*#mod_100T),#PB_Round_Nearest))

;-amplitudes
ampl_A=GetGadgetState(#TrackBar_a_ampl)*(ampl_max/180)
ampl_B=GetGadgetState(#TrackBar_b_ampl)*(ampl_max/180)
ampl_C=GetGadgetState(#TrackBar_c_ampl)*(ampl_max/180)
ampl_d=GetGadgetState(#TrackBar_d_ampl)*(ampl_max/180)
ampl_E=GetGadgetState(#TrackBar_e_ampl)*(ampl_max/180)
amplitude=ampl_A

;-coordonnées des échantillons
x_ech_A.f=0
x_ech_B.f=x_ech_A+nbre_ech_AB
x_ech_C.f=x_ech_B+nbre_ech_BC
x_ech_D.f=x_ech_C+nbre_ech_CD
x_ech_E.f=x_ech_D+nbre_ech_DE

;-modulation affine des amplitudes  (y=a*x+b)
affine(a_ampl_AB_aff,b_ampl_AB_aff,x_ech_A,ampl_A,x_ech_B,ampl_B)
affine(a_ampl_BC_aff,b_ampl_BC_aff,x_ech_B,ampl_B,x_ech_C,ampl_C)
affine(a_ampl_CD_aff,b_ampl_CD_aff,x_ech_C,ampl_C,x_ech_D,ampl_d)
affine(a_ampl_DE_aff,b_ampl_DE_aff,x_ech_D,ampl_d,x_ech_E,ampl_E)

;-modulation exponentielle des amplitudes  (y=a*exp(b*x)) !!!!penser au changement d'origine pour le calcul de a et b
exponentielle(a_ampl_AB_exp,b_ampl_AB_exp,0,ampl_A,x_ech_B,ampl_B)
exponentielle(a_ampl_BC_exp,b_ampl_BC_exp,0,ampl_B,x_ech_C-x_ech_B,ampl_C)
exponentielle(a_ampl_CD_exp,b_ampl_CD_exp,0,ampl_C,x_ech_D-x_ech_C,ampl_d)
exponentielle(a_ampl_DE_exp,b_ampl_DE_exp,0,ampl_d,x_ech_E-x_ech_D,ampl_E)

;-modulation affine des fréquences  (f=a*x+b)
affine(a_freq_AB_aff,b_freq_AB_aff,x_ech_A,freq_A,x_ech_B,freq_B)
affine(a_freq_BC_aff,b_freq_BC_aff,x_ech_B,freq_B,x_ech_C,freq_C)
affine(a_freq_CD_aff,b_freq_CD_aff,x_ech_C,freq_C,x_ech_D,freq_D)
affine(a_freq_DE_aff,b_freq_DE_aff,x_ech_D,freq_D,x_ech_E,freq_E)

;-modulation exponentielle des fréquences  (y=a*exp(b*x)) !!!!penser au changement d'origine pour le calcul de a et b
exponentielle(a_freq_AB_exp,b_freq_AB_exp,x_ech_A,freq_A,x_ech_B,freq_B)
exponentielle(a_freq_BC_exp,b_freq_BC_exp,0,freq_B,x_ech_C-x_ech_B,freq_C)
exponentielle(a_freq_CD_exp,b_freq_CD_exp,0,freq_C,x_ech_D-x_ech_C,freq_D)
exponentielle(a_freq_DE_exp,b_freq_DE_exp,0,freq_D,x_ech_E-x_ech_D,freq_E)

;-pour le tracé
x_courbe_ancien.f=#marge
y_courbe_ancien.f=y_origine
EndMacro
Macro enregistrement
#samplerate = 44100                 ; samplerate 
#bitrate = 16                       ; Bits per sample, #bitrate Mod 8 must be 0 ! 
#channels = 2                       ; number of channels 
totalsamples =(duree_signal/1000)*#samplerate           ; length in samples 
#avBytesPerSec  = #channels*#bitrate/8*#samplerate  ; calculate the average bytes per second 
datachunkBytes = totalsamples * #channels * #bitrate/8 +1


*sound = AllocateMemory(44 + datachunkBytes) 

*mem = *sound 

*mem\l = 'FFIR'                 : *mem+4      ; riff-chunk-ID "RIFF" 
*mem\l = 36 + datachunkBytes   : *mem+4      ; normally filesize minus (these) 8 Bytes 
*mem\l = 'EVAW'                 : *mem+4      ; wave-chunk-ID "WAVE" 
*mem\l = ' tmf'                 : *mem+4      ; format-chunk-ID "FMT " 
*mem\l = 16                     : *mem+4      ; chunk data size (+ Extra Format Bytes) 
*mem\w = 1                      : *mem+2      ; compression code 
*mem\w = #channels              : *mem+2      ; number of channels 
*mem\l = #samplerate            : *mem+4      ; samplerate 
*mem\l = #avBytesPerSec         : *mem+4      ; average bytes per second, (channels)*(block align)*(samplerate) 
*mem\w = #bitrate/8*#channels   : *mem+2      ; Block Align ('bytes per sample') 
*mem\w = #bitrate               : *mem+2      ; Bits per sample 
*mem\l = 'atad'                 : *mem+4      ; data-chunk-ID "DATA" 
*mem\l = datachunkBytes        : *mem+4      ; data chunk size in bytes 

;/ Now lets write #totalsamples 
;/ work only for 16 Bit or more. 8-Bit has zero-line at value 128, so it is unsigned 
For x_echantillon=0 To nbre_ech_total
  For actchannel = 1 To #channels 
    
    
    If x_echantillon<x_ech_B
      modulation_amplitude(#Combo_a_mod_ampl,ampl_A,a_ampl_AB_aff,b_ampl_AB_aff,a_ampl_AB_exp,x_ech_A,b_ampl_AB_exp)
      modulation_frequence(#Combo_a_mod_freq,freq_A, a_freq_AB_aff,b_freq_AB_aff,a_freq_AB_exp,x_ech_A,b_freq_AB_exp)
      
    ElseIf x_echantillon>=x_ech_B And x_echantillon<x_ech_C
      modulation_amplitude(#Combo_b_mod_ampl,ampl_B,a_ampl_BC_aff,b_ampl_BC_aff,a_ampl_BC_exp,x_ech_B,b_ampl_BC_exp)
      modulation_frequence(#Combo_b_mod_freq,freq_B, a_freq_BC_aff,b_freq_BC_aff,a_freq_BC_exp,x_ech_B,b_freq_BC_exp)
      
    ElseIf x_echantillon>=x_ech_C And x_echantillon<x_ech_D
      modulation_amplitude(#Combo_c_mod_ampl,ampl_C,a_ampl_CD_aff,b_ampl_CD_aff,a_ampl_CD_exp,x_ech_C,b_ampl_CD_exp)
      modulation_frequence(#Combo_c_mod_freq,freq_C, a_freq_CD_aff,b_freq_CD_aff,a_freq_CD_exp,x_ech_C,b_freq_CD_exp)
      
    Else
      modulation_amplitude(#Combo_d_mod_ampl,ampl_d,a_ampl_DE_aff,b_ampl_DE_aff,a_ampl_DE_exp,x_ech_D,b_ampl_DE_exp)
      modulation_frequence(#Combo_d_mod_freq,freq_D, a_freq_DE_aff,b_freq_DE_aff,a_freq_DE_exp,x_ech_D,b_freq_DE_exp)
      
    EndIf
    
    Select GetGadgetState(#Combo_type_signal)
      ;signal sinusoïdal
      Case 0
        *mem\w=amplitude*Sin(2 * #PI * frequence*x_echantillon/freq_ech); x_echantillon/frequence_echantillonnage=temps en seconde car 44100 échantillons correspondent à 1s
        *mem+2
        
        ;signal carré 
      Case 1
        If x_echantillon%Int(nbre_ech_par_periode*0.5)=0 
          nbre_ech_par_periode=Int(Round(freq_ech/frequence,#PB_Round_Nearest))
          alternance=-alternance
        EndIf
        *mem\w=amplitude*alternance
        *mem+2
        
        ;signal triangle
      Case 2
        If x_echantillon%Int(nbre_ech_par_periode*0.5)=0 
          nbre_ech_par_periode=Int(Round(freq_ech/frequence,#PB_Round_Nearest))
          x_origine_triangle=x_echantillon
          alternance=-alternance
        EndIf
        *mem\w=(4*(amplitude/nbre_ech_par_periode)*(x_echantillon-x_origine_triangle)-amplitude)*alternance
        *mem+2
        
        ;signal dents de scie
      Case 3
        If x_echantillon%Int(nbre_ech_par_periode)=0
          nbre_ech_par_periode=Int(Round(freq_ech/frequence,#PB_Round_Nearest))
          x_origine_dent=x_echantillon
        EndIf
        *mem\w=2*(amplitude/nbre_ech_par_periode)*(x_echantillon-x_origine_dent)-amplitude
        *mem+2
        
        ;signal  bruit sinusoïdal
      Case 4
        *mem\w=Random(amplitude)*Sin(2 * #PI * frequence*x_echantillon/freq_ech); x_echantillon/frequence_echantillonnage=temps en seconde car 44100 échantillons correspondent à 1s
        *mem+2
        
        ;signal bruit carré
      Case 5
        If x_echantillon%Int(nbre_ech_par_periode*0.5)=0 
          nbre_ech_par_periode=Int(Round(freq_ech/frequence,#PB_Round_Nearest))
          alternance=-alternance
        EndIf
        *mem\w=Random(amplitude)*alternance
        *mem+2
        
    EndSelect
    
  Next actchannel
Next x_echantillon

EndMacro
Macro couleur_frequence(f,fmax)
zone_frequence=fmax/5
If f<zone_frequence
  compo_rgb=f*255/zone_frequence
  couleur=RGB(255,compo_rgb,0)
ElseIf f>=zone_frequence And f<2*zone_frequence
  compo_rgb=f*255/zone_frequence-255
  couleur=RGB(255-compo_rgb,255,0)
ElseIf f>=2*zone_frequence And f<3*zone_frequence
  compo_rgb=f*255/zone_frequence-2*255
  couleur=RGB(0,255,compo_rgb)
ElseIf f>=3*zone_frequence And f<4*zone_frequence
  compo_rgb=f*255/zone_frequence-3*255
  couleur=RGB(0,255-compo_rgb,255)
ElseIf f>=4*zone_frequence 
  compo_rgb=f*255/zone_frequence-4*255
  couleur=RGB(compo_rgb,0,255)
EndIf
EndMacro
;-PROGRAMME PRINCIPAL
;-INITIALISATION

;-durée secondes
duree_signal.f=1000
duree_AB.f=0.1*duree_signal
duree_BC.f=0.1*duree_signal
duree_CD.f=0.5*duree_signal
duree_DE.f=0.3*duree_signal

;-fréquences 
freq_A.f=440
freq_B.f=880
freq_C.f=440
freq_D.f=220
freq_E.f=440
freq_ech.f=44100

;-nombre d'échantillons
nbre_ech_total.f=(duree_signal/1000)*freq_ech
nbre_ech_AB.f=(duree_AB/1000)*freq_ech
nbre_ech_BC.f=(duree_BC/1000)*freq_ech
nbre_ech_CD.f=(duree_CD/1000)*freq_ech
nbre_ech_DE.f=(duree_DE/1000)*freq_ech

;-amplitudes
ampl_max.f=32767 ;Pow(2, #bitrate-1)-1 
ampl_A.f=0.1*ampl_max
ampl_B.f=1*ampl_max
ampl_C.f=0.4*ampl_max
ampl_d.f=0.3*ampl_max
ampl_E.f=0

InitSound() 
OpenWindow(0, 0, 0, #largeur_ecran, #hauteur_ecran, "pure_ADSR (>>>données dans le presse-papier après enregistrement<<<)", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

;-gadgets>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

ButtonGadget(#Button_test,0,0,40,20,"Test")
ButtonGadget(#Button_fichier_wav,0,#hauteur_ecran*0.5-20,200,20,"Sauvegarder au format .wav")

     ;-SIGNAL
TextGadget(#Text_signal, 10, 10, 130, 20, "SIGNAL", #PB_Text_Center)
TextGadget(#Text_type_signal, 20, 120, 120, 20, "TYPE", #PB_Text_Center)
TextGadget(#Text_duree_signal, 10, 40, 130, 20, "DUREE (en ms)", #PB_Text_Center)
TrackBarGadget(#TrackBar_duree, 10, 80, 140, 20, 40, 10000)
SetGadgetState(#TrackBar_duree,duree_signal)
ComboBoxGadget(#Combo_type_signal, 20, 140, 120, 20)
AddGadgetItem(#Combo_type_signal,0,"Sinusoïdal")
AddGadgetItem(#Combo_type_signal,1,"Carré")
AddGadgetItem(#Combo_type_signal,2,"Triangle")
AddGadgetItem(#Combo_type_signal,3,"Dents de scie")
AddGadgetItem(#Combo_type_signal,4,"Bruit sinusoïdal")
AddGadgetItem(#Combo_type_signal,5,"Bruit carré")
SetGadgetState(#Combo_type_signal,0)
TextGadget(#Text_duree_val, 10, 60, 130, 20, Str(duree_signal), #PB_Text_Center)   
      
        ;-DUREE
TextGadget(#Text_duree, 160, 10, 140, 20, "DUREE (en ms)", #PB_Text_Center)
TextGadget(#Text_ab_duree, 150, 50, 30, 20, "(AB)", #PB_Text_Center)
TextGadget(#Text_bc_duree, 150, 80, 30, 20, "(BC)", #PB_Text_Center)
TextGadget(#Text_cd_duree, 150, 110, 30, 20, "(CD)", #PB_Text_Center)
TextGadget(#Text_de_duree, 150, 140, 30, 20, "(DE)", #PB_Text_Center)
TrackBarGadget(#TrackBar_ab_duree, 210, 50, 90, 20, 10,9970)
TrackBarGadget(#TrackBar_bc_duree, 210, 80, 90, 20, 10, 9970)
TrackBarGadget(#TrackBar_cd_duree, 210, 110, 90, 20, 10, 9970)
TrackBarGadget(#TrackBar_de_duree, 210, 140, 90, 20, 10, 9970)
SetGadgetState(#TrackBar_ab_duree, duree_AB)
SetGadgetState(#TrackBar_bc_duree, duree_BC)
SetGadgetState(#TrackBar_cd_duree, duree_CD)
SetGadgetState(#TrackBar_de_duree, duree_DE)
TextGadget(#Text_ab_duree_val, 180, 50, 30, 20, Str(duree_AB), #PB_Text_Center)
TextGadget(#Text_bc_duree_val, 180, 80, 30, 20, Str(duree_BC), #PB_Text_Center)
TextGadget(#Text_cd_duree_val, 180, 110, 30, 20, Str(duree_CD), #PB_Text_Center)
TextGadget(#Text_de_duree_val, 180, 140, 30, 20, Str(duree_DE), #PB_Text_Center)

      ;-AMPLITUDE
TextGadget(#Text_ampl, 310, 10, 140, 20, "AMPLITUDE (en %)", #PB_Text_Center)
TextGadget(#Text_mod_ampl, 460, 10, 80, 20, "MODULATION", #PB_Text_Center)
ComboBoxGadget(#Combo_a_mod_ampl, 460, 40, 80, 20)
TextGadget(#Text_a_ampl, 310, 30, 20, 20, "A", #PB_Text_Center)
TextGadget(#Text_b_ampl, 340, 30, 20, 20, "B", #PB_Text_Center)
TextGadget(#Text_c_ampl, 370, 30, 20, 20, "C", #PB_Text_Center)
TextGadget(#Text_d_ampl, 400, 30, 20, 20, "D", #PB_Text_Center)
TextGadget(#Text_e_ampl, 430, 30, 20, 20, "E", #PB_Text_Center)
TrackBarGadget(#TrackBar_a_ampl, 310, 70, 20, 110, 0,180, #PB_TrackBar_Vertical)
TrackBarGadget(#TrackBar_b_ampl, 340, 70, 20, 110, 0, 180, #PB_TrackBar_Vertical)
TrackBarGadget(#TrackBar_c_ampl, 370, 70, 20, 110, 0, 180, #PB_TrackBar_Vertical)
TrackBarGadget(#TrackBar_d_ampl, 400, 70, 20, 110, 0, 180, #PB_TrackBar_Vertical)
TrackBarGadget(#TrackBar_e_ampl, 430, 70, 20, 110, 0, 180, #PB_TrackBar_Vertical)
SetGadgetState(#TrackBar_a_ampl,ampl_A/(ampl_max/180))
SetGadgetState(#TrackBar_b_ampl,ampl_B/(ampl_max/180))
SetGadgetState(#TrackBar_c_ampl,ampl_C/(ampl_max/180))
SetGadgetState(#TrackBar_d_ampl,ampl_d/(ampl_max/180))
SetGadgetState(#TrackBar_e_ampl,ampl_E/(ampl_max/180))
TextGadget(#Text_a_ampl_val, 310, 50, 20, 20, Str(ampl_A/ampl_max*100), #PB_Text_Center)
TextGadget(#Text_b_ampl_val, 340, 50, 20, 20, Str(ampl_B/ampl_max*100), #PB_Text_Center)
TextGadget(#Text_c_ampl_val, 370, 50, 20, 20, Str(ampl_C/ampl_max*100), #PB_Text_Center)
TextGadget(#Text_d_ampl_val, 400, 50, 20, 20,  Str(ampl_d/ampl_max*100), #PB_Text_Center)
TextGadget(#Text_e_ampl_val, 430, 50, 20, 20,  Str(ampl_E/ampl_max*100), #PB_Text_Center)
ComboBoxGadget(#Combo_a_mod_ampl, 460, 40, 80, 20)
AddGadgetItem(#Combo_a_mod_ampl,0,"Aucune")
AddGadgetItem(#Combo_a_mod_ampl,1,"Affine")
AddGadgetItem(#Combo_a_mod_ampl,2, "Exponentielle")
AddGadgetItem(#Combo_a_mod_ampl,3,"Sinus_10T" )
AddGadgetItem(#Combo_a_mod_ampl,4,"Sinus_100T" )
AddGadgetItem(#Combo_a_mod_ampl,5,"Scie_10T" )
AddGadgetItem(#Combo_a_mod_ampl,6,"Scie_100T" )
SetGadgetState(#Combo_a_mod_ampl,0)

ComboBoxGadget(#Combo_b_mod_ampl, 460, 70, 80, 20)
AddGadgetItem(#Combo_b_mod_ampl,0,"Aucune")
AddGadgetItem(#Combo_b_mod_ampl,1,"Affine")
AddGadgetItem(#Combo_b_mod_ampl,2, "Exponentielle")
AddGadgetItem(#Combo_b_mod_ampl,3,"Sinus_10T" )
AddGadgetItem(#Combo_b_mod_ampl,4,"Sinus_100T" )
AddGadgetItem(#Combo_b_mod_ampl,5,"Scie_10T" )
AddGadgetItem(#Combo_b_mod_ampl,6,"Scie_100T" )

SetGadgetState(#Combo_b_mod_ampl,0)
ComboBoxGadget(#Combo_c_mod_ampl, 460, 100, 80, 20)
AddGadgetItem(#Combo_c_mod_ampl,0,"Aucune")
AddGadgetItem(#Combo_c_mod_ampl,1,"Affine")
AddGadgetItem(#Combo_c_mod_ampl,2, "Exponentielle")
AddGadgetItem(#Combo_c_mod_ampl,3,"Sinus_10T" )
AddGadgetItem(#Combo_c_mod_ampl,4,"Sinus_100T" )
AddGadgetItem(#Combo_c_mod_ampl,5,"Scie_10T" )
AddGadgetItem(#Combo_c_mod_ampl,6,"Scie_100T" )

SetGadgetState(#Combo_c_mod_ampl,1)
ComboBoxGadget(#Combo_d_mod_ampl, 460, 130, 80, 20)
AddGadgetItem(#Combo_d_mod_ampl,0,"Aucune")
AddGadgetItem(#Combo_d_mod_ampl,1,"Affine")
AddGadgetItem(#Combo_d_mod_ampl,2, "Exponentielle")
AddGadgetItem(#Combo_d_mod_ampl,3,"Sinus_10T" )
AddGadgetItem(#Combo_d_mod_ampl,4,"Sinus_100T" )
AddGadgetItem(#Combo_d_mod_ampl,5,"Scie_10T" )
AddGadgetItem(#Combo_d_mod_ampl,6,"Scie_100T" )
SetGadgetState(#Combo_d_mod_ampl,1)

      ;-FREQUENCE
TextGadget(#Text_freq, 570, 10, 350, 20, "FREQUENCE (en Hz)", #PB_Text_Center)
TextGadget(#Text_mod_freq, 930, 10, 80, 20, "MODULATION", #PB_Text_Center)
TextGadget(#Text_a_freq, 550, 40, 20, 20, "A", #PB_Text_Center)
TextGadget(#Text_b_freq, 550, 70, 20, 20, "B", #PB_Text_Center)
TextGadget(#Text_c_freq, 550, 100, 20, 20, "C", #PB_Text_Center)
TextGadget(#Text_d_freq, 550, 130, 20, 20, "D", #PB_Text_Center)
TextGadget(#Text_e_freq, 550, 160, 20, 20, "E", #PB_Text_Center)
TrackBarGadget(#TrackBar_a_freq, 600, 40, 320, 20, 20, 10000)
TrackBarGadget(#TrackBar_b_freq, 600, 70, 320, 20, 20, 10000)
TrackBarGadget(#TrackBar_c_freq, 600, 100, 320, 20, 20, 10000)
TrackBarGadget(#TrackBar_d_freq, 600, 130, 320, 20, 20, 10000)
TrackBarGadget(#TrackBar_e_freq, 600, 160, 320, 20, 20, 10000)
SetGadgetState(#TrackBar_a_freq, freq_A)
SetGadgetState(#TrackBar_b_freq, freq_B)
SetGadgetState(#TrackBar_c_freq, freq_C)
SetGadgetState(#TrackBar_d_freq, freq_D)
SetGadgetState(#TrackBar_e_freq, freq_E)
TextGadget(#Text_a_freq_val, 570, 40, 30, 20, Str(freq_A), #PB_Text_Center)
TextGadget(#Text_b_freq_val, 570, 70, 30, 20,Str(freq_B), #PB_Text_Center)
TextGadget(#Text_c_freq_val, 570, 100, 30, 20,Str(freq_C), #PB_Text_Center)
TextGadget(#Text_d_freq_val, 570, 130, 30, 20, Str(freq_D), #PB_Text_Center)
TextGadget(#Text_e_freq_val, 570, 160, 30, 20, Str(freq_E), #PB_Text_Center)
ComboBoxGadget(#Combo_a_mod_freq, 930, 40, 80, 20)
AddGadgetItem(#Combo_a_mod_freq,0,"Aucune")
AddGadgetItem(#Combo_a_mod_freq,1,"Affine")
AddGadgetItem(#Combo_a_mod_freq,2, "Exponentielle")
AddGadgetItem(#Combo_a_mod_freq,3,"Sinus_10T" )
AddGadgetItem(#Combo_a_mod_freq,4,"Sinus_100T" )
AddGadgetItem(#Combo_a_mod_freq,5,"Scie_10T" )
AddGadgetItem(#Combo_a_mod_freq,6,"Scie_100T" )
AddGadgetItem(#Combo_a_mod_freq,7,"Aléatoire" )


SetGadgetState(#Combo_a_mod_freq,0)
ComboBoxGadget(#Combo_b_mod_freq, 930, 70, 80, 20)
AddGadgetItem(#Combo_b_mod_freq,0,"Aucune")
AddGadgetItem(#Combo_b_mod_freq,1,"Affine")
AddGadgetItem(#Combo_b_mod_freq,2, "Exponentielle")
AddGadgetItem(#Combo_b_mod_freq,3,"Sinus_10T" )
AddGadgetItem(#Combo_b_mod_freq,4,"Sinus_100T" )
AddGadgetItem(#Combo_b_mod_freq,5,"Scie_10T" )
AddGadgetItem(#Combo_b_mod_freq,6,"Scie_100T" )
AddGadgetItem(#Combo_b_mod_freq,7,"Aléatoire" )

SetGadgetState(#Combo_b_mod_freq,0)
ComboBoxGadget(#Combo_c_mod_freq, 930, 100, 80, 20)
AddGadgetItem(#Combo_c_mod_freq,0,"Aucune")
AddGadgetItem(#Combo_c_mod_freq,1,"Affine")
AddGadgetItem(#Combo_c_mod_freq,2, "Exponentielle")
AddGadgetItem(#Combo_c_mod_freq,3,"Sinus_10T" )
AddGadgetItem(#Combo_c_mod_freq,4,"Sinus_100T" )
AddGadgetItem(#Combo_c_mod_freq,5,"Scie_10T" )
AddGadgetItem(#Combo_c_mod_freq,6,"Scie_100T" )
AddGadgetItem(#Combo_c_mod_freq,7,"Aléatoire" )

SetGadgetState(#Combo_c_mod_freq,0)
ComboBoxGadget(#Combo_d_mod_freq, 930, 130, 80, 20)
AddGadgetItem(#Combo_d_mod_freq,0,"Aucune")
AddGadgetItem(#Combo_d_mod_freq,1,"Affine")
AddGadgetItem(#Combo_d_mod_freq,2, "Exponentielle")
AddGadgetItem(#Combo_d_mod_freq,3,"Sinus_10T" )
AddGadgetItem(#Combo_d_mod_freq,4,"Sinus_100T" )
AddGadgetItem(#Combo_d_mod_freq,5,"Scie_10T" )
AddGadgetItem(#Combo_d_mod_freq,6,"Scie_100T" )
AddGadgetItem(#Combo_d_mod_freq,7,"Aléatoire" )

SetGadgetState(#Combo_d_mod_freq,0)

StartDrawing(WindowOutput(0))
  ;-dessin de l'écran
Box(0,#hauteur_ecran*0.5,#largeur_ecran,#hauteur_ecran*0.5,RGB(0,0,0))
  ;-dessin spectre
For l=0 To 310
  couleur_frequence(l,320)
  Line(605+l,30 , 0, 10,couleur)
Next l
    ;-dessin des axes
Line(x_origine,y_origine,#largeur_ecran-2*#marge,0,RGB(255,255,255))
Line(#marge,#hauteur_ecran*0.5+#marge,0,#hauteur_ecran*0.5-2*#marge,RGB(255,255,255))

StopDrawing()

;-BOUCLE PRINCIPALE
Repeat
  
  Repeat
    Event = WindowEvent()   
    Select Event
      Case  #PB_Event_CloseWindow
        End 
        
      Case #PB_Event_Gadget
        difference.l=GetGadgetState(#TrackBar_duree)-(GetGadgetState(#TrackBar_ab_duree)+GetGadgetState(#TrackBar_bc_duree)+GetGadgetState(#TrackBar_cd_duree)+GetGadgetState(#TrackBar_de_duree))
        
        Select EventGadget()
          
          Case #TrackBar_duree
            SetGadgetText(#Text_duree_val,Str(GetGadgetState(#TrackBar_duree)))
            duree_partagee.l=GetGadgetState(#TrackBar_duree)*0.25
            SetGadgetState(#TrackBar_ab_duree, duree_partagee)
            SetGadgetState(#TrackBar_bc_duree, duree_partagee)
            SetGadgetState(#TrackBar_cd_duree, duree_partagee)
            SetGadgetState(#TrackBar_de_duree, duree_partagee)
            SetGadgetText(#Text_ab_duree_val,Str(GetGadgetState(#TrackBar_ab_duree)))
            SetGadgetText(#Text_bc_duree_val,Str(GetGadgetState(#TrackBar_bc_duree)))
            SetGadgetText(#Text_cd_duree_val,Str(GetGadgetState(#TrackBar_cd_duree)))
            SetGadgetText(#Text_de_duree_val,Str(GetGadgetState(#TrackBar_de_duree)))
            
          Case #TrackBar_ab_duree
            SetGadgetText(#Text_ab_duree_val,Str(GetGadgetState(#TrackBar_ab_duree)))
            If GetGadgetState(#TrackBar_de_duree)>10 
              SetGadgetState(#TrackBar_de_duree,GetGadgetState(#TrackBar_de_duree)+difference)
              SetGadgetText(#Text_de_duree_val,Str(GetGadgetState(#TrackBar_de_duree)))
            ElseIf GetGadgetState(#TrackBar_de_duree)=10 And GetGadgetState(#TrackBar_cd_duree)>10 
              SetGadgetState(#TrackBar_cd_duree,GetGadgetState(#TrackBar_cd_duree)+difference)
              SetGadgetText(#Text_cd_duree_val,Str(GetGadgetState(#TrackBar_cd_duree)))
            ElseIf GetGadgetState(#TrackBar_de_duree)=10 And GetGadgetState(#TrackBar_cd_duree)=10 And GetGadgetState(#TrackBar_bc_duree)>=10 
              SetGadgetState(#TrackBar_bc_duree,GetGadgetState(#TrackBar_bc_duree)+difference)
              SetGadgetText(#Text_bc_duree_val,Str(GetGadgetState(#TrackBar_bc_duree)))
              ;blocage de l'index à la valeur max en fonction de la durée choisie
              If GetGadgetState(#TrackBar_de_duree)+ GetGadgetState(#TrackBar_cd_duree)+ GetGadgetState(#TrackBar_bc_duree)=30 
                SetGadgetState(#TrackBar_ab_duree,GetGadgetState(#TrackBar_duree)-30)
                SetGadgetText(#Text_ab_duree_val,Str(GetGadgetState(#TrackBar_ab_duree)))
              EndIf
            EndIf
          Case #TrackBar_bc_duree
            SetGadgetText(#Text_bc_duree_val,Str(GetGadgetState(#TrackBar_bc_duree)))
            If GetGadgetState(#TrackBar_de_duree)>10 
              SetGadgetState(#TrackBar_de_duree,GetGadgetState(#TrackBar_de_duree)+difference)
              SetGadgetText(#Text_de_duree_val,Str(GetGadgetState(#TrackBar_de_duree)))
            ElseIf GetGadgetState(#TrackBar_de_duree)=10 And GetGadgetState(#TrackBar_cd_duree)>10 
              SetGadgetState(#TrackBar_cd_duree,GetGadgetState(#TrackBar_cd_duree)+difference)
              SetGadgetText(#Text_cd_duree_val,Str(GetGadgetState(#TrackBar_cd_duree)))
            ElseIf GetGadgetState(#TrackBar_de_duree)=10 And GetGadgetState(#TrackBar_cd_duree)=10 And GetGadgetState(#TrackBar_ab_duree)>=10 
              SetGadgetState(#TrackBar_ab_duree,GetGadgetState(#TrackBar_ab_duree)+difference)
              SetGadgetText(#Text_ab_duree_val,Str(GetGadgetState(#TrackBar_ab_duree)))
              ;blocage de l'index à la valeur max en fonction de la durée choisie
              If GetGadgetState(#TrackBar_de_duree)+ GetGadgetState(#TrackBar_cd_duree)+ GetGadgetState(#TrackBar_ab_duree)=30 
                SetGadgetState(#TrackBar_bc_duree,GetGadgetState(#TrackBar_duree)-30)
                SetGadgetText(#Text_bc_duree_val,Str(GetGadgetState(#TrackBar_bc_duree)))
              EndIf
            EndIf
            
          Case #TrackBar_cd_duree
            SetGadgetText(#Text_cd_duree_val,Str(GetGadgetState(#TrackBar_cd_duree)))
            If GetGadgetState(#TrackBar_de_duree)>10 
              SetGadgetState(#TrackBar_de_duree,GetGadgetState(#TrackBar_de_duree)+difference)
              SetGadgetText(#Text_de_duree_val,Str(GetGadgetState(#TrackBar_de_duree)))
            ElseIf GetGadgetState(#TrackBar_de_duree)=10 And GetGadgetState(#TrackBar_bc_duree)>10 
              SetGadgetState(#TrackBar_bc_duree,GetGadgetState(#TrackBar_bc_duree)+difference)
              SetGadgetText(#Text_bc_duree_val,Str(GetGadgetState(#TrackBar_bc_duree)))
            ElseIf GetGadgetState(#TrackBar_de_duree)=10 And GetGadgetState(#TrackBar_bc_duree)=10 And GetGadgetState(#TrackBar_ab_duree)>=10 
              SetGadgetState(#TrackBar_ab_duree,GetGadgetState(#TrackBar_ab_duree)+difference)
              SetGadgetText(#Text_ab_duree_val,Str(GetGadgetState(#TrackBar_ab_duree)))
              ;blocage de l'index à la valeur max en fonction de la durée choisie
              If GetGadgetState(#TrackBar_de_duree)+ GetGadgetState(#TrackBar_bc_duree)+ GetGadgetState(#TrackBar_ab_duree)=30 
                SetGadgetState(#TrackBar_cd_duree,GetGadgetState(#TrackBar_duree)-30)
                SetGadgetText(#Text_cd_duree_val,Str(GetGadgetState(#TrackBar_cd_duree)))
              EndIf
            EndIf
            
            
          Case #TrackBar_de_duree
            SetGadgetText(#Text_de_duree_val,Str(GetGadgetState(#TrackBar_de_duree)))
            If GetGadgetState(#TrackBar_cd_duree)>10 
              SetGadgetState(#TrackBar_cd_duree,GetGadgetState(#TrackBar_cd_duree)+difference)
              SetGadgetText(#Text_cd_duree_val,Str(GetGadgetState(#TrackBar_cd_duree)))
            ElseIf GetGadgetState(#TrackBar_cd_duree)=10 And GetGadgetState(#TrackBar_bc_duree)>10 
              SetGadgetState(#TrackBar_bc_duree,GetGadgetState(#TrackBar_bc_duree)+difference)
              SetGadgetText(#Text_bc_duree_val,Str(GetGadgetState(#TrackBar_bc_duree)))
            ElseIf GetGadgetState(#TrackBar_cd_duree)=10 And GetGadgetState(#TrackBar_bc_duree)=10 And GetGadgetState(#TrackBar_ab_duree)>=10 
              SetGadgetState(#TrackBar_ab_duree,GetGadgetState(#TrackBar_ab_duree)+difference)
              SetGadgetText(#Text_ab_duree_val,Str(GetGadgetState(#TrackBar_ab_duree)))
              ;blocage de l'index à la valeur max en fonction de la durée choisie
              If GetGadgetState(#TrackBar_cd_duree)+ GetGadgetState(#TrackBar_bc_duree)+ GetGadgetState(#TrackBar_ab_duree)=30 
                SetGadgetState(#TrackBar_de_duree,GetGadgetState(#TrackBar_duree)-30)
                SetGadgetText(#Text_de_duree_val,Str(GetGadgetState(#TrackBar_de_duree)))
              EndIf
            EndIf
            
          Case #TrackBar_a_ampl
            SetGadgetText(#Text_a_ampl_val,Str(GetGadgetState(#TrackBar_a_ampl)*100/180))
            
          Case #TrackBar_b_ampl
            SetGadgetText(#Text_b_ampl_val,Str(GetGadgetState(#TrackBar_b_ampl)*100/180))
            
          Case #TrackBar_c_ampl
            SetGadgetText(#Text_c_ampl_val,Str(GetGadgetState(#TrackBar_c_ampl)*100/180))
            
          Case #TrackBar_d_ampl
            SetGadgetText(#Text_d_ampl_val,Str(GetGadgetState(#TrackBar_d_ampl)*100/180))
            
          Case #TrackBar_e_ampl
            SetGadgetText(#Text_e_ampl_val,Str(GetGadgetState(#TrackBar_e_ampl)*100/180))
            
          Case #TrackBar_a_freq
            SetGadgetText(#Text_a_freq_val,Str(GetGadgetState(#TrackBar_a_freq)))
            
          Case #TrackBar_b_freq
            SetGadgetText(#Text_b_freq_val,Str(GetGadgetState(#TrackBar_b_freq)))
            
          Case #TrackBar_c_freq
            SetGadgetText(#Text_c_freq_val,Str(GetGadgetState(#TrackBar_c_freq)))
            
          Case #TrackBar_d_freq
            SetGadgetText(#Text_d_freq_val,Str(GetGadgetState(#TrackBar_d_freq)))
            
          Case #TrackBar_e_freq
            SetGadgetText(#Text_e_freq_val,Str(GetGadgetState(#TrackBar_e_freq)))
            
          Case #Button_fichier_wav
            recuperation_donnees
            enregistrement
            NomFichier$=SaveFileRequester("Enregistrement du fichier(ne pas saisir  l'extension .wav)","c:\","Sons (*.wav)| *.wav",0)
            CreateFile(0,NomFichier$+".wav")
            For i=0 To (44 + datachunkBytes)
              WriteByte(0,PeekB(*sound+i))
            Next i
            CloseFile(0)
            
          Case #Button_test
            recuperation_donnees
            ;-copie dans le presse-papier
            donnees_procedure$="creation_son(0,*son,"+Str(GetGadgetState(#Combo_type_signal))+","+Str(duree_signal)
            donnees_procedure$=donnees_procedure$+","+Str(freq_A)+","+Str(freq_B)+","+Str(freq_C)+","+Str(freq_D)+","+Str(freq_E)
            donnees_procedure$=donnees_procedure$+","+Str(x_ech_A)+","+Str(x_ech_B)+","+Str(x_ech_C)+","+Str(x_ech_D)+","+Str(x_ech_E)
            donnees_procedure$=donnees_procedure$+","+Str(ampl_A)+","+Str(ampl_B)+","+Str(ampl_C)+","+Str(ampl_d)+","+Str(ampl_E)
            donnees_procedure$=donnees_procedure$+","+Str(GetGadgetState(#Combo_a_mod_ampl))+","+Str(GetGadgetState(#Combo_b_mod_ampl))+","+Str(GetGadgetState(#Combo_c_mod_ampl))+","+Str(GetGadgetState(#Combo_d_mod_ampl))
            donnees_procedure$=donnees_procedure$+","+Str(GetGadgetState(#Combo_a_mod_freq))+","+Str(GetGadgetState(#Combo_b_mod_freq))+","+Str(GetGadgetState(#Combo_c_mod_freq))+","+Str(GetGadgetState(#Combo_d_mod_freq))+")"
            SetClipboardText(donnees_procedure$)
            enregistrement
            trace_courbe
            ; catch and play the sound 
            CatchSound(0, *sound) 
            PlaySound(0) 
        EndSelect
        
    EndSelect
    
  Until Event = 0
  
  Delay(1)
ForEver

Exemple d'utilisation dans un code :

Code : Tout sélectionner

;pure_ADSR_procedure
#largeur_ecran=100
#hauteur_ecran=100

Declare creation_son(ID,*son,type_signal.b,duree.f,freq_A.f,freq_B.f,freq_C.f,freq_D.f,freq_E.f,x_A.f,x_B.f,x_C.f,x_D.f,x_E.f,ampl_A.f,ampl_B.f,ampl_C.f,ampl_D.f,ampl_E.f,mod_ampl_A.b,mod_ampl_B.b,mod_ampl_C.b,mod_ampl_D.b,mod_freq_A.b,mod_freq_B.b,mod_freq_C.b,mod_freq_D.b)

;-PROGRAMME PRINCIPAL

InitSound() 
OpenWindow(0, 0, 0, #largeur_ecran, #hauteur_ecran, "Exemple d'utilisation de pure_ADSR", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

creation_son(0,*son1,4,6707,517,86,550,20,451,0,73956,147911,221867,295823,33,32767,13107,9830,33,3,3,3,3,1,1,1,2)
creation_son(1,*son2,2,4403,4231,20,285,220,20,0,48554,48995,97549,194172,32767,33,32767,9830,33,1,1,1,2,2,7,7,7)
PlaySound(0 )
Delay(6000)
 PlaySound(1)


;-BOUCLE PRINCIPALE
Repeat
  
  Repeat
    Event = WindowEvent()   
    Select Event
      Case  #PB_Event_CloseWindow
        End 
        
        
    EndSelect
    
  Until Event = 0
  Delay(1)
ForEver


Macro affine(a,b,xA,yA,xB,yB)
a.f=(yB-yA)/(xB-xA)
b.f=(yA*xB-yB*xA)/(xB-xA)
EndMacro
Macro exp(x)
Pow(#e,x)
EndMacro
Macro modulation_amplitude(type_mod_ampl,ampl,a_aff,b_aff,a_exp,x_ech_point,b_exp)
Select type_mod_ampl
  Case 0 ;aucune modulation
    amplitude=ampl
  Case 1 ;affine
    amplitude=(a_aff*x_echantillon+b_aff)
  Case 2 ;exponentielle
    amplitude=(a_exp*exp((x_echantillon-x_ech_point)*b_exp))
  Case 3 ;sinusoïdale 10T
    amplitude=(a_aff*x_echantillon+b_aff)*(0.5+0.5*Sin(#mod_10T*2 * #PI * frequence*x_echantillon/freq_ech))
  Case 4 ;sinusoïdale 100T
    amplitude=(a_aff*x_echantillon+b_aff)*(0.5+0.5*Sin(#mod_100T*2 * #PI * frequence*x_echantillon/freq_ech))
  Case 5 ; dents de scie 10T
    If x_echantillon=x_ech_point
      x_origine_dent_mod=x_ech_point
      nbre_ech_par_10T=Int(Round(freq_ech/(frequence*#mod_10T),#PB_Round_Nearest))
    EndIf
    If (x_echantillon-x_origine_dent_mod)%nbre_ech_par_10T=0
      x_origine_dent_mod=x_echantillon
      nbre_ech_par_10T=Int(Round(freq_ech/(frequence*#mod_10T),#PB_Round_Nearest))
    EndIf
    amplitude=(ampl/nbre_ech_par_10T)*(x_echantillon-x_origine_dent_mod)
  Case 6 ; dents de scie 100T
    If x_echantillon=x_ech_point
      x_origine_dent_mod=x_ech_point
      nbre_ech_par_100T=Int(Round(freq_ech/(frequence*#mod_100T),#PB_Round_Nearest))
    EndIf
    If (x_echantillon-x_origine_dent_mod)%nbre_ech_par_100T=0
      x_origine_dent_mod=x_echantillon
      nbre_ech_par_100T=Int(Round(freq_ech/(frequence*#mod_100T),#PB_Round_Nearest))
    EndIf
    amplitude=(ampl/nbre_ech_par_100T)*(x_echantillon-x_origine_dent_mod)
EndSelect 
EndMacro
Macro modulation_frequence(type_mod_freq,freq,a_ff,b_ff,a_exp,x_ech_point,b_exp)
Select type_mod_freq
  Case 0 ;aucune modulation
    frequence=freq
  Case 1 ;affine
    frequence=(a_ff*x_echantillon+b_ff)
  Case 2 ;exponentielle
    frequence=(a_exp*exp((x_echantillon-x_ech_point)*b_exp))
  Case 3 ;sinusoïdale 10T
    frequence=freq*(0.6+0.4*Sin(#mod_10T*2 * #PI * freq*x_echantillon/freq_ech))
  Case 4 ;sinusoïdale 100T
    frequence=freq*(0.6+0.4*Sin(#mod_100T*2 * #PI * freq*x_echantillon/freq_ech))
  Case 5 ; dents de scie 10T
    If x_echantillon=x_ech_point
      x_origine_dent_mod=x_ech_point
      nbre_ech_par_10T=Int(Round(freq_ech/(freq*#mod_10T),#PB_Round_Nearest))
    EndIf
    If (x_echantillon-x_origine_dent_mod)%nbre_ech_par_10T=0
      x_origine_dent_mod=x_echantillon
      nbre_ech_par_10T=Int(Round(freq_ech/(freq*#mod_10T),#PB_Round_Nearest))
    EndIf
    frequence=(freq/nbre_ech_par_10T)*(x_echantillon-x_origine_dent_mod)+#frequence_min
  Case 6 ; dents de scie 100T
    If x_echantillon=x_ech_point
      x_origine_dent_mod=x_ech_point
      nbre_ech_par_100T=Int(Round(freq_ech/(freq*#mod_100T),#PB_Round_Nearest))
    EndIf
    If (x_echantillon-x_origine_dent_mod)%nbre_ech_par_100T=0
      x_origine_dent_mod=x_echantillon
      nbre_ech_par_100T=Int(Round(freq_ech/(freq*#mod_100T),#PB_Round_Nearest))
    EndIf
    frequence=(freq/nbre_ech_par_100T)*(x_echantillon-x_origine_dent_mod)+#frequence_min
  Case 7 ;aléatoire
    frequence=#frequence_min+Random(freq)
    
EndSelect

EndMacro
Macro exponentielle(a,b,xA,yA,xB,yB)
 ;test pour les amplitudes yA nulles!
If yA=0
  yA=0.001*ampl_max
EndIf
If yB=0
  yB=0.001*ampl_max
EndIf

b.f=Log(yB/yA)/(xB-xA)
a.f=yA*exp(b*xA)
EndMacro
Procedure creation_son(ID,*son,type_signal.b,duree.f,freq_A.f,freq_B.f,freq_C.f,freq_D.f,freq_E.f,x_A.f,x_B.f,x_C.f,x_D.f,x_E.f,ampl_A.f,ampl_B.f,ampl_C.f,ampl_D.f,ampl_E.f,mod_ampl_A.b,mod_ampl_B.b,mod_ampl_C.b,mod_ampl_D.b,mod_freq_A.b,mod_freq_B.b,mod_freq_C.b,mod_freq_D.b)
  #frequence_min=20
  #frequence_max=10000
  #e=2.71828182845904
  #mod_10T=0.1
  #mod_100T=0.01
  amplitude.f
  ampl_max.f=32767 ;Pow(2, #bitrate-1)-1 
  frequence.f
  freq_ech.f=44100
  nbre_ech_par_periode=freq_ech/freq_A
  nbre_ech_par_10T=Int(Round(freq_ech/(freq_A*#mod_10T),#PB_Round_Nearest))
  nbre_ech_par_100T=Int(Round(freq_ech/(freq_A*#mod_100T),#PB_Round_Nearest))
  alternance.b=-1
  
  ;-modulation affine des amplitudes  (y=a*x+b)
  affine(a_ampl_AB_aff,b_ampl_AB_aff,x_A,ampl_A,x_B,ampl_B)
  affine(a_ampl_BC_aff,b_ampl_BC_aff,x_B,ampl_B,x_C,ampl_C)
  affine(a_ampl_CD_aff,b_ampl_CD_aff,x_C,ampl_C,x_D,ampl_D)
  affine(a_ampl_DE_aff,b_ampl_DE_aff,x_D,ampl_D,x_E,ampl_E)
  
  ;-modulation exponentielle des amplitudes  (y=a*exp(b*x)) !!!!penser au changement d'origine pour le calcul de a et b
  exponentielle(a_ampl_AB_exp,b_ampl_AB_exp,0,ampl_A,x_B,ampl_B)
  exponentielle(a_ampl_BC_exp,b_ampl_BC_exp,0,ampl_B,x_C-x_B,ampl_C)
  exponentielle(a_ampl_CD_exp,b_ampl_CD_exp,0,ampl_C,x_D-x_C,ampl_D)
  exponentielle(a_ampl_DE_exp,b_ampl_DE_exp,0,ampl_D,x_E-x_D,ampl_E)
  
  ;-modulation affine des fréquences  (f=a*x+b)
  affine(a_freq_AB_aff,b_freq_AB_aff,x_A,freq_A,x_B,freq_B)
  affine(a_freq_BC_aff,b_freq_BC_aff,x_B,freq_B,x_C,freq_C)
  affine(a_freq_CD_aff,b_freq_CD_aff,x_C,freq_C,x_D,freq_D)
  affine(a_freq_DE_aff,b_freq_DE_aff,x_D,freq_D,x_E,freq_E)
  
  ;-modulation exponentielle des fréquences  (y=a*exp(b*x)) !!!!penser au changement d'origine pour le calcul de a et b
  exponentielle(a_freq_AB_exp,b_freq_AB_exp,x_A,freq_A,x_B,freq_B)
  exponentielle(a_freq_BC_exp,b_freq_BC_exp,0,freq_B,x_C-x_B,freq_C)
  exponentielle(a_freq_CD_exp,b_freq_CD_exp,0,freq_C,x_D-x_C,freq_D)
  exponentielle(a_freq_DE_exp,b_freq_DE_exp,0,freq_D,x_E-x_D,freq_E)
  #samplerate = 44100                 ; samplerate 
  #bitrate = 16                       ; Bits per sample, #bitrate Mod 8 must be 0 ! 
  #channels = 2                       ; number of channels 
  totalsamples.l =(duree/1000)*#samplerate  ; length in samples 
  nbre_ech_total.l=totalsamples
  #avBytesPerSec  = #channels*#bitrate/8*#samplerate  ; calculate the average bytes per second 
  datachunkBytes.l = totalsamples * #channels * #bitrate/8 +1
  
  Structure PBUnion 
    StructureUnion 
      b.b 
      w.w 
      l.l 
      f.f 
      s.s 
    EndStructureUnion 
  EndStructure 
  
  *son = AllocateMemory(44 + datachunkBytes) 
  *mem.PBUnion = *son 
  
  *mem\l = 'FFIR'                 : *mem+4      ; riff-chunk-ID "RIFF" 
  *mem\l = 36 + datachunkBytes   : *mem+4      ; normally filesize minus (these) 8 Bytes 
  *mem\l = 'EVAW'                 : *mem+4      ; wave-chunk-ID "WAVE" 
  *mem\l = ' tmf'                 : *mem+4      ; format-chunk-ID "FMT " 
  *mem\l = 16                     : *mem+4      ; chunk data size (+ Extra Format Bytes) 
  *mem\w = 1                      : *mem+2      ; compression code 
  *mem\w = #channels              : *mem+2      ; number of channels 
  *mem\l = #samplerate            : *mem+4      ; samplerate 
  *mem\l = #avBytesPerSec         : *mem+4      ; average bytes per second, (channels)*(block align)*(samplerate) 
  *mem\w = #bitrate/8*#channels   : *mem+2      ; Block Align ('bytes per sample') 
  *mem\w = #bitrate               : *mem+2      ; Bits per sample 
  *mem\l = 'atad'                 : *mem+4      ; data-chunk-ID "DATA" 
  *mem\l = datachunkBytes        : *mem+4      ; data chunk size in bytes 
  
  ;/ Now lets write #totalsamples 
  ;/ work only for 16 Bit or more. 8-Bit has zero-line at value 128, so it is unsigned 
  
  For x_echantillon=0 To nbre_ech_total
    For actchannel = 1 To #channels 
      
      If x_echantillon<x_B
        modulation_amplitude(mod_ampl_A,ampl_A,a_ampl_AB_aff,b_ampl_AB_aff,a_ampl_AB_exp,x_A,b_ampl_AB_exp)
        modulation_frequence(mod_freq_A,freq_A, a_freq_AB_aff,b_freq_AB_aff,a_freq_AB_exp,x_A,b_freq_AB_exp)
      ElseIf x_echantillon>=x_B And x_echantillon<x_C
        modulation_amplitude(mod_ampl_B,ampl_B,a_ampl_BC_aff,b_ampl_BC_aff,a_ampl_BC_exp,x_B,b_ampl_BC_exp)
        modulation_frequence(mod_freq_B,freq_B, a_freq_BC_aff,b_freq_BC_aff,a_freq_BC_exp,x_B,b_freq_BC_exp)
        
      ElseIf x_echantillon>=x_C And x_echantillon<x_D
        modulation_amplitude(mod_ampl_C,ampl_C,a_ampl_CD_aff,b_ampl_CD_aff,a_ampl_CD_exp,x_C,b_ampl_CD_exp)
        modulation_frequence(mod_freq_C,freq_C, a_freq_CD_aff,b_freq_CD_aff,a_freq_CD_exp,x_C,b_freq_CD_exp)
        
      Else
        modulation_amplitude(mod_ampl_D,ampl_d,a_ampl_DE_aff,b_ampl_DE_aff,a_ampl_DE_exp,x_D,b_ampl_DE_exp)
        modulation_frequence(mod_freq_D,freq_D, a_freq_DE_aff,b_freq_DE_aff,a_freq_DE_exp,x_D,b_freq_DE_exp)        
        
      EndIf
      
      Select type_signal
        ;signal sinusoïdal
        Case 0
          *mem\w=amplitude*Sin(2 * #PI * frequence*x_echantillon/freq_ech) : *mem+2
          
          ;signal carré 
        Case 1
          If x_echantillon%Int(nbre_ech_par_periode*0.5)=0 
            nbre_ech_par_periode=Int(Round(freq_ech/frequence,#PB_Round_Nearest))
            alternance=-alternance
          EndIf
          *mem\w=amplitude*alternance : *mem+2
          
          ;signal triangle
        Case 2
          If x_echantillon%Int(nbre_ech_par_periode*0.5)=0 
            nbre_ech_par_periode=Int(Round(freq_ech/frequence,#PB_Round_Nearest))
            x_origine_triangle=x_echantillon
            alternance=-alternance
          EndIf
          *mem\w=(4*(amplitude/nbre_ech_par_periode)*(x_echantillon-x_origine_triangle)-amplitude)*alternance : *mem+2
          
          ;signal dents de scie
        Case 3
          If x_echantillon%Int(nbre_ech_par_periode)=0
            nbre_ech_par_periode=Int(Round(freq_ech/frequence,#PB_Round_Nearest))
            x_origine_dent=x_echantillon
          EndIf
          *mem\w=2*(amplitude/nbre_ech_par_periode)*(x_echantillon-x_origine_dent)-amplitude : *mem+2
          
          ;signal  bruit sinusoïdal
        Case 4
          *mem\w=Random(amplitude)*Sin(2 * #PI * frequence*x_echantillon/freq_ech) : *mem+2
          
          ;signal bruit carré
        Case 5
          If x_echantillon%Int(nbre_ech_par_periode*0.5)=0 
            nbre_ech_par_periode=Int(Round(freq_ech/frequence,#PB_Round_Nearest))
            alternance=-alternance
          EndIf
          *mem\w=Random(amplitude)*alternance : *mem+2
          
      EndSelect
      
    Next actchannel
  Next x_echantillon
  
  CatchSound(ID, *son) 
  
EndProcedure

Je ferai un post avec une bibliothèque de sons (quand j'aurai commencé la phase "recherche de sons!" :wink:)

J'ai des questions qui vont arriver sur le MIDI! Accrochez-vous, c'est pour bientôt !

Hasta lavista !
Dernière modification par Huitbit le sam. 28/mars/2009 2:26, modifié 7 fois.
Anonyme

Message par Anonyme »

Balèze 8O
KrisJNT
Messages : 110
Inscription : ven. 31/oct./2008 16:51

Message par KrisJNT »

Beau travail ! Idéal pour les musiciens DJ !
Avatar de l’utilisateur
Huitbit
Messages : 939
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Message par Huitbit »

Merci :wink:

On peut changer la durée maximale(je me suis arrêté à 10 s) et rajouter d'autres options. Pour l'instant, je dois nettoyer le code car j'ai codé comme une brute !

Par contre, je rajouterai l'option de sortir le fichier au format .wav

Mais ce n'est que la première pierre d'un projet beaucoup plus fun qui concerne le forum(mystère :twisted: ) !

Hasta la vista !

PS : Si vous trouvez des sons sympas, n'hésitez pas à poster les paramètres !

[EDIT] J'ai rajouté la possibilité de sauvegarder au format .wav, le bouton se trouve au dessus de la courbe (l'extension ".wav" est ajoutée, inutile de la mettre)[EDIT]

J'ai toujours pas mis d'ordre dans le code :oops:
J'ai un alibi : un p'tit bonhomme qui va avoir 1 an bientôt :D
Avatar de l’utilisateur
Ar-S
Messages : 9476
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

Tu es un Dieu !
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
KarLKoX
Messages : 1191
Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :

Message par KarLKoX »

Bravo :!:
Je regarderais plus en détail le code ce week end :)
"Qui baise trop bouffe un poil." P. Desproges
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Joli :D
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Huitbit
Messages : 939
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Message par Huitbit »

Merci,

@Ar-S
Je n'ai fait qu'habiller un code déjà tout fait !
A l'époque, c'est le topic "nostalgie" de tonton qui m'avait mis la puce à l'oreille. Comtois avait clarifié la situation.
http://www.purebasic.fr/french/viewtopi ... ie&start=0

http://www.purebasic.fr/french/viewtopic.php?t=7420

@Soldat Inconnu,
Tu as vu pourquoi je jouais avec les sinus(merci du coup de main) et les arc-en-ciel !

Mon PC est HS (il ne s'allume plus 8O ).
Pour l'instant pas de réparation possible car la Guadeloupe est paralysée à 95% !

Prochaines mises à jour :roll: !:
-légende sur le graphique
-nouvelle enveloppe :exponentielle 2 (type y=a*[1-exp(b*t)] >>>départ rapide et fin lente, c'est le contraire de l'autre exponentielle).
-commentaires rajoutés au code
-commentaires rajoutés aux paramètres envoyés au presse-papier pour pouvoir "revenir" sur un son.


Hasta la proxima!
Avatar de l’utilisateur
Huitbit
Messages : 939
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Message par Huitbit »

Mon PC est réparé! L'alimentation était grillée !

Donc....bientôt de nouvelles mises à jour notamment de nouvelles enveloppes, un meilleur contrôle de la modulation avec les fonctions périodiques...etc

Hasta la vista !
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Salut Huitbit,

ça va mieux en Guadeloupe?
Avatar de l’utilisateur
Huitbit
Messages : 939
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Message par Huitbit »

Hello,

@Ollivier
Les cours vont, semble-t-il, reprendre dans mon établissement(ce n'est pas le cas partout), l'essence est revenue.
Aujourd'hui, les grandes surfaces étaient bloquées et certains supermarchés aussi !
La situation est encore floue, il va falloir attendre encore quelques jours.

En fouinant sur le site http://www.orangecaraibe.com/ tu auras plus d'infos (clique sur la chaîne canal 10(télé très locale!) puis à gauche de la télé tu auras un menu avec les infos pour la Guadeloupe, la Martinique...etc) !

Hasta la vista !
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

:D
Honte à moi que d'être passé à côté de cette merveille ! je comprend mieux maintenant ton message dans le forum jeu...
Huitbit a écrit :PS : Si vous trouvez des sons sympas, n'hésitez pas à poster les paramètres !
goutte d'eau:

Code : Tout sélectionner

goutte d'eau
creation_son(0,*son,0,205,1744,1313,783,220,440,0,2249,4498,6747,8996,9648,32767,13107,9830,33,0,0,1,1,1,1,1,1)
goutte d'eau2
creation_son(0,*son,0,452,53,418,20,20,20,0,4983,9967,14950,19933,24757,9284,5461,5461,12197,3,3,3,6,3,1,1,1)
un raccourcis clavier pour le bouton TEST serai le bienvenue, j'y suis pas arrivé
Dernière modification par beauregard le sam. 28/mars/2009 12:38, modifié 1 fois.
config de mon ordi: seven, directx11, Pentium(R) DualCore E5700, RadeonHD 4550 512MB, PureBasic 4.61 x86
Avatar de l’utilisateur
Huitbit
Messages : 939
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Message par Huitbit »

@beauregard
Bizarre, tes gouttes d'eau ne donnent rien chez moi (il y a un problème avec la durée :? )! On dirait que le programme plante pour des sons trop brefs. Va falloir que je regarde ça !

A part ça, je prépare la nouvelle version qui offrira plus de possibilités. Quand ça sera au point, je ferai une page spéciale pour regrouper les effets de tout le monde :D

Hasta la vista !

[EDIT] bug corrigé ! Maintenant, je peux entendre tes gouttes :P ![EDIT]

Code : Tout sélectionner

totalsamples.l =(duree/1000)*#samplerate 

Voilà le vilain bug !

La variable duree était déclarée avec le mauvais type !

Si la durée était inférieure à 1000, totalsamples.l=0 !!!

La correction a été faite dans les paramètres de la procedure creation_son() :

Code : Tout sélectionner

duree.f 
Dernière modification par Huitbit le sam. 28/mars/2009 4:16, modifié 6 fois.
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

Huitbit a écrit :@beauregard
A part ça, je prépare la nouvelle version qui offrira plus de possibilités.
j'ai hâte de voir cela... ou de l'écouter plutôt ! :) ...et n'oublie pas pour le raccourcis clavier, appuyez sur une touche pour tester sera toujours plus rapide...
Avatar de l’utilisateur
Huitbit
Messages : 939
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Message par Huitbit »

Merci d'avoir débusqué ce bug ! Ca m'apprendra à déclarer proprement les variables(c'est ce que je comptais faire le jour du GRAND dépoussièrage du code).

Un petit aperçu de la nouvelle version...

Image

Quelques nouvelles enveloppes (il y en a d'autres en préparation) :

En AB et BC l'exponentielle bis (à comparer avec l'exponentielle)

En CD choix du nombre d'ondulations

En DE ondulations qui sont liées à la période (plus délicat à manipuler mais permet de reproduire des effets intéressants : hélicoptère, mise en
marche ou ralentissement de machines...etc).

En tout cas c'est un moyen possible de protéger ses effets sonores à moindre coût (environ 300 lignes de code pour la procédure création_son()) :P

Pour l'utilisation du clavier, je pensais au contraire que les utilisateurs préféraient éviter !
Exemple : pour les paramètres d'ondulation, j'ai choisi de rajouter des gadgets au lieu de faire une fenêtre de saisie.

Je rajouterai donc quelques raccourcis claviers !
-barre d'espace pour écouter ?
-Ctrl pour enregistrer ?
-Shift pour récupérer les paramètres ?
S'il y a des raccourcis qui font l'unanimité sur les utilitaires, n'hésitez pas à me faire une liste car je les utilise rarement !

Dans la nouvelle version, on récupèrera les réglages sous forme de commentaires en même temps que les paramètres de la procédure (pour pouvoir retoucher un son par exemple).

Hasta la vista !
Répondre