/* Strumento di prova 1 */
signal ON ERROR NAME ErrFailure
signal ON FAILURE NAME ErrFailure
signal ON HALT NAME ErrHalt

parse arg Frequenza, Ampiezza, Durata, Offset, Sinistro, Destro, Posizione, WTrac

if Frequenza > 20000 | Frequenza < 20 then do
   say '+++ frequenza errata'
   signal ErrFormale
   end
if Ampiezza < 0 | Ampiezza > 100 then do
   say '+++ ampiezza errata'
   signal ErrFormale
   end
if Durata < 0 | Durata > 100000 then do
   say '+++ durata errata'
   signal ErrFormale
   end
if Offset < 0 then do
   say '+++ offset errato'
   signal ErrFormale
   end
if Posizione < 0 | Posizione > 100 then do
   say '+++ posizione errata'
   signal ErrFormale
   end

Offset = TRUNC(Offset)
/*
say 'Frequenza (hz):' Frequenza 'Ampiezza (%) :' Ampiezza 'Durata (ms) :' Durata 'Offset (ms) :' Offset
*/
/* f    = frequenza                                       */
/* dt   = durata totale della sinusoide base              */
/* adx  = ampiezza destra                                 */
/* asx  = ampiezza sinistra                               */
/* pdx  = offset traccia + ritardo destro                 */
/* psx  = offset traccia + ritardo sinistro               */
/* atk1 = tratto ascendente inviluppo di attacco        */
/* atk2 = tratto discendente inviluppo di attacco       */
/* sust = sustain                                         */
/* rel  = durata decadimento                              */

adx = (Ampiezza * ((101 - Posizione)/100)) / 100
asx = (Ampiezza * (Posizione/100)) / 100

pdx = Sinistro + TRUNC(((100 - (Posizione * 44.1)) / 30) + (Offset * 44.1))
psx = Destro + TRUNC(((Posizione * 44.1) / 30) + (Offset * 44.1))


f.1 = Frequenza
f.2 = Frequenza * 4
f.3 = Frequenza * 16
f.4 = Frequenza / 2
f.5 = Frequenza / 4
f.6 = Frequenza * 3 / 2
f.7 = Frequenza * 3
f.8 = Frequenza * 6

a.1 = 1.0
a.2 = 0.1
a.3 = 0.3
a.4 = 0.4
a.5 = 0.5
a.6 = 0.2
a.7 = 0.25
a.8 = 0.3

sust.1 = Durata * 0.25
sust.2 = Durata * 0.19
sust.3 = Durata * 0.18
sust.4 = Durata * 0.24
sust.5 = Durata * 0.27
sust.6 = Durata * 0.17
sust.7 = Durata * 0.16
sust.8 = Durata * 0.15

atk1.1 = 30
atk2.1 = 15
atk1.2 = 10
atk2.2 = 15
atk1.3 = 20
atk2.3 = 15
atk1.4 = 25
atk2.4 = 15
atk1.5 = 50
atk2.5 = 100
atk1.6 = 4
atk2.6 = 9
atk1.7 = 5
atk2.7 = 10
atk1.8 = 5
atk2.8 = 15

rel.1 = 50
rel.2 = 50
rel.3 = 65
rel.4 = 100
rel.5 = 150
rel.6 = 30
rel.7 = 35
rel.8 = 40

do i = 1 to 8
   if f.i < 1000 then a.i = a.i + ((1001 - f.i) / 6000)
   if a.i > 1.5 then a.i = 1.5

   if f.i < 20000 then do
/* canale sinistro      */
      dt = (atk1.i + atk2.i + sust.i + rel.i + 50) * 45
      rep = WavMute( WTrac , Durata * 45)
      rep = WavSinOsc( WTrac , dt, f.i, asx * a.i)
      oi = WTrac
      of = psx
      od = TRUNC(atk1.i) * 44

      rcy = WavCopyTrac(oi, of, od, 0, 1, 'LIN', 'MIX')
      of = of + od
      oi = oi + od
      od = 9 * 44
      rcy = WavCopyTrac(oi, of, od, 1, 1, 'LIN', 'MIX')
      of = of + od
      oi = oi + od
      od = TRUNC(atk2.i) * 44
      rcy = WavCopyTrac(oi, of, od, 1, 0.6, 'LIN', 'MIX')
      of = of + od
      oi = oi + od
      od = TRUNC(sust.i) * 44
      rcy = WavCopyTrac(oi, of, od, 0.6, 0.6, 'LIN', 'MIX')
      of = of + od
      oi = oi + od
      od = TRUNC(rel.i) * 44
      rcy = WavCopyTrac(oi, of, od, 0.6, 0, 'LIN', 'MIX')
/* canale destro        */
      rep = WavMute( WTrac , Durata * 45)
      rep = WavSinOsc( WTrac , dt, f.i, adx * a.i)
      oi = WTrac
      of = pdx
      od = TRUNC(atk1.i) * 44

      rcy = WavCopyTrac(oi, of, od, 0, 1, 'LIN', 'MIX')
      of = of + od
      oi = oi + od
      od = 9 * 44
      rcy = WavCopyTrac(oi, of, od, 1, 1, 'LIN', 'MIX')
      of = of + od
      oi = oi + od
      od = TRUNC(atk2.i) * 44
      rcy = WavCopyTrac(oi, of, od, 1, 0.6, 'LIN', 'MIX')
      of = of + od
      oi = oi + od
      od = TRUNC(sust.i) * 44
      rcy = WavCopyTrac(oi, of, od, 0.6, 0.6, 'LIN', 'MIX')
      of = of + od
      oi = oi + od
      od = TRUNC(rel.i) * 44
      rcy = WavCopyTrac(oi, of, od, 0.6, 0, 'LIN', 'MIX')
      end

   end


return 0



ErrFormale:
say 'Frequenza (hz):' Frequenza
say 'Ampiezza (%)  :' Ampiezza
say 'Durata (ms)   :' Durata
say 'Offset (ms)   :' Offset
say '+++ Str01: errore formale'
return 20

ErrFailure:
say '+++ Str01: errore bloccante'
return 21

ErrHalt:
say '+++ Str01: Break !'
return 22


