packages feed

hsc3-graphs-0.15: Sound/SC3/Graph/AF_birds_am_fm.hs

-- birds-am-fm (af)
-- http://www.obiwannabe.co.uk/tutorials/html/tutorial_birds.html
-- perhaps some mis-translations...
module Sound.SC3.Graph.AF_birds_am_fm where

-- import Debug.Trace {- base -}
import System.Random {- random -}

import Sound.SC3 hiding (sweep) {- hsc3 -}
import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
import qualified Sound.SC3.Lang.Random.Gen as R

-- > audition (out 0 (pd_noise 'a' * 0.1))
pd_noise :: ID a => a -> UGen
pd_noise e = whiteNoise e AR

-- > audition (out 0 (pd_lop (pd_noise 'a') 500 * 0.1))
pd_lop :: UGen -> UGen -> UGen
pd_lop = lpf -- actually lop is one-pole, lpf is two pole...

-- > audition (out 0 (pd_osc 440 * 0.1))
pd_osc :: UGen -> UGen
pd_osc f = sinOsc AR f pi

-- > audition (out 0 (pd_phasor 440 * 0.1))
pd_phasor :: UGen -> UGen
pd_phasor f = linLin_b (lfSaw AR f 0) 0 1

-- | Ramp doesn't make sense with a constant input signal.
--
-- > audition (out 0 (pd_osc (pd_line (lfNoise0 'a' AR 0.5) 300 * 500 + 300) * 0.1))
pd_line :: UGen -> UGen -> UGen
pd_line x msec = if isConstant x then x else ramp x (msec / 1000)

-- > audition (out 0 (pd_clip (pd_osc 220) (-0.05) 0.05))
pd_clip :: UGen -> UGen -> UGen -> UGen
pd_clip = clip

-- > audition (out 0 (pd_cos (pd_phasor 440) * 0.1))
pd_cos :: Floating a => a -> a
pd_cos i = cos (i * 2 * pi)

-- > audition (out 0 (pd_vcf (pd_noise 'a') (pd_phasor 0.1 * 500 + 200) 6 * 0.1))
pd_vcf :: UGen -> UGen -> UGen -> UGen
pd_vcf i cf q = bpf i cf (1 / q)

data B n = B {artic :: n
             ,tweet :: n
             ,syr1a :: n
             ,syr1m :: n
             ,syr2a :: n
             ,syr2m :: n
             ,basef :: n
             ,sweep :: n
             ,moda :: n
             ,modb :: n
             ,tf1 :: n
             ,tb1 :: n
             ,tf2 :: n
             ,tb2 :: n
             ,reson :: n
             ,vol :: n}
         deriving (Show)

square :: Num a => a -> a
square n = n * n

-- > let (_,o) = autotweet (presets !! 0)
-- > Sound.SC3.UGen.Dot.draw o
-- > audition (out 0 (sinOsc AR (sqrt o * 1000) 0 * 0.1))
autotweet :: B UGen -> (UGen,UGen)
autotweet b_data =
    let artic' = pd_line (artic b_data) 300
        tweet' = tweet b_data * 3
        ph = let x = abs (pd_lop (pd_noise 'a') 0.01) * (tweet' * 1000)
                 y = pd_osc x * (x * tweet')
             in pd_lop (pd_phasor y) 2
    in (ph,square (pd_cos (pd_clip (artic' - ph) (-0.25) 0.25)))

type TW = (UGen, UGen, UGen, UGen, UGen, UGen, UGen)

-- > Sound.SC3.UGen.Dot.draw (tweetypie (1,2,3,4,5,6,7))
tweetypie :: TW -> UGen
tweetypie (a,b,c,d,e,f,g) =
    let m = pd_osc (pd_osc a * pd_osc b * c + d)
    in pd_lop ((pd_vcf m e g + pd_vcf m f g) * 0.5) 5000

modmatrix :: UGen -> B UGen -> TW
modmatrix modall b_data =
    let get var mul tm = pd_line (var b_data * mul) tm
        syr1a' = get syr1a 3000 300
        syr1m' = get syr1m 200 500
        syr2a' = get syr2a 3000 300
        syr2m' = get syr2m 200 500
        basef' = get basef 5000 300
        sweep' = get sweep 3000 300
        moda' = get moda 2000 300
        modb' = get modb 50 300
        tf1' = get tf1 3000 300
        tb1' = get tb1 3000 300
        tf2' = get tf2 3000 300
        tb2' = get tb2 3000 300
        reson' = reson b_data * 20 + 2
        a = (syr1a' * modall) + syr2a'
        b = let p = syr1a' + syr1m'
                q = p * modall
                r = syr2a' + syr2m'
            in q + r
        c = modall * moda' * modb'
        d = (modall * sweep') + basef'
        e = (modall * tf1') + tb1'
        f = (modall * tf2') + tb2'
    in (a,b,c,d,e,f,reson')

-- > Sound.SC3.UGen.Dot.draw (birdbox (presets !! 0))
birdbox :: B UGen -> UGen
birdbox b_data =
    let (modall,a) = autotweet b_data
        tw = tweetypie (modmatrix modall b_data)
        a' = sqrt a * 1000
    in pd_vcf tw a' 0.1 * vol b_data

presets :: Fractional n => [B n]
presets =
    [B 0.683544 0.658228 0.177215 0.0886076 0.911392 0.0126582 0.291139 0.772152 0.0886076 0.632911 0.316456 0.860759 0.227848 0.620253 0.417722 0.199808
    ,B 0.683544 0.582278 0.405063 0.78481 0.911392 0.0126582 0.848101 0.0506329 0.0886076 0.632911 0.316456 0.240506 0.113924 0.620253 0.417722 0.199808
    ,B 0.924051 0.936709 0.886076 0.78481 0 0.291139 0.126582 0.721519 0.0253165 0.189873 0.0759494 0.810127 0.329114 0.139241 0.0759494 0.243502
    ,B 0.455696 0.620253 0 0.0506329 0.0126582 0.0126582 0.56962 1 0.0506329 0.620253 0.949367 0.810127 0.848101 0.683544 0.0886076 0.127144
    ,B 0.21519 0.518987 0.379747 1 0.0126582 0.0126582 0.405063 1 0.0506329 0.620253 0.949367 0.164557 0.848101 0.164557 0.746835 0.372008
    ,B 0.886076 0.518987 0 0.0632911 0.0126582 0.0126582 0.278481 0.417722 0.0506329 0.278481 0.443038 0.164557 0.544304 0.164557 0.746835 0.372008
    ,B 0.962025 0.898734 0 0.278481 0.164557 0.822785 0.0759494 0.417722 0.556962 0.113924 0.291139 0.126582 0.544304 0.151899 0.911392 0.372008
    ,B 0.164557 0.974684 0.734177 0.670886 0.240506 0.202532 0.227848 0.392405 0.0253165 0.392405 0.291139 0.126582 0.544304 0.734177 0.379747 0.868261
    ,B 0.708861 0.721519 0.253165 0.0759494 0.658228 0.177215 0.746835 0.202532 0.329114 0.202532 0.417722 0.177215 0.392405 0.405063 1 0.314002
    ,B 0.392405 0.721519 0.0759494 0.316456 0.658228 0.177215 0.177215 0.848101 0.0886076 0.202532 0.417722 0.177215 0.392405 0.405063 1 0.314002
    ,B 0.379747 0.962025 0.265823 0.0126582 0.0886076 0.177215 0.721519 0.139241 0.113924 0.139241 0.0759494 0.759494 0.936709 0.911392 0.848101 0.314002
    ,B 0.291139 0.556962 0.0632911 0.0253165 0.0506329 0.0379747 0.0759494 0 0.177215 0.227848 0.0759494 0.240506 0.0379747 0.506329 0.924051 0.314002
    ,B 0.848101 0.772152 0.367089 0.189873 0.35443 0.0506329 0.0126582 0.177215 0.101266 0.0253165 0.924051 0.0886076 1 0.0886076 0.455696 0.732876]

-- B 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

-- > hearb (presets !! 4)
hearb :: B UGen -> IO ()
hearb = audition . out 0 . birdbox

main :: IO ()
main = do
  let f g = let (p,g') = R.choose presets g in (birdbox p,g')
  overlapTextureS (20,4,5,maxBound) f =<< getStdGen

-- Local Variables:
-- truncate-lines:t
-- End: