packages feed

hsc3-graphs-0.11: src/arpeggio.hs

-- arpeggio (nc)
-- http://www.listarc.bham.ac.uk/lists/sc-users/msg07473.html

import Control.Monad
import Sound.SC3
import Sound.SC3.Lang.Control.Event
import Sound.SC3.Lang.Pattern.ID

analogarpeggio :: Synthdef
analogarpeggio =
    let k = control KR
        o = k "out" 0
        p = k "pan" 0
        g = k "gate" 1
        f = k "freq" 440
        a = k "amp" 0.1
        c = k "cutoffmult" 3
        r = k "res" 0.1
        e = let d = envADSR 0.01 0.3 0.5 1 1 (EnvNum (-4)) 0
            in envGen AR g 1 0 1 RemoveSynth d
        i = mix (saw AR (f * mce [0.497,0.999,1.0,2.03]))
	s = bLowPass i (c * f) r * 0.25
    in synthdef "analogarpeggio" (out o (pan2 (e * s * a) p 0.25))

{-
audition (analogarpeggio
         ,(pbind [("dur",pwrand 'a' [0.1,0.25] [2/3,1/2] inf)
                 ,("freq",pwhite 'b' 440.0 1600.0 inf)
                 ,("pan",pwhite 'c' (-1.0) 1.0 inf)
                 ,("amp",pwhite 'd' 0.0 0.5 inf)
                 ,("cutoffmult",pwhite 'e' 4.0 5.0 inf)
                 ,("res",pwhite 'f' 0.0 1.0 inf)]))
-}

pinterp :: (Fractional a) => Int -> a -> a -> P a
pinterp n s e = pseries s ((e - s) / fromIntegral n) n

pinterp' :: (Fractional a) => P Int -> P a -> P a -> P a
pinterp' n s e = join (pzipWith3 pinterp n s e)

arpeggio :: [(Key,P Double)]
arpeggio =
    [("dur"
     ,let d = pwrand 'n' [0.25,0.125,0.0625] [0.4875,0.4875,0.025] inf
      in pstutter 32 d)
    ,("cutoffmult"
     ,let n = prand 'a' [8,16,24,32] inf
          s = pwhite 'b' 2.5 5.0 inf
          e = pwhite 'c' 1.5 7.0 inf
      in pinterp' n s e)
    ,("res"
     ,let n = prand 'd' [8,16,24,32] inf
          s = pexprand 'e' 0.02 0.5 inf
          e = pexprand 'f' 0.02 1.0 inf
      in pinterp' n s e)
    ,("pan"
     ,let n = prand 'g' [8,16] inf
          s = pwhite 'h' (-1.0) 1.0 inf
          s' = fmap (< 0) s
          e = pif s' (pwhite 'i' 0.0 1.0 inf) (pwhite 'i' (-1.0) 0.0 inf)
      in pinterp' n s e)
    ,("amp"
     ,let n = prand 'j' [8,16,24,32] inf
          s = prand 'k' [0.25,0.05,0.5] inf
          e = prand 'l' [0.25,0.05,0.5,0.01] inf
      in pinterp' n s e)
    ,("note"
     ,let f x = pn (fromList x) 8
      in pseq (map f [[10,6,1,-2]
                     ,[-3,1,6,9]
                     ,[9,6,1,-3]
                     ,[-2,1,6,10]
                     ,[8,6,1,-4]
                     ,[-3,1,6,9]
                     ,[8,6,1,-3]
                     ,[-6,1,6,8]]) inf)
    ,("octave"
     ,pstutter 8 (pseq [7,6,5,4,4,5,6,7] inf))]

main :: IO ()
main = do
  let n = 60/157
      p = pedit "dur" (* n) (pbind arpeggio)
  withSC3 (\fd -> play fd (analogarpeggio,p))