-- | Common unit generator graphs.
module Sound.SC3.UGen.Bindings.Composite.External where

import Data.List {- base -}
import Data.Maybe {- base -}

import Sound.SC3.Common.Math {- hsc3 -}
import Sound.SC3.Common.Rate {- hsc3 -}
import Sound.SC3.UGen.Type {- hsc3 -}
import Sound.SC3.UGen.UGen {- hsc3 -}

import qualified Sound.SC3.UGen.Bindings.DB.External as External

-- | FM7 variant where input matrices are not in MCE form.
fm7_mx :: [[UGen]] -> [[UGen]] -> UGen
fm7_mx :: [[UGen]] -> [[UGen]] -> UGen
fm7_mx [[UGen]]
ctlMatrix [[UGen]]
modMatrix = Rate -> UGen -> UGen -> UGen
External.fm7 Rate
AR ([UGen] -> UGen
mce ([[UGen]] -> [UGen]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[UGen]]
ctlMatrix)) ([UGen] -> UGen
mce ([[UGen]] -> [UGen]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[UGen]]
modMatrix))

{- | greyhole re-orders parameters as well as unpacking the input signal.

in1=0.0 in2=0.0 damping=0.0 delayTime=2.0 diffusion=0.5 feedback=0.9 moddepth=0.1 modfreq=2.0 size=1.0
in              delayTime=2.0 damping=0.0 size=1.0 diffusion=0.7 feedback=0.9 modDepth=0.1 modFreq=2.0
-}
greyhole :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen
greyhole :: UGen
-> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen
greyhole UGen
i UGen
delayTime UGen
damping UGen
size UGen
diffusion UGen
feedback UGen
modDepth UGen
modFreq =
  let (UGen
i1,UGen
i2) = UGen -> (UGen, UGen)
unmce2 UGen
i
  in UGen
-> UGen
-> UGen
-> UGen
-> UGen
-> UGen
-> UGen
-> UGen
-> UGen
-> UGen
External.greyholeRaw UGen
i1 UGen
i2 UGen
damping UGen
delayTime UGen
diffusion UGen
feedback UGen
modDepth UGen
modFreq UGen
size

-- | Association list giving names for MiBraids modes.
miBraids_mode_dict :: Num n => [(n,String)]
miBraids_mode_dict :: [(n, String)]
miBraids_mode_dict =
  [(n
0,String
"CSAW")
  ,(n
1,String
"MORPH")
  ,(n
2,String
"SAW_SQUARE")
  ,(n
3,String
"SINE_TRIANGLE")
  ,(n
4,String
"BUZZ")
  ,(n
5,String
"SQUARE_SUB")
  ,(n
6,String
"SAW_SUB")
  ,(n
7,String
"SQUARE_SYNC")
  ,(n
8,String
"SAW_SYNC")
  ,(n
9,String
"TRIPLE_SAW")
  ,(n
10,String
"TRIPLE_SQUARE")
  ,(n
11,String
"TRIPLE_TRIANGLE")
  ,(n
12,String
"TRIPLE_SINE")
  ,(n
13,String
"TRIPLE_RING_MOD")
  ,(n
14,String
"SAW_SWARM")
  ,(n
15,String
"SAW_COMB")
  ,(n
16,String
"TOY")
  ,(n
17,String
"DIGITAL_FILTER_LP")
  ,(n
18,String
"DIGITAL_FILTER_PK")
  ,(n
19,String
"DIGITAL_FILTER_BP")
  ,(n
20,String
"DIGITAL_FILTER_HP")
  ,(n
21,String
"VOSIM")
  ,(n
22,String
"VOWEL")
  ,(n
23,String
"VOWEL_FOF")
  ,(n
24,String
"HARMONICS")
  ,(n
25,String
"FM")
  ,(n
26,String
"FEEDBACK_FM")
  ,(n
27,String
"CHAOTIC_FEEDBACK_FM")
  ,(n
28,String
"PLUCKED")
  ,(n
29,String
"BOWED")
  ,(n
30,String
"BLOWN")
  ,(n
31,String
"FLUTED")
  ,(n
32,String
"STRUCK_BELL")
  ,(n
33,String
"STRUCK_DRUM")
  ,(n
34,String
"KICK")
  ,(n
35,String
"CYMBAL")
  ,(n
36,String
"SNARE")
  ,(n
37,String
"WAVETABLES")
  ,(n
38,String
"WAVE_MAP")
  ,(n
39,String
"WAVE_LINE")
  ,(n
40,String
"WAVE_PARAPHONIC")
  ,(n
41,String
"FILTERED_NOISE")
  ,(n
42,String
"TWIN_PEAKS_NOISE")
  ,(n
43,String
"CLOCKED_NOISE")
  ,(n
44,String
"GRANULAR_CLOUD")
  ,(n
45,String
"PARTICLE_NOISE")
  ,(n
46,String
"DIGITAL_MODULATION")
  ,(n
47,String
"QUESTION_MARK")]

-- | Reverse lookup of 'miBraids_mode_dict'.
miBraids_mode_maybe :: Num n => String -> Maybe n
miBraids_mode_maybe :: String -> Maybe n
miBraids_mode_maybe String
x = ((n, String) -> n) -> Maybe (n, String) -> Maybe n
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (n, String) -> n
forall a b. (a, b) -> a
fst (((n, String) -> Bool) -> [(n, String)] -> Maybe (n, String)
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
find ((String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
x) (String -> Bool) -> ((n, String) -> String) -> (n, String) -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (n, String) -> String
forall a b. (a, b) -> b
snd) [(n, String)]
forall n. Num n => [(n, String)]
miBraids_mode_dict)

-- | 'error' of 'miBraids_mode_maybe'
miBraids_mode :: Num n => String -> n
miBraids_mode :: String -> n
miBraids_mode = n -> Maybe n -> n
forall a. a -> Maybe a -> a
fromMaybe (String -> n
forall a. HasCallStack => String -> a
error String
"miBraids_mode?") (Maybe n -> n) -> (String -> Maybe n) -> String -> n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Maybe n
forall n. Num n => String -> Maybe n
miBraids_mode_maybe

-- | Association list giving names for MiClouds modes.
miClouds_mode_dict :: Num n => [(n,String)]
miClouds_mode_dict :: [(n, String)]
miClouds_mode_dict =
  [(n
0,String
"GRANULAR")
  ,(n
1,String
"STRETCH")
  ,(n
2,String
"LOOPING_DELAY")
  ,(n
3,String
"SPECTRAL")]

-- | Reverse lookup of 'miClouds_mode_dict'.
miClouds_mode_maybe :: Num n => String -> Maybe n
miClouds_mode_maybe :: String -> Maybe n
miClouds_mode_maybe String
x = ((n, String) -> n) -> Maybe (n, String) -> Maybe n
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (n, String) -> n
forall a b. (a, b) -> a
fst (((n, String) -> Bool) -> [(n, String)] -> Maybe (n, String)
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
find ((String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
x) (String -> Bool) -> ((n, String) -> String) -> (n, String) -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (n, String) -> String
forall a b. (a, b) -> b
snd) [(n, String)]
forall n. Num n => [(n, String)]
miClouds_mode_dict)

-- | 'error' of 'miClouds_mode_maybe'
miClouds_mode :: Num n => String -> n
miClouds_mode :: String -> n
miClouds_mode = n -> Maybe n -> n
forall a. a -> Maybe a -> a
fromMaybe (String -> n
forall a. HasCallStack => String -> a
error String
"miClouds_mode?") (Maybe n -> n) -> (String -> Maybe n) -> String -> n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Maybe n
forall n. Num n => String -> Maybe n
miClouds_mode_maybe

-- | Association list giving names for MiPlaits modes.
miPlaits_mode_dict :: Num n => [(n,String)]
miPlaits_mode_dict :: [(n, String)]
miPlaits_mode_dict =
  [(n
0,String
"virtual_analog")
  ,(n
1,String
"waveshaping")
  ,(n
2,String
"fm")
  ,(n
3,String
"grain")
  ,(n
4,String
"additive")
  ,(n
5,String
"wavetable")
  ,(n
6,String
"chord")
  ,(n
7,String
"speech")
  ,(n
8,String
"swarm")
  ,(n
9,String
"noise")
  ,(n
10,String
"particle")
  ,(n
11,String
"string")
  ,(n
12,String
"modal")
  ,(n
13,String
"bass_drum")
  ,(n
14,String
"snare_drum")
  ,(n
15,String
"hi_hat")]

-- | Reverse lookup of 'miPlaits_mode_dict'.
miPlaits_mode_maybe :: Num n => String -> Maybe n
miPlaits_mode_maybe :: String -> Maybe n
miPlaits_mode_maybe String
x = ((n, String) -> n) -> Maybe (n, String) -> Maybe n
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (n, String) -> n
forall a b. (a, b) -> a
fst (((n, String) -> Bool) -> [(n, String)] -> Maybe (n, String)
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
find ((String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
x) (String -> Bool) -> ((n, String) -> String) -> (n, String) -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (n, String) -> String
forall a b. (a, b) -> b
snd) [(n, String)]
forall n. Num n => [(n, String)]
miPlaits_mode_dict)

-- | 'error' of 'miPlaits_mode_maybe'
miPlaits_mode :: Num n => String -> n
miPlaits_mode :: String -> n
miPlaits_mode = n -> Maybe n -> n
forall a. a -> Maybe a -> a
fromMaybe (String -> n
forall a. HasCallStack => String -> a
error String
"miPlaits_mode?") (Maybe n -> n) -> (String -> Maybe n) -> String -> n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Maybe n
forall n. Num n => String -> Maybe n
miPlaits_mode_maybe

-- | Association list giving names for MiPlaits modes.
miRings_mode_dict :: Num n => [(n,String)]
miRings_mode_dict :: [(n, String)]
miRings_mode_dict =
  [(n
0,String
"MODAL_RESONATOR")
  ,(n
1,String
"SYMPATHETIC_STRING")
  ,(n
2,String
"MODULATED/INHARMONIC_STRING")
  ,(n
3,String
"2-OP_FM_VOICE")
  ,(n
4,String
"SYMPATHETIC_STRING_QUANTIZED")
  ,(n
5,String
"STRING_AND_REVERB")]

-- | Reverse lookup of 'miRings_mode_dict'.
miRings_mode_maybe :: Num n => String -> Maybe n
miRings_mode_maybe :: String -> Maybe n
miRings_mode_maybe String
x = ((n, String) -> n) -> Maybe (n, String) -> Maybe n
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (n, String) -> n
forall a b. (a, b) -> a
fst (((n, String) -> Bool) -> [(n, String)] -> Maybe (n, String)
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
find ((String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
x) (String -> Bool) -> ((n, String) -> String) -> (n, String) -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (n, String) -> String
forall a b. (a, b) -> b
snd) [(n, String)]
forall n. Num n => [(n, String)]
miRings_mode_dict)

-- | 'error' of 'miRings_mode_maybe'
miRings_mode :: Num n => String -> n
miRings_mode :: String -> n
miRings_mode = n -> Maybe n -> n
forall a. a -> Maybe a -> a
fromMaybe (String -> n
forall a. HasCallStack => String -> a
error String
"miRings_mode?") (Maybe n -> n) -> (String -> Maybe n) -> String -> n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Maybe n
forall n. Num n => String -> Maybe n
miRings_mode_maybe

-- | pulse signal as difference of two 'sawDPW' signals.
pulseDPW :: Rate -> UGen -> UGen -> UGen
pulseDPW :: Rate -> UGen -> UGen -> UGen
pulseDPW Rate
rt UGen
freq UGen
width =
  let o1 :: UGen
o1 = Rate -> UGen -> UGen -> UGen
External.sawDPW Rate
rt UGen
freq UGen
0
      o2 :: UGen
o2 = Rate -> UGen -> UGen -> UGen
External.sawDPW Rate
rt UGen
freq ((UGen, UGen) -> UGen -> UGen
forall n. RealFrac n => (n, n) -> n -> n
wrap_hs (-UGen
1,UGen
1) (UGen
widthUGen -> UGen -> UGen
forall a. Num a => a -> a -> a
+UGen
width))
  in UGen
o1 UGen -> UGen -> UGen
forall a. Num a => a -> a -> a
- UGen
o2