!***************************
! Preset_Shepard glissando 2
!***************************

Declareer a; b;c; d; f0; f1; p; duur; loop; TonenPerOctaaf
Declareer aantal_octaven; x0; x1; g0; g1; q0; q1; q; Shepards

Wis buffers
  Wis buffer (F1...F32, S1, S2, S3)   S1 | S2 | S3

duur = 10*Fs
f0   = 40         ! startfrequentie HannLog frequentie-envelop
f1   = 6500       ! startfrequentie HannLog frequentie-envelop
aantal_octaven = log(f1/f0) / log(2)
a = 2^(1/duur)

!****************************************************************************************
! Je kunt zowel bandruis als een sinustoon gebruiken als basissignaal voor de Shepardtoon
!****************************************************************************************

! ruis opwekken
! Ruis wit, uniform
Buffer                        S1[0]
Min                           -8000
Max                           8000
Aantal samples                duur*aantal_octaven
Startgetal Toevalsgenerator   0

!***************************************************************************************
! Haal ruis door band pass filter met exponentieel toenemende centrumfrequentie, zoals
! bij toonladders en glissando's. (Exponentiele toename is gehoormatig lineair).

! Butterworth Banddoorlaat
Input                    S1[0]
Output                   S3[0]
Centrumfrequentie (Hz)   f0*a^n         ! exponentiele toename (zoals toonladder)
Bandbreedte (Hz)         2*f0 - 20
Duur (ook 'sec')         duur*aantal_octaven
Flanksteilheid (< 50)    4
Volume (0...100)         1
Additief ('j' of 'n')    n

!***************************************************************************************
Toongenerator
  Frequentie (Hz of TOETS)   f0*a^n
  Amplitude                  1000
  Golfvorm                   sinus
  Spoor: S?[?]               S3[0]
  Duur                       duur*aantal_octaven
  Aantal harmonischen        1

!***************************************************************************************
! Voorzie de steeds hoger wordende ruis van een HannLog frequentie-envelop:

q0 = log(f0)
q  = log(f1) - q0
b  = 2*pi/q
Bewerk signaal
  n0          0
  n1          duur * aantal_octaven
  Bewerking   S3[n] = S3[n] * (1 - cos(b*(log(f0*(a^n))-q0)))

!***************************************************************************************
! Deze ene stijgende ruistoon, die uiterst zacht begint en eindigt,
! wordt een aantal malen bijgemixt op (aanvankelijk leeg) spoor S2,
! en wel op regelmatige tijdsintervallen van elkaar, net zoals bij een
! canon. Elke volgende toon begint op het tijdstip waarop de vorige
! toon een octaaf (of een regelmatige onderverdeling daarvan, zoals 3 grote
! of 4 kleine tertsen) hoger is geworden.
!
! De Stijgende Shepard duurt aantal_octaven*duur/Fs seconden.
! Het minimale aantal Shepards is aantal_octaven * TonenPerOctaaf + 1

TonenPerOctaaf = 4
Shepards       = aantal_octaven * TonenPerOctaaf + 20

FOR loop = 0 TO Shepards
  a = loop * duur / TonenPerOctaaf
  
  Bewerk signaal
    n0          0
    n1          duur*aantal_octaven
    Bewerking   S2[a+n] = S2[a+n] + S3[n]
  
  Print Shepards - loop
NEXT loop

!----------------------------------------------------------
! Kopieer fragment 76 sec - 200 sec van S2 naar begin van S1:
a = 76*Fs
b = 200*Fs
Bewerk signaal
  n0          a
  n1          b
  Bewerking   S1[n-a] = S2[n]

!----------------------------------------------------------
S1 lineair infaden:
duur = 7*Fs
g0 = 0
g1 = 1
x0 = 0
x1 = duur
c  = (g1 - g0) / (x1-x0)
d  = g0 - x0*c

Bewerk signaal
  n0          0
  n1          duur
  Bewerking   S1[n] = S1[n] * (c*n + d)

!----------------------------------------------------------
S1 exponentieel uitfaden

c = 0,001^(1/duur)
d = 54*Fs - duur
Bewerk signaal
  n0          0
  n1          duur
  Bewerking   S1[d+n] = S1[d+n] * (c^n)

!----------------------------------------------------------
S1 kopieren naar S2:
d = 54*Fs
Bewerk signaal
  n0          0
  n1          d
  Bewerking   S2[n] = S1[n]


