module Csound.Air.Granular.Morpheus(
WaveAmp, WaveKey, MorphWave,
MorphSpec(..), GrainDensity(..), GrainEnv(..),
morpheus,
morphSnd1, morphSnd,
pairToSquare,
morpheusOsc, morpheusOsc2
) where
import Data.Default
import Csound.Typed
import Csound.Typed.Opcode
import Csound.Tab
import Csound.Air.Granular(Pointer, csdPartikkel)
import Csound.Air.Wav
import Csound.Air.Wave
type WaveAmp = Sig
type WaveKey = Sig
type MorphWave = (Tab, WaveAmp, WaveKey, Pointer)
data GrainDensity = GrainDensity
{ GrainDensity -> Sig
grainRate :: Sig
, GrainDensity -> Sig
grainSize :: Sig
, GrainDensity -> Sig
grainSkip :: Sig }
instance Default GrainDensity where
def :: GrainDensity
def = GrainDensity :: Sig -> Sig -> Sig -> GrainDensity
GrainDensity
{ grainRate :: Sig
grainRate = Sig
kGrainRate
, grainSize :: Sig
grainSize = Sig
kduration
, grainSkip :: Sig
grainSkip = Sig
0 }
where
kGrainDur :: Sig
kGrainDur = Sig
2.5
kduration :: Sig
kduration = (Sig
kGrainDurSig -> Sig -> Sig
forall a. Num a => a -> a -> a
*Sig
1000)Sig -> Sig -> Sig
forall a. Fractional a => a -> a -> a
/Sig
kGrainRate
kGrainRate :: Sig
kGrainRate = Sig
12
data GrainEnv = GrainEnv
{ GrainEnv -> Tab
grainAttShape :: Tab
, GrainEnv -> Tab
grainDecShape :: Tab
, GrainEnv -> Sig
grainSustRatio :: Sig
, GrainEnv -> Sig
grainAttDecRatio :: Sig }
instance Default GrainEnv where
def :: GrainEnv
def = GrainEnv :: Tab -> Tab -> Sig -> Sig -> GrainEnv
GrainEnv
{ grainAttShape :: Tab
grainAttShape = Tab
sigmoidRise
, grainDecShape :: Tab
grainDecShape = Tab
sigmoidFall
, grainSustRatio :: Sig
grainSustRatio = Sig
0.25
, grainAttDecRatio :: Sig
grainAttDecRatio = Sig
0.5 }
data MorphSpec = MorphSpec
{ MorphSpec -> GrainDensity
morphGrainDensity :: GrainDensity
, MorphSpec -> GrainEnv
morphGrainEnv :: GrainEnv
}
instance Default MorphSpec where
def :: MorphSpec
def = MorphSpec :: GrainDensity -> GrainEnv -> MorphSpec
MorphSpec
{ morphGrainDensity :: GrainDensity
morphGrainDensity = GrainDensity
forall a. Default a => a
def
, morphGrainEnv :: GrainEnv
morphGrainEnv = GrainEnv
forall a. Default a => a
def
}
morpheus :: MorphSpec -> [MorphWave] -> Sig -> SE Sig2
morpheus :: MorphSpec -> [MorphWave] -> Sig -> SE Sig2
morpheus MorphSpec
spec [MorphWave]
pwaves Sig
cps = [SE Sig2] -> SE Sig2
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum ([SE Sig2] -> SE Sig2) -> [SE Sig2] -> SE Sig2
forall a b. (a -> b) -> a -> b
$ ([MorphWave] -> SE Sig2) -> [[MorphWave]] -> [SE Sig2]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\[MorphWave]
waves -> MorphSpec -> [MorphWave] -> Sig -> SE Sig2
morpheus4 MorphSpec
spec [MorphWave]
waves Sig
cps) ([MorphWave] -> [[MorphWave]]
forall a. [a] -> [[a]]
splitBy4 [MorphWave]
pwaves)
splitBy4 :: [a] -> [[a]]
splitBy4 :: [a] -> [[a]]
splitBy4 [a]
xs = case [a]
xs of
a
a:a
b:a
c:a
d:[a]
rest -> [a
a,a
b,a
c,a
d] [a] -> [[a]] -> [[a]]
forall a. a -> [a] -> [a]
: [a] -> [[a]]
forall a. [a] -> [[a]]
splitBy4 [a]
rest
[a]
rest -> [[a]
rest]
morpheus4 :: MorphSpec -> [MorphWave] -> Sig -> SE Sig2
morpheus4 :: MorphSpec -> [MorphWave] -> Sig -> SE Sig2
morpheus4 MorphSpec
spec [MorphWave]
pwaves Sig
cps = do
Tab
iwaveamptab <- Sig -> Sig -> Sig -> Sig -> SE Tab
makeMorphTable Sig
amp1 Sig
amp2 Sig
amp3 Sig
amp4
Sig2 -> SE Sig2
forall (m :: * -> *) a. Monad m => a -> m a
return (Sig2 -> SE Sig2) -> Sig2 -> SE Sig2
forall a b. (a -> b) -> a -> b
$ 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
-> Sig2
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
agrainrate Sig
kdistribution Tab
idisttab Sig
async Sig
kenv2amt Tab
ienv2tab
Tab
ienv_attack Tab
ienv_decay Sig
ksustain_amount Sig
ka_d_ratio Sig
kduration Sig
kamp Tab
igainmasks
Sig
kwavfreq Sig
ksweepshape Tab
iwavfreqstarttab Tab
iwavfreqendtab Sig
awavfm
Tab
ifmamptab Tab
ifmenv Tab
icosine Sig
kTrainCps Sig
knumpartials
Sig
kchroma Tab
ichannelmasks Sig
krandommask Tab
kwaveform1 Tab
kwaveform2 Tab
kwaveform3 Tab
kwaveform4
Tab
iwaveamptab Sig
asamplepos1 Sig
asamplepos2 Sig
asamplepos3 Sig
asamplepos4
Sig
kwavekey1 Sig
kwavekey2 Sig
kwavekey3 Sig
kwavekey4 D
imax_grains
where
MorphWave
wave1 : MorphWave
wave2 : MorphWave
wave3 : MorphWave
wave4 : [MorphWave]
_ = [MorphWave] -> [MorphWave]
forall a. [a] -> [a]
cycle [MorphWave]
pwaves
async :: Sig
async = Sig
0
kamp :: Sig
kamp = Sig
1
ichannelmasks :: Tab
ichannelmasks = Tab -> Tab
skipNorm (Tab -> Tab) -> Tab -> Tab
forall a b. (a -> b) -> a -> b
$ [Double] -> Tab
doubles [Double
0, Double
0, Double
0.5]
kdistribution :: Sig
kdistribution = Sig
1
idisttab :: Tab
idisttab = Int -> Tab -> Tab
setSize Int
16 (Tab -> Tab) -> Tab -> Tab
forall a b. (a -> b) -> a -> b
$ [Double] -> Tab
startEnds [Double
1, Double
16, -Double
10, Double
0]
grainEnv :: GrainEnv
grainEnv = MorphSpec -> GrainEnv
morphGrainEnv MorphSpec
spec
ienv_attack :: Tab
ienv_attack = GrainEnv -> Tab
grainAttShape GrainEnv
grainEnv
ienv_decay :: Tab
ienv_decay = GrainEnv -> Tab
grainDecShape GrainEnv
grainEnv
ksustain_amount :: Sig
ksustain_amount = GrainEnv -> Sig
grainSustRatio GrainEnv
grainEnv
ka_d_ratio :: Sig
ka_d_ratio = GrainEnv -> Sig
grainAttDecRatio GrainEnv
grainEnv
kenv2amt :: Sig
kenv2amt = Sig
0
ienv2tab :: Tab
ienv2tab = [Double] -> Tab
eexps [Double
1, Double
0.0001]
grainDensity :: GrainDensity
grainDensity = MorphSpec -> GrainDensity
morphGrainDensity MorphSpec
spec
kGrainRate :: Sig
kGrainRate = GrainDensity -> Sig
grainRate GrainDensity
grainDensity
kduration :: Sig
kduration = GrainDensity -> Sig
grainSize GrainDensity
grainDensity
kwavfreq :: Sig
kwavfreq = Sig
cps
krandommask :: Sig
krandommask = GrainDensity -> Sig
grainSkip GrainDensity
grainDensity
kwavekey1 :: Sig
kwavekey1 = MorphWave -> Sig
forall b d. (Tab, b, Sig, d) -> Sig
getWaveKey MorphWave
wave1
kwavekey2 :: Sig
kwavekey2 = MorphWave -> Sig
forall b d. (Tab, b, Sig, d) -> Sig
getWaveKey MorphWave
wave2
kwavekey3 :: Sig
kwavekey3 = MorphWave -> Sig
forall b d. (Tab, b, Sig, d) -> Sig
getWaveKey MorphWave
wave3
kwavekey4 :: Sig
kwavekey4 = MorphWave -> Sig
forall b d. (Tab, b, Sig, d) -> Sig
getWaveKey MorphWave
wave4
asamplepos1 :: Sig
asamplepos1 = MorphWave -> Sig
forall a b c d. (a, b, c, d) -> d
getSamplePos MorphWave
wave1
asamplepos2 :: Sig
asamplepos2 = MorphWave -> Sig
forall a b c d. (a, b, c, d) -> d
getSamplePos MorphWave
wave2
asamplepos3 :: Sig
asamplepos3 = MorphWave -> Sig
forall a b c d. (a, b, c, d) -> d
getSamplePos MorphWave
wave3
asamplepos4 :: Sig
asamplepos4 = MorphWave -> Sig
forall a b c d. (a, b, c, d) -> d
getSamplePos MorphWave
wave4
kwaveform1 :: Tab
kwaveform1 = MorphWave -> Tab
forall a b c d. (a, b, c, d) -> a
getWaveForm MorphWave
wave1
kwaveform2 :: Tab
kwaveform2 = MorphWave -> Tab
forall a b c d. (a, b, c, d) -> a
getWaveForm MorphWave
wave2
kwaveform3 :: Tab
kwaveform3 = MorphWave -> Tab
forall a b c d. (a, b, c, d) -> a
getWaveForm MorphWave
wave3
kwaveform4 :: Tab
kwaveform4 = MorphWave -> Tab
forall a b c d. (a, b, c, d) -> a
getWaveForm MorphWave
wave4
amp1 :: Sig
amp1 = MorphWave -> Sig
forall a c d. (a, Sig, c, d) -> Sig
getAmp MorphWave
wave1
amp2 :: Sig
amp2 = MorphWave -> Sig
forall a c d. (a, Sig, c, d) -> Sig
getAmp MorphWave
wave2
amp3 :: Sig
amp3 = MorphWave -> Sig
forall a c d. (a, Sig, c, d) -> Sig
getAmp MorphWave
wave3
amp4 :: Sig
amp4 = MorphWave -> Sig
forall a c d. (a, Sig, c, d) -> Sig
getAmp MorphWave
wave4
imax_grains :: D
imax_grains = D
100
getWaveKey :: (Tab, b, Sig, d) -> Sig
getWaveKey (Tab
tab1, b
_, Sig
key1, d
_) = Sig
key1 Sig -> Sig -> Sig
forall a. Fractional a => a -> a -> a
/ D -> Sig
sig (Tab -> D
getTabLen Tab
tab1)
getSamplePos :: (a, b, c, d) -> d
getSamplePos (a
_, b
_, c
_, d
ptr) = d
ptr
getWaveForm :: (a, b, c, d) -> a
getWaveForm (a
form, b
_, c
_, d
_) = a
form
getAmp :: (a, Sig, c, d) -> Sig
getAmp (a
_, Sig
amp, c
_, d
_) = Sig -> Sig
kr Sig
amp
icosine :: Tab
icosine = Tab
cosine
kTrainCps :: Sig
kTrainCps = Sig
kGrainRate
knumpartials :: Sig
knumpartials = Sig
7
kchroma :: Sig
kchroma = Sig
3
kGrFmFreq :: Sig
kGrFmFreq = Sig
kGrainRate Sig -> Sig -> Sig
forall a. Fractional a => a -> a -> a
/ Sig
4
kGrFmIndex :: Sig
kGrFmIndex = Sig
0
aGrFmSig :: Sig
aGrFmSig = Sig
kGrFmIndex Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig -> Sig
osc Sig
kGrFmFreq
agrainrate :: Sig
agrainrate = Sig
kGrainRate Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ Sig
aGrFmSig Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
kGrainRate
ifmenv :: Tab
ifmenv = [Double] -> Tab
elins [Double
0, Double
1, Double
0]
ifmamptab :: Tab
ifmamptab = Tab -> Tab
skipNorm (Tab -> Tab) -> Tab -> Tab
forall a b. (a -> b) -> a -> b
$ [Double] -> Tab
doubles [Double
0, Double
0, Double
1]
awavfm :: Sig
awavfm = Sig
0
igainmasks :: Tab
igainmasks = Tab -> Tab
skipNorm (Tab -> Tab) -> Tab -> Tab
forall a b. (a -> b) -> a -> b
$ [Double] -> Tab
doubles [Double
0, Double
0, Double
1]
ksweepshape :: Sig
ksweepshape = Sig
0.5
iwavfreqstarttab :: Tab
iwavfreqstarttab = Tab -> Tab
skipNorm (Tab -> Tab) -> Tab -> Tab
forall a b. (a -> b) -> a -> b
$ [Double] -> Tab
doubles [Double
0, Double
0, Double
1]
iwavfreqendtab :: Tab
iwavfreqendtab = Tab -> Tab
skipNorm (Tab -> Tab) -> Tab -> Tab
forall a b. (a -> b) -> a -> b
$ [Double] -> Tab
doubles [Double
0, Double
0, Double
1]
makeMorphTable :: Sig -> Sig -> Sig -> Sig -> SE Tab
makeMorphTable Sig
a1 Sig
a2 Sig
a3 Sig
a4 = do
Tab
t <- D -> SE Tab
newTab D
64
((Int, Sig) -> SE ()) -> [(Int, Sig)] -> SE ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (\(Int
i, Sig
amp) -> Sig -> Sig -> Tab -> SE ()
tablew Sig
amp (Sig
2 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ D -> Sig
sig (Int -> D
int Int
i)) Tab
t ) ([Int] -> [Sig] -> [(Int, Sig)]
forall a b. [a] -> [b] -> [(a, b)]
zip [Int
0 .. ] [Sig
a1, Sig
a2, Sig
a3, Sig
a4])
Tab -> SE Tab
forall (m :: * -> *) a. Monad m => a -> m a
return Tab
t
getTabLen :: Tab -> D
getTabLen :: Tab -> D
getTabLen Tab
t = Tab -> D
ftlen Tab
t D -> D -> D
forall a. Fractional a => a -> a -> a
/ D
getSampleRate
pairToSquare :: (Sig, Sig) -> (Sig, Sig, Sig, Sig)
pairToSquare :: Sig2 -> (Sig, Sig, Sig, Sig)
pairToSquare (Sig
x, Sig
y) = ((Sig
1 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
- Sig
x) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* (Sig
1 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
- Sig
y), Sig
x Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* (Sig
1 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
- Sig
y) , Sig
x Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
y, (Sig
1 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
- Sig
x) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
y)
morphSnd1 :: MorphSpec -> [(String, WaveAmp, WaveKey)] -> Sig -> SE Sig2
morphSnd1 :: MorphSpec -> [(String, Sig, Sig)] -> Sig -> SE Sig2
morphSnd1 MorphSpec
spec [(String, Sig, Sig)]
waves Sig
cps = MorphSpec -> [MorphWave] -> Sig -> SE Sig2
morpheus MorphSpec
spec (((String, Sig, Sig) -> MorphWave)
-> [(String, Sig, Sig)] -> [MorphWave]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (String, Sig, Sig) -> MorphWave
forall b c. (String, b, c) -> (Tab, b, c, Sig)
fromSnd [(String, Sig, Sig)]
waves) Sig
cps
where
fromSnd :: (String, b, c) -> (Tab, b, c, Sig)
fromSnd (String
file, b
amp, c
key) = (String -> Tab
wavLeft String
file, b
amp, c
key, Sig -> Sig
phasor (Sig
1 Sig -> Sig -> Sig
forall a. Fractional a => a -> a -> a
/ D -> Sig
sig (String -> D
lengthSnd String
file)))
morphSnd :: MorphSpec -> [(String, WaveAmp, WaveKey)] -> Sig -> SE Sig2
morphSnd :: MorphSpec -> [(String, Sig, Sig)] -> Sig -> SE Sig2
morphSnd MorphSpec
spec [(String, Sig, Sig)]
waves Sig
cps = (String -> Tab)
-> MorphSpec -> [(String, Sig, Sig)] -> Sig -> SE Sig2
morphSndByTab String -> Tab
wavLeft MorphSpec
spec [(String, Sig, Sig)]
waves Sig
cps SE Sig2 -> SE Sig2 -> SE Sig2
forall a. Num a => a -> a -> a
+ (String -> Tab)
-> MorphSpec -> [(String, Sig, Sig)] -> Sig -> SE Sig2
morphSndByTab String -> Tab
wavRight MorphSpec
spec [(String, Sig, Sig)]
waves Sig
cps
morphSndByTab :: (String -> Tab) -> MorphSpec -> [(String, WaveAmp, WaveKey)] -> Sig -> SE Sig2
morphSndByTab :: (String -> Tab)
-> MorphSpec -> [(String, Sig, Sig)] -> Sig -> SE Sig2
morphSndByTab String -> Tab
getTab MorphSpec
spec [(String, Sig, Sig)]
waves Sig
cps = MorphSpec -> [MorphWave] -> Sig -> SE Sig2
morpheus MorphSpec
spec (((String, Sig, Sig) -> MorphWave)
-> [(String, Sig, Sig)] -> [MorphWave]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (String, Sig, Sig) -> MorphWave
forall b c. (String, b, c) -> (Tab, b, c, Sig)
fromSnd [(String, Sig, Sig)]
waves) Sig
cps
where
fromSnd :: (String, b, c) -> (Tab, b, c, Sig)
fromSnd (String
file, b
amp, c
key) = (String -> Tab
getTab String
file, b
amp, c
key, Sig -> Sig
phasor (Sig
1 Sig -> Sig -> Sig
forall a. Fractional a => a -> a -> a
/ D -> Sig
sig (String -> D
lengthSnd String
file)))
morpheusOsc :: MorphSpec -> (D, Tab) -> Sig -> SE Sig2
morpheusOsc :: MorphSpec -> (D, Tab) -> Sig -> SE Sig2
morpheusOsc MorphSpec
spec (D
baseFreq, Tab
t) Sig
cps = MorphSpec -> [MorphWave] -> Sig -> SE Sig2
morpheus MorphSpec
spec [MorphWave]
waves Sig
ratio
where
ratio :: Sig
ratio = Sig
cps Sig -> Sig -> Sig
forall a. Fractional a => a -> a -> a
/ D -> Sig
sig D
baseFreq
aptr :: Sig
aptr = Tab -> Sig
cycleTab Tab
t
waves :: [MorphWave]
waves = [(Tab
t, Sig
1, Sig
1, Sig
aptr)]
cycleTab :: Tab -> Sig
cycleTab :: Tab -> Sig
cycleTab Tab
t = Sig -> Sig
phasor (Sig -> Sig) -> Sig -> Sig
forall a b. (a -> b) -> a -> b
$ D -> Sig
sig (D -> Sig) -> D -> Sig
forall a b. (a -> b) -> a -> b
$ D -> D
forall a. Fractional a => a -> a
recip (D -> D) -> D -> D
forall a b. (a -> b) -> a -> b
$ Tab -> D
getTabLen Tab
t
morpheusOsc2 :: MorphSpec -> D -> [(Sig, Tab)] -> (Sig, Sig) -> Sig -> SE Sig2
morpheusOsc2 :: MorphSpec -> D -> [(Sig, Tab)] -> Sig2 -> Sig -> SE Sig2
morpheusOsc2 MorphSpec
spec D
baseFreq [(Sig, Tab)]
ts (Sig
x, Sig
y) Sig
cps = MorphSpec -> [MorphWave] -> Sig -> SE Sig2
morpheus MorphSpec
spec [MorphWave]
waves Sig
ratio
where
(Sig
a1, Sig
a2, Sig
a3, Sig
a4) = Sig2 -> (Sig, Sig, Sig, Sig)
pairToSquare (Sig
x, Sig
y)
ratio :: Sig
ratio = Sig
cps Sig -> Sig -> Sig
forall a. Fractional a => a -> a -> a
/ D -> Sig
sig D
baseFreq
waves :: [MorphWave]
waves = (Sig -> (Sig, Tab) -> MorphWave)
-> [Sig] -> [(Sig, Tab)] -> [MorphWave]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (\Sig
amp (Sig
key, Tab
t) -> (Tab
t, Sig
amp, Sig
key, Tab -> Sig
cycleTab Tab
t)) ([Sig] -> [Sig]
forall a. [a] -> [a]
cycle [Sig
a1, Sig
a2, Sig
a3, Sig
a4]) [(Sig, Tab)]
ts