module Csound.Catalog.Wave.Deserted(
    simpleMarimba, marimbaWave, phasingSynth, noiz, wind
) where

import Csound.Base hiding (ramp, osc')

-- | Simple marimba (by John Fitch) with percussive envelope.
--
--  > simpleMarimba noteDur cps
simpleMarimba :: D -> Sig -> Sig
simpleMarimba :: D -> Sig -> Sig
simpleMarimba D
xdur = D -> Sig -> Sig -> Sig
marimbaWave D
xdur Sig
kenv
    where kenv :: Sig
kenv = [D] -> Sig
expseg [D
0.0001, D
0.03, D
1, D
xdur D -> D -> D
forall a. Num a => a -> a -> a
- D
0.03, D
0.001]
               Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* [D] -> Sig
linseg [D
1, D
0.03, D
1, D
xdur D -> D -> D
forall a. Num a => a -> a -> a
- D
0.03, D
3]

-- | Simple marimba (by John Fitch) without fixed envelope.
--
--  > marimba noteDur amp cps
marimbaWave :: D -> Sig -> Sig -> Sig
marimbaWave :: D -> Sig -> Sig -> Sig
marimbaWave D
xdur Sig
amp Sig
cps = Sig
a6
    where
        k10 :: Sig
k10 = [D] -> Sig
linseg [D
2.25, D
0.03, D
3, D
xdur D -> D -> D
forall a. Num a => a -> a -> a
- D
0.03, D
2]
        a1 :: Sig
a1  = Sig -> Sig -> Sig -> Sig -> Sig -> Tab -> Sig
gbuzz Sig
amp Sig
cps Sig
k10 Sig
0 Sig
35 ([(PartialNumber, PartialNumber, PartialNumber)] -> Tab
sines3 [(PartialNumber
1, PartialNumber
1, PartialNumber
90)])
        a2 :: Sig
a2  = Sig -> Sig -> Sig -> Sig
reson' Sig
a1 Sig
500 Sig
50
        a3 :: Sig
a3  = Sig -> Sig -> Sig -> Sig
reson' Sig
a2 Sig
150 Sig
100
        a4 :: Sig
a4  = Sig -> Sig -> Sig -> Sig
reson' Sig
a3 Sig
3500 Sig
150
        a5 :: Sig
a5  = Sig -> Sig -> Sig -> Sig
reson' Sig
a4 Sig
3500 Sig
150
        a6 :: Sig
a6  = Sig -> Sig -> Sig
balance Sig
a5 Sig
a1
        reson' :: Sig -> Sig -> Sig -> Sig
reson' Sig
a Sig
b Sig
c = Sig -> Sig -> Sig -> Sig
reson Sig
a Sig
b Sig
c Sig -> D -> Sig
forall a. Tuple a => a -> D -> a
`withD` D
1

-- | Sound of the wind.
--
-- > wind noteDur (bandRise, bandDecay) (freqRise, freqDecay) attackDecayRatio
--
-- -* bandRise, banDecay, freqRise, freqDecay -- (50, 1000)
--
-- * attackDecayRatio -- (0, 1)
wind :: D -> (D, D) -> (D, D) -> D -> SE Sig
wind :: D -> (D, D) -> (D, D) -> D -> SE Sig
wind D
xdur (D
bandRise, D
bandDec) (D
freqRise, D
freqDec) D
winds =
    (Sig -> Sig) -> SE Sig -> SE Sig
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Sig -> Sig
fromRnd (SE Sig -> SE Sig) -> SE Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ Sig -> SE Sig
rand Sig
1
    where
        valu1 :: D
valu1 = D
100
        valu2 :: D
valu2 = D
50
        winde :: D
winde = D
1 D -> D -> D
forall a. Num a => a -> a -> a
- D
winds
        ramp :: D -> D -> Sig
ramp D
a D
b = [D] -> Sig
linseg [D
a, D
xdur, D
b]
        fromRnd :: Sig -> Sig
fromRnd Sig
a = Sig
aout
            where
                a2 :: Sig
a2 = Sig -> Sig -> Sig -> Sig
butbp Sig
a  (D -> D -> Sig
ramp D
freqRise D
freqDec) (D -> D -> Sig
ramp D
bandRise D
bandDec)
                a3 :: Sig
a3 = Sig -> Sig -> Sig -> Sig
butbp Sig
a2 (D -> D -> Sig
ramp (D
freqRise D -> D -> D
forall a. Num a => a -> a -> a
- D
valu1) (D
freqDec D -> D -> D
forall a. Num a => a -> a -> a
+ D
valu2))
                              (D -> D -> Sig
ramp (D
bandRise D -> D -> D
forall a. Num a => a -> a -> a
+ D
valu1) (D
bandDec D -> D -> D
forall a. Num a => a -> a -> a
- D
valu2))

                aout :: Sig
aout = (Sig
a2 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ Sig
a3) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* [D] -> Sig
linseg [D
0, D
xdur D -> D -> D
forall a. Num a => a -> a -> a
* D
winds, D
1, D
xdur D -> D -> D
forall a. Num a => a -> a -> a
* D
winde, D
0]

-- |
-- > noiz cps
noiz :: Sig -> SE Sig
noiz :: Sig -> SE Sig
noiz Sig
cps = (Sig -> Sig) -> SE Sig -> SE Sig
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Sig -> Sig
a2 SE Sig
k2
    where
        k1 :: Sig
k1 = [D] -> Sig
linseg [D
1, D
0.05, D
100, D
0.2, D
100, D
2, D
1, D
idur, D
1]
        k2 :: SE Sig
k2 = (Sig -> Sig) -> SE Sig -> SE Sig
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ( Sig -> D -> Sig
forall a. Tuple a => a -> D -> a
`withD` D
1) (SE Sig -> SE Sig) -> SE Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ Sig -> SE Sig
rand Sig
500

        buzz' :: Sig -> D -> Sig
buzz' Sig
kamp D
kcps = Sig -> Sig -> Sig -> Tab -> Sig
buzz Sig
kamp (D -> Sig
sig D
kcps Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
cps)  Sig
k1 Tab
sine

        a1 :: Sig
a1 = [Sig] -> Sig
forall a. Fractional a => [a] -> a
mean ([Sig] -> Sig) -> [Sig] -> Sig
forall a b. (a -> b) -> a -> b
$ (Sig -> D -> Sig) -> [Sig] -> [D] -> [Sig]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith Sig -> D -> Sig
buzz' [Sig
0.3, Sig
1, Sig
1] [D
1, D
0.5, D
0.501]
        a2 :: Sig -> Sig
a2 Sig
k = Sig
a1 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig -> Sig
osc Sig
k

-- |
-- > phasingSynth amp cps
phasingSynth :: Sig -> Sig -> Sig
phasingSynth :: Sig -> Sig -> Sig
phasingSynth Sig
amp Sig
cps = Sig
aout
    where
        osc' :: Tab -> Sig -> D -> Sig
osc' Tab
ftab Sig
k D
ph = Tab -> Sig -> Sig
oscBy Tab
ftab (Sig
cps Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
k) Sig -> D -> Sig
forall a. Tuple a => a -> D -> a
`withD` D
ph
        osc1 :: Sig -> D -> Sig
osc1 = Tab -> Sig -> D -> Sig
osc' Tab
sine
        osc2 :: Sig -> D -> Sig
osc2 = Tab -> Sig -> D -> Sig
osc' (Tab -> Sig -> D -> Sig) -> Tab -> Sig -> D -> Sig
forall a b. (a -> b) -> a -> b
$ [PartialNumber] -> Tab
sines [PartialNumber
1, PartialNumber
0, PartialNumber
0.9, PartialNumber
0, PartialNumber
0.8, PartialNumber
0, PartialNumber
0.7, PartialNumber
0, PartialNumber
0.6, PartialNumber
0, PartialNumber
0.5, PartialNumber
0, PartialNumber
0.4, PartialNumber
0, PartialNumber
0.3, PartialNumber
0, PartialNumber
0.2, PartialNumber
0, PartialNumber
0.1]
        asum :: Sig
asum = Sig
amp Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* [Sig] -> Sig
forall a. Fractional a => [a] -> a
mean
                [ Sig -> D -> Sig
osc1 Sig
1 D
0
                , Sig -> D -> Sig
osc2 Sig
1.008 D
0.02
                , Sig -> D -> Sig
osc1 Sig
0.992 D
0.04
                , Sig -> D -> Sig
osc2 Sig
2     D
0.06
                , Sig -> D -> Sig
osc2 Sig
1     D
0.08
                , Sig -> D -> Sig
osc1 Sig
1     D
0.01 ]
        kosc1 :: Sig
kosc1 = Sig
0.5 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Tab -> Sig
once Tab
sine
        kosc2 :: Sig
kosc2 = Sig
0.5 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Tab -> Sig
once Tab
sine Sig -> D -> Sig
forall a. Tuple a => a -> D -> a
`withD` D
0.4
        kosc3 :: Sig
kosc3 = Sig
1.0 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Tab -> Sig
once Tab
sine Sig -> D -> Sig
forall a. Tuple a => a -> D -> a
`withD` D
0.8

        afilt :: Sig
afilt  = [Sig] -> Sig
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum
                [ Sig -> Sig -> Sig -> Sig
butbp Sig
asum Sig
kosc1 Sig
1000
                , Sig -> Sig -> Sig -> Sig
butbp Sig
asum Sig
kosc2 Sig
300
                , Sig -> Sig -> Sig -> Sig
butbp Sig
asum Sig
kosc3 Sig
20 ]

        aout :: Sig
aout  = [Sig] -> Sig
forall a. Fractional a => [a] -> a
mean [Sig
afilt, Sig
asum]