-- | The Csound contains a set of functions for granular synthesis.
-- Unfortunately they are very hard to use due to large number of arguments.
-- This module attempts to set most of the arguments with sensible defaults.
-- So that a novice could start to use it. The defaults are implemented with
-- the help of the class @Default@. It's a standard way to implement defaults
-- in the Haskell. The class @Defaults@ defines a single constnat called @def@.
-- With @def@ we can get the default value for the given type.
--
-- Several csound opcodes are reimplemented so that first argument contains
-- secondary parameters. The type for parameters always has the instance for the
-- class @Default@. The original csound opcodes are defined in the end of the module
-- with prefix @csd@.
--
-- Also many granular synth opcodes expect the sound file as input.
-- There are predefined versions of the opcodes that take in the file names
-- instead of tables with sampled sound. They have suffix @Snd@ for stereo and @Snd1@ for mono files.
--
-- For example, that's how we can use the @granule@ opcode:
--
-- > dac $ granuleSnd1 spec [1, 2, 3] grainSize "fox.wav"
--
-- No need to set all 22 parameters.
-- Look at the official tutorial (on github) for more examples.
--
-- The five functions are reimplemented in this way: @sndwarp@, @syncgrain@, @partikkel@, @granule@, @fof2@.
--
-- The most often used arguments are:
--
-- * Scale factors for tempo and pitch: @TempoSig@ or @speed@ and @PitchSig@. Ranges in 0 to 1
--
-- * Grain size is the size of produced grains in seconds. Good range is 0.005 to 0.01 or even 0.1.
--    The higer the value the more it sounds like the original sound.
--
-- * Grain rate. It's the speed of grain production in Hz. If it's in audio range
-- we can no longer percieve the original pitch of the file. Then the pitch is determined
-- with grain rate value.
--
-- * Grain gap. It's the gap in samples between the grains. Good values are 1 to 100.
--
-- * Grain window function. For the sound to be a grain it have to be enveloped
-- with grain window (some sort of bell shaped envelope). We can use half-sine for this purpose
-- (and it's so in most of the defauts) or we can use a table in the @GEN20@ family. In the library
-- they implemented as window tables see the table constructors with prefix @win@.
--
-- Usual order of arguments is: @GrainRate@, @GrainSize@, @TempoSig@, @PitchSig@, file @table@ or @name@, @poniter@ to the table.
--
module Csound.Air.Granular(
  GrainRate, GrainSize, Pointer, ConstPitchSig,

  -- * Grainy (simple partikkel)
  RndGrainySpec(..),
  grainy, grainy1, rndGrainy, rndGrainy1,
  ptrGrainy, rndPtrGrainy,
  ptrGrainySnd, ptrGrainySnd1,

  -- * Sndwarp
  SndwarpSpec(..),
  sndwarp, sndwarpst, sndwarpSnd, sndwarpSnd1,
  ptrSndwarp, ptrSndwarpst, ptrSndwarpSnd, ptrSndwarpSnd1,

  -- * Syncgrain
  SyncgrainSpec(..), RndSyncgrainSpec(..),
  syncgrain, syncgrainSnd, syncgrainSnd1,
  rndSyncgrain, rndSyncgrainSnd, rndSyncgrainSnd1,

  -- * Granule
  GranuleSpec(..), GranuleMode(..),
  granule, granuleSnd, granuleSnd1,

  -- * Partikkel
  PartikkelSpec(..),
  partikkel,

  -- * Fof2

  Fof2Spec(..),
  fof2, fof2Snd, fof2Snd1,

  -- * Granular delays

  -- | This block is for granular delay effects. To make granular delay from the granular functions
  -- it has to support reading from table with pointer (phasor).
  -- All functions have the same four parameters:
  --
  -- * @maxDelayTime@ -- maximum delay length in seсoncds.
  --
  -- * @delayTime@ -- delay time (it can vary. it's a signal).
  --
  -- * @feedback@ -- amount of feedback. How much of processed signal is mixed to
  --    the delayed signal
  --
  -- * @balance@ -- mix between dry and wet signal. 0 is dry only signal. 1 is wet only signl.
  --
  -- The rest arguments are taken from the original granular functions.
  grainyDelay, rndGrainyDelay, sndwarpDelay,
  syncgrainDelay, rndSyncgrainDelay, partikkelDelay, fofDelay,

  -- * Granular effets

  -- | The functions are based on the granular delays.
  -- each function is a granular delay with zero feedback and instant delay time.
  grainyFx, rndGrainyFx, sndwarpFx,
  syncgrainFx, rndSyncgrainFx, partikkelFx, fofFx,

  -- * Csound functions
  csdSndwarp, csdSndwarpst, csdSyncgrain, csdGranule, csdPartikkel
) where

-- http://www.youtube.com/watch?v=tVW809gMND0

import Data.Default
import Csound.Dynamic hiding (int, when1, whens)
import Csound.Typed

import Csound.Typed.Opcode hiding(partikkel, granule, grain, syncgrain, sndwarp, sndwarpst, fof2, tab, pitch, tempo)
import qualified Csound.Typed.Opcode as C(granule, sndwarp, sndwarpst, fof2)

import Csound.Air.Wav(PitchSig, TempoSig, lengthSnd)
import Csound.Air.Fx(tabDelay, MaxDelayTime, DelayTime, Feedback, Balance)
import Csound.Tab

-- example
--
-- let q n = mul 0.1 $ grainy2 w2 1 (60 + 260 * uosc 0.25) (0.01 + 0.1 * uosc 0.1) (semitone n)
-- let w a b c = mul 0.1 $ q a + q b + q c
-- dac $ at magicCave2 $ (w 0 7 12) + delaySnd 2 (w (-12) (12 + 5) (12 + 7)) + delaySnd 1.3 (w 0 5 24)

-----------------------------------------------------------------
-- partikkel

type GrainRate  = Sig
type GrainSize  = Sig
type Pointer  = Sig

type ConstPitchSig = D
----------------------------------------------------------------------
-- partikkel

-- | Secondary parameters for the partikkel opcode. We can use the @def@ to get the defaults.
-- See the official docs to know the complete description:
--
-- csound doc: <http://www.csounds.com/manual/html/partikkel.html>
data PartikkelSpec = PartikkelSpec
  { PartikkelSpec -> Sig
partikkelDistribution   :: Sig
  , PartikkelSpec -> Tab
partikkelDisttab      :: Tab
  , PartikkelSpec -> Sig
partikkelSync       :: Sig
  , PartikkelSpec -> Sig
partikkelEnv2amt      :: Sig
  , PartikkelSpec -> Tab
partikkelEnv2tab      :: Tab
  , PartikkelSpec -> Tab
partikkelEnv_attack   :: Tab
  , PartikkelSpec -> Tab
partikkelEnv_decay    :: Tab
  , PartikkelSpec -> Sig
partikkelSustain_amount :: Sig
  , PartikkelSpec -> Sig
partikkelA_d_ratio    :: Sig
  , PartikkelSpec -> Sig
partikkelAmp        :: Sig
  , PartikkelSpec -> Tab
partikkelGainmasks    :: Tab
  , PartikkelSpec -> Sig
partikkelSweepshape     :: Sig
  , PartikkelSpec -> Tab
partikkelWavfreqstarttab  :: Tab
  , PartikkelSpec -> Tab
partikkelWavfreqendtab  :: Tab
  , PartikkelSpec -> Sig
partikkelWavfm      :: Sig
  , PartikkelSpec -> Tab
partikkelFmamptab     :: Tab
  , PartikkelSpec -> Tab
partikkelFmenv      :: Tab
  , PartikkelSpec -> Tab
partikkelCosine       :: Tab
  , PartikkelSpec -> Sig
partikkelNumpartials    :: Sig
  , PartikkelSpec -> Sig
partikkelChroma       :: Sig
  , PartikkelSpec -> Tab
partikkelChannelmasks   :: Tab
  , PartikkelSpec -> Sig
partikkelRandommask     :: Sig
  , PartikkelSpec -> Tab
partikkelWaveamptab     :: Tab
  , PartikkelSpec -> [Sig]
partikkelWavekeys     :: [Sig]
  , PartikkelSpec -> D
partikkelMax_grains   :: D
  }

instance Default PartikkelSpec where
  def :: PartikkelSpec
def = PartikkelSpec :: Sig
-> Tab
-> Sig
-> Sig
-> Tab
-> Tab
-> Tab
-> Sig
-> Sig
-> Sig
-> Tab
-> Sig
-> Tab
-> Tab
-> Sig
-> Tab
-> Tab
-> Tab
-> Sig
-> Sig
-> Tab
-> Sig
-> Tab
-> [Sig]
-> D
-> PartikkelSpec
PartikkelSpec
    { partikkelDistribution :: Sig
partikkelDistribution   = Sig
1
    , partikkelDisttab :: Tab
partikkelDisttab      = Int -> Tab -> Tab
setSize Int
32768 (Tab -> Tab) -> Tab -> Tab
forall a b. (a -> b) -> a -> b
$ [Double] -> Tab
lins [Double
0, Double
1, Double
1]
    , partikkelSync :: Sig
partikkelSync       = Sig
0
    , partikkelEnv2amt :: Sig
partikkelEnv2amt      = Sig
1
    , partikkelEnv2tab :: Tab
partikkelEnv2tab      = Int -> Tab -> Tab
setSize Int
4096 (Tab -> Tab) -> Tab -> Tab
forall a b. (a -> b) -> a -> b
$ Tab
winSync
    , partikkelEnv_attack :: Tab
partikkelEnv_attack   = Tab
noTab
    , partikkelEnv_decay :: Tab
partikkelEnv_decay    = Tab
noTab
    , partikkelSustain_amount :: Sig
partikkelSustain_amount = Sig
0
    , partikkelA_d_ratio :: Sig
partikkelA_d_ratio    = Sig
0
    , partikkelAmp :: Sig
partikkelAmp        = Sig
1
    , partikkelGainmasks :: Tab
partikkelGainmasks    = Tab
noTab
    , partikkelSweepshape :: Sig
partikkelSweepshape     = Sig
0
    , partikkelWavfreqstarttab :: Tab
partikkelWavfreqstarttab  = Tab
noTab
    , partikkelWavfreqendtab :: Tab
partikkelWavfreqendtab  = Tab
noTab
    , partikkelWavfm :: Sig
partikkelWavfm      = Sig
0
    , partikkelFmamptab :: Tab
partikkelFmamptab     = Tab
noTab
    , partikkelFmenv :: Tab
partikkelFmenv      = Tab
noTab
    , partikkelCosine :: Tab
partikkelCosine       = Int -> Tab -> Tab
setSize Int
8193 (Tab -> Tab) -> Tab -> Tab
forall a b. (a -> b) -> a -> b
$ [(Double, Double, Double)] -> Tab
sines3 [(Double
1, Double
1, Double
90)]
    , partikkelNumpartials :: Sig
partikkelNumpartials    = Sig
1
    , partikkelChroma :: Sig
partikkelChroma       = Sig
1
    , partikkelChannelmasks :: Tab
partikkelChannelmasks   = Tab
noTab
    , partikkelRandommask :: Sig
partikkelRandommask     = Sig
0
    , partikkelWaveamptab :: Tab
partikkelWaveamptab     = Tab
noTab
    , partikkelWavekeys :: [Sig]
partikkelWavekeys     = [Sig
1]
    , partikkelMax_grains :: D
partikkelMax_grains   = D
1000
    }

-- | Randomized parameters for function @grainy@. We can randomize pitch scaleing factor (0 to 1),
-- read position (in ratio: 0 to 1), and duration of the grains (in seconds, in magnitude of 0.005 to 0.5).
data RndGrainySpec = RndGrainySpec
  { RndGrainySpec -> Sig
rndGrainyPitch  :: Sig
  , RndGrainySpec -> Sig
rndGrainyPos    :: Sig
  , RndGrainySpec -> Sig
rndGrainyDur    :: Sig
  }

instance Default RndGrainySpec where
  def :: RndGrainySpec
def = RndGrainySpec :: Sig -> Sig -> Sig -> RndGrainySpec
RndGrainySpec
    { rndGrainyPitch :: Sig
rndGrainyPitch  = Sig
0.25
    , rndGrainyPos :: Sig
rndGrainyPos    = Sig
0.1
    , rndGrainyDur :: Sig
rndGrainyDur    = Sig
0.2
    }

-- |
-- Granular synthesizer with "per grain" control
--       over many of its parameters.  Has a sync input to
--       sychronize its internal grain scheduler clock to an external
--       clock source.
--
-- partikkel was conceived after reading Curtis Roads' book
--       "Microsound", and the goal was to create an opcode that was
--       capable of all time-domain varieties of granular synthesis
--       described in this book. The idea being that most of the
--       techniques only differ in parameter values, and by having a
--       single opcode that can do all varieties of granular synthesis
--       makes it possible to interpolate between techniques. Granular synthesis is sometimes dubbed particle
--       synthesis, and it was thought apt to name the opcode partikkel
--       to distinguish it from other granular opcodes.
--
-- > partikkel spec grainrate grainsize kpitch ifiltabs apnters
--
-- * @spec@ - secondary parameters
--
-- * @grainrate@ - rate of the grain creation
--
-- * @grainsize@ - grain size in sec (!!!not in ms as for Csound!!!).
--
-- * @kpitch@ -- pitch scaling factor.
--
-- * @apnters@ -- list of pointers (up to 4 values can be used)
--
-- * @ifiltabs@ -- list of tables (up to 4 values can be used)
partikkel :: PartikkelSpec -> GrainRate -> GrainSize -> PitchSig -> [Tab] -> [Pointer] -> Sig
partikkel :: PartikkelSpec -> Sig -> Sig -> Sig -> [Tab] -> [Sig] -> Sig
partikkel PartikkelSpec
spec Sig
kgrainrate Sig
kgrainsize Sig
kpitch [Tab]
ifiltab [Sig]
apnter = Sig -> Sig -> Sig
forall a. SigSpace a => Sig -> a -> a
mul Sig
0.2 Sig
res
  where
    res :: Sig
res = Sig
-> Sig
-> Tab
-> Sig
-> Sig
-> Tab
-> Tab
-> Tab
-> Sig
-> Sig
-> Sig
-> Sig
-> Tab
-> Sig
-> Sig
-> Tab
-> Tab
-> Sig
-> Tab
-> Tab
-> Tab
-> Sig
-> Sig
-> Sig
-> Tab
-> Sig
-> Tab
-> Tab
-> Tab
-> Tab
-> Tab
-> Sig
-> Sig
-> Sig
-> Sig
-> Sig
-> Sig
-> Sig
-> Sig
-> D
-> Sig
forall a.
Tuple a =>
Sig
-> Sig
-> Tab
-> Sig
-> Sig
-> Tab
-> Tab
-> Tab
-> Sig
-> Sig
-> Sig
-> Sig
-> Tab
-> Sig
-> Sig
-> Tab
-> Tab
-> Sig
-> Tab
-> Tab
-> Tab
-> Sig
-> Sig
-> Sig
-> Tab
-> Sig
-> Tab
-> Tab
-> Tab
-> Tab
-> Tab
-> Sig
-> Sig
-> Sig
-> Sig
-> Sig
-> Sig
-> Sig
-> Sig
-> D
-> a
csdPartikkel
        Sig
kgrainrate (PartikkelSpec -> Sig
partikkelDistribution PartikkelSpec
spec) (PartikkelSpec -> Tab
partikkelDisttab PartikkelSpec
spec) (PartikkelSpec -> Sig
partikkelSync PartikkelSpec
spec)
        (PartikkelSpec -> Sig
partikkelEnv2amt PartikkelSpec
spec) (PartikkelSpec -> Tab
partikkelEnv2tab PartikkelSpec
spec) (PartikkelSpec -> Tab
partikkelEnv_attack PartikkelSpec
spec) (PartikkelSpec -> Tab
partikkelEnv_decay PartikkelSpec
spec)
        (PartikkelSpec -> Sig
partikkelSustain_amount PartikkelSpec
spec) (PartikkelSpec -> Sig
partikkelA_d_ratio PartikkelSpec
spec) (Sig
kgrainsize Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
1000) (PartikkelSpec -> Sig
partikkelAmp PartikkelSpec
spec)
        (PartikkelSpec -> Tab
partikkelGainmasks PartikkelSpec
spec) Sig
kwavfreq (PartikkelSpec -> Sig
partikkelSweepshape PartikkelSpec
spec) (PartikkelSpec -> Tab
partikkelWavfreqstarttab PartikkelSpec
spec)
        (PartikkelSpec -> Tab
partikkelWavfreqendtab PartikkelSpec
spec) (PartikkelSpec -> Sig
partikkelWavfm PartikkelSpec
spec) (PartikkelSpec -> Tab
partikkelFmamptab PartikkelSpec
spec) (PartikkelSpec -> Tab
partikkelFmenv PartikkelSpec
spec)
        (PartikkelSpec -> Tab
partikkelCosine PartikkelSpec
spec) Sig
kgrainrate (PartikkelSpec -> Sig
partikkelNumpartials PartikkelSpec
spec) (PartikkelSpec -> Sig
partikkelChroma PartikkelSpec
spec)
        (PartikkelSpec -> Tab
partikkelChannelmasks PartikkelSpec
spec) (PartikkelSpec -> Sig
partikkelRandommask PartikkelSpec
spec)
        Tab
filtab1 Tab
filtab2 Tab
filtab3 Tab
filtab4
        (PartikkelSpec -> Tab
partikkelWaveamptab PartikkelSpec
spec)
        Sig
apnter1 Sig
apnter2 Sig
apnter3 Sig
apnter4
        Sig
keys1 Sig
keys2 Sig
keys3 Sig
keys4
        (PartikkelSpec -> D
partikkelMax_grains PartikkelSpec
spec)

    iorig :: D
iorig   =     D
1 D -> D -> D
forall a. Fractional a => a -> a -> a
/ (Tab -> D
ftlen([Tab] -> Tab
forall a. [a] -> a
head [Tab]
ifiltab)D -> D -> D
forall a. Fractional a => a -> a -> a
/D
getSampleRate)
    kwavfreq :: Sig
kwavfreq  =     D -> Sig
sig D
iorig Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
kpitch

    Tab
filtab1 : Tab
filtab2 : Tab
filtab3 : Tab
filtab4 : [Tab]
_ = [Tab] -> [Tab]
forall a. [a] -> [a]
cycle [Tab]
ifiltab
    Sig
apnter1 : Sig
apnter2 : Sig
apnter3 : Sig
apnter4 : [Sig]
_ = [Sig] -> [Sig]
forall a. [a] -> [a]
cycle [Sig]
apnter
    Sig
keys1   : Sig
keys2   : Sig
keys3   : Sig
keys4   : [Sig]
_ = [Sig] -> [Sig]
forall a. [a] -> [a]
cycle (PartikkelSpec -> [Sig]
partikkelWavekeys PartikkelSpec
spec)

-- | Simplified version of partikkel. The partikkel for mono sounds.
--
-- > grainy1 speed grainrate grainsize kfreqFactor file
--
-- * @speed@ - speed of the playback
--
-- * @grainrate@ - rate of the grain creation
--
-- * @grainsize@ - size of the grains
--
-- * @file@ - filename of an audio file to read the grains.
grainy1 :: GrainRate -> GrainSize -> TempoSig -> PitchSig -> String -> Sig
grainy1 :: Sig -> Sig -> Sig -> Sig -> String -> Sig
grainy1 = Int -> Sig -> Sig -> Sig -> Sig -> String -> Sig
grainyChn Int
1

-- | Simplified version of partikkel. The partikkel for stereo sounds.
--
-- > grainy1 speed grainrate grainsize kfreqFactor file
--
-- * @speed@ - speed of the playback
--
-- * @grainrate@ - rate of the grain creation
--
-- * @grainsize@ - size of the grains
--
-- * @file@ - filename of an audio file to read the grains.
grainy :: GrainRate -> GrainSize -> TempoSig -> PitchSig -> String -> Sig2
grainy :: Sig -> Sig -> Sig -> Sig -> String -> Sig2
grainy Sig
kgrainrate Sig
kgrainsize Sig
kspeed Sig
kfreqFactor String
file = (Int -> Sig
f Int
1, Int -> Sig
f Int
2)
  where f :: Int -> Sig
f Int
n = Int -> Sig -> Sig -> Sig -> Sig -> String -> Sig
grainyChn Int
n Sig
kgrainrate Sig
kgrainsize Sig
kspeed Sig
kfreqFactor String
file

grainyChn :: Int -> GrainRate -> GrainSize -> TempoSig -> PitchSig -> String -> Sig
grainyChn :: Int -> Sig -> Sig -> Sig -> Sig -> String -> Sig
grainyChn Int
n Sig
kgrainrate Sig
kgrainsize Sig
kspeed Sig
kpitch String
file =
  Sig -> Sig -> Sig -> Tab -> Sig -> Sig
ptrGrainy Sig
kgrainrate Sig
kgrainsize Sig
kpitch (Int -> String -> Tab
grainyTab Int
n String
file) (Sig -> String -> Sig
grainyPtr Sig
kspeed String
file)

-- | Randomized version of @grainy1@.
rndGrainy1 :: RndGrainySpec -> GrainRate -> GrainSize -> TempoSig -> PitchSig -> String -> SE Sig
rndGrainy1 :: RndGrainySpec -> Sig -> Sig -> Sig -> Sig -> String -> SE Sig
rndGrainy1 = Int
-> RndGrainySpec -> Sig -> Sig -> Sig -> Sig -> String -> SE Sig
rndGrainyChn Int
1

-- | Randomized version of @grainy@.
rndGrainy :: RndGrainySpec -> GrainRate -> GrainSize -> TempoSig -> PitchSig -> String -> SE Sig2
rndGrainy :: RndGrainySpec -> Sig -> Sig -> Sig -> Sig -> String -> SE Sig2
rndGrainy RndGrainySpec
spec Sig
kgrainrate Sig
kgrainsize Sig
kspeed Sig
kfreqFactor String
file = do
  Sig
asig1 <- Int -> SE Sig
f Int
1140
  Sig
asig2 <- Int -> SE Sig
f Int
2
  Sig2 -> SE Sig2
forall (m :: * -> *) a. Monad m => a -> m a
return (Sig
asig1, Sig
asig2)
  where f :: Int -> SE Sig
f Int
n = Int
-> RndGrainySpec -> Sig -> Sig -> Sig -> Sig -> String -> SE Sig
rndGrainyChn Int
n RndGrainySpec
spec Sig
kgrainrate Sig
kgrainsize Sig
kspeed Sig
kfreqFactor String
file

rndGrainyChn :: Int -> RndGrainySpec -> GrainRate -> GrainSize -> TempoSig -> PitchSig -> String -> SE Sig
rndGrainyChn :: Int
-> RndGrainySpec -> Sig -> Sig -> Sig -> Sig -> String -> SE Sig
rndGrainyChn Int
n RndGrainySpec
spec Sig
kgrainrate Sig
kgrainsize Sig
kspeed Sig
kpitch String
file =
  RndGrainySpec -> Sig -> Sig -> Sig -> Tab -> Sig -> SE Sig
rndPtrGrainy RndGrainySpec
spec Sig
kgrainrate Sig
kgrainsize Sig
kpitch (Int -> String -> Tab
grainyTab Int
n String
file) (Sig -> String -> Sig
grainyPtr Sig
kspeed String
file)


-- | Simplified version of partikkel with pointer access to the table. The partikkel for mono sounds.
--
-- > ptrGrainy grainrate grainsize kfreqFactor tab apnter
--
-- * @speed@ - speed of the playback
--
-- * @grainrate@ - rate of the grain creation
--
-- * @grainsize@ - size of the grains
--
-- * @tab@ - table with sampled sound.
--
-- * @apnter@ - pointer to the table. pointer is relative to total size (0 to 1).
ptrGrainy :: GrainRate -> GrainSize -> PitchSig -> Tab -> Pointer -> Sig
ptrGrainy :: Sig -> Sig -> Sig -> Tab -> Sig -> Sig
ptrGrainy Sig
kgrainrate Sig
kgrainsize Sig
kcent Tab
ifiltab Sig
apnter =
  PartikkelSpec -> Sig -> Sig -> Sig -> [Tab] -> [Sig] -> Sig
partikkel PartikkelSpec
forall a. Default a => a
def Sig
kgrainrate Sig
kgrainsize Sig
kcent [Tab
ifiltab] [Sig
apnter]

-- | Simplified version of partikkel with pointer access to the table. The partikkel for mono sounds.
--
-- > ptrGrainy grainrate grainsize kfreqFactor tab apnter
--
-- * @speed@ - speed of the playback
--
-- * @grainrate@ - rate of the grain creation
--
-- * @grainsize@ - size of the grains
--
-- * @file@ - file with sampled sound.
--
-- * @apnter@ - pointer to the table in seconds
ptrGrainySnd :: GrainRate -> GrainSize -> PitchSig -> String -> Pointer -> Sig2
ptrGrainySnd :: Sig -> Sig -> Sig -> String -> Sig -> Sig2
ptrGrainySnd Sig
kgrainrate Sig
kgrainsize Sig
kcent String
file Sig
apnter = (Tab -> Sig
f (String -> Double -> WavChn -> Tab
wavs String
file Double
0 WavChn
WavLeft), Tab -> Sig
f (String -> Double -> WavChn -> Tab
wavs String
file Double
0 WavChn
WavRight))
  where f :: Tab -> Sig
f Tab
tab = PartikkelSpec -> Sig -> Sig -> Sig -> [Tab] -> [Sig] -> Sig
partikkel PartikkelSpec
forall a. Default a => a
def Sig
kgrainrate Sig
kgrainsize Sig
kcent [Tab
tab] [Sig
apnter Sig -> Sig -> Sig
forall a. Fractional a => a -> a -> a
/ D -> Sig
sig (String -> D
lengthSnd String
file)]

-- | Simplified version of partikkel with pointer access to the table. The partikkel for mono sounds.
--
-- > ptrGrainy grainrate grainsize kfreqFactor tab apnter
--
-- * @speed@ - speed of the playback
--
-- * @grainrate@ - rate of the grain creation
--
-- * @grainsize@ - size of the grains
--
-- * @file@ - file with sampled sound.
--
-- * @apnter@ - pointer to the table in seconds
ptrGrainySnd1 :: GrainRate -> GrainSize -> PitchSig -> String -> Pointer -> Sig
ptrGrainySnd1 :: Sig -> Sig -> Sig -> String -> Sig -> Sig
ptrGrainySnd1 Sig
kgrainrate Sig
kgrainsize Sig
kcent String
file Sig
apnter = Tab -> Sig
f (String -> Double -> WavChn -> Tab
wavs String
file Double
0 WavChn
WavLeft)
  where f :: Tab -> Sig
f Tab
tab = PartikkelSpec -> Sig -> Sig -> Sig -> [Tab] -> [Sig] -> Sig
partikkel PartikkelSpec
forall a. Default a => a
def Sig
kgrainrate Sig
kgrainsize Sig
kcent [Tab
tab] [Sig
apnter Sig -> Sig -> Sig
forall a. Fractional a => a -> a -> a
/ D -> Sig
sig (String -> D
lengthSnd String
file)]

-- | Randomized version of @ptrGrainy@.
rndPtrGrainy :: RndGrainySpec -> GrainRate -> GrainSize -> PitchSig -> Tab -> Pointer -> SE Sig
rndPtrGrainy :: RndGrainySpec -> Sig -> Sig -> Sig -> Tab -> Sig -> SE Sig
rndPtrGrainy RndGrainySpec
rndSpec Sig
kgrainrate Sig
kgrainsize Sig
kpitch Tab
ifiltab Sig
apnter = do
  Sig
kpitchRandVal <- Sig -> SE Sig
rand (RndGrainySpec -> Sig
rndGrainyPitch RndGrainySpec
rndSpec)
  Sig
arndpos <- Sig -> SE Sig
forall a. SigOrD a => a -> SE a
linrand (RndGrainySpec -> Sig
rndGrainyPos RndGrainySpec
rndSpec)
  Sig
krndsize <- Sig -> SE Sig
rand (RndGrainySpec -> Sig
rndGrainyDur RndGrainySpec
rndSpec)
  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 -> Tab -> Sig -> Sig
ptrGrainy Sig
kgrainrate (Sig
kgrainsize Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ Sig
krndsize) (Sig
kpitch Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ Sig
kpitchRandVal) Tab
ifiltab (Sig
apnter Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ Sig
arndpos)

grainyTab :: Int -> String -> Tab
grainyTab :: Int -> String -> Tab
grainyTab Int
n String
file = String -> Double -> WavChn -> Tab
wavs String
file Double
0 (if Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
1 then WavChn
WavLeft else WavChn
WavRight)

grainyPtr :: Sig -> String -> Sig
grainyPtr :: Sig -> String -> Sig
grainyPtr Sig
kspeed String
file = Sig
apnter
  where
    ifildur :: D
ifildur = Str -> D
filelen (Str -> D) -> Str -> D
forall a b. (a -> b) -> a -> b
$ String -> Str
text String
file
    apnter :: Sig
apnter = Sig -> Sig
phasor (Sig
kspeed Sig -> Sig -> Sig
forall a. Fractional a => a -> a -> a
/ D -> Sig
sig D
ifildur)

-----------------------------------------------------------------
-- granule

-- | Granule playback mode.
data GranuleMode = GranuleForward | GranuleBackward | GranuleRandom

fromGranuleMode :: GranuleMode -> D
fromGranuleMode :: GranuleMode -> D
fromGranuleMode GranuleMode
x = case GranuleMode
x of
  GranuleMode
GranuleForward -> D
1
  GranuleMode
GranuleBackward -> -D
1
  GranuleMode
GranuleRandom -> D
0

-- | Secondary parameters for @granule@. We can use the @def@ to get the defaults.
--
-- * @Gap@ - gap between grains in sec.
--
-- * Voice - number of voices (integer value in magnitude of 1 to 128, 64 is default)
--
-- * Ratio - ratio of the speed of the gskip pointer relative to output audio sample rate (the default is 1)
--
-- * Mode  - playback mode (see @GranuleMode@, play forward is the default)
--
-- * Skip_os - gskip pointer random offset in sec, 0 will be no offset (0.5 is default).
--
-- * Gap_os - gap random offset in ratios (0 to 1) of the gap size, 0 gives no offset (0.5 is default).
--
-- * Size_os -grain size random offset in ratios (0 to 1) of grain size, 0 gives no offset (0.5 is default).
--
-- * Seed - seed for the random number generator (0.5 is default).
--
-- * Att   -  attack of the grain envelope in ratios (0 to 1) of grain size (0.3 is default).
--
-- * Dec  - decay of the grain envelope in ratios (0 to 1) of grain size (0.3 is default).
--
data GranuleSpec = GranuleSpec
  { GranuleSpec -> Sig
granuleGap   :: Sig
  , GranuleSpec -> D
granuleVoice :: D
  , GranuleSpec -> D
granuleRatio :: D
  , GranuleSpec -> GranuleMode
granuleMode  :: GranuleMode
  , GranuleSpec -> D
granuleSkip_os :: D
  , GranuleSpec -> D
granuleGap_os :: D
  , GranuleSpec -> D
granuleSize_os :: D
  , GranuleSpec -> D
granuleSeed :: D
  , GranuleSpec -> D
granuleAtt   :: D
  , GranuleSpec -> D
granuleDec   :: D
  }

instance Default GranuleMode where
  def :: GranuleMode
def = GranuleMode
GranuleForward

instance Default GranuleSpec where
  def :: GranuleSpec
def = GranuleSpec :: Sig
-> D
-> D
-> GranuleMode
-> D
-> D
-> D
-> D
-> D
-> D
-> GranuleSpec
GranuleSpec
    { granuleGap :: Sig
granuleGap = Sig
0
    , granuleVoice :: D
granuleVoice = D
64
    , granuleRatio :: D
granuleRatio = D
1
    , granuleMode :: GranuleMode
granuleMode  = GranuleMode
forall a. Default a => a
def
    , granuleSkip_os :: D
granuleSkip_os = D
0.5
    , granuleGap_os :: D
granuleGap_os = D
0.5
    , granuleSize_os :: D
granuleSize_os = D
0.5
    , granuleSeed :: D
granuleSeed = D
0.5
    , granuleAtt :: D
granuleAtt   = D
0.3
    , granuleDec :: D
granuleDec   = D
0.3
    }

toPercent :: D -> D
toPercent :: D -> D
toPercent = (D
100 D -> D -> D
forall a. Num a => a -> a -> a
* )

-- | A more complex granular synthesis texture generator.
--
-- granule is a Csound unit generator which employs a wavetable as input
-- to produce granularly synthesized audio output. Wavetable data may be
-- generated by any of the GEN subroutines such as GEN01 which reads an
-- audio data file into a wavetable. This enable a sampled sound to be used
-- as the source for the grains. Up to 128 voices are implemented internally.
-- The maximum number of voices can be increased by redefining the variable MAXVOICE
-- in the grain4.h file. granule has a build-in random number generator to handle
-- all the random offset parameters. Thresholding is also implemented to scan the source
-- function table at initialization stage. This facilitates features such as skipping
-- silence passage between sentences.
--
-- > granule spec chord grainSize ftab
--
-- * @spec@ -- secondary parameters. We can use @def@ to get the defaults.
--
-- * @chord :: [D]@ -- the list of pitch factors to scale the original sound.
--    It can be up to 4 items long. This parameters allows us to create a chords out of grains.
--
-- * @grainSize@ -- grain size in sec.
--
-- * @ftab@ - table with sampled sound.
granule :: GranuleSpec -> [ConstPitchSig] -> GrainSize -> Tab -> Sig
granule :: GranuleSpec -> [D] -> Sig -> Tab -> Sig
granule GranuleSpec
spec [D]
chord Sig
kgsize Tab
ifn = D -> GranuleSpec -> [D] -> Sig -> Tab -> Sig
granuleWithLength D
len GranuleSpec
spec [D]
chord Sig
kgsize Tab
ifn
  where len :: D
len = Tab -> D
nsamp Tab
ifn D -> D -> D
forall a. Fractional a => a -> a -> a
/ D
getSampleRate

-- | @granule@ that is defined on stereo audio files. We provide the filename instead of table.
-- The rest is the same.
granuleSnd :: GranuleSpec -> [ConstPitchSig] -> GrainSize -> String -> Sig2
granuleSnd :: GranuleSpec -> [D] -> Sig -> String -> Sig2
granuleSnd GranuleSpec
spec [D]
chord Sig
kgsize String
file =
  ( D -> GranuleSpec -> [D] -> Sig -> Tab -> Sig
granuleWithLength D
len GranuleSpec
spec [D]
chord Sig
kgsize (String -> Double -> WavChn -> Tab
wavs String
file Double
0 WavChn
WavLeft)
  , D -> GranuleSpec -> [D] -> Sig -> Tab -> Sig
granuleWithLength D
len GranuleSpec
spec [D]
chord Sig
kgsize (String -> Double -> WavChn -> Tab
wavs String
file Double
0 WavChn
WavRight))
  where len :: D
len = Str -> D
filelen (Str -> D) -> Str -> D
forall a b. (a -> b) -> a -> b
$ String -> Str
text String
file

-- | @granule@ that is defined on mono audio files. We provide the filename instead of table.
-- The rest is the same.
granuleSnd1 :: GranuleSpec -> [ConstPitchSig] -> GrainSize -> String -> Sig
granuleSnd1 :: GranuleSpec -> [D] -> Sig -> String -> Sig
granuleSnd1 GranuleSpec
spec [D]
chord Sig
kgsize String
file = D -> GranuleSpec -> [D] -> Sig -> Tab -> Sig
granuleWithLength D
len GranuleSpec
spec [D]
chord Sig
kgsize (String -> Double -> WavChn -> Tab
wavs String
file Double
0 WavChn
WavLeft)
  where len :: D
len = Str -> D
filelen (Str -> D) -> Str -> D
forall a b. (a -> b) -> a -> b
$ String -> Str
text String
file

granuleWithLength :: D -> GranuleSpec -> [ConstPitchSig] -> GrainSize -> Tab -> Sig
granuleWithLength :: D -> GranuleSpec -> [D] -> Sig -> Tab -> Sig
granuleWithLength D
len GranuleSpec
spec [D]
chord Sig
kgsize Tab
ifn = Sig -> Sig -> Sig
forall a. SigSpace a => Sig -> a -> a
mul Sig
0.2 Sig
res
  where
    kgap :: Sig
kgap    = GranuleSpec -> Sig
granuleGap GranuleSpec
spec
    kamp :: Sig
kamp    = Sig
1
    ivoice :: D
ivoice      = GranuleSpec -> D
granuleVoice GranuleSpec
spec
    iratio :: D
iratio      = GranuleSpec -> D
granuleRatio GranuleSpec
spec
    imode :: D
imode       = GranuleMode -> D
fromGranuleMode (GranuleMode -> D) -> GranuleMode -> D
forall a b. (a -> b) -> a -> b
$ GranuleSpec -> GranuleMode
granuleMode GranuleSpec
spec
    ithd :: D
ithd        = D
0
    ipshift :: D
ipshift     = Int -> D
int (Int -> D) -> Int -> D
forall a b. (a -> b) -> a -> b
$ Int -> Int -> Int
forall a. Ord a => a -> a -> a
min ([D] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([D] -> Int) -> [D] -> Int
forall a b. (a -> b) -> a -> b
$ [D]
chord) Int
4
    igskip :: D
igskip      = D
0
    igskip_os :: D
igskip_os   = D -> D
toPercent (D -> D) -> D -> D
forall a b. (a -> b) -> a -> b
$ GranuleSpec -> D
granuleSkip_os GranuleSpec
spec
    ilength :: D
ilength     = D
len
    igap_os :: D
igap_os     = D -> D
toPercent (D -> D) -> D -> D
forall a b. (a -> b) -> a -> b
$ GranuleSpec -> D
granuleGap_os GranuleSpec
spec
    igsize_os :: D
igsize_os   = D -> D
toPercent (D -> D) -> D -> D
forall a b. (a -> b) -> a -> b
$ GranuleSpec -> D
granuleSize_os GranuleSpec
spec
    iatt :: D
iatt        = D -> D
toPercent (D -> D) -> D -> D
forall a b. (a -> b) -> a -> b
$ GranuleSpec -> D
granuleAtt GranuleSpec
spec
    idec :: D
idec        = D -> D
toPercent (D -> D) -> D -> D
forall a b. (a -> b) -> a -> b
$ GranuleSpec -> D
granuleDec GranuleSpec
spec
    iseed :: D
iseed       = GranuleSpec -> D
granuleSeed GranuleSpec
spec
    D
ipitch1 : D
ipitch2 : D
ipitch3 : D
ipitch4 : [D]
_ = [D]
chord [D] -> [D] -> [D]
forall a. [a] -> [a] -> [a]
++ [D
1, D
1, D
1, D
1]

    -- create the granular synthesis textures; one for each channel
    res :: Sig
res  = Sig
-> D
-> D
-> D
-> D
-> Tab
-> D
-> D
-> D
-> D
-> Sig
-> D
-> Sig
-> D
-> D
-> D
-> Sig
csdGranule Sig
kamp D
ivoice D
iratio D
imode D
ithd Tab
ifn D
ipshift D
igskip
        D
igskip_os D
ilength Sig
kgap D
igap_os Sig
kgsize D
igsize_os D
iatt D
idec Sig -> [D] -> Sig
forall a. Tuple a => a -> [D] -> a
`withDs` [D
iseed, D
ipitch1, D
ipitch2, D
ipitch3, D
ipitch4]

---------------------------------------------------------
-- syncgrain

-- | Secondary parameters for syncgrain.
--
-- * @Win@ -- grain window function (half-sine is used by default)
--
-- * @Overlap@ -- grain overlap (use values in range 0 to 100, the 25 is default)
data SyncgrainSpec = SyncgrainSpec
  { SyncgrainSpec -> Tab
syncgrainWin   :: Tab
  , SyncgrainSpec -> D
syncgrainOverlap :: D
  }

-- | Randomized parameters for arguments (in range 0 to 1).
data RndSyncgrainSpec = RndSyncgrainSpec
  { RndSyncgrainSpec -> Sig
rndSyncTimescale :: Sig
  , RndSyncgrainSpec -> Sig
rndSyncgrainPitch :: Sig
  , RndSyncgrainSpec -> Sig
rndSyncgrainGrainDur :: Sig
  }

instance  Default SyncgrainSpec where
  def :: SyncgrainSpec
def = SyncgrainSpec :: Tab -> D -> SyncgrainSpec
SyncgrainSpec
    { syncgrainWin :: Tab
syncgrainWin     = Int -> Tab -> Tab
setSize Int
16384 (Tab -> Tab) -> Tab -> Tab
forall a b. (a -> b) -> a -> b
$ [(Double, Double, Double)] -> Tab
sines3 [(Double
0.5, Double
1, Double
0)]
    , syncgrainOverlap :: D
syncgrainOverlap   = D
25
    }

instance Default RndSyncgrainSpec where
  def :: RndSyncgrainSpec
def = RndSyncgrainSpec :: Sig -> Sig -> Sig -> RndSyncgrainSpec
RndSyncgrainSpec
    { rndSyncTimescale :: Sig
rndSyncTimescale     = Sig
0.5
    , rndSyncgrainPitch :: Sig
rndSyncgrainPitch    = Sig
0.51
    , rndSyncgrainGrainDur :: Sig
rndSyncgrainGrainDur = Sig
0.2
    }

-- | Synchronous granular synthesis.
--
-- syncgrain implements synchronous granular synthesis.
-- The source sound for the grains is obtained by reading
-- a function table containing the samples of the source waveform.
-- For sampled-sound sources, GEN01 is used. syncgrain will accept
-- deferred allocation tables.
--
-- > syncgrain spec graidDuration timeScale PitchSig ftab
--
-- * @spec@ - secondary params (use @def@ to get the defaults)
--
-- * @graidDuration@ - duration of grains in seconds.
--
-- * @timeScale@ - tempo scaling factor.
--
-- * @PitchSig@ - pitch scaling factor.
--
-- * @ftab@ - table with sampled sound.
syncgrain :: SyncgrainSpec -> GrainSize -> TempoSig -> PitchSig -> Tab -> Sig
syncgrain :: SyncgrainSpec -> Sig -> Sig -> Sig -> Tab -> Sig
syncgrain SyncgrainSpec
spec Sig
kgrdur Sig
ktimescale Sig
kpitch Tab
ftab = Sig -> Sig -> Sig
forall a. SigSpace a => Sig -> a -> a
mul Sig
0.2 Sig
res
  where
    kgroverlap :: Sig
kgroverlap = D -> Sig
sig (D -> Sig) -> D -> Sig
forall a b. (a -> b) -> a -> b
$ (SyncgrainSpec -> D
syncgrainOverlap SyncgrainSpec
spec) D -> D -> D
forall a. Fractional a => a -> a -> a
/ D
2

    ko1 :: Sig
ko1 = Sig -> Sig
forall a. SigOrD a => a -> a
int' (Sig
kgroverlap Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ Sig
0.15)
    kfr :: Sig
kfr = Sig
ko1 Sig -> Sig -> Sig
forall a. Fractional a => a -> a -> a
/ Sig
kgrdur
    kps :: Sig
kps = Sig
1 Sig -> Sig -> Sig
forall a. Fractional a => a -> a -> a
/ Sig
ko1

    res :: Sig
res = Sig -> Sig -> Sig -> Sig -> Sig -> Tab -> Tab -> D -> Sig
csdSyncgrain Sig
1 Sig
kfr Sig
kpitch Sig
kgrdur (Sig
kps Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
ktimescale) Tab
ftab (SyncgrainSpec -> Tab
syncgrainWin SyncgrainSpec
spec) (SyncgrainSpec -> D
syncgrainOverlap SyncgrainSpec
spec)

-- | The syncgrain with randomized parameters.
rndSyncgrain :: RndSyncgrainSpec -> SyncgrainSpec -> GrainSize -> TempoSig -> PitchSig -> Tab -> SE Sig
rndSyncgrain :: RndSyncgrainSpec
-> SyncgrainSpec -> Sig -> Sig -> Sig -> Tab -> SE Sig
rndSyncgrain RndSyncgrainSpec
rndSpec SyncgrainSpec
spec Sig
kgrdur Sig
ktimescale Sig
kpitch Tab
ftab = do
    Sig
rndSyncGrainDur <- Sig -> SE Sig
forall a. SigOrD a => a -> SE a
rnd (RndSyncgrainSpec -> Sig
rndSyncgrainGrainDur RndSyncgrainSpec
rndSpec)
    Sig
rndSyncGrainPitch <- Sig -> SE Sig
forall a. SigOrD a => a -> SE a
birnd (RndSyncgrainSpec -> Sig
rndSyncgrainPitch RndSyncgrainSpec
rndSpec)
    Sig
rndSyncGrainTimescale <- Sig -> SE Sig
forall a. SigOrD a => a -> SE a
birnd (RndSyncgrainSpec -> Sig
rndSyncTimescale RndSyncgrainSpec
rndSpec)
    let kgroverlap :: Sig
kgroverlap = D -> Sig
sig (D -> Sig) -> D -> Sig
forall a b. (a -> b) -> a -> b
$ (SyncgrainSpec -> D
syncgrainOverlap SyncgrainSpec
spec) D -> D -> D
forall a. Fractional a => a -> a -> a
/ D
2
        ko1 :: Sig
ko1 = Sig -> Sig
forall a. SigOrD a => a -> a
int' (Sig
kgroverlap Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ Sig
0.15)
        kgr :: Sig
kgr = Sig
kgrdur Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ Sig
rndSyncGrainDur
        kfr :: Sig
kfr = Sig
ko1 Sig -> Sig -> Sig
forall a. Fractional a => a -> a -> a
/ Sig
kgr
        kps :: Sig
kps = Sig
1 Sig -> Sig -> Sig
forall a. Fractional a => a -> a -> a
/ Sig
ko1

        res :: Sig
res = Sig -> Sig -> Sig -> Sig -> Sig -> Tab -> Tab -> D -> Sig
csdSyncgrain Sig
1 Sig
kfr (Sig
kpitch Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ Sig
rndSyncGrainPitch) Sig
kgr (Sig
kps Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
ktimescale Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ Sig
rndSyncGrainTimescale) Tab
ftab (SyncgrainSpec -> Tab
syncgrainWin SyncgrainSpec
spec) (SyncgrainSpec -> D
syncgrainOverlap SyncgrainSpec
spec)
    Sig -> SE Sig
forall (m :: * -> *) a. Monad m => a -> m a
return Sig
res

-- | syncgrain that is defined on stereo audio files. We provide the filename instead of table.
-- The rest is the same.
syncgrainSnd :: SyncgrainSpec -> GrainSize -> TempoSig -> PitchSig -> String -> Sig2
syncgrainSnd :: SyncgrainSpec -> Sig -> Sig -> Sig -> String -> Sig2
syncgrainSnd SyncgrainSpec
spec Sig
kgrdur Sig
ktimescale Sig
kpitch  String
file =
  (Tab -> Sig
f (Tab -> Sig) -> Tab -> Sig
forall a b. (a -> b) -> a -> b
$ String -> Double -> WavChn -> Tab
wavs String
file Double
0 WavChn
WavLeft, Tab -> Sig
f (Tab -> Sig) -> Tab -> Sig
forall a b. (a -> b) -> a -> b
$ String -> Double -> WavChn -> Tab
wavs String
file Double
0 WavChn
WavRight)
  where f :: Tab -> Sig
f = SyncgrainSpec -> Sig -> Sig -> Sig -> Tab -> Sig
syncgrain SyncgrainSpec
spec Sig
kgrdur Sig
ktimescale Sig
kpitch

-- | syncgrain that is defined on mono audio files. We provide the filename instead of table.
-- The rest is the same.
syncgrainSnd1 :: SyncgrainSpec -> GrainSize -> TempoSig -> PitchSig -> String -> Sig
syncgrainSnd1 :: SyncgrainSpec -> Sig -> Sig -> Sig -> String -> Sig
syncgrainSnd1 SyncgrainSpec
spec Sig
kgrdur Sig
ktimescale Sig
kpitch  String
file = Tab -> Sig
f (Tab -> Sig) -> Tab -> Sig
forall a b. (a -> b) -> a -> b
$ String -> Double -> WavChn -> Tab
wavs String
file Double
0 WavChn
WavLeft
  where f :: Tab -> Sig
f = SyncgrainSpec -> Sig -> Sig -> Sig -> Tab -> Sig
syncgrain SyncgrainSpec
spec Sig
kgrdur Sig
ktimescale Sig
kpitch

-- | rndSyncgrain that is defined on stereo audio files. We provide the filename instead of table.
-- The rest is the same.
rndSyncgrainSnd :: RndSyncgrainSpec -> SyncgrainSpec -> GrainSize -> TempoSig -> PitchSig -> String -> SE Sig2
rndSyncgrainSnd :: RndSyncgrainSpec
-> SyncgrainSpec -> Sig -> Sig -> Sig -> String -> SE Sig2
rndSyncgrainSnd RndSyncgrainSpec
rndSpec SyncgrainSpec
spec Sig
kgrdur Sig
ktimescale Sig
kpitch  String
file = do
  Sig
aleft  <- Tab -> SE Sig
f (Tab -> SE Sig) -> Tab -> SE Sig
forall a b. (a -> b) -> a -> b
$ String -> Double -> WavChn -> Tab
wavs String
file Double
0 WavChn
WavLeft
  Sig
aright <- Tab -> SE Sig
f (Tab -> SE Sig) -> Tab -> SE Sig
forall a b. (a -> b) -> a -> b
$ String -> Double -> WavChn -> Tab
wavs String
file Double
0 WavChn
WavRight
  Sig2 -> SE Sig2
forall (m :: * -> *) a. Monad m => a -> m a
return (Sig
aleft, Sig
aright)
  where f :: Tab -> SE Sig
f = RndSyncgrainSpec
-> SyncgrainSpec -> Sig -> Sig -> Sig -> Tab -> SE Sig
rndSyncgrain RndSyncgrainSpec
rndSpec SyncgrainSpec
spec Sig
kgrdur Sig
ktimescale Sig
kpitch

-- | rndSyncgrain that is defined on mono audio files. We provide the filename instead of table.
-- The rest is the same.
rndSyncgrainSnd1 :: RndSyncgrainSpec -> SyncgrainSpec -> GrainSize -> TempoSig -> PitchSig -> String -> SE Sig
rndSyncgrainSnd1 :: RndSyncgrainSpec
-> SyncgrainSpec -> Sig -> Sig -> Sig -> String -> SE Sig
rndSyncgrainSnd1 RndSyncgrainSpec
rndSpec SyncgrainSpec
spec Sig
kgrdur Sig
ktimescale Sig
kpitch  String
file = Tab -> SE Sig
f (Tab -> SE Sig) -> Tab -> SE Sig
forall a b. (a -> b) -> a -> b
$ String -> Double -> WavChn -> Tab
wavs String
file Double
0 WavChn
WavLeft
  where f :: Tab -> SE Sig
f = RndSyncgrainSpec
-> SyncgrainSpec -> Sig -> Sig -> Sig -> Tab -> SE Sig
rndSyncgrain RndSyncgrainSpec
rndSpec SyncgrainSpec
spec Sig
kgrdur Sig
ktimescale Sig
kpitch

-------------------------------------------------------
-- sndwarp

-- | Sndwarp secondary parameters. It's instance of @Default@, we can use the constant @def@ to get the value.
--
-- * @WinSize@ - window size in seconds (not in samples as in Csound!). The default is 0.1
--
-- * @Randw@ -  the bandwidth of a random number generator.
--    The random numbers will be added to iwsize. It's measured in ratio to WinSize.
--    So the 1 means the one WinSize length. The default is 0.3
--
-- * @Overlap@  - determines the density of overlapping windows. The default value is 50.
--  It's in range (0 to 100)
data SndwarpSpec = SndwarpSpec
  { SndwarpSpec -> D
sndwarpWinSize :: D
  , SndwarpSpec -> D
sndwarpRandw   :: D
  , SndwarpSpec -> D
sndwarpOvelrap :: D
  , SndwarpSpec -> Tab
sndwarpWin     :: Tab
  }

instance Default SndwarpSpec where
  def :: SndwarpSpec
def = SndwarpSpec :: D -> D -> D -> Tab -> SndwarpSpec
SndwarpSpec
    { sndwarpWinSize :: D
sndwarpWinSize  = D
0.1
    , sndwarpRandw :: D
sndwarpRandw    = D
0.3
    , sndwarpOvelrap :: D
sndwarpOvelrap  = D
50
    , sndwarpWin :: Tab
sndwarpWin      = Int -> Tab -> Tab
setSize Int
16384 (Tab -> Tab) -> Tab -> Tab
forall a b. (a -> b) -> a -> b
$ [(Double, Double, Double)] -> Tab
sines3 [(Double
0.5, Double
1, Double
0)]
    }

-- | Simple sndwarp with scaling mode (corresponds to Csound's @initmode == 0@).
--
-- > sndwarp spec resample speed ftab
--
-- * @spec@ - secondary params (use @def@ to get the defaults)
--
-- * @resample@ -  the factor by which to change the pitch of the sound. For example, a value of 2 will produce a
--     sound one octave higher than the original. The timing of the sound, however, will not be altered.
--
-- * @speed@  - the factor by which to change the tempo of the sound.
--
-- * @ftab@ -- table with the samples
sndwarp :: SndwarpSpec -> TempoSig -> PitchSig -> Tab -> Sig
sndwarp :: SndwarpSpec -> Sig -> Sig -> Tab -> Sig
sndwarp SndwarpSpec
spec Sig
kspeed Sig
xresample Tab
ftab = Sig -> Sig -> Sig
forall a. SigSpace a => Sig -> a -> a
mul Sig
0.2 (Sig -> Sig) -> Sig -> Sig
forall a b. (a -> b) -> a -> b
$ Sig -> Sig -> Sig -> Tab -> D -> D -> D -> D -> Tab -> D -> Sig
csdSndwarp Sig
1 Sig
kspeed Sig
xresample Tab
ftab D
0
  (D
getSampleRate D -> D -> D
forall a. Num a => a -> a -> a
* SndwarpSpec -> D
sndwarpWinSize SndwarpSpec
spec) (D
getSampleRate D -> D -> D
forall a. Num a => a -> a -> a
* SndwarpSpec -> D
sndwarpRandw SndwarpSpec
spec)
  (SndwarpSpec -> D
sndwarpOvelrap SndwarpSpec
spec) (SndwarpSpec -> Tab
sndwarpWin SndwarpSpec
spec) D
0

-- | Stereo version of the @sndwarp@.
sndwarpst :: SndwarpSpec -> TempoSig -> PitchSig -> Tab -> Sig2
sndwarpst :: SndwarpSpec -> Sig -> Sig -> Tab -> Sig2
sndwarpst SndwarpSpec
spec Sig
xspeed Sig
xresample Tab
ftab = Sig -> Sig2 -> Sig2
forall a. SigSpace a => Sig -> a -> a
mul Sig
0.2 (Sig2 -> Sig2) -> Sig2 -> Sig2
forall a b. (a -> b) -> a -> b
$ Sig -> Sig -> Sig -> Tab -> D -> D -> D -> D -> Tab -> D -> Sig2
csdSndwarpst Sig
1 Sig
xspeed Sig
xresample Tab
ftab D
0
  (D
getSampleRate D -> D -> D
forall a. Num a => a -> a -> a
* SndwarpSpec -> D
sndwarpWinSize SndwarpSpec
spec) (D
getSampleRate D -> D -> D
forall a. Num a => a -> a -> a
* SndwarpSpec -> D
sndwarpRandw SndwarpSpec
spec)
  (SndwarpSpec -> D
sndwarpOvelrap SndwarpSpec
spec) (SndwarpSpec -> Tab
sndwarpWin SndwarpSpec
spec) D
0

-- | Sndwarp that is defined on stereo audio files. We provide the filename instead of table.
-- The rest is the same.
sndwarpSnd :: SndwarpSpec -> TempoSig -> PitchSig -> String -> Sig2
sndwarpSnd :: SndwarpSpec -> Sig -> Sig -> String -> Sig2
sndwarpSnd SndwarpSpec
spec Sig
kspeed Sig
xresample String
file = SndwarpSpec -> Sig -> Sig -> Tab -> Sig2
sndwarpst SndwarpSpec
spec Sig
kspeed Sig
xresample (String -> Double -> WavChn -> Tab
wavs String
file Double
0 WavChn
WavAll)

-- | Sndwarp that is defined on mono audio files. We provide the filename instead of table.
-- The rest is the same.
sndwarpSnd1 :: SndwarpSpec -> TempoSig -> PitchSig -> String -> Sig
sndwarpSnd1 :: SndwarpSpec -> Sig -> Sig -> String -> Sig
sndwarpSnd1 SndwarpSpec
spec Sig
kspeed Sig
xresample String
file = SndwarpSpec -> Sig -> Sig -> Tab -> Sig
sndwarp SndwarpSpec
spec Sig
kspeed Sig
xresample (String -> Double -> WavChn -> Tab
wavs String
file Double
0 WavChn
WavLeft)


-- | The simple sndwarp with pointer (Csound @initmode = 1@).
--
-- > sndwarp spec resample ftab ptr
--
-- * @spec@ - secondary params (use @def@ to get the defaults)
--
-- * @resample@ -  the factor by which to change the pitch of the sound. For example, a value of 2 will produce a
--     sound one octave higher than the original. The timing of the sound, however, will not be altered.
--
-- * @ftab@ -- table with the samples
--
-- * @ptr@  - pointer to read the table (in seconds).
ptrSndwarp :: SndwarpSpec -> PitchSig -> Tab -> Pointer -> Sig
ptrSndwarp :: SndwarpSpec -> Sig -> Tab -> Sig -> Sig
ptrSndwarp SndwarpSpec
spec Sig
xresample Tab
ftab Sig
xptr = Sig -> Sig -> Sig
forall a. SigSpace a => Sig -> a -> a
mul Sig
0.2 (Sig -> Sig) -> Sig -> Sig
forall a b. (a -> b) -> a -> b
$ Sig -> Sig -> Sig -> Tab -> D -> D -> D -> D -> Tab -> D -> Sig
csdSndwarp Sig
1 Sig
xptr Sig
xresample Tab
ftab D
0
  (D
getSampleRate D -> D -> D
forall a. Num a => a -> a -> a
* SndwarpSpec -> D
sndwarpWinSize SndwarpSpec
spec) (D
getSampleRate D -> D -> D
forall a. Num a => a -> a -> a
* SndwarpSpec -> D
sndwarpRandw SndwarpSpec
spec)
  (SndwarpSpec -> D
sndwarpOvelrap SndwarpSpec
spec) (SndwarpSpec -> Tab
sndwarpWin SndwarpSpec
spec) D
1

-- | Stereo version of @ptrSndwarp@.
ptrSndwarpst :: SndwarpSpec -> PitchSig -> Tab -> Pointer -> Sig2
ptrSndwarpst :: SndwarpSpec -> Sig -> Tab -> Sig -> Sig2
ptrSndwarpst SndwarpSpec
spec Sig
xresample Tab
ftab Sig
xptr = Sig -> Sig -> Sig -> Tab -> D -> D -> D -> D -> Tab -> D -> Sig2
csdSndwarpst Sig
1 Sig
xptr Sig
xresample Tab
ftab D
0
  (D
getSampleRate D -> D -> D
forall a. Num a => a -> a -> a
* SndwarpSpec -> D
sndwarpWinSize SndwarpSpec
spec) (D
getSampleRate D -> D -> D
forall a. Num a => a -> a -> a
* SndwarpSpec -> D
sndwarpRandw SndwarpSpec
spec)
  (SndwarpSpec -> D
sndwarpOvelrap SndwarpSpec
spec) (SndwarpSpec -> Tab
sndwarpWin SndwarpSpec
spec) D
1

-- | ptrSndwarp that is defined on stereo audio files. We provide the filename instead of table.
-- The rest is the same.
ptrSndwarpSnd :: SndwarpSpec -> PitchSig -> String -> Pointer -> Sig2
ptrSndwarpSnd :: SndwarpSpec -> Sig -> String -> Sig -> Sig2
ptrSndwarpSnd SndwarpSpec
spec Sig
xresample String
file Sig
xptr = SndwarpSpec -> Sig -> Tab -> Sig -> Sig2
ptrSndwarpst SndwarpSpec
spec Sig
xresample (String -> Double -> WavChn -> Tab
wavs String
file Double
0 WavChn
WavAll) Sig
xptr

-- | ptrSndwarp that is defined on mono audio files. We provide the filename instead of table.
-- The rest is the same.
ptrSndwarpSnd1 :: SndwarpSpec -> PitchSig -> String -> Pointer -> Sig
ptrSndwarpSnd1 :: SndwarpSpec -> Sig -> String -> Sig -> Sig
ptrSndwarpSnd1 SndwarpSpec
spec Sig
xresample String
file Sig
xptr = SndwarpSpec -> Sig -> Tab -> Sig -> Sig
ptrSndwarp SndwarpSpec
spec Sig
xresample (String -> Double -> WavChn -> Tab
wavs String
file Double
0 WavChn
WavLeft) Sig
xptr

------------------------------------------------------------------------
-- fof2


-- | Defaults for @fof2@ opcode.
data Fof2Spec = Fof2Spec
  { Fof2Spec -> Sig
fof2TimeMod  :: Sig
  , Fof2Spec -> Sig
fof2PitchMod :: Sig
  , Fof2Spec -> Sig
fof2Oct   :: Sig
  , Fof2Spec -> Sig
fof2Band  :: Sig
  , Fof2Spec -> Sig
fof2Rise  :: Sig
  , Fof2Spec -> Sig
fof2Decay :: Sig
  , Fof2Spec -> Sig
fof2Gliss :: Sig
  , Fof2Spec -> Tab
fof2Win   :: Tab
  }

instance Default Fof2Spec where
  def :: Fof2Spec
def = Fof2Spec :: Sig -> Sig -> Sig -> Sig -> Sig -> Sig -> Sig -> Tab -> Fof2Spec
Fof2Spec
    { fof2TimeMod :: Sig
fof2TimeMod   = Sig
0.2
    , fof2PitchMod :: Sig
fof2PitchMod  = Sig
0
    , fof2Oct :: Sig
fof2Oct       = Sig
0
    , fof2Band :: Sig
fof2Band      = Sig
0
    , fof2Rise :: Sig
fof2Rise      = Sig
0.5
    , fof2Decay :: Sig
fof2Decay     = Sig
0.5
    , fof2Gliss :: Sig
fof2Gliss     = Sig
0
    , fof2Win :: Tab
fof2Win       = Int -> Tab -> Tab
setSize Int
8192 (Tab -> Tab) -> Tab -> Tab
forall a b. (a -> b) -> a -> b
$ [(Double, Double, Double, Double)] -> Tab
sines4 [(Double
0.5, Double
1, Double
270, Double
1)]
    }

-- | Reimplementation of fof2 opcode for stereo  audio files.
fof2Snd :: Fof2Spec -> GrainRate -> GrainSize -> TempoSig -> String -> Sig2
fof2Snd :: Fof2Spec -> Sig -> Sig -> Sig -> String -> Sig2
fof2Snd Fof2Spec
spec Sig
kgrainrate Sig
kgrainsize Sig
kspeed String
file = (Int -> Sig
f Int
1, Int -> Sig
f Int
2)
  where f :: Int -> Sig
f Int
n = Int -> Fof2Spec -> Sig -> Sig -> Sig -> String -> Sig
fof2Chn Int
n Fof2Spec
spec Sig
kgrainrate Sig
kgrainsize Sig
kspeed String
file

-- | Reimplementation of fof2 opcode for mono audio files.
fof2Snd1 :: Fof2Spec -> GrainRate -> GrainSize -> TempoSig -> String -> Sig
fof2Snd1 :: Fof2Spec -> Sig -> Sig -> Sig -> String -> Sig
fof2Snd1 Fof2Spec
spec Sig
kgrainrate Sig
kgrainsize Sig
kspeed String
file = Int -> Sig
f Int
1
  where f :: Int -> Sig
f Int
n = Int -> Fof2Spec -> Sig -> Sig -> Sig -> String -> Sig
fof2Chn Int
n Fof2Spec
spec Sig
kgrainrate Sig
kgrainsize Sig
kspeed String
file

fof2Chn :: Int -> Fof2Spec -> GrainRate -> GrainSize -> TempoSig -> String -> Sig
fof2Chn :: Int -> Fof2Spec -> Sig -> Sig -> Sig -> String -> Sig
fof2Chn Int
n Fof2Spec
spec Sig
kgrainrate Sig
kgrainsize Sig
kspeed String
file =
  Fof2Spec -> Sig -> Sig -> Tab -> Sig -> Sig
fof2 Fof2Spec
spec Sig
kgrainrate Sig
kgrainsize (Int -> String -> Tab
grainyTab Int
n String
file) (Sig -> String -> Sig
grainyPtr Sig
kspeed String
file)

-- | Reimplementation of fof2 opcode.
fof2 :: Fof2Spec -> GrainRate -> GrainSize -> Tab -> Pointer -> Sig
fof2 :: Fof2Spec -> Sig -> Sig -> Tab -> Sig -> Sig
fof2 Fof2Spec
spec Sig
grainRate Sig
grainSize Tab
buf Sig
kphs = D -> Sig
go (Tab -> D
ftlen Tab
buf)
  where
    kfund :: Sig
kfund = Sig
grainRate
    kris :: Sig
kris  = Fof2Spec -> Sig
fof2Rise Fof2Spec
spec
    kdec :: Sig
kdec  = Fof2Spec -> Sig
fof2Decay Fof2Spec
spec
    kband :: Sig
kband = Fof2Spec -> Sig
fof2Band Fof2Spec
spec
    koct :: Sig
koct  = Fof2Spec -> Sig
fof2Oct Fof2Spec
spec
    kgliss :: Sig
kgliss = Fof2Spec -> Sig
fof2Gliss Fof2Spec
spec

    go :: D -> Sig
go D
tabLen = do
      Sig
-> Sig
-> Sig
-> Sig
-> Sig
-> Sig
-> Sig
-> Sig
-> D
-> Tab
-> Tab
-> D
-> Sig
-> Sig
-> Sig
csdFof2 (Sig -> Sig
forall a. SigOrD a => a -> a
ampdbfs (-Sig
8)) Sig
kfund Sig
kform Sig
koct Sig
kband (Sig
kris Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
kdur)
        Sig
kdur (Sig
kdec Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
kdur) D
100  Tab
giLive Tab
giSigRise D
86400 Sig
kphs Sig
kgliss
      where
        kdur :: Sig
kdur = Sig
grainSize Sig -> Sig -> Sig
forall a. Fractional a => a -> a -> a
/ Sig
kfund
        kform :: Sig
kform = (D -> Sig
sig (D -> Sig) -> D -> Sig
forall a b. (a -> b) -> a -> b
$ D
getSampleRate D -> D -> D
forall a. Fractional a => a -> a -> a
/ D
tabLen)
        giSigRise :: Tab
giSigRise = Fof2Spec -> Tab
fof2Win Fof2Spec
spec
        giLive :: Tab
giLive = Tab
buf

------------------------------------------------------------------------
-- granular effects

-- partikkelDelay :: PartikkelSpec -> D -> Sig -> GrainRate -> GrainSize -> Sig -> Sig -> SE Sig
-- partikkelDelay spec maxLength delTim

-- | Granular delay effect for fof2. Good values for grain rate and size are
--
-- > grainRate = 25
-- > grainSize = 2.5
fofDelay :: MaxDelayTime -> DelayTime -> Feedback -> Balance -> Fof2Spec -> GrainRate -> GrainSize -> Sig -> SE Sig
fofDelay :: D -> Sig -> Sig -> Sig -> Fof2Spec -> Sig -> Sig -> Sig -> SE Sig
fofDelay D
maxLength Sig
delTim Sig
kfeed Sig
kbalance Fof2Spec
spec Sig
grainRate Sig
grainSize Sig
asig = do
  Sig
rndTmod <- Sig -> Sig -> SE Sig
forall a. SigOrD a => a -> a -> SE a
rnd31 Sig
kTmod Sig
1
  Sig
rndFmod <- Sig -> Sig -> SE Sig
forall a. SigOrD a => a -> a -> SE a
rnd31 Sig
kFmod Sig
1
  (Tab -> Sig -> SE Sig) -> D -> Sig -> Sig -> Sig -> Sig -> SE Sig
tabDelay (Sig -> Tab -> Sig -> SE Sig
go Sig
rndFmod) D
maxLength (Sig
delTim Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ Sig
rndTmod) Sig
kfeed Sig
kbalance Sig
asig
  where
    kTmod :: Sig
kTmod = Fof2Spec -> Sig
fof2TimeMod Fof2Spec
spec
    kFmod :: Sig
kFmod = Fof2Spec -> Sig
fof2PitchMod Fof2Spec
spec
    kfund :: Sig
kfund = Sig
grainRate
    kris :: Sig
kris  = Fof2Spec -> Sig
fof2Rise Fof2Spec
spec
    kdec :: Sig
kdec  = Fof2Spec -> Sig
fof2Decay Fof2Spec
spec
    kband :: Sig
kband = Fof2Spec -> Sig
fof2Band Fof2Spec
spec
    koct :: Sig
koct  = Fof2Spec -> Sig
fof2Oct Fof2Spec
spec
    kgliss :: Sig
kgliss = Fof2Spec -> Sig
fof2Gliss Fof2Spec
spec

    tabLen :: D
tabLen = D -> D
tabSizeSecondsPower2 D
maxLength

    go :: Sig -> Tab -> Sig -> SE Sig
    go :: Sig -> Tab -> Sig -> SE Sig
go Sig
kFmodSig Tab
buf Sig
kphs = do
      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
-> Sig
-> Sig
-> Sig
-> Sig
-> Sig
-> D
-> Tab
-> Tab
-> D
-> Sig
-> Sig
-> Sig
csdFof2 (Sig -> Sig
forall a. SigOrD a => a -> a
ampdbfs (-Sig
8)) Sig
kfund Sig
kform Sig
koct Sig
kband (Sig
kris Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
kdur)
            Sig
kdur (Sig
kdec Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
kdur) D
100  Tab
giLive Tab
giSigRise D
86400 Sig
kphs Sig
kgliss
      where
        kdur :: Sig
kdur = Sig
grainSize Sig -> Sig -> Sig
forall a. Fractional a => a -> a -> a
/ Sig
kfund
        kform :: Sig
kform   = (Sig
1Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+Sig
kFmodSig)Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
*(D -> Sig
sig (D -> Sig) -> D -> Sig
forall a b. (a -> b) -> a -> b
$ D
getSampleRate D -> D -> D
forall a. Fractional a => a -> a -> a
/ D
tabLen)

        giSigRise :: Tab
giSigRise = Fof2Spec -> Tab
fof2Win Fof2Spec
spec
        giLive :: Tab
giLive = Tab
buf

-- | Granular delay effect for @grainy@.
grainyDelay :: MaxDelayTime -> DelayTime -> Feedback -> Balance -> GrainRate -> GrainSize -> PitchSig -> Sig -> SE Sig
grainyDelay :: D -> Sig -> Sig -> Sig -> Sig -> Sig -> Sig -> Sig -> SE Sig
grainyDelay D
maxDel Sig
delTime Sig
kfeed Sig
kbalance Sig
grainRate Sig
grainSize Sig
pitch Sig
asig = (Tab -> Sig -> SE Sig) -> D -> Sig -> Sig -> Sig -> Sig -> SE Sig
tabDelay Tab -> Sig -> SE Sig
forall (m :: * -> *). Monad m => Tab -> Sig -> m Sig
go D
maxDel Sig
delTime Sig
kfeed Sig
kbalance Sig
asig
  where go :: Tab -> Sig -> m Sig
go Tab
tab Sig
ptr = Sig -> m Sig
forall (m :: * -> *) a. Monad m => a -> m a
return (Sig -> m Sig) -> Sig -> m Sig
forall a b. (a -> b) -> a -> b
$ Sig -> Sig -> Sig -> Tab -> Sig -> Sig
ptrGrainy Sig
grainRate Sig
grainSize Sig
pitch Tab
tab Sig
ptr

-- | Granular delay effect for @rndGrainy@.
rndGrainyDelay :: MaxDelayTime -> DelayTime -> Feedback -> Balance -> RndGrainySpec -> GrainRate -> GrainSize -> PitchSig -> Sig -> SE Sig
rndGrainyDelay :: D
-> Sig
-> Sig
-> Sig
-> RndGrainySpec
-> Sig
-> Sig
-> Sig
-> Sig
-> SE Sig
rndGrainyDelay  D
maxDel Sig
delTime Sig
kfeed Sig
kbalance RndGrainySpec
spec Sig
grainRate Sig
grainSize Sig
pitch Sig
asig = (Tab -> Sig -> SE Sig) -> D -> Sig -> Sig -> Sig -> Sig -> SE Sig
tabDelay Tab -> Sig -> SE Sig
go D
maxDel Sig
delTime Sig
kfeed Sig
kbalance Sig
asig
  where go :: Tab -> Sig -> SE Sig
go = RndGrainySpec -> Sig -> Sig -> Sig -> Tab -> Sig -> SE Sig
rndPtrGrainy RndGrainySpec
spec Sig
grainRate Sig
grainSize Sig
pitch

-- | Granular delay effect for @sndwarp@.
sndwarpDelay :: MaxDelayTime -> DelayTime -> Feedback -> Balance -> SndwarpSpec -> PitchSig -> Sig -> SE Sig
sndwarpDelay :: D -> Sig -> Sig -> Sig -> SndwarpSpec -> Sig -> Sig -> SE Sig
sndwarpDelay D
maxDel Sig
delTime Sig
kfeed Sig
kbalance SndwarpSpec
spec Sig
pitch Sig
asig = (Tab -> Sig -> SE Sig) -> D -> Sig -> Sig -> Sig -> Sig -> SE Sig
tabDelay Tab -> Sig -> SE Sig
forall (m :: * -> *). Monad m => Tab -> Sig -> m Sig
go D
maxDel Sig
delTime Sig
kfeed Sig
kbalance Sig
asig
  where go :: Tab -> Sig -> m Sig
go Tab
tab Sig
ptr = Sig -> m Sig
forall (m :: * -> *) a. Monad m => a -> m a
return (Sig -> m Sig) -> Sig -> m Sig
forall a b. (a -> b) -> a -> b
$ SndwarpSpec -> Sig -> Tab -> Sig -> Sig
ptrSndwarp SndwarpSpec
spec Sig
pitch Tab
tab (Tab -> Sig -> Sig
sec2rel Tab
tab Sig
ptr)

-- | Granular delay effect for @syncgrain@.
syncgrainDelay :: MaxDelayTime -> DelayTime -> Feedback -> Balance -> SyncgrainSpec -> GrainSize -> TempoSig -> PitchSig -> Sig -> SE Sig
syncgrainDelay :: D
-> Sig
-> Sig
-> Sig
-> SyncgrainSpec
-> Sig
-> Sig
-> Sig
-> Sig
-> SE Sig
syncgrainDelay D
maxDel Sig
delTime Sig
kfeed Sig
kbalance SyncgrainSpec
spec Sig
grainSize Sig
tempo Sig
pitch Sig
asig = (Tab -> Sig -> SE Sig) -> D -> Sig -> Sig -> Sig -> Sig -> SE Sig
tabDelay Tab -> Sig -> SE Sig
forall (m :: * -> *) p. Monad m => Tab -> p -> m Sig
go D
maxDel Sig
delTime Sig
kfeed Sig
kbalance Sig
asig
  where go :: Tab -> p -> m Sig
go Tab
tab p
_ = Sig -> m Sig
forall (m :: * -> *) a. Monad m => a -> m a
return (Sig -> m Sig) -> Sig -> m Sig
forall a b. (a -> b) -> a -> b
$ SyncgrainSpec -> Sig -> Sig -> Sig -> Tab -> Sig
syncgrain SyncgrainSpec
spec Sig
grainSize Sig
tempo Sig
pitch Tab
tab

-- | Granular delay effect for @rndSyncgrain@.
rndSyncgrainDelay :: MaxDelayTime -> DelayTime -> Feedback -> Balance -> RndSyncgrainSpec -> SyncgrainSpec -> GrainSize -> TempoSig -> PitchSig -> Sig -> SE Sig
rndSyncgrainDelay :: D
-> Sig
-> Sig
-> Sig
-> RndSyncgrainSpec
-> SyncgrainSpec
-> Sig
-> Sig
-> Sig
-> Sig
-> SE Sig
rndSyncgrainDelay D
maxDel Sig
delTime Sig
kfeed Sig
kbalance RndSyncgrainSpec
rndSpec SyncgrainSpec
spec Sig
grainSize Sig
tempo Sig
pitch Sig
asig = (Tab -> Sig -> SE Sig) -> D -> Sig -> Sig -> Sig -> Sig -> SE Sig
tabDelay Tab -> Sig -> SE Sig
forall p. Tab -> p -> SE Sig
go D
maxDel Sig
delTime Sig
kfeed Sig
kbalance Sig
asig
  where go :: Tab -> p -> SE Sig
go Tab
tab p
_ = RndSyncgrainSpec
-> SyncgrainSpec -> Sig -> Sig -> Sig -> Tab -> SE Sig
rndSyncgrain RndSyncgrainSpec
rndSpec SyncgrainSpec
spec Sig
grainSize Sig
tempo Sig
pitch Tab
tab

-- | Granular delay effect for @partikkel@.
partikkelDelay :: MaxDelayTime -> DelayTime -> Feedback -> Balance -> PartikkelSpec -> GrainRate -> GrainSize -> PitchSig -> Sig -> SE Sig
partikkelDelay :: D
-> Sig
-> Sig
-> Sig
-> PartikkelSpec
-> Sig
-> Sig
-> Sig
-> Sig
-> SE Sig
partikkelDelay D
maxDel Sig
delTime Sig
kfeed Sig
kbalance PartikkelSpec
spec Sig
grainRate Sig
grainSize Sig
pitch Sig
asig = (Tab -> Sig -> SE Sig) -> D -> Sig -> Sig -> Sig -> Sig -> SE Sig
tabDelay Tab -> Sig -> SE Sig
forall (m :: * -> *). Monad m => Tab -> Sig -> m Sig
go D
maxDel Sig
delTime Sig
kfeed Sig
kbalance Sig
asig
  where go :: Tab -> Sig -> m Sig
go Tab
tab Sig
ptr = Sig -> m Sig
forall (m :: * -> *) a. Monad m => a -> m a
return (Sig -> m Sig) -> Sig -> m Sig
forall a b. (a -> b) -> a -> b
$ PartikkelSpec -> Sig -> Sig -> Sig -> [Tab] -> [Sig] -> Sig
partikkel PartikkelSpec
spec Sig
grainRate Sig
grainSize Sig
pitch [Tab
tab] [Sig
ptr]

-------------------------------------------------------------------------
-- effects

fxFeed :: Feedback
fxFeed :: Sig
fxFeed = Sig
0

fxBalance :: Balance
fxBalance :: Sig
fxBalance = Sig
1

fxMaxLength :: MaxDelayTime
fxMaxLength :: D
fxMaxLength = D
1

fxDelTime :: DelayTime
fxDelTime :: Sig
fxDelTime = Sig
0.05

type GrainDelay a = MaxDelayTime -> DelayTime -> Feedback -> Balance -> a

toGrainFx :: GrainDelay a -> a
toGrainFx :: GrainDelay a -> a
toGrainFx GrainDelay a
f = GrainDelay a
f D
fxMaxLength Sig
fxDelTime Sig
fxFeed Sig
fxBalance

-- | Granular effect for @grainy@.
grainyFx :: GrainRate -> GrainSize -> PitchSig -> Sig -> SE Sig
grainyFx :: Sig -> Sig -> Sig -> Sig -> SE Sig
grainyFx = (D -> Sig -> Sig -> Sig -> Sig -> Sig -> Sig -> Sig -> SE Sig)
-> Sig -> Sig -> Sig -> Sig -> SE Sig
forall a. GrainDelay a -> a
toGrainFx D -> Sig -> Sig -> Sig -> Sig -> Sig -> Sig -> Sig -> SE Sig
grainyDelay

-- | Granular effect for @rndGrainy@.
rndGrainyFx :: RndGrainySpec -> GrainRate -> GrainSize -> PitchSig -> Sig -> SE Sig
rndGrainyFx :: RndGrainySpec -> Sig -> Sig -> Sig -> Sig -> SE Sig
rndGrainyFx = (D
 -> Sig
 -> Sig
 -> Sig
 -> RndGrainySpec
 -> Sig
 -> Sig
 -> Sig
 -> Sig
 -> SE Sig)
-> RndGrainySpec -> Sig -> Sig -> Sig -> Sig -> SE Sig
forall a. GrainDelay a -> a
toGrainFx D
-> Sig
-> Sig
-> Sig
-> RndGrainySpec
-> Sig
-> Sig
-> Sig
-> Sig
-> SE Sig
rndGrainyDelay

-- | Granular effect for @sndwarp@.
sndwarpFx :: SndwarpSpec -> PitchSig -> Sig -> SE Sig
sndwarpFx :: SndwarpSpec -> Sig -> Sig -> SE Sig
sndwarpFx = (D -> Sig -> Sig -> Sig -> SndwarpSpec -> Sig -> Sig -> SE Sig)
-> SndwarpSpec -> Sig -> Sig -> SE Sig
forall a. GrainDelay a -> a
toGrainFx D -> Sig -> Sig -> Sig -> SndwarpSpec -> Sig -> Sig -> SE Sig
sndwarpDelay

-- | Granular effect for @syncgrain@.
syncgrainFx :: SyncgrainSpec -> GrainSize -> TempoSig -> PitchSig -> Sig -> SE Sig
syncgrainFx :: SyncgrainSpec -> Sig -> Sig -> Sig -> Sig -> SE Sig
syncgrainFx = (D
 -> Sig
 -> Sig
 -> Sig
 -> SyncgrainSpec
 -> Sig
 -> Sig
 -> Sig
 -> Sig
 -> SE Sig)
-> SyncgrainSpec -> Sig -> Sig -> Sig -> Sig -> SE Sig
forall a. GrainDelay a -> a
toGrainFx D
-> Sig
-> Sig
-> Sig
-> SyncgrainSpec
-> Sig
-> Sig
-> Sig
-> Sig
-> SE Sig
syncgrainDelay

-- | Granular effect for @rndSyncgrain@.
rndSyncgrainFx :: RndSyncgrainSpec -> SyncgrainSpec -> GrainSize -> TempoSig -> PitchSig -> Sig -> SE Sig
rndSyncgrainFx :: RndSyncgrainSpec
-> SyncgrainSpec -> Sig -> Sig -> Sig -> Sig -> SE Sig
rndSyncgrainFx = (D
 -> Sig
 -> Sig
 -> Sig
 -> RndSyncgrainSpec
 -> SyncgrainSpec
 -> Sig
 -> Sig
 -> Sig
 -> Sig
 -> SE Sig)
-> RndSyncgrainSpec
-> SyncgrainSpec
-> Sig
-> Sig
-> Sig
-> Sig
-> SE Sig
forall a. GrainDelay a -> a
toGrainFx D
-> Sig
-> Sig
-> Sig
-> RndSyncgrainSpec
-> SyncgrainSpec
-> Sig
-> Sig
-> Sig
-> Sig
-> SE Sig
rndSyncgrainDelay

-- | Granular effect for @partikkel@.
partikkelFx :: PartikkelSpec -> GrainRate -> GrainSize -> PitchSig -> Sig -> SE Sig
partikkelFx :: PartikkelSpec -> Sig -> Sig -> Sig -> Sig -> SE Sig
partikkelFx = (D
 -> Sig
 -> Sig
 -> Sig
 -> PartikkelSpec
 -> Sig
 -> Sig
 -> Sig
 -> Sig
 -> SE Sig)
-> PartikkelSpec -> Sig -> Sig -> Sig -> Sig -> SE Sig
forall a. GrainDelay a -> a
toGrainFx D
-> Sig
-> Sig
-> Sig
-> PartikkelSpec
-> Sig
-> Sig
-> Sig
-> Sig
-> SE Sig
partikkelDelay

-- | Granular effect for @fof2@.
fofFx :: Fof2Spec -> GrainRate -> GrainSize -> Sig -> SE Sig
fofFx :: Fof2Spec -> Sig -> Sig -> Sig -> SE Sig
fofFx = (D -> Sig -> Sig -> Sig -> Fof2Spec -> Sig -> Sig -> Sig -> SE Sig)
-> Fof2Spec -> Sig -> Sig -> Sig -> SE Sig
forall a. GrainDelay a -> a
toGrainFx D -> Sig -> Sig -> Sig -> Fof2Spec -> Sig -> Sig -> Sig -> SE Sig
fofDelay

------------------------------------------------------------------------
------------------------------------------------------------------------
-- csound opcodes

-- |
-- Granular synthesizer with "per grain" control
--       over many of its parameters.  Has a sync input to
--       sychronize its internal grain scheduler clock to an external
--       clock source.
--
-- partikkel was conceived after reading Curtis Roads' book
--       "Microsound", and the goal was to create an opcode that was
--       capable of all time-domain varieties of granular synthesis
--       described in this book. The idea being that most of the
--       techniques only differ in parameter values, and by having a
--       single opcode that can do all varieties of granular synthesis
--       makes it possible to interpolate between techniques. Granular synthesis is sometimes dubbed particle
--       synthesis, and it was thought apt to name the opcode partikkel
--       to distinguish it from other granular opcodes.
--
-- > a1 [, a2, a3, a4, a5, a6, a7, a8]  partikkel  agrainfreq, \
-- >                   kdistribution, idisttab, async, kenv2amt, ienv2tab, ienv_attack, \
-- >                   ienv_decay, ksustain_amount, ka_d_ratio, kduration, kamp, igainmasks, \
-- >                   kwavfreq, ksweepshape, iwavfreqstarttab, iwavfreqendtab, awavfm, \
-- >                   ifmamptab, kfmenv, icosine, ktraincps, knumpartials, kchroma, \
-- >                   ichannelmasks, krandommask, kwaveform1, kwaveform2, kwaveform3, \
-- >                   kwaveform4, iwaveamptab, asamplepos1, asamplepos2, asamplepos3, \
-- >                   asamplepos4, kwavekey1, kwavekey2, kwavekey3, kwavekey4, imax_grains \
-- >                   [, iopcode_id]
--
-- csound doc: <http://www.csounds.com/manual/html/partikkel.html>
csdPartikkel :: Tuple a => Sig  -> Sig -> Tab -> Sig -> Sig -> Tab -> Tab -> Tab -> Sig -> Sig -> Sig -> Sig -> Tab -> Sig  -> Sig  -> Tab-> Tab -> Sig -> Tab -> Tab -> Tab -> Sig -> Sig -> Sig -> Tab -> Sig -> Tab -> Tab -> Tab -> Tab -> Tab -> Sig -> Sig -> Sig -> Sig -> Sig -> Sig -> Sig -> Sig -> D -> a
csdPartikkel :: Sig
-> Sig
-> Tab
-> Sig
-> Sig
-> Tab
-> Tab
-> Tab
-> Sig
-> Sig
-> Sig
-> Sig
-> Tab
-> Sig
-> Sig
-> Tab
-> Tab
-> Sig
-> Tab
-> Tab
-> Tab
-> Sig
-> Sig
-> Sig
-> Tab
-> Sig
-> Tab
-> Tab
-> Tab
-> Tab
-> Tab
-> Sig
-> Sig
-> Sig
-> Sig
-> Sig
-> Sig
-> Sig
-> Sig
-> D
-> a
csdPartikkel Sig
b1 Sig
b2 Tab
b3 Sig
b4 Sig
b5 Tab
b6 Tab
b7 Tab
b8 Sig
b9 Sig
b10 Sig
b11 Sig
b12 Tab
b13 Sig
b14 Sig
b15 Tab
b16 Tab
b17 Sig
b18 Tab
b19 Tab
b20 Tab
b21 Sig
b22 Sig
b23 Sig
b24 Tab
b25 Sig
b26 Tab
b27 Tab
b28 Tab
b29 Tab
b30 Tab
b31 Sig
b32 Sig
b33 Sig
b34 Sig
b35 Sig
b36 Sig
b37 Sig
b38 Sig
b39 D
b40 = GE (MultiOut [E]) -> a
forall a. Tuple a => GE (MultiOut [E]) -> a
pureTuple (GE (MultiOut [E]) -> a) -> GE (MultiOut [E]) -> a
forall a b. (a -> b) -> a -> b
$ E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> MultiOut [E]
f (E
 -> E
 -> E
 -> E
 -> E
 -> E
 -> E
 -> E
 -> E
 -> E
 -> E
 -> E
 -> E
 -> E
 -> E
 -> E
 -> E
 -> E
 -> E
 -> E
 -> E
 -> E
 -> E
 -> E
 -> E
 -> E
 -> E
 -> E
 -> E
 -> E
 -> E
 -> E
 -> E
 -> E
 -> E
 -> E
 -> E
 -> E
 -> E
 -> E
 -> MultiOut [E])
-> GE E
-> GE
     (E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> MultiOut [E])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Sig -> GE E
unSig Sig
b1 GE
  (E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> MultiOut [E])
-> GE E
-> GE
     (E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Sig -> GE E
unSig Sig
b2 GE
  (E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> MultiOut [E])
-> GE E
-> GE
     (E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Tab -> GE E
unTab Tab
b3 GE
  (E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> MultiOut [E])
-> GE E
-> GE
     (E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Sig -> GE E
unSig Sig
b4 GE
  (E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> MultiOut [E])
-> GE E
-> GE
     (E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Sig -> GE E
unSig Sig
b5 GE
  (E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> MultiOut [E])
-> GE E
-> GE
     (E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Tab -> GE E
unTab Tab
b6 GE
  (E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> MultiOut [E])
-> GE E
-> GE
     (E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Tab -> GE E
unTab Tab
b7 GE
  (E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> MultiOut [E])
-> GE E
-> GE
     (E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Tab -> GE E
unTab Tab
b8 GE
  (E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> MultiOut [E])
-> GE E
-> GE
     (E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Sig -> GE E
unSig Sig
b9 GE
  (E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> MultiOut [E])
-> GE E
-> GE
     (E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Sig -> GE E
unSig Sig
b10 GE
  (E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> MultiOut [E])
-> GE E
-> GE
     (E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Sig -> GE E
unSig Sig
b11 GE
  (E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> MultiOut [E])
-> GE E
-> GE
     (E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Sig -> GE E
unSig Sig
b12 GE
  (E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> MultiOut [E])
-> GE E
-> GE
     (E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Tab -> GE E
unTab Tab
b13 GE
  (E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> MultiOut [E])
-> GE E
-> GE
     (E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Sig -> GE E
unSig Sig
b14 GE
  (E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> MultiOut [E])
-> GE E
-> GE
     (E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Sig -> GE E
unSig Sig
b15 GE
  (E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> MultiOut [E])
-> GE E
-> GE
     (E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Tab -> GE E
unTab Tab
b16 GE
  (E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> MultiOut [E])
-> GE E
-> GE
     (E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Tab -> GE E
unTab Tab
b17 GE
  (E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> MultiOut [E])
-> GE E
-> GE
     (E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Sig -> GE E
unSig Sig
b18 GE
  (E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> MultiOut [E])
-> GE E
-> GE
     (E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Tab -> GE E
unTab Tab
b19 GE
  (E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> MultiOut [E])
-> GE E
-> GE
     (E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Tab -> GE E
unTab Tab
b20 GE
  (E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> MultiOut [E])
-> GE E
-> GE
     (E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Tab -> GE E
unTab Tab
b21 GE
  (E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> MultiOut [E])
-> GE E
-> GE
     (E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Sig -> GE E
unSig Sig
b22 GE
  (E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> MultiOut [E])
-> GE E
-> GE
     (E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Sig -> GE E
unSig Sig
b23 GE
  (E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> MultiOut [E])
-> GE E
-> GE
     (E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Sig -> GE E
unSig Sig
b24 GE
  (E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> MultiOut [E])
-> GE E
-> GE
     (E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Tab -> GE E
unTab Tab
b25 GE
  (E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> MultiOut [E])
-> GE E
-> GE
     (E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Sig -> GE E
unSig Sig
b26 GE
  (E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> MultiOut [E])
-> GE E
-> GE
     (E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Tab -> GE E
unTab Tab
b27 GE
  (E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> MultiOut [E])
-> GE E
-> GE
     (E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> E
      -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Tab -> GE E
unTab Tab
b28 GE
  (E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> E
   -> MultiOut [E])
-> GE E
-> GE
     (E
      -> E -> E -> E -> E -> E -> E -> E -> E -> E -> E -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Tab -> GE E
unTab Tab
b29 GE
  (E
   -> E -> E -> E -> E -> E -> E -> E -> E -> E -> E -> MultiOut [E])
-> GE E
-> GE
     (E -> E -> E -> E -> E -> E -> E -> E -> E -> E -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Tab -> GE E
unTab Tab
b30 GE (E -> E -> E -> E -> E -> E -> E -> E -> E -> E -> MultiOut [E])
-> GE E
-> GE (E -> E -> E -> E -> E -> E -> E -> E -> E -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Tab -> GE E
unTab Tab
b31 GE (E -> E -> E -> E -> E -> E -> E -> E -> E -> MultiOut [E])
-> GE E
-> GE (E -> E -> E -> E -> E -> E -> E -> E -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Sig -> GE E
unSig Sig
b32 GE (E -> E -> E -> E -> E -> E -> E -> E -> MultiOut [E])
-> GE E -> GE (E -> E -> E -> E -> E -> E -> E -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Sig -> GE E
unSig Sig
b33 GE (E -> E -> E -> E -> E -> E -> E -> MultiOut [E])
-> GE E -> GE (E -> E -> E -> E -> E -> E -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Sig -> GE E
unSig Sig
b34 GE (E -> E -> E -> E -> E -> E -> MultiOut [E])
-> GE E -> GE (E -> E -> E -> E -> E -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Sig -> GE E
unSig Sig
b35 GE (E -> E -> E -> E -> E -> MultiOut [E])
-> GE E -> GE (E -> E -> E -> E -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Sig -> GE E
unSig Sig
b36 GE (E -> E -> E -> E -> MultiOut [E])
-> GE E -> GE (E -> E -> E -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Sig -> GE E
unSig Sig
b37 GE (E -> E -> E -> MultiOut [E])
-> GE E -> GE (E -> E -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Sig -> GE E
unSig Sig
b38 GE (E -> E -> MultiOut [E]) -> GE E -> GE (E -> MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Sig -> GE E
unSig Sig
b39 GE (E -> MultiOut [E]) -> GE E -> GE (MultiOut [E])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> D -> GE E
unD D
b40
    where
      f :: E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> E
-> MultiOut [E]
f E
a1 E
a2 E
a3 E
a4 E
a5 E
a6 E
a7 E
a8 E
a9 E
a10 E
a11 E
a12 E
a13 E
a14 E
a15 E
a16 E
a17 E
a18 E
a19 E
a20 E
a21 E
a22 E
a23 E
a24 E
a25 E
a26 E
a27 E
a28 E
a29 E
a30 E
a31 E
a32 E
a33 E
a34 E
a35 E
a36 E
a37 E
a38 E
a39 E
a40 =
          String -> Specs -> [E] -> MultiOut [E]
mopcs String
"partikkel" ([Rate
Ar,Rate
Ar,Rate
Ar,Rate
Ar,Rate
Ar,Rate
Ar,Rate
Ar,Rate
Ar],[Rate
Ar,Rate
Kr,Rate
Ir,Rate
Ar,Rate
Kr,Rate
Ir,Rate
Ir,Rate
Ir,Rate
Kr,Rate
Kr,Rate
Kr,Rate
Kr,Rate
Ir,Rate
Kr,Rate
Kr,Rate
Ir,Rate
Ir,Rate
Ar,Rate
Ir,Rate
Kr,Rate
Ir,Rate
Kr,Rate
Kr,Rate
Kr,Rate
Ir,Rate
Kr,Rate
Kr,Rate
Kr,Rate
Kr,Rate
Kr,Rate
Ir,Rate
Ar,Rate
Ar,Rate
Ar,Rate
Ar,Rate
Kr,Rate
Kr,Rate
Kr,Rate
Kr,Rate
Ir,Rate
Ir]) [E
a1,E
a2,E
a3,E
a4,E
a5,E
a6,E
a7,E
a8,E
a9,E
a10,E
a11,E
a12,E
a13,E
a14,E
a15,E
a16,E
a17,E
a18,E
a19,E
a20,E
a21,E
a22,E
a23,E
a24,E
a25,E
a26,E
a27,E
a28,E
a29,E
a30,E
a31,E
a32,E
a33,E
a34,E
a35,E
a36,E
a37,E
a38,E
a39,E
a40]

-- |
-- Synchronous granular synthesis.
--
-- syncgrain implements synchronous granular synthesis. The source sound for the
-- grains is obtained by reading a function table containing the samples of the source waveform.
-- For sampled-sound sources, GEN01 is used.
-- syncgrain will accept deferred allocation tables.
--
-- > asig  syncgrain  kamp, kfreq, kpitch, kgrsize, kprate, ifun1, \
-- >           ifun2, iolaps
--
-- csound doc: <http://www.csounds.com/manual/html/syncgrain.html>
csdSyncgrain :: Sig -> Sig -> Sig -> Sig -> Sig -> Tab -> Tab -> D -> Sig
csdSyncgrain :: Sig -> Sig -> Sig -> Sig -> Sig -> Tab -> Tab -> D -> Sig
csdSyncgrain Sig
b1 Sig
b2 Sig
b3 Sig
b4 Sig
b5 Tab
b6 Tab
b7 D
b8 = GE E -> Sig
Sig (GE E -> Sig) -> GE E -> Sig
forall a b. (a -> b) -> a -> b
$ E -> E -> E -> E -> E -> E -> E -> E -> E
f (E -> E -> E -> E -> E -> E -> E -> E -> E)
-> GE E -> GE (E -> E -> E -> E -> E -> E -> E -> E)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Sig -> GE E
unSig Sig
b1 GE (E -> E -> E -> E -> E -> E -> E -> E)
-> GE E -> GE (E -> E -> E -> E -> E -> E -> E)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Sig -> GE E
unSig Sig
b2 GE (E -> E -> E -> E -> E -> E -> E)
-> GE E -> GE (E -> E -> E -> E -> E -> E)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Sig -> GE E
unSig Sig
b3 GE (E -> E -> E -> E -> E -> E)
-> GE E -> GE (E -> E -> E -> E -> E)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Sig -> GE E
unSig Sig
b4 GE (E -> E -> E -> E -> E) -> GE E -> GE (E -> E -> E -> E)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Sig -> GE E
unSig Sig
b5 GE (E -> E -> E -> E) -> GE E -> GE (E -> E -> E)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Tab -> GE E
unTab Tab
b6 GE (E -> E -> E) -> GE E -> GE (E -> E)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Tab -> GE E
unTab Tab
b7 GE (E -> E) -> GE E -> GE E
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> D -> GE E
unD D
b8
  where f :: E -> E -> E -> E -> E -> E -> E -> E -> E
f E
a1 E
a2 E
a3 E
a4 E
a5 E
a6 E
a7 E
a8 = String -> Spec1 -> [E] -> E
opcs String
"syncgrain" [(Rate
Ar, [Rate
Kr,Rate
Kr,Rate
Kr,Rate
Kr,Rate
Kr,Rate
Ir,Rate
Ir,Rate
Ir])] [E
a1, E
a2, E
a3, E
a4, E
a5, E
a6, E
a7, E
a8]

-- |
-- A more complex granular synthesis texture generator.
--
-- The granule unit generator is more complex than grain, but does add new possibilities.
--
-- > ares  granule  xamp, ivoice, iratio, imode, ithd, ifn, ipshift, igskip, \
-- >           igskip_os, ilength, kgap, igap_os, kgsize, igsize_os, iatt, idec \
-- >           [, iseed] [, ipitch1] [, ipitch2] [, ipitch3] [, ipitch4] [, ifnenv]
--
-- csound doc: <http://www.csounds.com/manual/html/granule.html>
csdGranule :: Sig -> D -> D -> D -> D -> Tab -> D -> D -> D -> D -> Sig -> D -> Sig -> D -> D -> D -> Sig
csdGranule :: Sig
-> D
-> D
-> D
-> D
-> Tab
-> D
-> D
-> D
-> D
-> Sig
-> D
-> Sig
-> D
-> D
-> D
-> Sig
csdGranule = Sig
-> D
-> D
-> D
-> D
-> Tab
-> D
-> D
-> D
-> D
-> Sig
-> D
-> Sig
-> D
-> D
-> D
-> Sig
C.granule

-- |
-- Reads a mono sound sample from a table and applies time-stretching and/or pitch modification.
--
-- sndwarp reads sound samples from a table and applies time-stretching and/or pitch modification. Time and frequency modification are independent from one another. For example, a sound can be stretched in time while raising the pitch!
--
-- > ares [, ac]  sndwarp  xamp, xtimewarp, xresample, ifn1, ibeg, iwsize, \
-- >           irandw, ioverlap, ifn2, itimemode
--
-- csound doc: <http://www.csounds.com/manual/html/sndwarp.html>
csdSndwarp :: Sig -> Sig -> Sig -> Tab -> D -> D -> D -> D -> Tab -> D -> Sig
csdSndwarp :: Sig -> Sig -> Sig -> Tab -> D -> D -> D -> D -> Tab -> D -> Sig
csdSndwarp = Sig -> Sig -> Sig -> Tab -> D -> D -> D -> D -> Tab -> D -> Sig
forall a.
Tuple a =>
Sig -> Sig -> Sig -> Tab -> D -> D -> D -> D -> Tab -> D -> a
C.sndwarp


-- |
-- Reads a stereo sound sample from a table and applies time-stretching and/or pitch modification.
--
-- sndwarpst reads stereo sound samples from a table and applies time-stretching and/or pitch modification. Time and frequency modification are independent from one another. For example, a sound can be stretched in time while raising the pitch!
--
-- > ar1, ar2 [,ac1] [, ac2]  sndwarpst  xamp, xtimewarp, xresample, ifn1, \
-- >           ibeg, iwsize, irandw, ioverlap, ifn2, itimemode
--
-- csound doc: <http://www.csounds.com/manual/html/sndwarpst.html>
csdSndwarpst :: Sig -> Sig -> Sig -> Tab -> D -> D -> D -> D -> Tab -> D -> Sig2
csdSndwarpst :: Sig -> Sig -> Sig -> Tab -> D -> D -> D -> D -> Tab -> D -> Sig2
csdSndwarpst = Sig -> Sig -> Sig -> Tab -> D -> D -> D -> D -> Tab -> D -> Sig2
forall a.
Tuple a =>
Sig -> Sig -> Sig -> Tab -> D -> D -> D -> D -> Tab -> D -> a
C.sndwarpst

-- |
-- Produces sinusoid bursts including k-rate incremental indexing with each successive burst.
--
-- Audio output is a succession of sinusoid bursts initiated at frequency xfund with a spectral peak at xform. For xfund above 25 Hz these bursts produce a speech-like formant with spectral characteristics determined by the k-input parameters. For lower fundamentals this generator provides a special form of granular synthesis.
--
-- > ares  fof2  xamp, xfund, xform, koct, kband, kris, kdur, kdec, iolaps, \
-- >           ifna, ifnb, itotdur, kphs, kgliss [, iskip]
--
-- csound doc: <http://www.csounds.com/manual/html/fof2.html>
csdFof2 :: Sig -> Sig -> Sig -> Sig -> Sig -> Sig -> Sig -> Sig -> D -> Tab -> Tab -> D -> Sig -> Sig -> Sig
csdFof2 :: Sig
-> Sig
-> Sig
-> Sig
-> Sig
-> Sig
-> Sig
-> Sig
-> D
-> Tab
-> Tab
-> D
-> Sig
-> Sig
-> Sig
csdFof2 = Sig
-> Sig
-> Sig
-> Sig
-> Sig
-> Sig
-> Sig
-> Sig
-> D
-> Tab
-> Tab
-> D
-> Sig
-> Sig
-> Sig
C.fof2