packages feed

hsc3-graphs-0.15: gr/nharm-p.hs

-- nharm-p (rd)

import Sound.SC3 {- hsc3 -}
import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
import qualified Sound.SC3.Lang.Pattern.Plain as P {- hsc3-lang -}

nharm :: Num n => Int -> n -> [n]
nharm n f = map ((* f) . fromIntegral) [1..n]

klg :: Int -> UGen
klg n =
    let f = control KR "freq" 440
        d = rand 'α' 9 12
        l = mceChannels (randN n 'α' 0.01 0.02)
        p = rand 'α' (-1.0) 1.0
        a = 0.5
        e = envGen KR 1 0.9 0 1 RemoveSynth (envSine d a)
        nh = nharm n f
        s = klangSpec nh l (replicate n 0.0)
    in out 0 (pan2 (klang AR 1 0 s) p e)

type Range = (Double,Double)

{- Note that the dur key is used only to schedule the nodes, the UGen
graph manages duration internally.-}

pN :: Int -> Range -> Range -> (Synthdef,P.Param)
pN n (m0,m1) (d0,d1) =
    let s = synthdef ("klg" ++ show n) (klg n)
    in (s,[("freq",map midiCPS (P.white 'α' m0 m1))
          ,("dur",P.white 'β' d0 d1)])

main :: IO ()
main = audition (P.sbind [(pN 24 (90,92) (0.25,0.75))
                         ,(pN 54 (12,14) (1.25,1.76))])