PureBasic

Forums PureBasic
Nous sommes le Sam 19/Oct/2019 19:33

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 29 messages ]  Aller à la page 1, 2  Suivante
Auteur Message
 Sujet du message: pure ADSR (+procédure+save) ça, c'est la faute à tonton !
MessagePosté: Mer 11/Fév/2009 17:41 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 08/Déc/2005 5:19
Messages: 936
Localisation: Guadeloupe
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:
Citation:
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:
;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:
;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 édition par Huitbit le Sam 28/Mar/2009 2:26, édité 7 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Mer 11/Fév/2009 18:21 
Balèze 8O


Haut
  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Mer 11/Fév/2009 19:23 
Hors ligne

Inscription: Ven 31/Oct/2008 16:51
Messages: 110
Beau travail ! Idéal pour les musiciens DJ !


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Mer 11/Fév/2009 19:36 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 08/Déc/2005 5:19
Messages: 936
Localisation: Guadeloupe
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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Jeu 12/Fév/2009 18:00 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 09/Oct/2005 16:51
Messages: 8768
Tu es un Dieu !

_________________
~~~~Règles du forum ~~~~
.: Ar-S :. Tour + portable W10 x64 PB 5.4x / 5.6x
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
RESIZER GOLD : Mon logiciel de redimensionnement par lot 100% PB


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Jeu 12/Fév/2009 22:55 
Hors ligne

Inscription: Jeu 26/Fév/2004 15:36
Messages: 1191
Localisation: France
Bravo :!:
Je regarderais plus en détail le code ce week end :)

_________________
"Qui baise trop bouffe un poil." P. Desproges


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Jeu 12/Fév/2009 23:06 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 28/Jan/2004 20:58
Messages: 4312
Localisation: Clermont ferrand OU Olsztyn
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)]


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Sam 14/Fév/2009 19:18 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 08/Déc/2005 5:19
Messages: 936
Localisation: Guadeloupe
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!


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Mar 03/Mar/2009 3:22 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 08/Déc/2005 5:19
Messages: 936
Localisation: Guadeloupe
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 !


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Mar 03/Mar/2009 19:19 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3503
Salut Huitbit,

ça va mieux en Guadeloupe?


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Mar 03/Mar/2009 21:47 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 08/Déc/2005 5:19
Messages: 936
Localisation: Guadeloupe
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 !


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Ven 27/Mar/2009 18:35 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 08/Juil/2007 18:32
Messages: 1307
Localisation: Toulouse
: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:
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é

_________________
config de mon ordi: seven, directx11, Pentium(R) DualCore E5700, RadeonHD 4550 512MB, PureBasic 4.61 x86


Dernière édition par beauregard le Sam 28/Mar/2009 12:38, édité 1 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Ven 27/Mar/2009 19:30 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 08/Déc/2005 5:19
Messages: 936
Localisation: Guadeloupe
@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:
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:
duree.f


Dernière édition par Huitbit le Sam 28/Mar/2009 4:16, édité 6 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Sam 28/Mar/2009 0:20 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 08/Juil/2007 18:32
Messages: 1307
Localisation: Toulouse
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...


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Sam 28/Mar/2009 2:45 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 08/Déc/2005 5:19
Messages: 936
Localisation: Guadeloupe
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 !
Citation:
-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 !


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 29 messages ]  Aller à la page 1, 2  Suivante

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  
cron

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye