module Csound.Catalog.Wave.TrappedInConvert (
    ivory, blue, black, blackMarimba        
) where

import Csound.Base

-- | 
-- > ivory xdur glisDur vibRate cpsCoeff cps
ivory :: D -> D -> Sig -> D -> Sig -> Sig
ivory :: D -> D -> Sig -> D -> Sig -> Sig
ivory D
xdur D
glisDur Sig
vibRate D
cpsCoeff Sig
cps = [Sig] -> Sig
forall a. Fractional a => [a] -> a
mean 
    --    vibrato env                amplitude env               freq bias   phase   vibrato coeff   wave
    [ Sig -> Sig -> D -> D -> D -> Tab -> Sig
alg ([D] -> Sig
linseg [D
0, D
xdur, D
5])      (D -> D -> D -> D -> D -> Sig
lincone D
0 D
0.7 D
1 D
0.3 D
0)     D
0           D
0       D
1               Tab
sine
    , Sig -> Sig -> D -> D -> D -> Tab -> Sig
alg (D -> D -> D -> D -> D -> Sig
lincone D
0 D
0.6 D
6 D
0.4 D
0)    (D -> D -> D -> D -> D -> Sig
lincone D
0 D
0.9 D
1 D
0.1 D
0)     D
0.009       D
0.2     D
0.9             ([PartialStrength] -> Tab
sines [PartialStrength
10, PartialStrength
9 .. PartialStrength
1])
    , Sig -> Sig -> D -> D -> D -> Tab -> Sig
alg (D -> D -> D -> D -> D -> Sig
lincone D
9 D
0.7 D
1 D
0.3 D
1)    (D -> D -> Sig
linenXdur D
0.5 D
0.333)       D
0.007       D
0.3     D
1.2             ([PartialStrength] -> Tab
sines [PartialStrength
10, PartialStrength
0, PartialStrength
9, PartialStrength
0, PartialStrength
8, PartialStrength
0, PartialStrength
7, PartialStrength
0, PartialStrength
6, PartialStrength
0, PartialStrength
5])
    , Sig -> Sig -> D -> D -> D -> Tab -> Sig
alg (D -> D -> D -> D -> D -> Sig
expcone D
1 D
0.4 D
3 D
0.6 D
0.02) 
          (D -> D -> D -> D -> D -> Sig
expcone D
0.0001 D
0.8 D
1 D
0.2 D
0.0001)                      D
0.005       D
0.5     D
0.97            ([PartialStrength] -> Tab
sines [PartialStrength
10, PartialStrength
10, PartialStrength
9, PartialStrength
0, PartialStrength
0, PartialStrength
0, PartialStrength
3, PartialStrength
2, PartialStrength
0, PartialStrength
0, PartialStrength
1])  
    , Sig -> Sig -> D -> D -> D -> Tab -> Sig
alg (D -> D -> D -> D -> D -> Sig
expcone D
1 D
0.4 D
3 D
0.6 D
0.02) 
          ([D] -> Sig
expdur [D
0.001, D
0.5, D
1, D
0.1, D
0.6, D
0.2, D
0.97, D
0.2, D
0.001])
                                                                 D
0.003       D
0.8     D
0.99            ([PartialStrength] -> Tab
sines [PartialStrength
10, PartialStrength
0, PartialStrength
0, PartialStrength
0, PartialStrength
5, PartialStrength
0, PartialStrength
0, PartialStrength
0, PartialStrength
0, PartialStrength
0, PartialStrength
3])
    , Sig -> Sig -> D -> D -> D -> Tab -> Sig
alg (D -> D -> D -> D -> D -> Sig
expcone D
4 D
0.91 D
1 D
0.09 D
1)  
          ([D] -> Sig
expdur [D
0.001, D
0.6, D
1, D
0.2, D
0.8, D
0.1, D
0.98, D
0.1, D
0.001])
                                                                 D
0.001       D
1.3     D
1.4             ([PartialStrength] -> Tab
sines [PartialStrength
10, PartialStrength
0, PartialStrength
0, PartialStrength
0, PartialStrength
0, PartialStrength
3, PartialStrength
1])
    ]
    where
        alg :: Sig -> Sig -> D -> D -> D -> Tab -> Sig    
        alg :: Sig -> Sig -> D -> D -> D -> Tab -> Sig
alg Sig
vibrEnv Sig
ampEnv D
cpsBias D
phsBias D
vibrCoeff Tab
wave = 
            Sig
ampEnv Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* (Tab -> Sig -> Sig
oscBy Tab
wave ((Sig
cps Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ D -> Sig
sig D
cpsBias Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ Sig
kvibr) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
glis) Sig -> D -> Sig
forall a. Tuple a => a -> D -> a
`withD` D
phsBias)
            where glis :: Sig
glis = [D] -> Sig
expseg [D
1, D
glisDur, D
1, D
xdur D -> D -> D
forall a. Num a => a -> a -> a
- D
glisDur, D
cpsCoeff]
                  kvibr :: Sig
kvibr = Sig
vibrEnv Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig -> Sig
osc (Sig
vibRate Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* D -> Sig
sig D
vibrCoeff)
                
        cone :: D -> D -> D -> D -> D -> [D]
cone D
a D
x1 D
b D
x2 D
c = [D
a, D
x1 D -> D -> D
forall a. Num a => a -> a -> a
* D
xdur, D
b, D
x2 D -> D -> D
forall a. Num a => a -> a -> a
* D
xdur, D
c]
        lincone :: D -> D -> D -> D -> D -> Sig
lincone D
a D
x1 D
b D
x2 D
c = [D] -> Sig
linseg ([D] -> Sig) -> [D] -> Sig
forall a b. (a -> b) -> a -> b
$ D -> D -> D -> D -> D -> [D]
cone D
a D
x1 D
b D
x2 D
c
        expcone :: D -> D -> D -> D -> D -> Sig
expcone D
a D
x1 D
b D
x2 D
c = [D] -> Sig
expseg ([D] -> Sig) -> [D] -> Sig
forall a b. (a -> b) -> a -> b
$ D -> D -> D -> D -> D -> [D]
cone D
a D
x1 D
b D
x2 D
c
        linenXdur :: D -> D -> Sig
linenXdur D
a D
b = Sig -> D -> D -> D -> Sig
linen Sig
1 (D
a D -> D -> D
forall a. Num a => a -> a -> a
* D
xdur) D
xdur (D
b D -> D -> D
forall a. Num a => a -> a -> a
* D
xdur)


-- snow flakes

-- | 
-- > blue noteDuration numberOfHarmonics sweepRate lfoCps cps
--
-- * numberOfHarmonics ~ (6, 10)
-- 
-- * sweepRate ~ (0, 1)
--
-- * lfoCps ~ 20
blue :: D -> D -> D -> Sig -> Sig -> SE Sig
blue :: D -> D -> D -> Sig -> Sig -> SE Sig
blue D
xdur D
harmNum D
sweepRate Sig
lfoCps Sig
cps = (Sig -> Sig) -> SE Sig -> SE Sig
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Sig -> Sig
aout SE Sig
k1
    where 
        k1 :: SE Sig
k1 = Sig -> Sig -> SE Sig
randi Sig
1 Sig
50
        k2 :: Sig
k2 = D -> [D] -> Sig
lindurBy D
xdur [D
0, D
0.5, D
1, D
0.5, D
0]
        k3 :: Sig
k3 = D -> [D] -> Sig
lindurBy D
xdur [D
0.005, D
0.71, D
0.015, D
0.29, D
0.01]
        k4 :: Sig
k4 = Sig
k2 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* (Sig -> Sig
kr (Sig -> Sig) -> Sig -> Sig
forall a b. (a -> b) -> a -> b
$ Sig -> Sig
osc Sig
lfoCps Sig -> D -> Sig
forall a. Tuple a => a -> D -> a
`withD` D
0.2)
        k5 :: Sig
k5 = Sig
k4 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ Sig
2

        ksweep :: Sig
ksweep = D -> [D] -> Sig
lindurBy D
xdur [D
harmNum, D
sweepRate, D
1, D
1 D -> D -> D
forall a. Num a => a -> a -> a
- D
sweepRate, D
1]
        kenv :: Sig
kenv = D -> [D] -> Sig
expdurBy D
xdur [D
0.001, D
0.01, D
1, D
0.99, D
0.001]
        aout :: Sig -> Sig
aout Sig
k = Sig -> Sig -> Sig -> Sig -> Sig -> Tab -> Sig
gbuzz Sig
kenv (Sig
cps Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ Sig
k3) Sig
k5 Sig
ksweep Sig
k ([(PartialStrength, PartialStrength, PartialStrength)] -> Tab
sines3 [(PartialStrength
1, PartialStrength
1, PartialStrength
90)])

-- | Noise filtered with sweep filter.
--
-- > black noteDuration filterSweepStart filterSweepEnd bandWidth cps
--
-- * @filterSweepStart@, @filterSweepEnd@ - hearing range
--
-- * @bandWidth@ - (10, 50)
black :: D -> D -> D -> Sig -> Sig -> SE Sig
black :: D -> D -> D -> Sig -> Sig -> SE Sig
black D
xdur D
filterSweepStart D
filterSweepEnd Sig
bandWidth Sig
cps = 
    (Sig -> Sig) -> SE Sig -> SE Sig
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Sig -> Sig
aout (SE Sig -> SE Sig) -> SE Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ Sig -> SE Sig
rand Sig
1
    where 
        k1 :: Sig
k1 = D -> [D] -> Sig
expdurBy D
xdur [D
filterSweepStart, D
1, D
filterSweepEnd]
        a1 :: Sig -> Sig
a1 Sig
anoise = Sig -> Sig -> Sig -> Sig
reson Sig
anoise Sig
k1 (Sig
k1 Sig -> Sig -> Sig
forall a. Fractional a => a -> a -> a
/ Sig
bandWidth) Sig -> D -> Sig
forall a. Tuple a => a -> D -> a
`withD` D
1
        k3 :: Sig
k3 = D -> [D] -> Sig
expdurBy D
xdur [D
0.001, D
0.001, D
1, D
0.999, D
0.001]
        a2 :: Sig
a2 = Sig
k3 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig -> Sig
osc (Sig
cps Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ Sig
0.6 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* (Sig -> Sig
osc Sig
11.3 Sig -> D -> Sig
forall a. Tuple a => a -> D -> a
`withD` D
0.1))
        aout :: Sig -> Sig
aout Sig
anoise = [Sig] -> Sig
forall a. Fractional a => [a] -> a
mean [Sig -> Sig
a1 Sig
anoise, Sig
a2]


-- | Black with fixed parameters.
--
-- > blackMarimba cps
blackMarimba :: Sig -> SE Sig
blackMarimba :: Sig -> SE Sig
blackMarimba = D -> D -> D -> Sig -> Sig -> SE Sig
black D
3 D
100 D
500 Sig
50