packages feed

hsc3-graphs-0.11: src/black-atlantic-currents.hs

-- black atlantic currents (jr)
-- http://www.listarc.bham.ac.uk/lists/sc-users/msg08240.html

import Data.Numbers.Primes {- primes -}
import Sound.SC3.ID {- hsc3 -}
import System.Random {- random -}
import System.Random.Shuffle {- random-shuffle -}

nth_prime :: Integral a => Int -> a
nth_prime j = primes !! j

chain :: Int -> (t -> t) -> t -> t
chain j f x = if j == 0 then x else chain (j - 1) f (f x)

xn,yn,zn :: Num a => a
xn = 64
yn = 65
zn = 66

type NF t a = a -> Rate -> t -> UGen

n :: NF t a -> t -> [a] -> UGen
n g f = mce . map (\k -> g k KR f)

n' :: NF t a -> [t] -> [a] -> UGen
n' g f = mce . map (\(f',k) -> g k KR f') . zip f

i :: UGen -> UGen
i = inFeedback 2

c :: Int -> UGen
c = Constant . fromIntegral

bac :: UGen
bac =
  let x = let ph = i yn * uclone 'a' 2 (lfdNoise3 'a' KR 1)
          in out xn (mceReverse (sinOsc AR (60 * 2) ph))
      y = let ph = i xn * uclone 'a' 2 (lfdNoise3 'a' KR 0.3) * 4
          in out yn (sinOsc AR (50 * 2) ph)
  in mrg [inFeedback 2 xn,y,x]

bac' :: UGen
bac' =
  let x = let f = c (nth_prime 23)
              ph = i yn * uclone 'a' 2 (lfdNoise3 'a' KR (sqrt 2))
          in out xn (mceReverse (sinOsc AR f ph))
      y = let f = c (chain 3 nth_prime 1)
              ph = i xn * uclone 'a' 2 (lfdNoise3 'a' KR (sqrt pi)) * pi
          in out yn (tanh (sinOsc AR f ph))
  in mrg [inFeedback 2 xn,y,x]

bac'' :: UGen
bac'' =
  let x = let f = c (nth_prime 23)
              ph = i yn * n' lfdNoise3 (map sqrt [1,2]) "ab"
          in out xn (mceReverse (sinOsc AR f ph))
      y = let f = c (chain 3 nth_prime 1)
              ph = i xn * n lfdNoise1 (sqrt pi) "cd" * pi
          in out yn (tanh (sinOsc AR f ph))
      z = let f = c (chain 3 nth_prime 2)
              ph = i yn * n lfdNoise0 (sqrt (sqrt pi)) "ef" * 42 * pi
          in out zn (tanh (sinOsc AR f ph) * exp (-0.5 * pi))
  in mrg [inFeedback 2 xn,y,x,z]

bac''' :: UGen
bac''' =
  let x = let j = range 1 30 (lfNoise0 's' KR (log 2 / 2))
              f = select j (mce (map (c . nth_prime) [1..30]))
              ph = i zn * n' lfdNoise3 (map sqrt [1,2]) "ab"
          in out xn (mceReverse (sinOsc AR f ph))
      y = let f = c (chain 3 nth_prime 1)
              ph = i xn * n lfdNoise1 (sqrt pi) "cd" * pi
          in out yn (tanh (sinOsc AR f ph) * exp 1)
      z = let f = c (chain 3 nth_prime 2)
              ph = i yn * n lfdNoise0 (sqrt (sqrt pi)) "ef" * 42 * pi
          in out zn (tanh (sinOsc AR f ph) * exp (-0.5 * pi))
  in mrg [inFeedback 2 xn,y,x,z]

scramble :: Enum a => a -> [t] -> [t]
scramble j k =
    let g = mkStdGen (fromEnum j)
    in shuffle' k (length k) g

bac'''' :: UGen
bac'''' =
  let x = let j = range 1 30 (lfNoise2 's' KR (log 2 / 2))
              ph = i zn * n' lfdNoise3 (map sqrt [1,2]) "ab"
              f' = map (c . nth_prime) (scramble 'p' [1,3..61])
              o = map (\f -> mceReverse (sinOsc AR f ph)) f'
          in out xn (mceChannel 1 (selectX j (mce o)))
      y = let f = c (chain 3 nth_prime 1)
              ph = i xn * n lfdNoise1 (sqrt pi) "cd" * pi
          in out yn (tanh (sinOsc AR f ph) * exp 1)
      z = let f = c (chain 3 nth_prime 2)
              ph = i yn * n lfdNoise0 (sqrt (sqrt pi)) "ef" * 42 * pi
          in out zn (tanh (sinOsc AR f ph) * exp (-0.5 * pi))
  in mrg [inFeedback 2 xn,y,x,z]

{-
audition (out 0 bac)
audition (out 0 bac')
audition (out 0 bac'')
audition (out 0 bac''')
audition (out 0 bac'''')
-}

main :: IO ()
main = audition (out 0 bac)