> {-#  LANGUAGE Arrows  #-}
> module HSoM.Examples.PhysicalModeling where
> import Euterpea
> import FRP.UISF.AuxFunctions
> sineTable441 :: Table
> sineTable441 = tableSinesN 100 [1]
> s441 :: AudSF () Double
> s441 = proc () -> do
>          rec s <- delayLineT 100 sineTable441 -< s
>          outA -< s
> ts441 = outFile "s441.wav" 5 s441
> echo :: AudSF Double Double
> echo = proc s -> do
>          rec fb  <- delayLine 0.5 -< s + 0.7*fb
>          outA -< fb/3
> modVib :: Double -> Double -> AudSF Double Double
> modVib rate depth =
>   proc sin -> do
>     vib   <- osc sineTable 0  -< rate
>     sout  <- delayLine1 0.2   -< (sin,0.1+0.005*vib)
>     outA -< sout
> tModVib = outFile "modvib.wav" 6 $
>                   constA 440 >>> osc sineTable 0 >>> modVib 5 0.005
> sineTable :: Table
> sineTable = tableSinesN 4096 [1]
> flute ::  Time -> Double -> Double -> Double -> Double 
>           -> AudSF () Double
> flute dur amp fqc press breath = 
>   proc () -> do
>     env1   <- envLineSeg  [0, 1.1*press, press, press, 0] 
>                           [0.06, 0.2, dur-0.16, 0.02]  -< ()
>     env2   <- envLineSeg  [0, 1, 1, 0] 
>                           [0.01, dur-0.02, 0.01]       -< ()
>     envib  <- envLineSeg  [0, 0, 1, 1] 
>                           [0.5, 0.5, dur-1]            -< ()
>     flow   <- noiseWhite 42    -< ()
>     vib    <- osc sineTable 0  -< 5
>     let  emb = breath*flow*env1 + env1 + vib*0.1*envib
>     rec  flute  <- delayLine (1/fqc)    -< out
>          x      <- delayLine (1/fqc/2)  -< emb + flute*0.4
>          out    <- filterLowPassBW -< (x-x*x*x + flute*0.4, 2000)
>     outA -< out*amp*env2
> tFlute = outFile "tFlute.wav" 5 $ flute 5 0.3 440 0.99 0.2 
> tFlute2 = outFileNorm "tFlute2.wav" 5 $ flute 5 0.7 440 0.99 0.2