pure_ADSR_II (éditeur + lecteur)

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

pure_ADSR_II (éditeur + lecteur)

Message par Huitbit »

Bonjour,

Nouveau post car cette version n'est pas compatible avec l'ancienne !
http://www.purebasic.fr/french/viewtopic.php?t=9027
J'ai été obligé de poster le code de l'éditeur sans balises(voir post suivant) car il y avait un problème :? Désolé!

Changements par rapport à l'ancienne version :
-de nouvelles modulations
-possibilité de charger des paramètres avec un copier-coller
-petit nettoyage du code (j'espère que j'ai pas frotté trop fort :lol: , j'ai utilisé EnableExplicit, ça m'a permis de supprimer des variables inutilisées)

En attendant, voici le nouveau lecteur :
(si vous mettez plusieurs sons, n'oubliez pas de changer les deux premiers paramètres de creation_wav(0,*son,....)!)

Code : Tout sélectionner

;pure_ADSR_procedure
#largeur_ecran=280
#hauteur_ecran=100

Declare creation_wav(ID,*son,type_signal.b,duree.f,freq_A.f,freq_B.f,freq_C.f,freq_D.f,freq_E.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,n_AB.b,n_BC.b,n_CD.b,n_DE.b,m_AB.b,m_BC.b,m_CD.b,m_DE.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_wav(0,*son,4,5967,20,388,440,536,20,25181,112234,244138,263145,33,32767,23483,18750,33,3,4,5,8,2,3,4,2,5,6,87,12,20,22,40,5)
PlaySound(0)
;
;-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 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 hyperbole(a,b,xA,yA,xB,yB)
a.f=(yA-yB)/((yA*yB*(xB-xA)))
b.f=(xB*yB-xA*yA)/((yA*yB*(xB-xA)))
EndMacro

Macro modulation_amplitude(type_mod_ampl,ampl,a_aff,b_aff,a_exp,x_ech_point_1,x_ech_point_2,b_exp,n)
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_1)*b_exp))
  Case 3 ;exponentielle2
    amplitude=ampl+(a_exp*exp((x_ech_point_2-x_ech_point_1)*b_exp))*(1-exp(-(x_echantillon-x_ech_point_1)*b_exp))
  Case 4 ;modulation sin(kt*n/durée_portion)
    ;x_echantillon/frequence_echantillonnage=temps en seconde car 44100 échantillons correspondent à 1s
    amplitude=(a_aff*x_echantillon+b_aff)*(0.5+0.5*Sin(2 * #PI *n/(x_ech_point_2-x_ech_point_1)*x_echantillon))
  Case 5 ;modulation sin(kt/nT)
    amplitude=(a_aff*x_echantillon+b_aff)*(0.5+0.5*Sin(2 * #PI * frequence/n*x_echantillon/freq_ech))
  Case 6 ; modulation scie(kt*n/durée_portion)
    If x_echantillon=x_ech_point_1
      x_origine_dent_mod=x_ech_point_1
      nbre_ech_par_T_modulation=Int(Round((x_ech_point_2-x_ech_point_1)/n,#PB_Round_Nearest))
    EndIf
    If (x_echantillon-x_origine_dent_mod)%nbre_ech_par_T_modulation=0
      x_origine_dent_mod=x_echantillon
      nbre_ech_par_T_modulation=Int(Round((x_ech_point_2-x_ech_point_1)/n,#PB_Round_Nearest))
    EndIf
    amplitude=((a_aff*x_echantillon+b_aff)/nbre_ech_par_T_modulation)*(x_echantillon-x_origine_dent_mod)
  Case 7 ;modulation scie(kt/nT)
    If x_echantillon=x_ech_point_1
      x_origine_dent_mod=x_ech_point_1
      nbre_ech_par_T_modulation=Int(Round(freq_ech/(frequence/n),#PB_Round_Nearest))
    EndIf
    If (x_echantillon-x_origine_dent_mod)%nbre_ech_par_T_modulation=0
      x_origine_dent_mod=x_echantillon
      nbre_ech_par_T_modulation=Int(Round(freq_ech/(frequence/n),#PB_Round_Nearest))
    EndIf
    amplitude=((a_aff*x_echantillon+b_aff)/nbre_ech_par_T_modulation)*(x_echantillon-x_origine_dent_mod)
  Case  8  ; modulation triangle(kt*n/durée_portion)
    If x_echantillon=x_ech_point_1
      x_origine_triangle_mod=x_ech_point_1
      nbre_ech_par_T_modulation=Int(Round((x_ech_point_2-x_ech_point_1)/n,#PB_Round_Nearest))
      alternance_mod.b=-1
    EndIf
    If (x_echantillon-x_origine_triangle_mod)%Int(nbre_ech_par_T_modulation*0.5)=0
      nbre_ech_par_T_modulation=Int(Round((x_ech_point_2-x_ech_point_1)/n,#PB_Round_Nearest))
      x_origine_triangle_mod=x_echantillon
      alternance_mod=-alternance_mod
    EndIf
    amplitude=(a_aff*x_echantillon+b_aff)*(1-alternance_mod)*0.5+(2*(a_aff*x_echantillon+b_aff)/nbre_ech_par_T_modulation)*(x_echantillon-x_origine_triangle_mod)*alternance_mod
  Case 9  ;modulation triangle(kt/nT)
    If x_echantillon=x_ech_point_1
      x_origine_triangle_mod=x_ech_point_1
      nbre_ech_par_T_modulation=Int(Round(freq_ech/(frequence/n),#PB_Round_Nearest))
      alternance_mod=-1
    EndIf
    If (x_echantillon-x_origine_triangle_mod)%Int(nbre_ech_par_T_modulation*0.5)=0
      nbre_ech_par_T_modulation=Int(Round(freq_ech/(frequence/n),#PB_Round_Nearest))
      x_origine_triangle_mod=x_echantillon
      alternance_mod=-alternance_mod
    EndIf
    amplitude=(a_aff*x_echantillon+b_aff)*(1-alternance_mod)*0.5+(2*(a_aff*x_echantillon+b_aff)/nbre_ech_par_T_modulation)*(x_echantillon-x_origine_triangle_mod)*alternance_mod
EndSelect 

EndMacro
Macro modulation_frequence(type_mod_freq,freq,a_aff,b_aff,a_exp,x_ech_point_1,x_ech_point_2,b_exp,m,a_hyp,b_hyp))
Select type_mod_freq
  Case 0 ;aucune modulation
    frequence=freq
  Case 1 ;affine
    frequence=(a_aff*x_echantillon+b_aff)
  Case 2 ;hyperbolique
    frequence=1/(a_hyp*x_echantillon+b_hyp)
  Case 3 ;exponentielle
    frequence=(a_exp*exp((x_echantillon-x_ech_point_1)*b_exp))
  Case 4 ;exponentielle2
    frequence=freq+(a_exp*exp((x_ech_point_2-x_ech_point_1)*b_exp))*(1-exp(-(x_echantillon-x_ech_point_1)*b_exp))
  Case 5 ;modulation sin(kt*n/durée_portion)
    ;x_echantillon/frequence_echantillonnage=temps en seconde car 44100 échantillons correspondent à 1s
    frequence=(a_aff*x_echantillon+b_aff)*(0.6+0.4*Sin(2 * #PI *m/(x_ech_point_2-x_ech_point_1)*x_echantillon))
  Case 6 ; modulation scie(kt*n/durée_portion)
    If x_echantillon=x_ech_point_1
      x_origine_dent_mod_freq=x_ech_point_1
      nbre_ech_par_T_modulation_freq=Int(Round((x_ech_point_2-x_ech_point_1)/m,#PB_Round_Nearest))
    EndIf
    If (x_echantillon-x_origine_dent_mod_freq)%nbre_ech_par_T_modulation_freq=0
      x_origine_dent_mod_freq=x_echantillon
      nbre_ech_par_T_modulation_freq=Int(Round((x_ech_point_2-x_ech_point_1)/m,#PB_Round_Nearest))
    EndIf
    frequence=((a_aff*x_echantillon+b_aff)/nbre_ech_par_T_modulation_freq)*(x_echantillon-x_origine_dent_mod_freq)+#frequence_min
  Case  7  ; modulation triangle(kt*n/durée_portion)
    If x_echantillon=x_ech_point_1
      x_origine_triangle_mod_freq=x_ech_point_1
      nbre_ech_par_T_modulation_freq=Int(Round((x_ech_point_2-x_ech_point_1)/m,#PB_Round_Nearest))
      alternance_mod_freq.b=-1
    EndIf
    If (x_echantillon-x_origine_triangle_mod_freq)%Int(nbre_ech_par_T_modulation_freq*0.5)=0
      nbre_ech_par_T_modulation_freq=Int(Round((x_ech_point_2-x_ech_point_1)/m,#PB_Round_Nearest))
      x_origine_triangle_mod_freq=x_echantillon
      alternance_mod_freq=-alternance_mod_freq
    EndIf
    frequence=(a_aff*x_echantillon+b_aff)*(1-alternance_mod_freq)*0.5+(2*(a_aff*x_echantillon+b_aff)/nbre_ech_par_T_modulation_freq)*(x_echantillon-x_origine_triangle_mod_freq)*alternance_mod_freq+#frequence_min
  Case 8 ;aléatoire
    frequence=#frequence_min+Random(freq)
    
EndSelect

EndMacro
Procedure creation_wav(ID,*son,type_signal.b,duree.f,freq_A.f,freq_B.f,freq_C.f,freq_D.f,freq_E.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,n_AB.b,n_BC.b,n_CD.b,n_DE.b,m_AB.b,m_BC.b,m_CD.b,m_DE.b)
   #frequence_min=20
  #frequence_max=10000
  #e=2.71828182845904
  amplitude.f
  ampl_max.f=32767 ;Pow(2, #bitrate-1)-1 
  frequence.f
  freq_ech.f=44100
  x_A.f=0
  nbre_ech_par_periode=freq_ech/freq_A
  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)
  
  ;-modulation hyperbolique des fréquences  (f=1/(a*x+b))
  hyperbole(a_freq_AB_hyp,b_freq_AB_hyp,x_A,freq_A,x_B,freq_B)
  hyperbole(a_freq_BC_hyp,b_freq_BC_hyp,x_B,freq_B,x_C,freq_C)
  hyperbole(a_freq_CD_hyp,b_freq_CD_hyp,x_C,freq_C,x_D,freq_D)
  hyperbole(a_freq_DE_hyp,b_freq_DE_hyp,x_D,freq_D,x_E,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,x_B,b_ampl_AB_exp,n_AB)
        modulation_frequence(mod_freq_A,freq_A, a_freq_AB_aff,b_freq_AB_aff,a_freq_AB_exp,x_A,x_B,b_freq_AB_exp,m_AB,a_freq_AB_hyp,b_freq_AB_hyp)
        
      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,x_C,b_ampl_BC_exp,n_BC)
        modulation_frequence(mod_freq_B,freq_B, a_freq_BC_aff,b_freq_BC_aff,a_freq_BC_exp,x_B,x_C,b_freq_BC_exp,m_BC,a_freq_BC_hyp,b_freq_BC_hyp)
        
      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,x_D,b_ampl_CD_exp,n_CD)
        modulation_frequence(mod_freq_C,freq_C, a_freq_CD_aff,b_freq_CD_aff,a_freq_CD_exp,x_C,x_D,b_freq_CD_exp,m_CD,a_freq_CD_hyp,b_freq_CD_hyp)
        
      Else
        modulation_amplitude(mod_ampl_D,ampl_d,a_ampl_DE_aff,b_ampl_DE_aff,a_ampl_DE_exp,x_D,x_E,b_ampl_DE_exp,n_DE)
        modulation_frequence(mod_freq_D,freq_D, a_freq_DE_aff,b_freq_DE_aff,a_freq_DE_exp,x_D,x_E,b_freq_DE_exp,m_DE,a_freq_DE_hyp,b_freq_DE_hyp)        
        
      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 mets l'éditeur seul dans le post suivant.

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

code de l'éditeur

Message par Huitbit »

J'ai rajouté les raccourcis clavier Space pour TEST et Ctrl+s pour la sauvegarde.
J'utilise les commandes AddKeyboardShortcut() et EventMenu().

Là par contre, je suis obligé de couper le code en deux pour le poster !

Voir plus loin...
Dernière modification par Huitbit le mer. 08/avr./2009 16:59, modifié 5 fois.
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Y'a pas à dire: c'est de mieux en mieux! J'ai testé le deuxième code (celui qui a explosé les balises).

Je ne peux malheureusement pas pousser l'utilisation à l'heure actuelle. Mais je tâcherai de voir ça. ça m'intéresse!

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

Astuces du jour...

Message par Huitbit »

Bonjour,

1. Pour dompter une fonction périodique au niveau de la fréquence, il n'y a que la modulation hyperbolique (merci le Soldat Inconnu :wink: ). Les autres modulations donnent souvent des résultats inattendus.

2. Pour faire du bruit, modulation aléatoire de la fréquence !

En résumé (à coller dans l'éditeur) :

Code : Tout sélectionner

creation_wav(0,*son,2,5061,1760,220,204,20,20,124186,197568,216575,223190,33,32767,10012,10376,33,1,3,4,4,2,8,8,8,3,100,3,1,20,22,40,5)

3. Si peu de fonctions sont utilisées, le lecteur peut-être allégé (il n'y a qu'à supprimer toutes les modulations et tous les signaux inutilisés), on gagne ainsi un grand nombre de lignes !

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

Message par Ollivier »

@Huitbit

Je ne sais pas si c'est l'heure, le temps, les champignons que j'ai mangé ou la mescaline que je me suis injecté, mais là j'ai rien compris à ce que tu as écrit en tout dernier!

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

Message par Huitbit »

@Ollivier

Le lecteur fait ~300 lignes, son objectif est d'être utilisé directement dans un programme (par exemple un jeu).
Si on peut passer de 300 à 150 lignes(en supprimant des fonctions inutilisées), c'est toujours ça de pris pour la taille du code et la compilation!

C'est quoi comme champignons? :wink:

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

Message par Ollivier »

Huitbit a écrit :Le lecteur fait ~300 lignes
Euh... Des fois il n'y a pas besoin de lourd pour assomer le petit curieux qui vient copier du code ici pour le tester!!!

Moi, je t'avouerais que j'ai été quand même sonné! Je commence à me faire sénil de temps en temps!

En tout cas, bravo pour ce boulot. Dans l'instant, ça ne m'est pas utile, mais ça aura certainement son utilité à venir.

Pour les champi, en fait, je vais éviter de goùter à ça. Sinon, je ne comprendrai vraiment plus rien!

Ollivier
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

Huitbit a écrit :c'est toujours ça de pris pour la taille du code et la compilation!
La compilation est très rapide depuis la 4.30, compiler 50.000 lignes de code prend quelques secondes. :)

-> il est temps pour ton code de lui faire un beau cadeau: un .pbi

-> toujours un soucis avec l'appui sur barre espace: faut d'abord cliquer sur le bouton TEST, ce qui donc annule l'intérêt du raccourcis( on fait "essuie glace" avec la souris).

tu dois connaître, mais bon:http://www.cyd.liu.se/~tompe573/hp/project_sfxr.html à gauche il y a des bouton bien pratique avec des effets déjà prédéfinis, afin de ne pas partir de 0.

Sinon c'est toujours aussi impressionnant, continu ! :D
Avatar de l’utilisateur
Huitbit
Messages : 939
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Message par Huitbit »

@beauregard
J'ai tellement joué avec EnableExplicit que j'en ai oublié les raccourcis :oops:

Je connais le lien. C'est une idée d'amélioration. Pour l'instant, j'explore pure_ADSR !


Essais du jour

passage de vaisseaux

Code : Tout sélectionner

creation_wav(0,*son,5,4403,1051,536,646,388,536,48554,97108,145662,194216,33,32767,33,19842,33,2,2,2,2,1,1,1,1,5,100,50,12,20,22,40,5)
décollage raté

Code : Tout sélectionner

creation_wav(0,*son,4,6131,20,462,867,425,20,67605,135211,253178,270377,33,19478,32767,17294,33,5,7,6,6,1,1,2,5,14,20,17,10,20,22,40,5)
Laser au gloubi-boulga :lol:

Code : Tout sélectionner

creation_wav(0,*son,0,287,6170,3150,1714,609,167,3175,6350,9526,12701,32767,23847,17658,7646,33,1,1,4,4,4,3,1,1,5,100,6,3,20,22,40,5)
Hasta la vista !
Dernière modification par Huitbit le mer. 08/avr./2009 17:01, modifié 1 fois.
Avatar de l’utilisateur
Huitbit
Messages : 939
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Partie n°1

Message par Huitbit »

Code de pure_ADSR_II partie n°1

Code : Tout sélectionner

;pure_ADSR_II
;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
;idée de base tonton, décortiquée par Comtois
;idée modulation hyperbolique Soldat Inconnu
;utilisation d'un code de codearchiv Froggerprogger (updated for PB 4.00 by Andre)
;-déclarations
#largeur_ecran=1024 
#hauteur_ecran=768
#marge=12
#frequence_min=20
#frequence_max=10000
#e=2.71828182845904
EnableExplicit
Define .b choix_mod_ampl, choix_mod_freq
Define .b alternance=-1, alternance_mod, alternance_mod_freq
Define .l x_origine_dent_mod, nbre_ech_par_T_modulation, x_origine_triangle_mod, x_origine_dent_mod_freq, nbre_ech_par_T_modulation_freq
Define .l x_origine_triangle_mod_freq, x_origine_triangle, x_origine_dent, i, x_courbe, amplitude_trace, y_courbe
Define .l nbre_ech_par_periode, longueur_spectre, Event, Menu, difference, x_echantillon
Define .f couleur, zone_frequence,compo_rgb
Define .f duree_signal, duree_AB, duree_BC, duree_CD,duree_DE,duree_partagee
Define .f frequence, freq_A, freq_B, freq_C, freq_D, freq_E, freq_ech
Define .f nbre_ech_total, nbre_ech_AB, nbre_ech_BC, nbre_ech_CD, nbre_ech_DE
Define .f amplitude, ampl_max, ampl_A, ampl_B, ampl_C, ampl_d, ampl_E
Define .f x_ech_A, x_ech_B, x_ech_C, x_ech_D, x_ech_E
;coefficients pour modulations affine, exponentielle et hyperbolique
Define .f a_ampl_AB_aff, b_ampl_AB_aff, a_ampl_BC_aff, b_ampl_BC_aff, a_ampl_CD_aff, b_ampl_CD_aff, a_ampl_DE_aff, b_ampl_DE_aff
Define .f a_ampl_AB_exp, b_ampl_AB_exp, a_ampl_BC_exp, b_ampl_BC_exp, a_ampl_CD_exp, b_ampl_CD_exp, a_ampl_DE_exp, b_ampl_DE_exp
Define .f a_freq_AB_aff, b_freq_AB_aff, a_freq_BC_aff, b_freq_BC_aff, a_freq_CD_aff, b_freq_CD_aff,  a_freq_DE_aff, b_freq_DE_aff
Define .f a_freq_AB_exp, b_freq_AB_exp, a_freq_BC_exp, b_freq_BC_exp, a_freq_CD_exp, b_freq_CD_exp, a_freq_DE_exp, b_freq_DE_exp
Define .f a_freq_AB_hyp, b_freq_AB_hyp, a_freq_BC_hyp, b_freq_BC_hyp, a_freq_CD_hyp, b_freq_CD_hyp, a_freq_DE_hyp, b_freq_DE_hyp
;sauvegarde
Define .s NomFichier, parametres, donnees_procedure
;origine du repère
Define .f x_origine=#marge, y_origine=#hauteur_ecran*0.75, x_courbe_ancien=#marge, y_courbe_ancien=y_origine
; coefficients pour la modulation signal(k*n/durée_portion) ou signal(k/nT)
Define .b n_AB=5, n_BC=100, n_CD=50, n_DE=12;pour l'amplitude
Define .b m_AB=20, m_BC=22, m_CD=40, m_DE=5;pour la fréquence
;déclaration pour l'enregistrement
Define .l totalsamples, datachunkBytes, *sound
Define .b actchannel
Structure PBUnion 
  StructureUnion 
    b.b 
    w.w 
    l.l 
    f.f 
    s.s 
  EndStructureUnion 
EndStructure 
Define .PBUnion *mem

;- Gadget Constants
Enumeration
  #Button_test
  #Button_fichier_wav
  #Button_charger_parametres
  #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_signal : #Text_duree_signal : #Text_ampl :  #Text_mod_ampl :#Text_mod_ampl_coeff:  #Text_freq :  #Text_mod_freq :#Text_mod_freq_coeff
  #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
  #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_a_ampl_val : #Text_b_ampl_val : #Text_c_ampl_val : #Text_d_ampl_val : #Text_e_ampl_val
  #TrackBar_n_AB: #TrackBar_n_BC:  #TrackBar_n_CD: #TrackBar_n_DE
  #Text_n_AB:#Text_n_BC:#Text_n_CD:#Text_n_DE
  #TrackBar_m_AB : #TrackBar_m_BC : #TrackBar_m_CD : #TrackBar_m_DE
  #Text_m_AB : #Text_m_BC : #Text_m_CD : #Text_m_DE
  
EndEnumeration
;-____________________________________________
;-CALCULS DES COEFFICIENTS POUR LES MODULATIONS AFFINE, EXPONENTIELLE ET HYPERBOLIQUE
;a et b sont les solutions des équations yA=f(xA) et yB=f(xB)
Macro affine(a,b,xA,yA,xB,yB)
a=(yB-yA)/(xB-xA)
b=(yA*xB-yB*xA)/(xB-xA)
EndMacro
Macro exp(x)
Pow(#e,x)
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=Log(yB/yA)/(xB-xA)
a=yA*exp(b*xA)
EndMacro
Macro hyperbole(a,b,xA,yA,xB,yB)
a=(yA-yB)/((yA*yB*(xB-xA)))
b=(xB*yB-xA*yA)/((yA*yB*(xB-xA)))
EndMacro
;-_________________________________________________
;-MENUS POUR LES MODULATIONS
;utilisation des codes ASCII pour les lettres A, B, C, D et E
Macro menu_mod_ampl(ordonnee,nom_combo_ampl,ascii1,ascii2,constante_portion)
ComboBoxGadget(nom_combo_ampl, 460, ordonnee, 85, 20)
AddGadgetItem(nom_combo_ampl,0,"Aucune")
AddGadgetItem(nom_combo_ampl,1,"Affine")
AddGadgetItem(nom_combo_ampl,2, "exp() n°1")
AddGadgetItem(nom_combo_ampl,3, "exp() n°2")
AddGadgetItem(nom_combo_ampl,4,"sin("+Chr(ascii1)+Chr(ascii2)+"/"+Str(constante_portion)+")")
AddGadgetItem(nom_combo_ampl,5,"sin("+Str(constante_portion)+"T)" )
AddGadgetItem(nom_combo_ampl,6,"scie("+Chr(ascii1)+Chr(ascii2)+"/"+Str(constante_portion)+")")
AddGadgetItem(nom_combo_ampl,7,"scie("+Str(constante_portion)+"T)" )
AddGadgetItem(nom_combo_ampl,8,"triangle("+Chr(ascii1)+Chr(ascii2)+"/"+Str(constante_portion)+")")
AddGadgetItem(nom_combo_ampl,9,"triangle("+Str(constante_portion)+"T)" )
SetGadgetState(nom_combo_ampl,0)
EndMacro
Macro menu_mod_frequence(ordonnee,nom_combo_freq,ascii1,ascii2,constante_portion)
ComboBoxGadget(nom_combo_freq, 900, ordonnee, 80, 20)
AddGadgetItem(nom_combo_freq,0,"Aucune")
AddGadgetItem(nom_combo_freq,1,"Affine")
AddGadgetItem(nom_combo_freq,2, "hyperbolique")
AddGadgetItem(nom_combo_freq,3, "exp() n°1")
AddGadgetItem(nom_combo_freq,4, "exp() n°2")
AddGadgetItem(nom_combo_freq,5,"sin("+Chr(ascii1)+Chr(ascii2)+"/"+Str(constante_portion)+")")
AddGadgetItem(nom_combo_freq,6,"scie("+Chr(ascii1)+Chr(ascii2)+"/"+Str(constante_portion)+")")
AddGadgetItem(nom_combo_freq,7,"triangle("+Chr(ascii1)+Chr(ascii2)+"/"+Str(constante_portion)+")")
AddGadgetItem(nom_combo_freq,8,"Aléatoire" )
SetGadgetState(nom_combo_freq,0)
EndMacro
;-_______________________________________________________________________________
;-MODULATION D'AMPLITUDE
Macro modulation_amplitude(ID_combo,ampl,a_aff,b_aff,a_exp,x_ech_point_1,x_ech_point_2,b_exp,n)
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_1)*b_exp))
  Case 3 ;exponentielle2
    amplitude=ampl+(a_exp*exp((x_ech_point_2-x_ech_point_1)*b_exp))*(1-exp(-(x_echantillon-x_ech_point_1)*b_exp))
  Case 4 ;modulation sin(kt*n/durée_portion)
    ;x_echantillon/frequence_echantillonnage=temps en seconde car 44100 échantillons correspondent à 1s
    amplitude=(a_aff*x_echantillon+b_aff)*(0.5+0.5*Sin(2 * #PI *n/(x_ech_point_2-x_ech_point_1)*x_echantillon))
  Case 5 ;modulation sin(kt/nT)
    amplitude=(a_aff*x_echantillon+b_aff)*(0.5+0.5*Sin(2 * #PI * frequence/n*x_echantillon/freq_ech))
  Case 6 ; modulation scie(kt*n/durée_portion)
    If x_echantillon=x_ech_point_1
      x_origine_dent_mod=x_ech_point_1
      nbre_ech_par_T_modulation=Int(Round((x_ech_point_2-x_ech_point_1)/n,#PB_Round_Nearest))
    EndIf
    If (x_echantillon-x_origine_dent_mod)%nbre_ech_par_T_modulation=0
      x_origine_dent_mod=x_echantillon
      nbre_ech_par_T_modulation=Int(Round((x_ech_point_2-x_ech_point_1)/n,#PB_Round_Nearest))
    EndIf
    amplitude=((a_aff*x_echantillon+b_aff)/nbre_ech_par_T_modulation)*(x_echantillon-x_origine_dent_mod)
  Case 7 ;modulation scie(kt/nT)
    If x_echantillon=x_ech_point_1
      x_origine_dent_mod=x_ech_point_1
      nbre_ech_par_T_modulation=Int(Round(freq_ech/(frequence/n),#PB_Round_Nearest))
    EndIf
    If (x_echantillon-x_origine_dent_mod)%nbre_ech_par_T_modulation=0
      x_origine_dent_mod=x_echantillon
      nbre_ech_par_T_modulation=Int(Round(freq_ech/(frequence/n),#PB_Round_Nearest))
    EndIf
    amplitude=((a_aff*x_echantillon+b_aff)/nbre_ech_par_T_modulation)*(x_echantillon-x_origine_dent_mod)
  Case  8  ; modulation triangle(kt*n/durée_portion)
    If x_echantillon=x_ech_point_1
      x_origine_triangle_mod=x_ech_point_1
      nbre_ech_par_T_modulation=Int(Round((x_ech_point_2-x_ech_point_1)/n,#PB_Round_Nearest))
      alternance_mod=-1
    EndIf
    If (x_echantillon-x_origine_triangle_mod)%Int(nbre_ech_par_T_modulation*0.5)=0
      nbre_ech_par_T_modulation=Int(Round((x_ech_point_2-x_ech_point_1)/n,#PB_Round_Nearest))
      x_origine_triangle_mod=x_echantillon
      alternance_mod=-alternance_mod
    EndIf
    amplitude=(a_aff*x_echantillon+b_aff)*(1-alternance_mod)*0.5+(2*(a_aff*x_echantillon+b_aff)/nbre_ech_par_T_modulation)*(x_echantillon-x_origine_triangle_mod)*alternance_mod
  Case 9  ;modulation triangle(kt/nT)
    If x_echantillon=x_ech_point_1
      x_origine_triangle_mod=x_ech_point_1
      nbre_ech_par_T_modulation=Int(Round(freq_ech/(frequence/n),#PB_Round_Nearest))
      alternance_mod=-1
    EndIf
    If (x_echantillon-x_origine_triangle_mod)%Int(nbre_ech_par_T_modulation*0.5)=0
      nbre_ech_par_T_modulation=Int(Round(freq_ech/(frequence/n),#PB_Round_Nearest))
      x_origine_triangle_mod=x_echantillon
      alternance_mod=-alternance_mod
    EndIf
    amplitude=(a_aff*x_echantillon+b_aff)*(1-alternance_mod)*0.5+(2*(a_aff*x_echantillon+b_aff)/nbre_ech_par_T_modulation)*(x_echantillon-x_origine_triangle_mod)*alternance_mod
    
EndSelect ;GetGadgetState(ID_combo)
EndMacro
;-________________________________________________________________
;-MODULATION DE FREQUENCE
Macro modulation_frequence(ID_combo,freq,a_aff,b_aff,a_exp,x_ech_point_1,x_ech_point_2,b_exp,m,a_hyp,b_hyp)
Select GetGadgetState(ID_combo)
  
  Case 0 ;aucune modulation
    frequence=freq
  Case 1 ;affine
    frequence=(a_aff*x_echantillon+b_aff)
  Case 2 ;hyperbolique
    frequence=1/(a_hyp*x_echantillon+b_hyp)
  Case 3 ;exponentielle
    frequence=(a_exp*exp((x_echantillon-x_ech_point_1)*b_exp))
  Case 4 ;exponentielle2
    frequence=freq+(a_exp*exp((x_ech_point_2-x_ech_point_1)*b_exp))*(1-exp(-(x_echantillon-x_ech_point_1)*b_exp))
  Case 5 ;modulation sin(kt*n/durée_portion)
    ;x_echantillon/frequence_echantillonnage=temps en seconde car 44100 échantillons correspondent à 1s
    frequence=(a_aff*x_echantillon+b_aff)*(0.6+0.4*Sin(2 * #PI *m/(x_ech_point_2-x_ech_point_1)*x_echantillon))
  Case 6 ; modulation scie(kt*n/durée_portion)
    If x_echantillon=x_ech_point_1
      x_origine_dent_mod_freq=x_ech_point_1
      nbre_ech_par_T_modulation_freq=Int(Round((x_ech_point_2-x_ech_point_1)/m,#PB_Round_Nearest))
    EndIf
    If (x_echantillon-x_origine_dent_mod_freq)%nbre_ech_par_T_modulation_freq=0
      x_origine_dent_mod_freq=x_echantillon
      nbre_ech_par_T_modulation_freq=Int(Round((x_ech_point_2-x_ech_point_1)/m,#PB_Round_Nearest))
    EndIf
    frequence=((a_aff*x_echantillon+b_aff)/nbre_ech_par_T_modulation_freq)*(x_echantillon-x_origine_dent_mod_freq)+#frequence_min
  Case  7  ; modulation triangle(kt*n/durée_portion)
    If x_echantillon=x_ech_point_1
      x_origine_triangle_mod_freq=x_ech_point_1
      nbre_ech_par_T_modulation_freq=Int(Round((x_ech_point_2-x_ech_point_1)/m,#PB_Round_Nearest))
      alternance_mod_freq=-1
    EndIf
    If (x_echantillon-x_origine_triangle_mod_freq)%Int(nbre_ech_par_T_modulation_freq*0.5)=0
      nbre_ech_par_T_modulation_freq=Int(Round((x_ech_point_2-x_ech_point_1)/m,#PB_Round_Nearest))
      x_origine_triangle_mod_freq=x_echantillon
      alternance_mod_freq=-alternance_mod_freq
    EndIf
    frequence=(a_aff*x_echantillon+b_aff)*(1-alternance_mod_freq)*0.5+(2*(a_aff*x_echantillon+b_aff)/nbre_ech_par_T_modulation_freq)*(x_echantillon-x_origine_triangle_mod_freq)*alternance_mod_freq+#frequence_min
  Case 8 ;aléatoire
    frequence=#frequence_min+Random(freq)
    
EndSelect ;GetGadgetState(ID_combo)
EndMacro
;-___________________________________________________________________
;-TRACE DE LA COURBE
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
  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,x_ech_B,b_ampl_AB_exp,n_AB)
      modulation_frequence(#Combo_a_mod_freq,freq_A, a_freq_AB_aff,b_freq_AB_aff,a_freq_AB_exp,x_ech_A,x_ech_B,b_freq_AB_exp,m_AB,a_freq_AB_hyp,b_freq_AB_hyp)
      
    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,x_ech_C,b_ampl_BC_exp,n_BC)
      modulation_frequence(#Combo_b_mod_freq,freq_B, a_freq_BC_aff,b_freq_BC_aff,a_freq_BC_exp,x_ech_B,x_ech_C,b_freq_BC_exp,m_BC,a_freq_BC_hyp,b_freq_BC_hyp)
      
    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,x_ech_D,b_ampl_CD_exp,n_CD)
      modulation_frequence(#Combo_c_mod_freq,freq_C, a_freq_CD_aff,b_freq_CD_aff,a_freq_CD_exp,x_ech_C,x_ech_D,b_freq_CD_exp,m_CD,a_freq_CD_hyp,b_freq_CD_hyp)
      
    Else
      modulation_amplitude(#Combo_d_mod_ampl,ampl_D,a_ampl_DE_aff,b_ampl_DE_aff,a_ampl_DE_exp,x_ech_D,x_ech_E,b_ampl_DE_exp,n_DE)
      modulation_frequence(#Combo_d_mod_freq,freq_D, a_freq_DE_aff,b_freq_DE_aff,a_freq_DE_exp,x_ech_D,x_ech_E,b_freq_DE_exp,m_DE,a_freq_DE_hyp,b_freq_DE_hyp)
      
    EndIf
    
    ;-changement d'échelle pour l'affichage des données
    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 ;GetGadgetState(#Combo_type_signal)
    
    ;couleur de la courbe en fonction de sa fréquence
    couleur_frequence(frequence,#frequence_max)
    
    ;on évite la fonction plot() pour éviter d'avoir une courbe en pointillés
    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))
  ;dessin des repères A, B, C, D et E
  Line(x_ech_B/(nbre_ech_total/1000)+x_origine,#hauteur_ecran*0.5+#marge,0,#hauteur_ecran*0.5-2*#marge,RGB(255,255,255))
  Line(x_ech_C/(nbre_ech_total/1000)+x_origine,#hauteur_ecran*0.5+#marge,0,#hauteur_ecran*0.5-2*#marge,RGB(255,255,255))
  Line(x_ech_D/(nbre_ech_total/1000)+x_origine,#hauteur_ecran*0.5+#marge,0,#hauteur_ecran*0.5-2*#marge,RGB(255,255,255))
  Line(x_ech_E/(nbre_ech_total/1000)+x_origine,#hauteur_ecran*0.5+#marge,0,#hauteur_ecran*0.5-2*#marge,RGB(255,255,255))
  DrawText(x_ech_A/(nbre_ech_total/1000)+x_origine,#hauteur_ecran*0.5+#marge,"A")
  DrawText(x_ech_B/(nbre_ech_total/1000)+x_origine,#hauteur_ecran*0.5+#marge+17,"B");17 taille du caractère "B"
  DrawText(x_ech_C/(nbre_ech_total/1000)+x_origine,#hauteur_ecran*0.5+#marge,"C")
  DrawText(x_ech_D/(nbre_ech_total/1000)+x_origine,#hauteur_ecran*0.5+#marge+17,"D")
  DrawText(x_ech_E/(nbre_ech_total/1000)+x_origine,#hauteur_ecran*0.5+#marge,"E")
  
  StopDrawing()   
EndIf;StartDrawing
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

;-___________________________________________________________________________________________________
;-RECUPERATION DES CONSTANTES DES GADGETS
;-ET CALCUL DES COEFFICIENTS
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

;-coefficients pour la modulation périodique de fréquence
m_AB=GetGadgetState(#TrackBar_m_AB)
m_BC=GetGadgetState(#TrackBar_m_BC)
m_CD=GetGadgetState(#TrackBar_m_CD)
m_DE=GetGadgetState(#TrackBar_m_DE)

;-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

;-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

;-coefficients pour la modulation périodique d'amplitude
n_AB=GetGadgetState(#TrackBar_n_AB)
n_BC=GetGadgetState(#TrackBar_n_BC)
n_CD=GetGadgetState(#TrackBar_n_CD)
n_DE=GetGadgetState(#TrackBar_n_DE)

;-coordonnées des échantillons
x_ech_A=0 ;toujours nul car c'est le point de départ
x_ech_B=x_ech_A+nbre_ech_AB
x_ech_C=x_ech_B+nbre_ech_BC
x_ech_D=x_ech_C+nbre_ech_CD
x_ech_E=x_ech_D+nbre_ech_DE

;-calcul des coefficients 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)

;-calcul des coefficients de 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)

;-calcul des coefficients de 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)

;-calcul des coefficients de 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)

;-calcul des coefficients de modulation hyperbolique des fréquences  (f=1/(a*x+b))
hyperbole(a_freq_AB_hyp,b_freq_AB_hyp,x_ech_A,freq_A,x_ech_B,freq_B)
hyperbole(a_freq_BC_hyp,b_freq_BC_hyp,x_ech_B,freq_B,x_ech_C,freq_C)
hyperbole(a_freq_CD_hyp,b_freq_CD_hyp,x_ech_C,freq_C,x_ech_D,freq_D)
hyperbole(a_freq_DE_hyp,b_freq_DE_hyp,x_ech_D,freq_D,x_ech_E,freq_E)

;-pour le tracé
x_courbe_ancien.f=#marge
y_courbe_ancien.f=y_origine
EndMacro
;-_______________________________________________________________________________
;-ENREGISTREMENT
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,x_ech_B,b_ampl_AB_exp,n_AB)
      modulation_frequence(#Combo_a_mod_freq,freq_A, a_freq_AB_aff,b_freq_AB_aff,a_freq_AB_exp,x_ech_A,x_ech_B,b_freq_AB_exp,m_AB,a_freq_AB_hyp,b_freq_AB_hyp)
      
    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,x_ech_C,b_ampl_BC_exp,n_BC)
      modulation_frequence(#Combo_b_mod_freq,freq_B, a_freq_BC_aff,b_freq_BC_aff,a_freq_BC_exp,x_ech_B,x_ech_C,b_freq_BC_exp,m_BC,a_freq_BC_hyp,b_freq_BC_hyp)
      
    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,x_ech_D,b_ampl_CD_exp,n_CD)
      modulation_frequence(#Combo_c_mod_freq,freq_C, a_freq_CD_aff,b_freq_CD_aff,a_freq_CD_exp,x_ech_C,x_ech_D,b_freq_CD_exp,m_CD,a_freq_CD_hyp,b_freq_CD_hyp)
      
    Else
      modulation_amplitude(#Combo_d_mod_ampl,ampl_d,a_ampl_DE_aff,b_ampl_DE_aff,a_ampl_DE_exp,x_ech_D,x_ech_E,b_ampl_DE_exp,n_DE)
      modulation_frequence(#Combo_d_mod_freq,freq_D, a_freq_DE_aff,b_freq_DE_aff,a_freq_DE_exp,x_ech_D,x_ech_E,b_freq_DE_exp,m_DE,a_freq_DE_hyp,b_freq_DE_hyp)
      
    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 ;GetGadgetState(#Combo_type_signal)
    
  Next actchannel
Next x_echantillon

EndMacro
Dernière modification par Huitbit le mer. 08/avr./2009 18:21, modifié 1 fois.
Avatar de l’utilisateur
Huitbit
Messages : 939
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Partie n°2

Message par Huitbit »

Code de pure_ADSR_II partie n°2

Code : Tout sélectionner

;-*******************************************************************************************
;-PROGRAMME PRINCIPAL
;-*******************************************************************************************
;-INITIALISATION

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

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

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

;-amplitudes
ampl_max=32767 ;Pow(2, #bitrate-1)-1 
ampl_A=0.1*ampl_max
ampl_B=1*ampl_max
ampl_C=0.4*ampl_max
ampl_D=0.3*ampl_max
ampl_E=0
;-Window
InitSound() 
OpenWindow(0, 0, 0, #largeur_ecran, #hauteur_ecran, "pure_ADSR_II (>>> les paramètres de la procédure creation_wav()  sont dans le presse-papier après enregistrement<<<)", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
;-___________________________________________________________________
;-GADGETS
;-boutons
ButtonGadget(#Button_test,0,0,40,20,"Test")
ButtonGadget(#Button_fichier_wav,0,#hauteur_ecran*0.5-20,200,20,"Sauvegarder au format .wav")
ButtonGadget(#Button_charger_parametres,200,#hauteur_ecran*0.5-20,200,20,"Saisir des paramètres")
AddKeyboardShortcut(0,#PB_Shortcut_Space,1)
AddKeyboardShortcut(0, #PB_Shortcut_Control | #PB_Shortcut_S, 2)


;-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)   
      
;-durée
TextGadget(#Text_duree, 160, 10, 140, 20, "DUREE (en ms)", #PB_Text_Center)
TextGadget(#Text_ab_duree, 150, 50, 60, 20, "(AB)    "+Str(duree_AB))
TextGadget(#Text_bc_duree, 150, 80, 60, 20, "(BC)    "+Str(duree_BC))
TextGadget(#Text_cd_duree, 150, 110, 60, 20, "(CD)    "+Str(duree_CD))
TextGadget(#Text_de_duree, 150, 140, 60, 20, "(DE)    "+Str(duree_DE))
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)

;-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)
TextGadget(#Text_mod_ampl_coeff, 430, 200, 140, 20, "COEFFICIENT", #PB_Text_Center)

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)

menu_mod_ampl(40,#Combo_a_mod_ampl,65,66,n_AB); chr(65)="A"
menu_mod_ampl(70,#Combo_b_mod_ampl,66,67,n_BC)
menu_mod_ampl(100,#Combo_c_mod_ampl,67,68,n_CD)
menu_mod_ampl(130,#Combo_d_mod_ampl,68,69,n_DE)

TrackBarGadget(#TrackBar_n_AB, 490, 220, 80, 20,1,100)
TrackBarGadget(#TrackBar_n_BC, 490, 250, 80, 20,1,100)
TrackBarGadget(#TrackBar_n_CD, 490, 280, 80, 20,1,100)
TrackBarGadget(#TrackBar_n_DE, 490, 310, 80, 20,1,100)
SetGadgetState(#TrackBar_n_AB,n_AB)
SetGadgetState(#TrackBar_n_BC,n_BC)
SetGadgetState(#TrackBar_n_CD,n_CD)
SetGadgetState(#TrackBar_n_DE,n_DE)
TextGadget(#Text_n_AB,430,220, 60, 20,"(AB)    "+Str(n_AB))
TextGadget(#Text_n_BC,430,250, 60, 20,"(BC)    "+Str(n_BC))
TextGadget(#Text_n_CD,430,280, 60, 20,"(CD)    "+Str(n_CD))
TextGadget(#Text_n_DE,430,310, 60, 20,"(DE)    "+Str(n_DE))

;-fréquence
TextGadget(#Text_freq, 600, 10, 290, 20, "FREQUENCE (en Hz)", #PB_Text_Center)
TextGadget(#Text_mod_freq, 900, 10, 80, 20, "MODULATION", #PB_Text_Center)
TextGadget(#Text_mod_freq_coeff, 870, 200, 140, 20, "COEFFICIENT", #PB_Text_Center)

TextGadget(#Text_a_freq, 550, 40, 50, 20, "A    "+Str(freq_A))
TextGadget(#Text_b_freq, 550, 70, 50, 20, "B    "+Str(freq_B))
TextGadget(#Text_c_freq, 550, 100, 50, 20, "C    "+Str(freq_C))
TextGadget(#Text_d_freq, 550, 130, 50, 20, "D    "+Str(freq_D))
TextGadget(#Text_e_freq, 550, 160, 50, 20, "E    "+Str(freq_E))
TrackBarGadget(#TrackBar_a_freq, 600, 40, 290, 20, 20, 10000)
TrackBarGadget(#TrackBar_b_freq, 600, 70, 290, 20, 20, 10000)
TrackBarGadget(#TrackBar_c_freq, 600, 100, 290, 20, 20, 10000)
TrackBarGadget(#TrackBar_d_freq, 600, 130, 290, 20, 20, 10000)
TrackBarGadget(#TrackBar_e_freq, 600, 160, 290, 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)

menu_mod_frequence(40,#Combo_a_mod_freq,65,66,m_AB)
menu_mod_frequence(70,#Combo_b_mod_freq,66,67,m_BC)
menu_mod_frequence(100,#Combo_c_mod_freq,67,68,m_CD)
menu_mod_frequence(130,#Combo_d_mod_freq,68,69,m_DE)

TrackBarGadget(#TrackBar_m_AB, 930, 220, 80, 20,1,100)
TrackBarGadget(#TrackBar_m_BC, 930, 250, 80, 20,1,100)
TrackBarGadget(#TrackBar_m_CD, 930, 280, 80, 20,1,100)
TrackBarGadget(#TrackBar_m_DE, 930, 310, 80, 20,1,100)
SetGadgetState(#TrackBar_m_AB,m_AB)
SetGadgetState(#TrackBar_m_BC,m_BC)
SetGadgetState(#TrackBar_m_CD,m_CD)
SetGadgetState(#TrackBar_m_DE,m_DE)
TextGadget(#Text_m_AB,870,220, 60, 20,"(AB)    "+Str(m_AB))
TextGadget(#Text_m_BC,870,250, 60, 20,"(BC)    "+Str(m_BC))
TextGadget(#Text_m_CD,870,280, 60, 20,"(CD)    "+Str(m_CD))
TextGadget(#Text_m_DE,870,310, 60, 20,"(DE)    "+Str(m_DE))
;-_______________________________________________________________
;-DESSIN DE L'ECRAN INITIAL
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 longueur_spectre=0 To 278
  couleur_frequence(longueur_spectre,290)
  Line(605+longueur_spectre,30 , 0, 10,couleur)
Next longueur_spectre
    ;-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_Menu 
        Menu=EventMenu()
        Select  menu
          Case 1
            recuperation_donnees
            ;copie des paramètres dans le presse-papier
            donnees_procedure="creation_wav(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_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))
            donnees_procedure=donnees_procedure+","+Str(n_AB)+","+Str(n_BC)+","+Str(n_CD)+","+Str(n_DE)
            donnees_procedure=donnees_procedure+","+Str(m_AB)+","+Str(m_BC)+","+Str(m_CD)+","+Str(m_DE)+")"
            SetClipboardText(donnees_procedure)
            enregistrement
            trace_courbe
            ;catch and play the sound  !
            CatchSound(0, *sound) 
            PlaySound(0) 
            
          Case 2
            ;sauvegarde
            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)
            
        EndSelect
        
        
      Case #PB_Event_Gadget
        ;variable utilisée pour gérer le partage des durées AB, BC, CD et DE par rapport à la durée du signal
        difference=GetGadgetState(#TrackBar_duree)-(GetGadgetState(#TrackBar_ab_duree)+GetGadgetState(#TrackBar_bc_duree)+GetGadgetState(#TrackBar_cd_duree)+GetGadgetState(#TrackBar_de_duree))
        
        Select EventGadget()
          ;-gestion des trackbars
          Case #TrackBar_duree
            SetGadgetText(#Text_duree_val,Str(GetGadgetState(#TrackBar_duree)))
            duree_partagee=Round(GetGadgetState(#TrackBar_duree)*0.25, #PB_Round_Nearest)
            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,"(AB)    "+Str(GetGadgetState(#TrackBar_ab_duree)))
            SetGadgetText(#Text_bc_duree,"(BC)    "+Str(GetGadgetState(#TrackBar_bc_duree)))
            SetGadgetText(#Text_cd_duree,"CD)    "+Str(GetGadgetState(#TrackBar_cd_duree)))
            SetGadgetText(#Text_de_duree,"(DE)    "+Str(GetGadgetState(#TrackBar_de_duree)))
            
          Case #TrackBar_ab_duree
            SetGadgetText(#Text_ab_duree,"(AB)    "+Str(GetGadgetState(#TrackBar_ab_duree)))
            If GetGadgetState(#TrackBar_de_duree)>10 
              SetGadgetState(#TrackBar_de_duree,GetGadgetState(#TrackBar_de_duree)+difference)
              SetGadgetText(#Text_de_duree,"(DE)    "+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,"(CD)    "+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,"(BC)    "+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,"(AB)    "+Str(GetGadgetState(#TrackBar_ab_duree)))
              EndIf
            EndIf
            
          Case #TrackBar_bc_duree
            SetGadgetText(#Text_bc_duree,"(BC)    "+Str(GetGadgetState(#TrackBar_bc_duree)))
            If GetGadgetState(#TrackBar_de_duree)>10 
              SetGadgetState(#TrackBar_de_duree,GetGadgetState(#TrackBar_de_duree)+difference)
              SetGadgetText(#Text_de_duree,"(DE)    "+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,"(CD)    "+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,"(AB)    "+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,"(BC)    "+Str(GetGadgetState(#TrackBar_bc_duree)))
              EndIf
            EndIf
            
          Case #TrackBar_cd_duree
            SetGadgetText(#Text_cd_duree,"(CD)    "+Str(GetGadgetState(#TrackBar_cd_duree)))
            If GetGadgetState(#TrackBar_de_duree)>10 
              SetGadgetState(#TrackBar_de_duree,GetGadgetState(#TrackBar_de_duree)+difference)
              SetGadgetText(#Text_de_duree,"(DE)    "+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,"(BC)    "+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,"(AB)    "+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,"(CD)    "+Str(GetGadgetState(#TrackBar_cd_duree)))
              EndIf
            EndIf
            
          Case #TrackBar_de_duree
            SetGadgetText(#Text_de_duree,"(DE)    "+Str(GetGadgetState(#TrackBar_de_duree)))
            If GetGadgetState(#TrackBar_cd_duree)>10 
              SetGadgetState(#TrackBar_cd_duree,GetGadgetState(#TrackBar_cd_duree)+difference)
              SetGadgetText(#Text_cd_duree,"(CD)    "+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,"(BC)    "+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,"(AB)    "+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,"(DE)    "+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_n_AB
            n_AB=GetGadgetState(#TrackBar_n_AB)
            SetGadgetText(#Text_n_AB,"(AB)    "+Str(n_AB))
            choix_mod_ampl=GetGadgetState(#Combo_a_mod_ampl)
            SetGadgetItemText(#Combo_a_mod_ampl,4,"sin(AB/"+Str(n_AB)+")")
            SetGadgetItemText(#Combo_a_mod_ampl,5,"sin("+Str(n_AB)+"T)" )
            SetGadgetItemText(#Combo_a_mod_ampl,6,"scie(AB/"+Str(n_AB)+")")
            SetGadgetItemText(#Combo_a_mod_ampl,7,"scie("+Str(n_AB)+"T)" )
            SetGadgetItemText(#Combo_a_mod_ampl,8,"triangle(AB/"+Str(n_AB)+")")
            SetGadgetItemText(#Combo_a_mod_ampl,9,"triangle("+Str(n_AB)+"T)" )            
            SetGadgetState(#Combo_a_mod_ampl,choix_mod_ampl)
            
          Case #TrackBar_n_BC
            n_BC=GetGadgetState(#TrackBar_n_BC)
            SetGadgetText(#Text_n_BC,"(BC)    "+Str(n_BC))
            choix_mod_ampl=GetGadgetState(#Combo_b_mod_ampl)
            SetGadgetItemText(#Combo_b_mod_ampl,4,"sin(BC/"+Str(n_BC)+")")
            SetGadgetItemText(#Combo_b_mod_ampl,5,"sin("+Str(n_BC)+"T)" )
            SetGadgetItemText(#Combo_b_mod_ampl,6,"scie(BC/"+Str(n_BC)+")")
            SetGadgetItemText(#Combo_b_mod_ampl,7,"scie("+Str(n_BC)+"T)" )
            SetGadgetItemText(#Combo_b_mod_ampl,8,"triangle(BC/"+Str(n_BC)+")")
            SetGadgetItemText(#Combo_b_mod_ampl,9,"triangle("+Str(n_BC)+"T)" )            
            SetGadgetState(#Combo_b_mod_ampl,choix_mod_ampl)
            
          Case #TrackBar_n_CD
            n_CD=GetGadgetState(#TrackBar_n_CD)
            SetGadgetText(#Text_n_CD,"(CD)    "+Str(n_CD))
            choix_mod_ampl=GetGadgetState(#Combo_c_mod_ampl)
            SetGadgetItemText(#Combo_c_mod_ampl,4,"sin(CD/"+Str(n_CD)+")")
            SetGadgetItemText(#Combo_c_mod_ampl,5,"sin("+Str(n_CD)+"T)" )
            SetGadgetItemText(#Combo_c_mod_ampl,6,"scie(CD/"+Str(n_CD)+")")
            SetGadgetItemText(#Combo_c_mod_ampl,7,"scie("+Str(n_CD)+"T)" )
            SetGadgetItemText(#Combo_c_mod_ampl,8,"triangle(CD/"+Str(n_CD)+")")
            SetGadgetItemText(#Combo_c_mod_ampl,9,"triangle("+Str(n_CD)+"T)" )
            
            SetGadgetState(#Combo_c_mod_ampl,choix_mod_ampl)
            
          Case #TrackBar_n_DE
            n_DE=GetGadgetState(#TrackBar_n_DE)
            SetGadgetText(#Text_n_DE,"(DE)    "+Str(n_DE))
            choix_mod_ampl=GetGadgetState(#Combo_d_mod_ampl)
            SetGadgetItemText(#Combo_d_mod_ampl,4,"sin(DE/"+Str(n_DE)+")")
            SetGadgetItemText(#Combo_d_mod_ampl,5,"sin("+Str(n_DE)+"T)" )
            SetGadgetItemText(#Combo_d_mod_ampl,6,"scie(DE/"+Str(n_DE)+")")
            SetGadgetItemText(#Combo_d_mod_ampl,7,"scie("+Str(n_DE)+"T)" )
            SetGadgetItemText(#Combo_d_mod_ampl,8,"triangle(DE/"+Str(n_DE)+")")
            SetGadgetItemText(#Combo_d_mod_ampl,9,"triangle("+Str(n_DE)+"T)" )            
            SetGadgetState(#Combo_d_mod_ampl,choix_mod_ampl)            
            
          Case #TrackBar_a_freq
            SetGadgetText(#Text_a_freq,"A    "+Str(GetGadgetState(#TrackBar_a_freq)))
            
          Case #TrackBar_b_freq
            SetGadgetText(#Text_b_freq,"B    "+Str(GetGadgetState(#TrackBar_b_freq)))
            
          Case #TrackBar_c_freq
            SetGadgetText(#Text_c_freq,"C    "+Str(GetGadgetState(#TrackBar_c_freq)))
            
          Case #TrackBar_d_freq
            SetGadgetText(#Text_d_freq,"D    "+Str(GetGadgetState(#TrackBar_d_freq)))
            
          Case #TrackBar_e_freq
            SetGadgetText(#Text_e_freq,"E    "+Str(GetGadgetState(#TrackBar_e_freq)))
            
          Case #TrackBar_m_AB
            m_AB=GetGadgetState(#TrackBar_m_AB)
            SetGadgetText(#Text_m_AB,"(AB)    "+Str(m_AB))
            choix_mod_freq=GetGadgetState(#Combo_a_mod_freq)
            SetGadgetItemText(#Combo_a_mod_freq,5,"sin(AB/"+Str(m_AB)+")")
            SetGadgetItemText(#Combo_a_mod_freq,6,"scie(AB/"+Str(m_AB)+")")
            SetGadgetItemText(#Combo_a_mod_freq,7,"triangle(AB/"+Str(m_AB)+")")
            SetGadgetState(#Combo_a_mod_freq,choix_mod_freq)
            
          Case #TrackBar_m_BC
            m_BC=GetGadgetState(#TrackBar_m_BC)
            SetGadgetText(#Text_m_BC,"(BC)    "+Str(m_BC))
            choix_mod_freq=GetGadgetState(#Combo_b_mod_freq)
            SetGadgetItemText(#Combo_b_mod_freq,5,"sin(BC/"+Str(m_BC)+")")
            SetGadgetItemText(#Combo_b_mod_freq,6,"scie(BC/"+Str(m_BC)+")")
            SetGadgetItemText(#Combo_b_mod_freq,7,"triangle(BC/"+Str(m_BC)+")")
            SetGadgetState(#Combo_b_mod_freq,choix_mod_freq)
            
          Case #TrackBar_m_CD
            m_CD=GetGadgetState(#TrackBar_m_CD)
            SetGadgetText(#Text_m_CD,"(CD)    "+Str(m_CD))
            choix_mod_freq=GetGadgetState(#Combo_c_mod_freq)
            SetGadgetItemText(#Combo_c_mod_freq,5,"sin(CD/"+Str(m_CD)+")")
            SetGadgetItemText(#Combo_c_mod_freq,6,"scie(CD/"+Str(m_CD)+")")
            SetGadgetItemText(#Combo_c_mod_freq,7,"triangle(CD/"+Str(m_CD)+")")
            SetGadgetState(#Combo_c_mod_freq,choix_mod_freq)
            
          Case #TrackBar_m_DE
            m_DE=GetGadgetState(#TrackBar_m_DE)
            SetGadgetText(#Text_m_DE,"(DE)    "+Str(m_DE))
            choix_mod_freq=GetGadgetState(#Combo_d_mod_freq)
            SetGadgetItemText(#Combo_d_mod_freq,5,"sin(DE/"+Str(m_DE)+")")
            SetGadgetItemText(#Combo_d_mod_freq,6,"scie(DE/"+Str(m_DE)+")")
            SetGadgetItemText(#Combo_d_mod_freq,7,"triangle(DE/"+Str(m_DE)+")")
            SetGadgetState(#Combo_d_mod_freq,choix_mod_freq)            
            
          Case #Button_fichier_wav
            ;-sauvegarde
            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_charger_parametres
            ;-saisie des paramètres
            parametres=InputRequester("","Veuillez coller l'expression complète de votre procédure :" ,"")
            parametres=RemoveString(parametres,"creation_wav(0,*son,")
            parametres=RemoveString(parametres,")")
            SetGadgetState(#Combo_type_signal,Val(StringField(parametres,1,",")));type_signal
            ;duree_signal
            SetGadgetState(#TrackBar_duree,ValF(StringField(parametres,2,",")))
            SetGadgetText(#Text_duree_val,StringField(parametres,2,","))
            ;freq_A
            SetGadgetState(#TrackBar_a_freq,ValF(StringField(parametres,3,",")))
            SetGadgetText(#Text_a_freq,"A    "+StringField(parametres,3,","))
            ;freq_B
            SetGadgetState(#TrackBar_b_freq,ValF(StringField(parametres,4,",")))
            SetGadgetText(#Text_b_freq,"B    "+StringField(parametres,4,","))
            ;freq_C
            SetGadgetState(#TrackBar_c_freq,ValF(StringField(parametres,5,",")))
            SetGadgetText(#Text_c_freq,"C    "+StringField(parametres,5,","))
            ;freq_D
            SetGadgetState(#TrackBar_d_freq,ValF(StringField(parametres,6,",")))
            SetGadgetText(#Text_d_freq,"D    "+StringField(parametres,6,","))
            ;freq_E
            SetGadgetState(#TrackBar_e_freq,ValF(StringField(parametres,7,",")))
            SetGadgetText(#Text_e_freq,"E    "+StringField(parametres,7,","))
            
            x_ech_A=0
            x_ech_B=ValF(StringField(parametres,8,","))
            x_ech_C=ValF(StringField(parametres,9,","))
            x_ech_D=ValF(StringField(parametres,10,","))
            x_ech_E=ValF(StringField(parametres,11,","))
            
            ;durée (AB)
            SetGadgetState(#TrackBar_ab_duree,(x_ech_B-x_ech_A)*1000/freq_ech)
            SetGadgetText(#Text_ab_duree,"(AB)    "+Str((x_ech_B-x_ech_A)*1000/freq_ech))
            ;durée (BC)
            SetGadgetState(#TrackBar_bc_duree,(x_ech_C-x_ech_B)*1000/freq_ech)
            SetGadgetText(#Text_bc_duree,"(BC)    "+Str((x_ech_C-x_ech_B)*1000/freq_ech))
            ;durée (CD)
            SetGadgetState(#TrackBar_cd_duree,(x_ech_D-x_ech_C)*1000/freq_ech)
            SetGadgetText(#Text_cd_duree,"(CD)    "+Str((x_ech_D-x_ech_C)*1000/freq_ech))   
            ;durée (CD)
            SetGadgetState(#TrackBar_de_duree,(x_ech_E-x_ech_D)*1000/freq_ech)
            SetGadgetText(#Text_de_duree,"(DE)    "+Str((x_ech_E-x_ech_D)*1000/freq_ech))   
            ;ampl_A      
            SetGadgetState(#TrackBar_a_ampl,ValF(StringField(parametres,12,","))/(ampl_max/180))
            SetGadgetText(#Text_a_ampl_val,Str(ValF(StringField(parametres,12,","))/(ampl_max/180)))
            ;ampl_B      
            SetGadgetState(#TrackBar_b_ampl,ValF(StringField(parametres,13,","))/(ampl_max/180))
            SetGadgetText(#Text_b_ampl_val,Str(ValF(StringField(parametres,13,","))/(ampl_max/180)))
            ;ampl_C      
            SetGadgetState(#TrackBar_c_ampl,ValF(StringField(parametres,14,","))/(ampl_max/180))
            SetGadgetText(#Text_c_ampl_val,Str(ValF(StringField(parametres,14,","))/(ampl_max/180)))
            ;ampl_D      
            SetGadgetState(#TrackBar_d_ampl,ValF(StringField(parametres,15,","))/(ampl_max/180))
            SetGadgetText(#Text_d_ampl_val,Str(ValF(StringField(parametres,15,","))/(ampl_max/180)))   
            ;ampl_E      
            SetGadgetState(#TrackBar_e_ampl,ValF(StringField(parametres,16,","))/(ampl_max/180))
            SetGadgetText(#Text_e_ampl_val,Str(ValF(StringField(parametres,16,","))/(ampl_max/180)))   
            
            ;n_AB
            n_AB=Val(StringField(parametres,25,","))
            SetGadgetState(#TrackBar_n_AB,n_AB)
            SetGadgetText(#Text_n_AB,"(AB)    "+Str(n_AB))
            SetGadgetItemText(#Combo_a_mod_ampl,4,"sin(AB/"+Str(n_AB)+")")
            SetGadgetItemText(#Combo_a_mod_ampl,5,"sin("+Str(n_AB)+"T)" )
            SetGadgetItemText(#Combo_a_mod_ampl,6,"scie(AB/"+Str(n_AB)+")")
            SetGadgetItemText(#Combo_a_mod_ampl,7,"scie("+Str(n_AB)+"T)" )
            SetGadgetItemText(#Combo_a_mod_ampl,8,"triangle(AB/"+Str(n_AB)+")")
            SetGadgetItemText(#Combo_a_mod_ampl,9,"triangle("+Str(n_AB)+"T)" )            
            
            ;n_BC
            n_BC=Val(StringField(parametres,26,","))
            SetGadgetState(#TrackBar_n_BC,n_BC)
            SetGadgetText(#Text_n_BC,"(BC)    "+Str(n_BC))
            SetGadgetItemText(#Combo_b_mod_ampl,4,"sin(BC/"+Str(n_BC)+")")
            SetGadgetItemText(#Combo_b_mod_ampl,5,"sin("+Str(n_BC)+"T)" )
            SetGadgetItemText(#Combo_b_mod_ampl,6,"scie(BC/"+Str(n_BC)+")")
            SetGadgetItemText(#Combo_b_mod_ampl,7,"scie("+Str(n_BC)+"T)" )
            SetGadgetItemText(#Combo_b_mod_ampl,8,"triangle(BC/"+Str(n_BC)+")")
            SetGadgetItemText(#Combo_b_mod_ampl,9,"triangle("+Str(n_BC)+"T)" )                       
            
            ;n_CD
            n_CD=Val(StringField(parametres,27,","))
            SetGadgetState(#TrackBar_n_CD,n_CD)
            SetGadgetText(#Text_n_CD,"(CD)    "+Str(n_CD))
            SetGadgetItemText(#Combo_c_mod_ampl,4,"sin(CD/"+Str(n_CD)+")")
            SetGadgetItemText(#Combo_c_mod_ampl,5,"sin("+Str(n_CD)+"T)" )
            SetGadgetItemText(#Combo_c_mod_ampl,6,"scie(CD/"+Str(n_CD)+")")
            SetGadgetItemText(#Combo_c_mod_ampl,7,"scie("+Str(n_CD)+"T)" )
            SetGadgetItemText(#Combo_c_mod_ampl,8,"triangle(CD/"+Str(n_CD)+")")
            SetGadgetItemText(#Combo_c_mod_ampl,9,"triangle("+Str(n_CD)+"T)" )    
            
            ;n_DE
            n_DE=Val(StringField(parametres,28,","))
            SetGadgetState(#TrackBar_n_DE,n_DE)
            SetGadgetText(#Text_n_DE,"(DE)    "+Str(n_DE))
            SetGadgetItemText(#Combo_d_mod_ampl,4,"sin(DE/"+Str(n_DE)+")")
            SetGadgetItemText(#Combo_d_mod_ampl,5,"sin("+Str(n_DE)+"T)" )
            SetGadgetItemText(#Combo_d_mod_ampl,6,"scie(DE/"+Str(n_DE)+")")
            SetGadgetItemText(#Combo_d_mod_ampl,7,"scie("+Str(n_DE)+"T)" )
            SetGadgetItemText(#Combo_d_mod_ampl,8,"triangle(DE/"+Str(n_DE)+")")
            SetGadgetItemText(#Combo_d_mod_ampl,9,"triangle("+Str(n_DE)+"T)" )                
            
            ;m_AB
            m_AB=Val(StringField(parametres,29,","))
            SetGadgetState(#TrackBar_m_AB,m_AB)
            SetGadgetText(#Text_m_AB,"(AB)    "+Str(m_AB))
            SetGadgetItemText(#Combo_a_mod_freq,5,"sin(AB/"+Str(m_AB)+")")
            SetGadgetItemText(#Combo_a_mod_freq,6,"scie(AB/"+Str(m_AB)+")")
            SetGadgetItemText(#Combo_a_mod_freq,7,"triangle(AB/"+Str(m_AB)+")")
            
            ;m_BC
            m_BC=Val(StringField(parametres,30,","))
            SetGadgetState(#TrackBar_m_BC,m_BC)
            SetGadgetText(#Text_m_BC,"(BC)    "+Str(m_BC))
            SetGadgetItemText(#Combo_b_mod_freq,5,"sin(BC/"+Str(m_BC)+")")
            SetGadgetItemText(#Combo_b_mod_freq,6,"scie(BC/"+Str(m_BC)+")")
            SetGadgetItemText(#Combo_b_mod_freq,7,"triangle(BC/"+Str(m_BC)+")")            
            
            ;m_CD
            m_CD=Val(StringField(parametres,31,","))
            SetGadgetState(#TrackBar_m_CD,m_CD)
            SetGadgetText(#Text_m_CD,"(CD)    "+Str(m_CD))
            SetGadgetItemText(#Combo_c_mod_freq,5,"sin(CD/"+Str(m_CD)+")")
            SetGadgetItemText(#Combo_c_mod_freq,6,"scie(CD/"+Str(m_CD)+")")
            SetGadgetItemText(#Combo_c_mod_freq,7,"triangle(CD/"+Str(m_CD)+")")
            
            ;m_DE
            m_DE=Val(StringField(parametres,32,","))
            SetGadgetState(#TrackBar_m_DE,m_DE)
            SetGadgetText(#Text_m_DE,"(DE)    "+Str(m_DE))
            SetGadgetItemText(#Combo_d_mod_freq,5,"sin(DE/"+Str(m_DE)+")")
            SetGadgetItemText(#Combo_d_mod_freq,6,"scie(DE/"+Str(m_DE)+")")
            SetGadgetItemText(#Combo_d_mod_freq,7,"triangle(DE/"+Str(m_DE)+")")
            
            SetGadgetState(#Combo_a_mod_ampl,Val(StringField(parametres,17,",")))
            SetGadgetState(#Combo_b_mod_ampl,Val(StringField(parametres,18,",")))
            SetGadgetState(#Combo_c_mod_ampl,Val(StringField(parametres,19,",")))
            SetGadgetState(#Combo_d_mod_ampl,Val(StringField(parametres,20,",")))
            SetGadgetState(#Combo_a_mod_freq,Val(StringField(parametres,21,",")))
            SetGadgetState(#Combo_b_mod_freq,Val(StringField(parametres,22,",")))
            SetGadgetState(#Combo_c_mod_freq,Val(StringField(parametres,23,",")))
            SetGadgetState(#Combo_d_mod_freq,Val(StringField(parametres,24,",")))
            
          Case #Button_test
            recuperation_donnees
            ;-copie des paramètres dans le presse-papier
            donnees_procedure="creation_wav(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_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))
            donnees_procedure=donnees_procedure+","+Str(n_AB)+","+Str(n_BC)+","+Str(n_CD)+","+Str(n_DE)
            donnees_procedure=donnees_procedure+","+Str(m_AB)+","+Str(m_BC)+","+Str(m_CD)+","+Str(m_DE)+")"
            SetClipboardText(donnees_procedure)
            enregistrement
            trace_courbe
            ;-catch and play the sound  !
            CatchSound(0, *sound) 
            PlaySound(0) 
            
        EndSelect ;EventGadget()
        
    EndSelect ;Event
    
  Until Event = 0
  
  Delay(1)
ForEver
Répondre