summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntonKholomiov <>2016-03-26 13:41:00 (GMT)
committerhdiff <hdiff@hdiff.luite.com>2016-03-26 13:41:00 (GMT)
commit6ae1b2c455d196b2c2bb6eebd8a063d425acf2bd (patch)
tree7d8f40793039e68ef0d7555f4add0890e5198d66
parent7211a5f60e01ea876d31783187491a300789da8a (diff)
version 0.5.00.5.0
-rw-r--r--csound-catalog.cabal4
-rw-r--r--src/Csound/Catalog/Wave.hs7
-rw-r--r--src/Csound/Catalog/Wave/Sharc.hs75
-rw-r--r--src/Csound/Catalog/Wave/Thor.hs31
-rw-r--r--src/Csound/Patch.hs608
5 files changed, 707 insertions, 18 deletions
diff --git a/csound-catalog.cabal b/csound-catalog.cabal
index cf71983..5990891 100644
--- a/csound-catalog.cabal
+++ b/csound-catalog.cabal
@@ -1,5 +1,5 @@
Name: csound-catalog
-Version: 0.4.0
+Version: 0.5.0
Cabal-Version: >= 1.6
License: BSD3
License-file: LICENSE
@@ -27,7 +27,7 @@ Source-repository head
Library
Ghc-Options: -Wall
Build-Depends:
- base >= 4, base < 5, transformers >= 0.3, csound-expression >= 4.9.0, csound-sampler >=0.0.6.4, sharc-timbre
+ base >= 4, base < 5, transformers >= 0.3, csound-expression >= 5.0.0, csound-sampler >=0.0.6.5, sharc-timbre
Hs-Source-Dirs: src/
Exposed-Modules:
Csound.Catalog
diff --git a/src/Csound/Catalog/Wave.hs b/src/Csound/Catalog/Wave.hs
index f317343..60b3ade 100644
--- a/src/Csound/Catalog/Wave.hs
+++ b/src/Csound/Catalog/Wave.hs
@@ -77,7 +77,8 @@ module Csound.Catalog.Wave(
simpleBass,
- EpianoOsc(..), epiano,
+ ReleaseTime,
+ EpianoOsc(..), epiano, pianoEnv, xpianoEnv,
noisyChoir, thorWind, mildWind, boom, windWall,
@@ -101,6 +102,10 @@ module Csound.Catalog.Wave(
sharcOsc, sigSharcOsc, rndSharcOsc, rndSigSharcOsc,
soloSharcOsc, orcSharcOsc, purePadSharcOsc, padSharcOsc,
+ -- ** Padsynth
+ PadSharcSpec(..), padsynthSharcOsc, padsynthSharcOsc2,
+ padsynthSharcOsc', padsynthSharcOsc2',
+
-- ** Instriments
SharcInstr(..),
shViolin, shViolinPizzicato, shViolinMuted, shViolinMarteleBowing, shViolinsEnsemble, shViola, shViolaPizzicato, shViolaMuted,
diff --git a/src/Csound/Catalog/Wave/Sharc.hs b/src/Csound/Catalog/Wave/Sharc.hs
index 0390678..49b9096 100644
--- a/src/Csound/Catalog/Wave/Sharc.hs
+++ b/src/Csound/Catalog/Wave/Sharc.hs
@@ -3,6 +3,10 @@ module Csound.Catalog.Wave.Sharc(
sharcOsc, sigSharcOsc, rndSharcOsc, rndSigSharcOsc,
soloSharcOsc, orcSharcOsc, purePadSharcOsc, padSharcOsc,
+ -- * Padsynth
+ PadSharcSpec(..), padsynthSharcOsc, padsynthSharcOsc2,
+ padsynthSharcOsc', padsynthSharcOsc2',
+
-- * Instriments
SharcInstr(..),
shViolin, shViolinPizzicato, shViolinMuted, shViolinMarteleBowing, shViolinsEnsemble, shViola, shViolaPizzicato, shViolaMuted,
@@ -30,7 +34,7 @@ deg x = 180 * x / pi
harmonics2tab harmonics = sines3 $ fmap (\h -> (fromIntegral $ Sh.harmonicId h, Sh.harmonicAmplitude h, deg $ Sh.harmonicPhase h)) harmonics
--- | Get instrument wae table by midi pitch number.
+-- | Get instrument wave table by midi pitch number.
getInstrTab :: SharcInstr -> Int -> Tab
getInstrTab (SharcInstr instr) n = note2tab $ Sh.instrNotes instr !! idx
where
@@ -97,6 +101,75 @@ padSharcOsc :: SharcInstr -> D -> SE Sig
padSharcOsc instr cps = mul (fades 0.65 0.75) $ uni (rndSharcOsc instr . ir) (sig cps)
---------------------------------------------------------------------------
+-- padsynth
+
+data PadSharcSpec = PadSharcSpec {
+ padSharcBandwidth :: Double,
+ padSharcSize :: Int
+ }
+
+instance Default PadSharcSpec where
+ def = PadSharcSpec 15 8
+
+padsynthSharcOsc :: SharcInstr -> D -> SE Sig
+padsynthSharcOsc = padsynthSharcOsc' def
+
+padsynthSharcOsc2 :: SharcInstr -> D -> SE Sig2
+padsynthSharcOsc2 = padsynthSharcOsc2' def
+
+padsynthSharcOsc2' :: PadSharcSpec -> SharcInstr -> D -> SE Sig2
+padsynthSharcOsc2' spec instr freq = padsynthOscMultiCps2 (getSpecIntervals spec instr) freq
+
+padsynthSharcOsc' :: PadSharcSpec -> SharcInstr -> D -> SE Sig
+padsynthSharcOsc' spec instr freq = padsynthOscMultiCps (getSpecIntervals spec instr) freq
+
+getSpecIntervals spec (SharcInstr instr) = zip borderFreqs specs
+ where
+ groups = splitTo (padSharcSize spec) (Sh.instrNotes instr)
+ medians = fmap getMedian groups
+ borders = fmap getBorder groups
+
+ specs = fmap (note2padsynth $ padSharcBandwidth spec) medians
+ borderFreqs = fmap (Sh.pitchFund . Sh.notePitch) borders
+
+
+splitTo :: Int -> [a] -> [[a]]
+splitTo n as = go size as
+ where
+ size = max 1 (length as `div` n)
+
+ go :: Int -> [a] -> [[a]]
+ go n bs
+ | null ys = [xs]
+ | otherwise = xs : go n ys
+ where
+ (xs, ys) = splitAt n bs
+
+getMedian :: [a] -> a
+getMedian as
+ | null as = error "getMedian: Csound.Catalog.Wave.Sharc.hs empty list"
+ | otherwise = as !! (length as `div` 2)
+
+getBorder :: [a] -> a
+getBorder as
+ | null as = error "getMedian: Csound.Catalog.Wave.Sharc.hs empty list"
+ | otherwise = last as
+
+note2padsynth :: Double -> Sh.Note -> PadsynthSpec
+note2padsynth bandwidth note = (defPadsynthSpec bandwidth normAmps) { padsynthFundamental = Sh.pitchFund (Sh.notePitch note) }
+ where
+ normAmps = fmap ( / maxAmp) amps
+ amps = fmap Sh.harmonicAmplitude $ Sh.noteHarmonics note
+ maxAmp = maximum amps
+
+
+toStereoOsc :: (a -> SE Sig) -> (a -> SE Sig2)
+toStereoOsc f x = do
+ left <- f x
+ right <- f x
+ return (left, right)
+
+---------------------------------------------------------------------------
-- sharc instr
newtype SharcInstr = SharcInstr { unSharcInstr :: Sh.Instr }
diff --git a/src/Csound/Catalog/Wave/Thor.hs b/src/Csound/Catalog/Wave/Thor.hs
index 467b0cd..af55a83 100644
--- a/src/Csound/Catalog/Wave/Thor.hs
+++ b/src/Csound/Catalog/Wave/Thor.hs
@@ -8,7 +8,8 @@ module Csound.Catalog.Wave.Thor(
simpleBass,
- EpianoOsc(..), epiano,
+ ReleaseTime,
+ EpianoOsc(..), epiano, pianoEnv, xpianoEnv,
noisyChoir, thorWind, mildWind, boom, windWall,
@@ -95,6 +96,8 @@ pwEnsemble x = mul 0.3 $ at (mlp (3500 + x * 2) 0.1) $ mul (leg 0.5 0 1 1) $ sum
------------------------------
-- 4 Multi osc (unision)
+type ReleaseTime = D
+
data EpianoOsc = EpianoOsc
{ epianoOscChorusNum :: Int
, epianoOscChorusAmt :: Sig
@@ -102,19 +105,27 @@ data EpianoOsc = EpianoOsc
, epianoOscWeight :: Sig
}
-epiano :: [EpianoOsc] -> (D, D) -> SE Sig
-epiano xs (amp, cps) = mul (sig amp * leg 0.001 sust 0 rel) $ at (mlp (2500 + 4500 * (leg 0.085 3 0 0.1)) 0.25) $
- fmap sum $ mapM (\x -> mul (epianoOscWeight x) $ multiRndSE (epianoOscChorusNum x) (epianoOscChorusAmt x) (detune (epianoOscNum x) rndOsc) (sig cps)) xs
- -- (multiRndSE 4 5 rndOsc + multiRndSE 8 10 (detune (2.01) rndOsc))
- where
- sust = amp + 2 + (0.7 - 3 * k ** 2)
- rel = (amp / 10) + 0.05 - (k / 10)
- k = cps / 1000
+xpianoEnv :: ReleaseTime -> (D, D) -> Sig
+xpianoEnv userRelease (amp, cps) = sig amp * xeg 0.01 sust 0.25 rel
+ where
+ sust = maxB (amp + 2 + (0.7 - 3 * k ** 2)) 0.1
+ rel = userRelease + maxB ((amp / 5) + 0.05 - (k / 10)) 0.02
+ k = cps / 3500
+
+pianoEnv :: ReleaseTime -> (D, D) -> Sig
+pianoEnv userRelease (amp, cps) = sig amp * leg 0.001 sust 0.25 rel
+ where
+ sust = maxB (amp + 2 + (0.7 - 3 * k ** 2)) 0.1
+ rel = userRelease + maxB ((amp / 5) + 0.05 - (k / 10)) 0.02
+ k = cps / 3500
+
+epiano :: ReleaseTime -> [EpianoOsc] -> (D, D) -> SE Sig
+epiano releaseTime xs (amp, cps) = mul (pianoEnv releaseTime (amp, cps)) $ at (mlp (2500 + 4500 * (leg 0.085 3 0 0.1)) 0.25) $
+ fmap sum $ mapM (\x -> mul (epianoOscWeight x) $ multiRndSE (epianoOscChorusNum x) (epianoOscChorusAmt x) (detune (epianoOscNum x) rndOsc) (sig cps)) xs
------------------------------
-- 5 noise
--- noisyChor numberOfFilters bandWidthRatio cps
noisyChoir :: Int -> Sig -> Sig -> SE Sig
noisyChoir n ratio cps = mul 0.5 $ genGhostChoir white [1, 1] [1, 0.5] n (5 + 300 ** ratio) cps
diff --git a/src/Csound/Patch.hs b/src/Csound/Patch.hs
index c7ea101..ed8b86a 100644
--- a/src/Csound/Patch.hs
+++ b/src/Csound/Patch.hs
@@ -33,6 +33,7 @@ module Csound.Patch(
Choir(..), choirA', choirO', choirU', choirE',
windSings, noisyChoir, longNoisyChoir, noisyChoir', longNoisyChoir', NoisyChoir(..),
+ noisyRise, noisySpiral, noisySpiral',
-- * Pad
pwPad, triPad, nightPad, overtonePad, caveOvertonePad,
@@ -142,6 +143,56 @@ module Csound.Patch(
SharcInstr,
soloSharc, orcSharc, padSharc, purePadSharc, dreamSharc, dreamSharc',
+ -- ** Padsynth instruments
+ PadSharcSpec(..),
+
+ psOrganSharc, psOrganSharc', psLargeOrganSharc, psLargeOrganSharc', psPianoSharc, psPianoSharc',
+ xpsPianoSharc, xpsPianoSharc',
+ psPadSharc, psPadSharc', psSoftPadSharc, psSoftPadSharc',
+ psMagicPadSharc, psMagicPadSharc', psMagicSoftPadSharc, psMagicSoftPadSharc',
+ psLargePianoSharc, psLargePianoSharc',
+ xpsLargePianoSharc,
+ xpsLargePianoSharc',
+
+ -- *** Deep pads
+ psDeepPadSharc, psDeepPadSharc', psDeepSoftPadSharc, psDeepSoftPadSharc',
+ psDeepMagicPadSharc, psDeepMagicPadSharc', psDeepMagicSoftPadSharc, psDeepMagicSoftPadSharc',
+
+ --- *** Crossfades
+ psPadSharcCfd, psPadSharcCfd', psPadSharcCfd4, psPadSharcCfd4', psDeepPadSharcCfd, psDeepPadSharcCfd',
+ psDeepPadSharcCfd4, psDeepPadSharcCfd4', psSoftPadSharcCfd, psSoftPadSharcCfd', psSoftPadSharcCfd4, psSoftPadSharcCfd4',
+ psDeepSoftPadSharcCfd, psDeepSoftPadSharcCfd', psDeepSoftPadSharcCfd4, psDeepSoftPadSharcCfd4',
+
+ -- *** High resolution Padsynth instruments
+ psOrganSharcHifi,
+ psLargeOrganSharcHifi,
+ psPianoSharcHifi,
+ xpsPianoSharcHifi,
+ psPadSharcHifi,
+ psSoftPadSharcHifi,
+ psMagicPadSharcHifi,
+ psMagicSoftPadSharcHifi,
+ psLargePianoSharcHifi,
+ xpsLargePianoSharcHifi,
+
+ -- *** Vedic pads
+ -- | Deep spiritual pads.
+ vedicPad, vedicPadCfd, vedicPadCfd4, vibhu, rishi, agni, prakriti, rajas, avatara, bhumi,
+
+ --- *** High resolution vedic pads
+ -- | Deep spiritual pads.
+ vedicPadHifi, vibhuHifi, rishiHifi, agniHifi, prakritiHifi, rajasHifi, avataraHifi, bhumiHifi,
+
+ --- *** Low resolution vedic pads
+ -- | Deep spiritual pads.
+ vedicPadLofi, vibhuLofi, rishiLofi, agniLofi, prakritiLofi, rajasLofi, avataraLofi, bhumiLofi,
+
+ --- *** Crossfade vedic pads
+ -- | Crossfade between deep spiritual pads. All pads take in padsynthBandwidth and crossfade level as parameters.
+ vibhuRishi, vibhuAgni, vibhuPrakriti, vibhuRajas, vibhuAvatara, vibhuBhumi, rishiAgni, rishiPrakriti,
+ rishiRajas, rishiAvatara, rishiBhumi, agniPrakriti, agniRajas, agniAvatara, agniBhumi, prakritiRajas,
+ prakritiAvatara, prakritiBhumi, rajasAvatara, rajasBhumi, avataraBhumi,
+
-- ** concrete instruments
shViolin, shViolinPizzicato, shViolinMuted, shViolinMarteleBowing, shViolinsEnsemble, shViola, shViolaPizzicato, shViolaMuted,
shViolaMarteleBowing, shTuba, shTromboneMuted, shTrombone, shPiccolo, shOboe, shFrenchHornMuted, shFrenchHorn, shFlute,
@@ -177,7 +228,9 @@ import Csound.Catalog.Wave(maleA, maleE, maleIY, maleO, maleOO, maleU, maleER, m
femaleA, femaleE, femaleIY, femaleO, femaleOO)
import Csound.Catalog.Wave(Accordeon(..),
+ ReleaseTime,
SharcInstr,
+ PadSharcSpec(..),
shViolin, shViolinPizzicato, shViolinMuted, shViolinMarteleBowing, shViolinsEnsemble, shViola, shViolaPizzicato, shViolaMuted,
shViolaMarteleBowing, shTuba, shTromboneMuted, shTrombone, shPiccolo, shOboe, shFrenchHornMuted, shFrenchHorn, shFlute,
shEnglishHorn, shClarinetEflat, shTrumpetMutedC, shTrumpetC, shContrabassClarinet, shContrabassoon, shCello, shCelloPizzicato,
@@ -245,16 +298,19 @@ fmPiano = Patch
{ patchInstr = at fromMono . mul 0.75 . onCps (C.fmFlavio 6 3)
, patchFx = fx1 0.15 smallHall2 }
+epianoReleaseTime :: ReleaseTime
+epianoReleaseTime = 0.25
+
epiano2 = addHammer 0.15 $ Patch
- { patchInstr = mul 1.125 . at fromMono . (onCps $ C.epiano [C.EpianoOsc 4 5 1 1, C.EpianoOsc 8 10 2.01 1])
+ { patchInstr = mul 1.125 . at fromMono . (onCps $ C.epiano epianoReleaseTime [C.EpianoOsc 4 5 1 1, C.EpianoOsc 8 10 2.01 1])
, patchFx = fx1 0.25 smallHall2 }
epianoHeavy = addHammer 0.15 $ Patch
- { patchInstr = mul 1.125 . at fromMono . (onCps $ C.epiano [C.EpianoOsc 4 5 1 1, C.EpianoOsc 8 10 2.01 1, C.EpianoOsc 8 15 0.5 0.5])
+ { patchInstr = mul 1.125 . at fromMono . (onCps $ C.epiano epianoReleaseTime [C.EpianoOsc 4 5 1 1, C.EpianoOsc 8 10 2.01 1, C.EpianoOsc 8 15 0.5 0.5])
, patchFx = fx1 0.2 smallHall2 }
epianoBright = addHammer 0.15 $ Patch
- { patchInstr = mul 1.12 . at fromMono . (onCps $ C.epiano [C.EpianoOsc 4 5 1 1, C.EpianoOsc 8 10 3.01 1, C.EpianoOsc 8 15 5 0.5, C.EpianoOsc 8 4 7 0.3])
+ { patchInstr = mul 1.12 . at fromMono . (onCps $ C.epiano epianoReleaseTime [C.EpianoOsc 4 5 1 1, C.EpianoOsc 8 10 3.01 1, C.EpianoOsc 8 15 5 0.5, C.EpianoOsc 8 4 7 0.3])
, patchFx = fx1 0.2 smallHall2 }
vibraphonePiano1 = addHammer 0.15 $ smallVibraphone1 { patchInstr = mul (1.5 * fadeOut 0.25) . at (mlp 6500 0.1). patchInstr smallVibraphone1 }
@@ -616,7 +672,7 @@ razorLead' (RazorLead bright speed) = Patch
, patchFx = fx1 0.35 smallHall2 }
overtoneLeadFx :: Sig2 -> SE Sig2
-overtoneLeadFx x = fmap magicCave2 $ mixAt 0.2 (echo 0.25 0.45) (return x)
+overtoneLeadFx x = fmap magicCave2 $ mixAt 0.2 (echo 0.25 0.45) x
overtoneLead :: Patch2
overtoneLead = Patch
@@ -1425,3 +1481,547 @@ dreamSharc instr = dreamPadBy (\cps -> C.rndSigSharcOsc instr (ir cps) cps)
dreamSharc' :: SharcInstr -> Sig -> Patch2
dreamSharc' instr brightness = dreamPadBy' brightness (\cps -> C.rndSigSharcOsc instr (ir cps) cps)
+
+type PadsynthBandwidth = Double
+
+-- | Padsynth instrument with organ-like amplitude envelope.
+psOrganSharc :: SharcInstr -> Patch2
+psOrganSharc = psOrganSharc' def
+
+hiDef = def { padSharcSize = 35 }
+
+-- | High resolution Padsynth instrument with organ-like amplitude envelope.
+psOrganSharcHifi :: SharcInstr -> Patch2
+psOrganSharcHifi = psOrganSharc' hiDef
+
+-- | Padsynth instrument with organ-like amplitude envelope. We can specify aux parameters.
+psOrganSharc' :: PadSharcSpec -> SharcInstr -> Patch2
+psOrganSharc' spec sh = Patch
+ { patchInstr = mul (0.5 * fades 0.01 0.1) . onCps (C.padsynthSharcOsc2' spec sh)
+ , patchFx = [FxSpec 0.25 (return . smallHall2), FxSpec 1 (return . (at $ mul 1.4 . saturator 0.75))]
+ }
+
+-- | Padsynth instrument with organ-like amplitude envelope and huge reverb.
+psLargeOrganSharc :: SharcInstr -> Patch2
+psLargeOrganSharc = psLargeOrganSharc' def
+
+-- | High resolution Padsynth instrument with organ-like amplitude envelope and huge reverb.
+psLargeOrganSharcHifi :: SharcInstr -> Patch2
+psLargeOrganSharcHifi = psLargeOrganSharc' hiDef
+
+-- | Padsynth instrument with organ-like amplitude envelope and huge reverb.
+psLargeOrganSharc' :: PadSharcSpec -> SharcInstr -> Patch2
+psLargeOrganSharc' spec sh = Patch
+ { patchInstr = mul (0.65 * fades 0.01 0.1) . onCps (C.padsynthSharcOsc2' spec sh)
+ , patchFx = [FxSpec 0.35 (return . largeHall2), FxSpec 1 (return . (at $ mul 1.4 . saturator 0.75))]
+ }
+
+-- | Padsynth instrument with piano-like amplitude envelope.
+psPianoSharc :: ReleaseTime -> SharcInstr -> Patch2
+psPianoSharc = psPianoSharc' def
+
+-- | High resolution Padsynth instrument with piano-like amplitude envelope.
+psPianoSharcHifi :: ReleaseTime -> SharcInstr -> Patch2
+psPianoSharcHifi = psPianoSharc' hiDef
+
+-- | Padsynth instrument with piano-like amplitude envelope. We can specify aux parameters.
+psPianoSharc' :: PadSharcSpec -> ReleaseTime -> SharcInstr -> Patch2
+psPianoSharc' spec releaseTime sh = Patch
+ { patchInstr = \ampCps -> mul (0.75 * C.pianoEnv releaseTime ampCps) $ onCps (C.padsynthSharcOsc2' spec sh) ampCps
+ , patchFx = [FxSpec 0.15 (return . smallHall2), FxSpec 1 (return . (at $ mul 1.4 . saturator 0.75))]
+ }
+
+
+-- | Padsynth instrument with piano-like amplitude envelope.
+xpsPianoSharc :: ReleaseTime -> SharcInstr -> Patch2
+xpsPianoSharc = xpsPianoSharc' def
+
+-- | High resolution Padsynth instrument with piano-like amplitude envelope.
+xpsPianoSharcHifi :: ReleaseTime -> SharcInstr -> Patch2
+xpsPianoSharcHifi = xpsPianoSharc' hiDef
+
+-- | Padsynth instrument with piano-like amplitude envelope. We can specify aux parameters.
+xpsPianoSharc' :: PadSharcSpec -> ReleaseTime -> SharcInstr -> Patch2
+xpsPianoSharc' spec releaseTime sh = addHammer 0.12 $ Patch
+ { patchInstr = \ampCps -> mul (0.75 * C.xpianoEnv releaseTime ampCps) $ onCps (C.padsynthSharcOsc2' spec sh) ampCps
+ , patchFx = [FxSpec 0.15 (return . smallHall2), FxSpec 1 (return . (at $ mul 1.4 . saturator 0.75))]
+ }
+
+
+-- | Padsynth instrument with piano-like amplitude envelope.
+psLargePianoSharc :: ReleaseTime -> SharcInstr -> Patch2
+psLargePianoSharc = psLargePianoSharc' def
+
+-- | High resolution Padsynth instrument with piano-like amplitude envelope.
+psLargePianoSharcHifi :: ReleaseTime -> SharcInstr -> Patch2
+psLargePianoSharcHifi = psLargePianoSharc' hiDef
+
+-- | Padsynth instrument with piano-like amplitude envelope. We can specify aux parameters.
+psLargePianoSharc' :: PadSharcSpec -> ReleaseTime -> SharcInstr -> Patch2
+psLargePianoSharc' spec releaseTime sh = Patch
+ { patchInstr = \ampCps -> mul (0.75 * C.pianoEnv releaseTime ampCps) $ onCps (C.padsynthSharcOsc2' spec sh) ampCps
+ , patchFx = [FxSpec 0.15 (return . largeHall2), FxSpec 1 (return . (at $ mul 1.4 . saturator 0.75))]
+ }
+
+-- | Padsynth instrument with piano-like amplitude envelope.
+xpsLargePianoSharc :: ReleaseTime -> SharcInstr -> Patch2
+xpsLargePianoSharc = xpsLargePianoSharc' def
+
+-- | High resolution Padsynth instrument with piano-like amplitude envelope.
+xpsLargePianoSharcHifi :: ReleaseTime -> SharcInstr -> Patch2
+xpsLargePianoSharcHifi = xpsLargePianoSharc' hiDef
+
+-- | Padsynth instrument with piano-like amplitude envelope. We can specify aux parameters.
+xpsLargePianoSharc' :: PadSharcSpec -> ReleaseTime -> SharcInstr -> Patch2
+xpsLargePianoSharc' spec releaseTime sh = Patch
+ { patchInstr = \ampCps -> mul (0.75 * C.xpianoEnv releaseTime ampCps) $ onCps (C.padsynthSharcOsc2' spec sh) ampCps
+ , patchFx = [FxSpec 0.15 (return . largeHall2), FxSpec 1 (return . (at $ mul 1.4 . saturator 0.75))]
+ }
+
+psPadFilterBy :: Sig -> Sig -> (Sig -> Sig -> Sig -> Sig) -> (D, D) -> Sig -> Sig
+psPadFilterBy rippleLevel q resonFilter ampCps = resonFilter (0.3 * (sig $ snd ampCps) + 2500 + 2000 * fades 0.15 (0.6 + rel ampCps) + rippleLevel * slope 0.75 0.5 * osc 8) q
+ where rel (amp, cps) = amp - cps / 3500
+
+psPadFilter = psPadFilterBy 75 15 (\cfq q x -> lowpass2 x cfq q)
+psSoftPadFilter = psPadFilterBy 350 0.15 mlp
+
+deepOsc :: (Num a, SigSpace a) => (D -> a) -> (D -> a)
+deepOsc f x = mul 0.5 (f x + f (x / 2))
+
+psOsc spec sh x = C.padsynthSharcOsc2' spec sh x
+psDeepOsc spec sh = deepOsc (C.padsynthSharcOsc2' spec sh)
+
+psOscCfd koeff (spec1, sh1) (spec2, sh2) x = cfd koeff (C.padsynthSharcOsc2' spec1 sh1 x) (C.padsynthSharcOsc2' spec2 sh2 x)
+psOscCfd4 koeffX koeffY (spec1, sh1) (spec2, sh2) (spec3, sh3) (spec4, sh4) x = cfd4 koeffX koeffY (C.padsynthSharcOsc2' spec1 sh1 x) (C.padsynthSharcOsc2' spec2 sh2 x) (C.padsynthSharcOsc2' spec3 sh3 x) (C.padsynthSharcOsc2' spec4 sh4 x)
+
+psDeepOscCfd koeff (spec1, sh1) (spec2, sh2) = deepOsc (psOscCfd koeff (spec1, sh1) (spec2, sh2))
+psDeepOscCfd4 koeffX koeffY (spec1, sh1) (spec2, sh2) (spec3, sh3) (spec4, sh4) = deepOsc (psOscCfd4 koeffX koeffY (spec1, sh1) (spec2, sh2) (spec3, sh3) (spec4, sh4))
+
+genPsPad :: (Sig2 -> Sig2) -> ((D, D) -> Sig -> Sig) -> (D -> SE Sig2) -> Patch2
+genPsPad effect filter wave = Patch
+ { patchInstr = \ampCps -> mul (0.45 * fades 0.5 (0.6 + rel ampCps)) $ onCps (at (filter ampCps) . wave) ampCps
+ , patchFx = [FxSpec 0.25 (return . effect), FxSpec 0.5 (return . (at $ mul 1.6 . saturator 0.75)), FxSpec 0.3 (at $ echo 0.125 0.65)]
+ }
+ where rel (amp, cps) = amp - cps / 3500
+
+-- | Padsynth instrument with pad-like amplitude envelope.
+psPadSharc :: SharcInstr -> Patch2
+psPadSharc = psPadSharc' def
+
+-- | High resolution Padsynth instrument with pad-like amplitude envelope.
+psPadSharcHifi :: SharcInstr -> Patch2
+psPadSharcHifi = psPadSharc' hiDef
+
+-- | Padsynth instrument with pad-like amplitude envelope.
+psPadSharc' :: PadSharcSpec -> SharcInstr -> Patch2
+psPadSharc' spec sh = genPsPad largeHall2 psPadFilter (psOsc spec sh)
+
+-- | Padsynth instrument with pad-like amplitude envelope. Plays a note and one octave below it.
+psDeepPadSharc :: SharcInstr -> Patch2
+psDeepPadSharc = psDeepPadSharc' def
+
+psDeepPadSharc' :: PadSharcSpec -> SharcInstr -> Patch2
+psDeepPadSharc' spec sh = genPsPad largeHall2 psPadFilter (psDeepOsc spec sh)
+
+psPadSharcCfd :: Sig -> SharcInstr -> SharcInstr -> Patch2
+psPadSharcCfd k sh1 sh2 = psPadSharcCfd' k (def, sh1) (def, sh2)
+
+-- | Crossfade between timbres.
+psPadSharcCfd' :: Sig -> (PadSharcSpec, SharcInstr) -> (PadSharcSpec, SharcInstr) -> Patch2
+psPadSharcCfd' k spec1 spec2 = genPsPad largeHall2 psPadFilter (psOscCfd k spec1 spec2)
+
+psPadSharcCfd4 :: Sig -> Sig -> SharcInstr -> SharcInstr -> SharcInstr -> SharcInstr -> Patch2
+psPadSharcCfd4 k1 k2 sh1 sh2 sh3 sh4 = psPadSharcCfd4' k1 k2 (def, sh1) (def, sh2) (def, sh3) (def, sh4)
+
+-- | Crossfade between timbres.
+psPadSharcCfd4' :: Sig -> Sig -> (PadSharcSpec, SharcInstr) -> (PadSharcSpec, SharcInstr) -> (PadSharcSpec, SharcInstr) -> (PadSharcSpec, SharcInstr) -> Patch2
+psPadSharcCfd4' k1 k2 spec1 spec2 spec3 spec4 = genPsPad largeHall2 psPadFilter (psOscCfd4 k1 k2 spec1 spec2 spec3 spec4)
+
+psDeepPadSharcCfd :: Sig -> SharcInstr -> SharcInstr -> Patch2
+psDeepPadSharcCfd k sh1 sh2 = psDeepPadSharcCfd' k (def, sh1) (def, sh2)
+
+-- | Crossfade between timbres.
+psDeepPadSharcCfd' :: Sig -> (PadSharcSpec, SharcInstr) -> (PadSharcSpec, SharcInstr) -> Patch2
+psDeepPadSharcCfd' k spec1 spec2 = genPsPad largeHall2 psPadFilter (psDeepOscCfd k spec1 spec2)
+
+psDeepPadSharcCfd4 :: Sig -> Sig -> SharcInstr -> SharcInstr -> SharcInstr -> SharcInstr -> Patch2
+psDeepPadSharcCfd4 k1 k2 sh1 sh2 sh3 sh4 = psDeepPadSharcCfd4' k1 k2 (def, sh1) (def, sh2) (def, sh3) (def, sh4)
+
+-- | Crossfade between timbres.
+psDeepPadSharcCfd4' :: Sig -> Sig -> (PadSharcSpec, SharcInstr) -> (PadSharcSpec, SharcInstr) -> (PadSharcSpec, SharcInstr) -> (PadSharcSpec, SharcInstr) -> Patch2
+psDeepPadSharcCfd4' k1 k2 spec1 spec2 spec3 spec4 = genPsPad largeHall2 psPadFilter (psDeepOscCfd4 k1 k2 spec1 spec2 spec3 spec4)
+
+
+-- | Padsynth instrument with pad-like amplitude envelope and moog filter.
+psSoftPadSharc :: SharcInstr -> Patch2
+psSoftPadSharc = psSoftPadSharc' def
+
+-- | High resolution Padsynth instrument with pad-like amplitude envelope and moog filter (resource hungry).
+psSoftPadSharcHifi :: SharcInstr -> Patch2
+psSoftPadSharcHifi = psSoftPadSharc' hiDef
+
+-- | Padsynth instrument with pad-like amplitude envelope and moog filter.
+-- We can specify aux parameters.
+psSoftPadSharc' :: PadSharcSpec -> SharcInstr -> Patch2
+psSoftPadSharc' spec sh = genPsPad largeHall2 psSoftPadFilter (psOsc spec sh)
+
+-- | Padsynth instrument with pad-like amplitude envelope and moog filter. Plays a note and one octave below it.
+psDeepSoftPadSharc :: SharcInstr -> Patch2
+psDeepSoftPadSharc = psDeepSoftPadSharc' def
+
+psDeepSoftPadSharc' :: PadSharcSpec -> SharcInstr -> Patch2
+psDeepSoftPadSharc' spec sh = genPsPad largeHall2 psSoftPadFilter (psDeepOsc spec sh)
+
+
+psSoftPadSharcCfd :: Sig -> SharcInstr -> SharcInstr -> Patch2
+psSoftPadSharcCfd k sh1 sh2 = psSoftPadSharcCfd' k (def, sh1) (def, sh2)
+
+-- | Crossfade between timbres.
+psSoftPadSharcCfd' :: Sig -> (PadSharcSpec, SharcInstr) -> (PadSharcSpec, SharcInstr) -> Patch2
+psSoftPadSharcCfd' k spec1 spec2 = genPsPad largeHall2 psSoftPadFilter (psOscCfd k spec1 spec2)
+
+psSoftPadSharcCfd4 :: Sig -> Sig -> SharcInstr -> SharcInstr -> SharcInstr -> SharcInstr -> Patch2
+psSoftPadSharcCfd4 k1 k2 sh1 sh2 sh3 sh4 = psSoftPadSharcCfd4' k1 k2 (def, sh1) (def, sh2) (def, sh3) (def, sh4)
+
+-- | Crossfade between timbres.
+psSoftPadSharcCfd4' :: Sig -> Sig -> (PadSharcSpec, SharcInstr) -> (PadSharcSpec, SharcInstr) -> (PadSharcSpec, SharcInstr) -> (PadSharcSpec, SharcInstr) -> Patch2
+psSoftPadSharcCfd4' k1 k2 spec1 spec2 spec3 spec4 = genPsPad largeHall2 psSoftPadFilter (psOscCfd4 k1 k2 spec1 spec2 spec3 spec4)
+
+psDeepSoftPadSharcCfd :: Sig -> SharcInstr -> SharcInstr -> Patch2
+psDeepSoftPadSharcCfd k sh1 sh2 = psDeepSoftPadSharcCfd' k (def, sh1) (def, sh2)
+
+-- | Crossfade between timbres.
+psDeepSoftPadSharcCfd' :: Sig -> (PadSharcSpec, SharcInstr) -> (PadSharcSpec, SharcInstr) -> Patch2
+psDeepSoftPadSharcCfd' k spec1 spec2 = genPsPad largeHall2 psSoftPadFilter (psDeepOscCfd k spec1 spec2)
+
+psDeepSoftPadSharcCfd4 :: Sig -> Sig -> SharcInstr -> SharcInstr -> SharcInstr -> SharcInstr -> Patch2
+psDeepSoftPadSharcCfd4 k1 k2 sh1 sh2 sh3 sh4 = psDeepSoftPadSharcCfd4' k1 k2 (def, sh1) (def, sh2) (def, sh3) (def, sh4)
+
+-- | Crossfade between timbres.
+psDeepSoftPadSharcCfd4' :: Sig -> Sig -> (PadSharcSpec, SharcInstr) -> (PadSharcSpec, SharcInstr) -> (PadSharcSpec, SharcInstr) -> (PadSharcSpec, SharcInstr) -> Patch2
+psDeepSoftPadSharcCfd4' k1 k2 spec1 spec2 spec3 spec4 = genPsPad largeHall2 psSoftPadFilter (psDeepOscCfd4 k1 k2 spec1 spec2 spec3 spec4)
+
+
+-- | Padsynth instrument with pad-like amplitude envelope and @magicCave2@ reverb.
+psMagicPadSharc :: SharcInstr -> Patch2
+psMagicPadSharc = psMagicPadSharc' def
+
+-- | High resolution Padsynth instrument with pad-like amplitude envelope and @magicCave2@ reverb.
+psMagicPadSharcHifi :: SharcInstr -> Patch2
+psMagicPadSharcHifi = psMagicPadSharc' hiDef
+
+-- | Padsynth instrument with pad-like amplitude envelope and @magicCave2@ reverb.
+psMagicPadSharc' :: PadSharcSpec -> SharcInstr -> Patch2
+psMagicPadSharc' spec sh = genPsPad magicCave2 psPadFilter (psOsc spec sh)
+
+-- | Padsynth instrument with pad-like amplitude envelope and @magicCave2@ reverb. Plays a note and one octave below it.
+psDeepMagicPadSharc :: SharcInstr -> Patch2
+psDeepMagicPadSharc = psDeepMagicPadSharc' def
+
+-- | Padsynth instrument with pad-like amplitude envelope and @magicCave2@ reverb. Plays a note and one octave below it.
+psDeepMagicPadSharc' :: PadSharcSpec -> SharcInstr -> Patch2
+psDeepMagicPadSharc' spec sh = genPsPad magicCave2 psPadFilter (psDeepOsc spec sh)
+
+-- | Padsynth instrument with pad-like amplitude envelope and moog filter and @magicCave2@ reverb (resource hungry).
+psMagicSoftPadSharc :: SharcInstr -> Patch2
+psMagicSoftPadSharc = psMagicSoftPadSharc' def
+
+-- | High resolution Padsynth instrument with pad-like amplitude envelope and moog filter and @magicCave2@ reverb (resource hungry).
+psMagicSoftPadSharcHifi :: SharcInstr -> Patch2
+psMagicSoftPadSharcHifi = psMagicSoftPadSharc' hiDef
+
+-- | Padsynth instrument with pad-like amplitude envelope and moog filter and @magicCave2@ reverb (resource hungry).
+-- We can specify aux parameters.
+psMagicSoftPadSharc' :: PadSharcSpec -> SharcInstr -> Patch2
+psMagicSoftPadSharc' spec sh = genPsPad magicCave2 psSoftPadFilter (psOsc spec sh)
+
+
+-- | Padsynth instrument with pad-like amplitude envelope and moog filter and @magicCave2@ reverb (resource hungry).
+psDeepMagicSoftPadSharc :: SharcInstr -> Patch2
+psDeepMagicSoftPadSharc = psDeepMagicSoftPadSharc' def
+
+-- | Padsynth instrument with pad-like amplitude envelope and moog filter and @magicCave2@ reverb (resource hungry).
+-- We can specify aux parameters.
+psDeepMagicSoftPadSharc' :: PadSharcSpec -> SharcInstr -> Patch2
+psDeepMagicSoftPadSharc' spec sh = genPsPad magicCave2 psSoftPadFilter (psDeepOsc spec sh)
+
+vedicSize = 15
+vedicSizeHifi = 32
+vedicSizeLofi = 4
+
+-- | Deep spiritual drones.
+--
+-- > vedicPad sharcInstrument bandwidth
+--
+-- Good values for bandwidth lies in the interval [0, 120]
+vedicPad :: SharcInstr -> PadsynthBandwidth -> Patch2
+vedicPad instr bandwidth = mul 0.8 $
+ addPreFx 0.45 (pingPong 0.25 0.65 0.5) $
+ psDeepSoftPadSharc' (def { padSharcBandwidth = bandwidth, padSharcSize = 15 }) instr
+
+-- | Deep spiritual drones. Crossfade between two instruments.
+--
+-- > vedicPadCfd cfdLevel sharcInstrument1 sharcInstrument2 bandwidth
+--
+-- Good values for bandwidth lies in the interval [0, 120]
+vedicPadCfd :: Sig -> SharcInstr -> SharcInstr -> PadsynthBandwidth -> Patch2
+vedicPadCfd k instr1 instr2 bandwidth = mul 0.8 $
+ addPreFx 0.45 (pingPong 0.25 0.65 0.5) $
+ psDeepSoftPadSharcCfd' k (def { padSharcBandwidth = bandwidth, padSharcSize = 15 }, instr1) (def { padSharcBandwidth = bandwidth, padSharcSize = 15 }, instr2)
+
+-- | Deep spiritual drones. Crossfade between four instruments.
+--
+-- > vedicPadCfd4 cfdLevelX cfdLevelY sharcInstrument1 sharcInstrument2 sharcInstrument3 sharcInstrument4 bandwidth
+--
+-- Good values for bandwidth lies in the interval [0, 120]
+vedicPadCfd4 :: Sig -> Sig -> SharcInstr -> SharcInstr -> SharcInstr -> SharcInstr -> PadsynthBandwidth -> Patch2
+vedicPadCfd4 kX kY instr1 instr2 instr3 instr4 bandwidth = mul 0.8 $
+ addPreFx 0.45 (pingPong 0.25 0.65 0.5) $
+ psDeepSoftPadSharcCfd4' kX kY
+ (def { padSharcBandwidth = bandwidth, padSharcSize = 15 }, instr1) (def { padSharcBandwidth = bandwidth, padSharcSize = 15 }, instr2)
+ (def { padSharcBandwidth = bandwidth, padSharcSize = 15 }, instr3) (def { padSharcBandwidth = bandwidth, padSharcSize = 15 }, instr4)
+
+
+-- | Deep spiritual drones. Contains twice as many ftables as for simple @vedicPad@.
+--
+-- > vedicPad sharcInstrument bandwidth
+--
+-- Good values for bandwidth lies in the interval [0, 120]
+vedicPadHifi :: SharcInstr -> PadsynthBandwidth -> Patch2
+vedicPadHifi instr bandwidth = mul 0.8 $
+ addPreFx 0.45 (pingPong 0.25 0.65 0.5) $
+ deepPad $
+ psSoftPadSharc' (def { padSharcBandwidth = bandwidth, padSharcSize = 32 }) instr
+
+-- | Deep spiritual drones. Contains only quater of ftables as for simple @vedicPad@.
+--
+-- > vedicPad sharcInstrument bandwidth
+--
+-- Good values for bandwidth lies in the interval [0, 120]
+vedicPadLofi :: SharcInstr -> PadsynthBandwidth -> Patch2
+vedicPadLofi instr bandwidth = mul 0.8 $
+ addPreFx 0.45 (pingPong 0.25 0.65 0.5) $
+ deepPad $
+ psSoftPadSharc' (def { padSharcBandwidth = bandwidth, padSharcSize = 4 }) instr
+
+-- | Eminent
+vibhu :: PadsynthBandwidth -> Patch2
+vibhu = vedicPad shVibhu
+
+shVibhu = shAltoFlute
+
+-- | Wise
+rishi :: PadsynthBandwidth -> Patch2
+rishi = vedicPad shRishi
+
+shRishi = shFlute
+
+-- | Fire
+agni :: PadsynthBandwidth -> Patch2
+agni = vedicPad shAgni
+
+shAgni = shCello
+
+-- | Material nature
+prakriti :: PadsynthBandwidth -> Patch2
+prakriti = vedicPad shPrakriti
+
+shPrakriti = shClarinet
+
+-- | Desire
+rajas :: PadsynthBandwidth -> Patch2
+rajas = vedicPad shRajas
+
+shRajas = shViolin
+
+-- | the hero
+avatara :: PadsynthBandwidth -> Patch2
+avatara = vedicPad shAvatara
+
+shAvatara = shFrenchHorn
+
+-- | Earth
+bhumi :: PadsynthBandwidth -> Patch2
+bhumi = vedicPad shBhumi
+
+shBhumi = shViolinsEnsemble
+
+-- | Eminent
+vibhuHifi :: PadsynthBandwidth -> Patch2
+vibhuHifi = vedicPadHifi shAltoFlute
+
+-- | Wise
+rishiHifi :: PadsynthBandwidth -> Patch2
+rishiHifi = vedicPadHifi shFlute
+
+-- | Fire
+agniHifi :: PadsynthBandwidth -> Patch2
+agniHifi = vedicPadHifi shCello
+
+-- | Material nature
+prakritiHifi :: PadsynthBandwidth -> Patch2
+prakritiHifi = vedicPadHifi shClarinet
+
+-- | Desire
+rajasHifi :: PadsynthBandwidth -> Patch2
+rajasHifi = vedicPadHifi shViolin
+
+-- | the hero
+avataraHifi :: PadsynthBandwidth -> Patch2
+avataraHifi = vedicPadHifi shFrenchHorn
+
+-- | Earth
+bhumiHifi :: PadsynthBandwidth -> Patch2
+bhumiHifi = vedicPadHifi shViolinsEnsemble
+
+
+-- | Eminent
+vibhuLofi :: PadsynthBandwidth -> Patch2
+vibhuLofi = vedicPadLofi shAltoFlute
+
+-- | Wise
+rishiLofi :: PadsynthBandwidth -> Patch2
+rishiLofi = vedicPadLofi shFlute
+
+-- | Fire
+agniLofi :: PadsynthBandwidth -> Patch2
+agniLofi = vedicPadLofi shCello
+
+-- | Material nature
+prakritiLofi :: PadsynthBandwidth -> Patch2
+prakritiLofi = vedicPadLofi shClarinet
+
+-- | Desire
+rajasLofi :: PadsynthBandwidth -> Patch2
+rajasLofi = vedicPadLofi shViolin
+
+-- | the hero
+avataraLofi :: PadsynthBandwidth -> Patch2
+avataraLofi = vedicPadLofi shFrenchHorn
+
+-- | Earth
+bhumiLofi :: PadsynthBandwidth -> Patch2
+bhumiLofi = vedicPadLofi shViolinsEnsemble
+
+-----------------------------
+-- crossfade pads
+
+vedicCfd :: SharcInstr -> SharcInstr -> PadsynthBandwidth -> Sig -> Patch2
+vedicCfd inst1 instr2 bandwidth cfdLevel = vedicPadCfd cfdLevel inst1 instr2 bandwidth
+
+vibhuRishi :: PadsynthBandwidth -> Sig -> Patch2
+vibhuRishi = vedicCfd shVibhu shRishi
+
+vibhuAgni :: PadsynthBandwidth -> Sig -> Patch2
+vibhuAgni = vedicCfd shVibhu shAgni
+
+vibhuPrakriti :: PadsynthBandwidth -> Sig -> Patch2
+vibhuPrakriti = vedicCfd shVibhu shPrakriti
+
+vibhuRajas :: PadsynthBandwidth -> Sig -> Patch2
+vibhuRajas = vedicCfd shVibhu shRajas
+
+vibhuAvatara :: PadsynthBandwidth -> Sig -> Patch2
+vibhuAvatara = vedicCfd shVibhu shAvatara
+
+vibhuBhumi :: PadsynthBandwidth -> Sig -> Patch2
+vibhuBhumi = vedicCfd shVibhu shBhumi
+
+rishiAgni :: PadsynthBandwidth -> Sig -> Patch2
+rishiAgni = vedicCfd shRishi shAgni
+
+rishiPrakriti :: PadsynthBandwidth -> Sig -> Patch2
+rishiPrakriti = vedicCfd shRishi shPrakriti
+
+rishiRajas :: PadsynthBandwidth -> Sig -> Patch2
+rishiRajas = vedicCfd shRishi shRajas
+
+rishiAvatara :: PadsynthBandwidth -> Sig -> Patch2
+rishiAvatara = vedicCfd shRishi shAvatara
+
+rishiBhumi :: PadsynthBandwidth -> Sig -> Patch2
+rishiBhumi = vedicCfd shRishi shRajas
+
+agniPrakriti :: PadsynthBandwidth -> Sig -> Patch2
+agniPrakriti = vedicCfd shAgni shPrakriti
+
+agniRajas :: PadsynthBandwidth -> Sig -> Patch2
+agniRajas = vedicCfd shAgni shRajas
+
+agniAvatara :: PadsynthBandwidth -> Sig -> Patch2
+agniAvatara = vedicCfd shAgni shAvatara
+
+agniBhumi :: PadsynthBandwidth -> Sig -> Patch2
+agniBhumi = vedicCfd shAgni shBhumi
+
+prakritiRajas :: PadsynthBandwidth -> Sig -> Patch2
+prakritiRajas = vedicCfd shPrakriti shRajas
+
+prakritiAvatara :: PadsynthBandwidth -> Sig -> Patch2
+prakritiAvatara = vedicCfd shPrakriti shAvatara
+
+prakritiBhumi :: PadsynthBandwidth -> Sig -> Patch2
+prakritiBhumi = vedicCfd shPrakriti shBhumi
+
+rajasAvatara :: PadsynthBandwidth -> Sig -> Patch2
+rajasAvatara = vedicCfd shRajas shAvatara
+
+rajasBhumi :: PadsynthBandwidth -> Sig -> Patch2
+rajasBhumi = vedicCfd shRajas shBhumi
+
+avataraBhumi :: PadsynthBandwidth -> Sig -> Patch2
+avataraBhumi = vedicCfd shAvatara shBhumi
+
+----------------------------------------
+-- noisy padsynth pads
+
+noisyRise :: Patch2
+noisyRise = Patch {
+ patchInstr = onCps $ \cps -> mul 0.24 $ wave cps,
+ patchFx = [FxSpec 0.35 (return . largeHall2), FxSpec 0.5 (at $ echo 0.25 0.85)]
+ }
+ where
+ wave x = noisy x + pad x
+ noisy x = at (mul 0.3 . fromMono . bat (bp (x * 5) 23) . lp (300 + 2500 * linseg [0, 0.73, 0, 8, 3]) 14) white
+ pad x = envelope $ filter x $ padsynthOsc2 spec x + mul 0.15 (padsynthOsc2 spec (x * 5)) + mul 0.5 (padsynthOsc2 spec (x / 2))
+
+ envelope asig = mul (fades 0.5 0.7) asig
+ filter cps asig = at (bhp 30) $ bat (lp (200 + (cps + 3000)) 45) $ asig
+
+ spec = noisySpec
+
+noisySpiral :: Patch2
+noisySpiral = noisySpiral' 8
+
+-- | Oscillating noise:
+--
+-- > noisySpiral' finalSpeedOfOscillation
+noisySpiral' :: D -> Patch2
+noisySpiral' spiralSpeed = Patch {
+ patchInstr = onCps $ \cps -> mul 0.24 $ wave cps,
+ patchFx = [FxSpec 0.15 (return . magicCave2), FxSpec 0.43 (at $ echo 0.35 0.85)]
+ }
+ where
+ wave x = noisy x + pad x
+ noisy x = at (mul 0.3 . fromMono . bat (bp (x * 5) 23) . lp (300 + 2500 * linseg [0, 0.73, 0, 8, 3] * uosc (expseg [0.25, 5, spiralSpeed])) 14) white
+ pad x = envelope $ filter x $ padsynthOsc2 spec x + mul 0.15 (padsynthOsc2 spec (x * 5)) + mul 0.5 (padsynthOsc2 spec (x / 2))
+ envelope asig = mul (fades 0.5 0.7) asig
+ filter cps asig = at (bhp 30) $ bat (lp (200 + (cps + 3000)) 45) $ asig
+
+ spec = noisySpec
+
+
+noisyHarms = [ 1, 1, 0.7600046992, 0.6199994683, 0.9399998784, 0.4400023818, 0.0600003302, 0.8499968648, 0.0899999291, 0.8199964762, 0.3199984133, 0.9400014281, 0.3000001907, 0.120003365, 0.1799997687, 0.5200006366]
+noisySpec = defPadsynthSpec 82.2 noisyHarms
+
+
+-- dac $ mul 0.24 $ at (bhp 30) $ mixAt 0.15 magicCave2 $ mixAt 0.43 (echo 0.35 0.85) $ midi $ onMsg $ (\cps -> (bat (lp (200 + (cps + 3000)) 45) . mul (fades 0.5 0.7) . (\x -> (at (mul 0.3 . fromMono . bat (bp (x * 11) 23) . lp (300 + 2500 * linseg [0, 0.73, 0, 8, 3] * uosc (expseg [0.25, 5, 8])) 14) white) + padsynthOsc2 spec x + mul 0.15 (padsynthOsc2 spec (x * 5)) + mul 0.5 (padsynthOsc2 spec (x / 2)))) cps)
+
+-- dac $ mul 0.24 $ at (bhp 30) $ mixAt 0.35 largeHall2 $ mixAt 0.5 (echo 0.25 0.85) $ midi $ onMsg $ (\cps -> (bat (lp (200 + (cps + 3000)) 45) . mul (fades 0.5 0.7) . (\x -> (at (mul 0.3 . fromMono . bat (bp (x * 5) 23) . lp (300 + 2500 * linseg [0, 0.73, 0, 8, 3]) 14) white) + padsynthOsc2 spec x + mul 0.15 (padsynthOsc2 spec (x * 5)) + mul 0.5 (padsynthOsc2 spec (x / 2)))) cps)
+
+
+
+
+
+
+