module Csound.Catalog.Wave.Bitwig(
  pwPad, pwPadMidi, triPad, triPadFx, triPadBy, pwPadBy,
  Accordeon(..), accordeon, accordeonFx
) where

import Prelude hiding (filter)
import Csound.Base hiding (lfo)

---------------------------------------------------
-- wind pads

triPadFx :: Sig2 -> SE Sig2
triPadFx :: Sig2 -> SE Sig2
triPadFx Sig2
a = Sig -> (Sig2 -> Sig2) -> SE Sig2 -> AtOut Sig2 Sig2 (SE Sig2)
forall a b c. MixAt a b c => Sig -> (a -> b) -> c -> AtOut a b c
mixAt Sig
0.5 Sig2 -> Sig2
smallHall2 (SE Sig2 -> AtOut Sig2 Sig2 (SE Sig2))
-> SE Sig2 -> AtOut Sig2 Sig2 (SE Sig2)
forall a b. (a -> b) -> a -> b
$ (Sig -> SE Sig) -> SE Sig2 -> AtOut Sig (SE Sig) (SE Sig2)
forall a b c. At a b c => (a -> b) -> c -> AtOut a b c
at (Sig -> Sig -> Sig -> Sig -> SE Sig
chorus Sig
0.2 Sig
0.3 Sig
0.25) (Sig2 -> SE Sig2
forall (m :: * -> *) a. Monad m => a -> m a
return Sig2
a :: SE Sig2)

triPad :: Sig -> SE Sig
triPad :: Sig -> SE Sig
triPad = ResonFilter -> Sig -> SE Sig
triPadBy ResonFilter
mlp

triPadBy :: ResonFilter -> Sig -> SE Sig
triPadBy :: ResonFilter -> Sig -> SE Sig
triPadBy ResonFilter
filter Sig
x = Sig -> SE Sig -> SE Sig
forall a. SigSpace a => Sig -> a -> a
mul (Sig
1.5 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* D -> D -> Sig
fades D
0.3 D
0.5) (SE Sig -> SE Sig) -> SE Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ (Sig -> Sig) -> SE Sig -> AtOut Sig Sig (SE Sig)
forall a b c. At a b c => (a -> b) -> c -> AtOut a b c
at (ResonFilter
filter (Sig
x Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
5) Sig
0.15) (SE Sig -> AtOut Sig Sig (SE Sig))
-> SE Sig -> AtOut Sig Sig (SE Sig)
forall a b. (a -> b) -> a -> b
$ do
  Sig
lfo <- Sig -> SE Sig
rand Sig
1.2
  Sig -> SE Sig -> SE Sig
forall a. SigSpace a => Sig -> a -> a
mul Sig
0.5 (SE Sig -> SE Sig) -> SE Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ Sig -> SE Sig
rndTri (Sig
x Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ Sig
1.5 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
lfo) SE Sig -> SE Sig -> SE Sig
forall a. Num a => a -> a -> a
+ Sig -> SE Sig
rndTri (Sig
x Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig -> Sig
forall a. SigOrD a => a -> a
cent Sig
8)

pwPad :: Sig -> SE Sig
pwPad :: Sig -> SE Sig
pwPad = ResonFilter -> Sig -> SE Sig
pwPadBy ResonFilter
mlp

pwPadBy :: ResonFilter -> Sig -> SE Sig
pwPadBy :: ResonFilter -> Sig -> SE Sig
pwPadBy ResonFilter
filter Sig
x = Sig -> SE Sig -> SE Sig
forall a. SigSpace a => Sig -> a -> a
mul (D -> D -> Sig
fades D
0.3 D
0.95) (SE Sig -> SE Sig) -> SE Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ (Sig -> Sig) -> SE Sig -> AtOut Sig Sig (SE Sig)
forall a b c. At a b c => (a -> b) -> c -> AtOut a b c
at (ResonFilter
filter (Sig
x Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
5) Sig
0.15) (SE Sig -> AtOut Sig Sig (SE Sig))
-> SE Sig -> AtOut Sig Sig (SE Sig)
forall a b. (a -> b) -> a -> b
$ do
  let lfo :: Sig
lfo = Sig -> Sig
uosc Sig
4
  Sig -> SE Sig
forall (m :: * -> *) a. Monad m => a -> m a
return (Sig -> SE Sig) -> Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ Sig -> Sig -> Sig
forall a. SigSpace a => Sig -> a -> a
mul Sig
0.5 (Sig -> Sig) -> Sig -> Sig
forall a b. (a -> b) -> a -> b
$ Sig -> Sig -> Sig
pw (Sig
0.2 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ Sig
0.4 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
lfo) Sig
x Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ Sig -> Sig
tri (Sig
x Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig -> Sig
forall a. SigOrD a => a -> a
cent Sig
8)

pwPadMidi :: SE Sig2
pwPadMidi :: SE Sig2
pwPadMidi = Sig -> SE Sig2 -> SE Sig2
forall a. SigSpace a => Sig -> a -> a
mul Sig
0.5 (SE Sig2 -> SE Sig2) -> SE Sig2 -> SE Sig2
forall a b. (a -> b) -> a -> b
$ Sig -> (Sig2 -> Sig2) -> SE Sig2 -> AtOut Sig2 Sig2 (SE Sig2)
forall a b c. MixAt a b c => Sig -> (a -> b) -> c -> AtOut a b c
mixAt Sig
0.5 Sig2 -> Sig2
smallHall2 (SE Sig2 -> AtOut Sig2 Sig2 (SE Sig2))
-> SE Sig2 -> AtOut Sig2 Sig2 (SE Sig2)
forall a b. (a -> b) -> a -> b
$ (Sig -> SE Sig) -> SE Sig2 -> AtOut Sig (SE Sig) (SE Sig2)
forall a b c. At a b c => (a -> b) -> c -> AtOut a b c
at (Sig -> Sig -> Sig -> Sig -> SE Sig
chorus Sig
0.2 Sig
0.3 Sig
0.25) (SE Sig2 -> AtOut Sig (SE Sig) (SE Sig2))
-> SE Sig2 -> AtOut Sig (SE Sig) (SE Sig2)
forall a b. (a -> b) -> a -> b
$ (Sig -> Sig2) -> SE Sig -> AtOut Sig Sig2 (SE Sig)
forall a b c. At a b c => (a -> b) -> c -> AtOut a b c
at Sig -> Sig2
fromMono (SE Sig -> AtOut Sig Sig2 (SE Sig))
-> SE Sig -> AtOut Sig Sig2 (SE Sig)
forall a b. (a -> b) -> a -> b
$ (Msg -> SE Sig) -> SE Sig
forall a. (Num a, Sigs a) => (Msg -> SE a) -> SE a
midi ((Msg -> SE Sig) -> SE Sig) -> (Msg -> SE Sig) -> SE Sig
forall a b. (a -> b) -> a -> b
$ (Sig -> SE Sig) -> Msg -> SE (MidiInstrOut (Sig -> SE Sig))
forall a. MidiInstr a => a -> Msg -> SE (MidiInstrOut a)
onMsg Sig -> SE Sig
pwPad

---------------------------------------------------
-- accordeon

osc4 :: Sig -> Sig -> Sig -> Sig -> Sig -> Sig -> Sig -> Sig
osc4 :: Sig -> Sig -> Sig -> Sig -> ResonFilter
osc4 Sig
freq1 Sig
freq2 Sig
freq3 Sig
freq4 Sig
a Sig
b Sig
cps = Sig -> Sig -> Sig -> ResonFilter
forall a.
(Num a, SigSpace a) =>
Sig -> Sig -> a -> a -> a -> a -> a
cfd4 Sig
a Sig
b (Sig -> Sig
saw (Sig
cps Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
freq1)) (Sig -> Sig
sqr (Sig
cps Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
freq2)) (Sig -> Sig
saw (Sig
cps Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
freq3)) (Sig -> Sig
sqr (Sig
cps Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
freq4))

mlpTrack :: Sig -> Sig -> Sig -> Sig -> Sig
mlpTrack :: Sig -> ResonFilter
mlpTrack Sig
cps Sig
center Sig
q = ResonFilter
mlp (Sig
cps Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ Sig
6500 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
center) Sig
q

data Accordeon = Accordeon
  { Accordeon -> Sig
accordeonFreq1 :: Sig
  , Accordeon -> Sig
accordeonFreq2 :: Sig
  , Accordeon -> Sig
accordeonFreq3 :: Sig
  , Accordeon -> Sig
accordeonFreq4 :: Sig
  }

instance Default Accordeon where
  def :: Accordeon
def = Sig -> Sig -> Sig -> Sig -> Accordeon
Accordeon Sig
1 Sig
0.5 Sig
2.01 Sig
2

accordeon :: Accordeon -> Sig -> SE Sig2
accordeon :: Accordeon -> Sig -> SE Sig2
accordeon Accordeon
spec Sig
cps = (Sig -> Sig2) -> SE Sig -> SE Sig2
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Sig -> Sig2
fromMono (SE Sig -> SE Sig2) -> SE Sig -> SE Sig2
forall a b. (a -> b) -> a -> b
$ (Sig -> Sig -> Sig) -> SE Sig -> SE Sig -> SE Sig
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (\Sig
a Sig
b -> Sig -> Sig -> Sig
forall a. SigSpace a => Sig -> a -> a
mul Sig
vcaEg (Sig -> Sig) -> Sig -> Sig
forall a b. (a -> b) -> a -> b
$ Sig -> ResonFilter
mlpTrack (Sig
cps Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
2) (Sig
0.5 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
vcfEg) Sig
0.1 (Sig -> Sig) -> Sig -> Sig
forall a b. (a -> b) -> a -> b
$ ResonFilter
f Sig
a Sig
b Sig
cps) (Sig -> Sig2 -> SE Sig
rndPointer Sig
6 (Sig
0.3, Sig
0.2)) (Sig -> Sig2 -> SE Sig
rndPointer Sig
10 (Sig
0.4, Sig
0.1))
  where
    vcaEg :: Sig
vcaEg = D -> D -> D -> D -> Sig
leg D
0.01 D
0.3 D
0.5 D
0.3
    vcfEg :: Sig
vcfEg = D -> D -> D -> D -> Sig
leg D
0.05 D
0.3 D
0.2 D
0.2
    rndPointer' :: D -> D -> D -> Sig -> Sig2 -> SE Sig
rndPointer' D
a D
dt D
b Sig
frq (Sig
x, Sig
y) = (Sig -> Sig) -> SE Sig -> SE Sig
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Sig
r -> Sig
x Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ Sig
y Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* [D] -> Sig
linseg [D
0, D
0.01, D
a, D
dt, D
b] Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
r) (Sig -> Sig -> SE Sig
randi Sig
1 Sig
frq)
    rndPointer :: Sig -> Sig2 -> SE Sig
rndPointer = D -> D -> D -> Sig -> Sig2 -> SE Sig
rndPointer' D
1 D
5 D
0.35
    f :: ResonFilter
f = Sig -> Sig -> Sig -> Sig -> ResonFilter
osc4 (Accordeon -> Sig
accordeonFreq1 Accordeon
spec) (Accordeon -> Sig
accordeonFreq2 Accordeon
spec) (Accordeon -> Sig
accordeonFreq3 Accordeon
spec) (Accordeon -> Sig
accordeonFreq4 Accordeon
spec)

accordeonFx :: Sig2 -> SE Sig2
accordeonFx :: Sig2 -> SE Sig2
accordeonFx Sig2
a = (Sig2 -> Sig2) -> SE Sig2 -> AtOut Sig2 Sig2 (SE Sig2)
forall a b c. At a b c => (a -> b) -> c -> AtOut a b c
at Sig2 -> Sig2
smallHall2 (SE Sig2 -> AtOut Sig2 Sig2 (SE Sig2))
-> SE Sig2 -> AtOut Sig2 Sig2 (SE Sig2)
forall a b. (a -> b) -> a -> b
$ Sig -> (Sig -> Sig) -> SE Sig2 -> AtOut Sig Sig (SE Sig2)
forall a b c. MixAt a b c => Sig -> (a -> b) -> c -> AtOut a b c
mixAt Sig
0.35 (D -> Sig -> Sig -> Sig
echo D
0.25 Sig
0.55) (Sig2 -> SE Sig2
forall (m :: * -> *) a. Monad m => a -> m a
return Sig2
a :: SE Sig2)