module Csound.Air.Padsynth (
padsynthOsc, padsynthOsc2,
bwOscBy, bwOddOscBy, bwOscBy2, bwOddOscBy2,
bwOsc, bwTri, bwSqr, bwSaw, bwOsc2, bwTri2, bwSqr2, bwSaw2,
padsynthOscMultiCps, padsynthOscMultiCps2,
padsynthOscMultiVol, padsynthOscMultiVol2,
padsynthOscMultiVolCps, padsynthOscMultiVolCps2,
morphsynthOscMultiCps, quadMorphsynthOscMultiCps
) where
import Data.List
import Control.Arrow (first, second)
import Csound.Typed
import Csound.Tab
import Csound.Air.Wave
import Csound.Typed.Opcode(poscil)
import Csound.Types(compareWhenD)
import Csound.Air.Granular.Morpheus
padsynthOsc :: PadsynthSpec -> Sig -> SE Sig
padsynthOsc :: PadsynthSpec -> Sig -> SE Sig
padsynthOsc PadsynthSpec
spec Sig
freq = D -> Tab -> Sig -> SE Sig
padsynthOscByTab (Double -> D
double (Double -> D) -> Double -> D
forall a b. (a -> b) -> a -> b
$ PadsynthSpec -> Double
padsynthFundamental PadsynthSpec
spec) (PadsynthSpec -> Tab
padsynth PadsynthSpec
spec) Sig
freq
padsynthOscByTab :: D -> Tab -> Sig -> SE Sig
padsynthOscByTab :: D -> Tab -> Sig -> SE Sig
padsynthOscByTab D
baseFreq Tab
tab Sig
freq = SE Sig
ares
where
len :: D
len = Tab -> D
ftlen Tab
tab
wave :: Sig -> SE Sig
wave = (D -> Sig -> Sig) -> Sig -> SE Sig
rndPhs (\D
phs Sig
frq -> Sig -> Sig -> Tab -> Sig
poscil Sig
1 Sig
frq Tab
tab Sig -> D -> Sig
forall a. Tuple a => a -> D -> a
`withD` D
phs)
ares :: SE Sig
ares = Sig -> SE Sig
wave (Sig
freq 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
len) D -> D -> D
forall a. Fractional a => a -> a -> a
/ D
baseFreq))
toStereoOsc :: (a -> SE Sig) -> (a -> SE Sig2)
toStereoOsc :: (a -> SE Sig) -> a -> SE Sig2
toStereoOsc a -> SE Sig
f a
x = do
Sig
left <- a -> SE Sig
f a
x
Sig
right <- a -> SE Sig
f a
x
Sig2 -> SE Sig2
forall (m :: * -> *) a. Monad m => a -> m a
return (Sig
left, Sig
right)
padsynthOsc2 :: PadsynthSpec -> Sig -> SE Sig2
padsynthOsc2 :: PadsynthSpec -> Sig -> SE Sig2
padsynthOsc2 PadsynthSpec
spec Sig
freq = (Sig -> SE Sig) -> Sig -> SE Sig2
forall a. (a -> SE Sig) -> a -> SE Sig2
toStereoOsc (PadsynthSpec -> Sig -> SE Sig
padsynthOsc PadsynthSpec
spec) Sig
freq
layeredPadsynthSpec :: D -> [(D, PadsynthSpec)] -> SE (D, Tab)
layeredPadsynthSpec :: D -> [(D, PadsynthSpec)] -> SE (D, Tab)
layeredPadsynthSpec D
val [(D, PadsynthSpec)]
specs = do
Ref Tab
refTab <- Tab -> SE (Ref Tab)
forall a. Tuple a => a -> SE (Ref a)
newCtrlRef Tab
lastTab
Ref D
refBaseFreq <- D -> SE (Ref D)
forall a. Tuple a => a -> SE (Ref a)
newCtrlRef D
lastBaseFreq
D -> [(D, SE ())] -> SE ()
compareWhenD D
val (((D, PadsynthSpec) -> (D, SE ()))
-> [(D, PadsynthSpec)] -> [(D, SE ())]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((PadsynthSpec -> SE ()) -> (D, PadsynthSpec) -> (D, SE ())
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (d, b) (d, c)
second ((PadsynthSpec -> SE ()) -> (D, PadsynthSpec) -> (D, SE ()))
-> (PadsynthSpec -> SE ()) -> (D, PadsynthSpec) -> (D, SE ())
forall a b. (a -> b) -> a -> b
$ Ref Tab -> Ref D -> PadsynthSpec -> SE ()
toCase Ref Tab
refTab Ref D
refBaseFreq) [(D, PadsynthSpec)]
specs)
Tab
tab <- Ref Tab -> SE Tab
forall a. Tuple a => Ref a -> SE a
readRef Ref Tab
refTab
D
baseFreq <- Ref D -> SE D
forall a. Tuple a => Ref a -> SE a
readRef Ref D
refBaseFreq
(D, Tab) -> SE (D, Tab)
forall (m :: * -> *) a. Monad m => a -> m a
return (D
baseFreq, Tab
tab)
where
toCase :: Ref Tab -> Ref D -> PadsynthSpec -> SE ()
toCase Ref Tab
refTab Ref D
refBaseFreq PadsynthSpec
spec = do
Ref Tab -> Tab -> SE ()
forall a. Tuple a => Ref a -> a -> SE ()
writeRef Ref Tab
refTab (PadsynthSpec -> Tab
padsynth PadsynthSpec
spec)
Ref D -> D -> SE ()
forall a. Tuple a => Ref a -> a -> SE ()
writeRef Ref D
refBaseFreq (Double -> D
double (Double -> D) -> Double -> D
forall a b. (a -> b) -> a -> b
$ PadsynthSpec -> Double
padsynthFundamental PadsynthSpec
spec)
lastTab :: Tab
lastTab = PadsynthSpec -> Tab
padsynth (PadsynthSpec -> Tab) -> PadsynthSpec -> Tab
forall a b. (a -> b) -> a -> b
$ (D, PadsynthSpec) -> PadsynthSpec
forall a b. (a, b) -> b
snd ((D, PadsynthSpec) -> PadsynthSpec)
-> (D, PadsynthSpec) -> PadsynthSpec
forall a b. (a -> b) -> a -> b
$ [(D, PadsynthSpec)] -> (D, PadsynthSpec)
forall a. [a] -> a
last [(D, PadsynthSpec)]
specs
lastBaseFreq :: D
lastBaseFreq = Double -> D
double (Double -> D) -> Double -> D
forall a b. (a -> b) -> a -> b
$ PadsynthSpec -> Double
padsynthFundamental (PadsynthSpec -> Double) -> PadsynthSpec -> Double
forall a b. (a -> b) -> a -> b
$ (D, PadsynthSpec) -> PadsynthSpec
forall a b. (a, b) -> b
snd ((D, PadsynthSpec) -> PadsynthSpec)
-> (D, PadsynthSpec) -> PadsynthSpec
forall a b. (a -> b) -> a -> b
$ [(D, PadsynthSpec)] -> (D, PadsynthSpec)
forall a. [a] -> a
last [(D, PadsynthSpec)]
specs
padsynthOscMultiCps :: [(Double, PadsynthSpec)] -> D -> SE Sig
padsynthOscMultiCps :: [(Double, PadsynthSpec)] -> D -> SE Sig
padsynthOscMultiCps [(Double, PadsynthSpec)]
specs D
freq = do
(D
baseFreq, Tab
tab) <- D -> [(D, PadsynthSpec)] -> SE (D, Tab)
layeredPadsynthSpec D
freq (((Double, PadsynthSpec) -> (D, PadsynthSpec))
-> [(Double, PadsynthSpec)] -> [(D, PadsynthSpec)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Double -> D) -> (Double, PadsynthSpec) -> (D, PadsynthSpec)
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
first Double -> D
double) [(Double, PadsynthSpec)]
specs)
D -> Tab -> Sig -> SE Sig
padsynthOscByTab D
baseFreq Tab
tab (D -> Sig
sig D
freq)
padsynthOscMultiCps2 :: [(Double, PadsynthSpec)] -> D -> SE Sig2
padsynthOscMultiCps2 :: [(Double, PadsynthSpec)] -> D -> SE Sig2
padsynthOscMultiCps2 [(Double, PadsynthSpec)]
specs D
freq = do
(D
baseFreq, Tab
tab) <- D -> [(D, PadsynthSpec)] -> SE (D, Tab)
layeredPadsynthSpec D
freq (((Double, PadsynthSpec) -> (D, PadsynthSpec))
-> [(Double, PadsynthSpec)] -> [(D, PadsynthSpec)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Double -> D) -> (Double, PadsynthSpec) -> (D, PadsynthSpec)
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
first Double -> D
double) [(Double, PadsynthSpec)]
specs)
(Sig -> SE Sig) -> Sig -> SE Sig2
forall a. (a -> SE Sig) -> a -> SE Sig2
toStereoOsc (D -> Tab -> Sig -> SE Sig
padsynthOscByTab D
baseFreq Tab
tab) (D -> Sig
sig D
freq)
padsynthOscMultiVol :: [(Double, PadsynthSpec)] -> (D, Sig) -> SE Sig
padsynthOscMultiVol :: [(Double, PadsynthSpec)] -> (D, Sig) -> SE Sig
padsynthOscMultiVol [(Double, PadsynthSpec)]
specs (D
amp, Sig
freq) = do
(D
baseFreq, Tab
tab) <- D -> [(D, PadsynthSpec)] -> SE (D, Tab)
layeredPadsynthSpec D
amp (((Double, PadsynthSpec) -> (D, PadsynthSpec))
-> [(Double, PadsynthSpec)] -> [(D, PadsynthSpec)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Double -> D) -> (Double, PadsynthSpec) -> (D, PadsynthSpec)
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
first Double -> D
double) [(Double, PadsynthSpec)]
specs)
(Sig -> Sig) -> SE Sig -> SE Sig
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (D -> Sig
sig D
amp Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* ) (SE Sig -> SE Sig) -> SE Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ D -> Tab -> Sig -> SE Sig
padsynthOscByTab D
baseFreq Tab
tab Sig
freq
padsynthOscMultiVol2 :: [(Double, PadsynthSpec)] -> (D, Sig) -> SE Sig2
padsynthOscMultiVol2 :: [(Double, PadsynthSpec)] -> (D, Sig) -> SE Sig2
padsynthOscMultiVol2 [(Double, PadsynthSpec)]
specs (D
amp, Sig
freq) = do
(D
baseFreq, Tab
tab) <- D -> [(D, PadsynthSpec)] -> SE (D, Tab)
layeredPadsynthSpec D
amp (((Double, PadsynthSpec) -> (D, PadsynthSpec))
-> [(Double, PadsynthSpec)] -> [(D, PadsynthSpec)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Double -> D) -> (Double, PadsynthSpec) -> (D, PadsynthSpec)
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
first Double -> D
double) [(Double, PadsynthSpec)]
specs)
(Sig -> SE Sig) -> Sig -> SE Sig2
forall a. (a -> SE Sig) -> a -> SE Sig2
toStereoOsc ((Sig -> Sig) -> SE Sig -> SE Sig
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (D -> Sig
sig D
amp Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* ) (SE Sig -> SE Sig) -> (Sig -> SE Sig) -> Sig -> SE Sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. D -> Tab -> Sig -> SE Sig
padsynthOscByTab D
baseFreq Tab
tab) Sig
freq
padsynthOscMultiVolCps :: [((Double, Double), PadsynthSpec)] -> (D, D) -> SE Sig
padsynthOscMultiVolCps :: [((Double, Double), PadsynthSpec)] -> (D, D) -> SE Sig
padsynthOscMultiVolCps [((Double, Double), PadsynthSpec)]
_ = (D, D) -> SE Sig
forall a. HasCallStack => a
undefined
padsynthOscMultiVolCps2 :: [((Double, Double), PadsynthSpec)] -> (D, D) -> SE Sig2
padsynthOscMultiVolCps2 :: [((Double, Double), PadsynthSpec)] -> (D, D) -> SE Sig2
padsynthOscMultiVolCps2 [((Double, Double), PadsynthSpec)]
specs (D, D)
x = ((D, D) -> SE Sig) -> (D, D) -> SE Sig2
forall a. (a -> SE Sig) -> a -> SE Sig2
toStereoOsc ([((Double, Double), PadsynthSpec)] -> (D, D) -> SE Sig
padsynthOscMultiVolCps [((Double, Double), PadsynthSpec)]
specs) (D, D)
x
bwOscBy :: [Double] -> Double -> Sig -> SE Sig
bwOscBy :: [Double] -> Double -> Sig -> SE Sig
bwOscBy [Double]
harmonics Double
bandwidth = PadsynthSpec -> Sig -> SE Sig
padsynthOsc (Double -> [Double] -> PadsynthSpec
defPadsynthSpec Double
bandwidth [Double]
harmonics)
bwOscBy2 :: [Double] -> Double -> Sig -> SE Sig2
bwOscBy2 :: [Double] -> Double -> Sig -> SE Sig2
bwOscBy2 [Double]
harmonics Double
bandwidth = (Sig -> SE Sig) -> Sig -> SE Sig2
forall a. (a -> SE Sig) -> a -> SE Sig2
toStereoOsc ([Double] -> Double -> Sig -> SE Sig
bwOscBy [Double]
harmonics Double
bandwidth)
bwOddOscBy :: [Double] -> Double -> Sig -> SE Sig
bwOddOscBy :: [Double] -> Double -> Sig -> SE Sig
bwOddOscBy [Double]
harmonics Double
bandwidth = PadsynthSpec -> Sig -> SE Sig
padsynthOsc ((Double -> [Double] -> PadsynthSpec
defPadsynthSpec Double
bandwidth [Double]
harmonics) { padsynthHarmonicStretch :: Double
padsynthHarmonicStretch = Double
2 })
bwOddOscBy2 :: [Double] -> Double -> Sig -> SE Sig2
bwOddOscBy2 :: [Double] -> Double -> Sig -> SE Sig2
bwOddOscBy2 [Double]
harmonics Double
bandwidth = (Sig -> SE Sig) -> Sig -> SE Sig2
forall a. (a -> SE Sig) -> a -> SE Sig2
toStereoOsc ([Double] -> Double -> Sig -> SE Sig
bwOddOscBy [Double]
harmonics Double
bandwidth)
limit :: Int
limit :: Int
limit = Int
15
triCoeff, sqrCoeff, sawCoeff :: [Double]
triCoeff :: [Double]
triCoeff = Double -> [Double] -> [Double]
forall a. a -> [a] -> [a]
intersperse Double
0 ([Double] -> [Double]) -> [Double] -> [Double]
forall a b. (a -> b) -> a -> b
$ (Double -> Double -> Double) -> [Double] -> [Double] -> [Double]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith Double -> Double -> Double
forall a. Num a => a -> a -> a
(*) ((Double -> Double) -> Double -> [Double]
forall a. (a -> a) -> a -> [a]
iterate (Double -> Double -> Double
forall a. Num a => a -> a -> a
* (-Double
1)) (Double
1)) ([Double] -> [Double]) -> [Double] -> [Double]
forall a b. (a -> b) -> a -> b
$ (Double -> Double) -> [Double] -> [Double]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Double
x -> Double
1 Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ (Double
x Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
x)) ([Double] -> [Double]) -> [Double] -> [Double]
forall a b. (a -> b) -> a -> b
$ [Double
1, Double
3 ..]
sqrCoeff :: [Double]
sqrCoeff = Double -> [Double] -> [Double]
forall a. a -> [a] -> [a]
intersperse Double
0 ([Double] -> [Double]) -> [Double] -> [Double]
forall a b. (a -> b) -> a -> b
$ (Double -> Double -> Double) -> [Double] -> [Double] -> [Double]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith Double -> Double -> Double
forall a. Num a => a -> a -> a
(*) ((Double -> Double) -> Double -> [Double]
forall a. (a -> a) -> a -> [a]
iterate (Double -> Double -> Double
forall a. Num a => a -> a -> a
* (-Double
1)) (Double
1)) ([Double] -> [Double]) -> [Double] -> [Double]
forall a b. (a -> b) -> a -> b
$ (Double -> Double) -> [Double] -> [Double]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Double
x -> Double
1 Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ (Double
x)) ([Double] -> [Double]) -> [Double] -> [Double]
forall a b. (a -> b) -> a -> b
$ [Double
1, Double
3 ..]
sawCoeff :: [Double]
sawCoeff = (Double -> Double -> Double) -> [Double] -> [Double] -> [Double]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith Double -> Double -> Double
forall a. Num a => a -> a -> a
(*) ((Double -> Double) -> Double -> [Double]
forall a. (a -> a) -> a -> [a]
iterate (Double -> Double -> Double
forall a. Num a => a -> a -> a
* (-Double
1)) (Double
1)) ([Double] -> [Double]) -> [Double] -> [Double]
forall a b. (a -> b) -> a -> b
$ (Double -> Double) -> [Double] -> [Double]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Double
x -> Double
1 Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ (Double
x)) ([Double] -> [Double]) -> [Double] -> [Double]
forall a b. (a -> b) -> a -> b
$ [Double
1, Double
2 ..]
bwOsc :: Double -> Sig -> SE Sig
bwOsc :: Double -> Sig -> SE Sig
bwOsc = [Double] -> Double -> Sig -> SE Sig
bwOscBy [Double
1]
bwTri :: Double -> Sig -> SE Sig
bwTri :: Double -> Sig -> SE Sig
bwTri = [Double] -> Double -> Sig -> SE Sig
bwOscBy (Int -> [Double] -> [Double]
forall a. Int -> [a] -> [a]
take Int
limit [Double]
triCoeff)
bwSqr :: Double -> Sig -> SE Sig
bwSqr :: Double -> Sig -> SE Sig
bwSqr = [Double] -> Double -> Sig -> SE Sig
bwOscBy (Int -> [Double] -> [Double]
forall a. Int -> [a] -> [a]
take Int
limit [Double]
sqrCoeff)
bwSaw :: Double -> Sig -> SE Sig
bwSaw :: Double -> Sig -> SE Sig
bwSaw = [Double] -> Double -> Sig -> SE Sig
bwOscBy (Int -> [Double] -> [Double]
forall a. Int -> [a] -> [a]
take Int
limit [Double]
sawCoeff)
bwOsc2 :: Double -> Sig -> SE Sig2
bwOsc2 :: Double -> Sig -> SE Sig2
bwOsc2 Double
bandwidth = (Sig -> SE Sig) -> Sig -> SE Sig2
forall a. (a -> SE Sig) -> a -> SE Sig2
toStereoOsc (Double -> Sig -> SE Sig
bwOsc Double
bandwidth)
bwTri2 :: Double -> Sig -> SE Sig2
bwTri2 :: Double -> Sig -> SE Sig2
bwTri2 Double
bandwidth = (Sig -> SE Sig) -> Sig -> SE Sig2
forall a. (a -> SE Sig) -> a -> SE Sig2
toStereoOsc (Double -> Sig -> SE Sig
bwTri Double
bandwidth)
bwSqr2 :: Double -> Sig -> SE Sig2
bwSqr2 :: Double -> Sig -> SE Sig2
bwSqr2 Double
bandwidth = (Sig -> SE Sig) -> Sig -> SE Sig2
forall a. (a -> SE Sig) -> a -> SE Sig2
toStereoOsc (Double -> Sig -> SE Sig
bwSqr Double
bandwidth)
bwSaw2 :: Double -> Sig -> SE Sig2
bwSaw2 :: Double -> Sig -> SE Sig2
bwSaw2 Double
bandwidth = (Sig -> SE Sig) -> Sig -> SE Sig2
forall a. (a -> SE Sig) -> a -> SE Sig2
toStereoOsc (Double -> Sig -> SE Sig
bwSaw Double
bandwidth)
morphsynthOscMultiCps :: MorphSpec -> [(Double, PadsynthSpec)] -> D -> SE Sig2
morphsynthOscMultiCps :: MorphSpec -> [(Double, PadsynthSpec)] -> D -> SE Sig2
morphsynthOscMultiCps MorphSpec
morphSpec [(Double, PadsynthSpec)]
specs D
freq = do
(D
baseFreq, Tab
tab) <- D -> [(D, PadsynthSpec)] -> SE (D, Tab)
layeredPadsynthSpec D
freq (((Double, PadsynthSpec) -> (D, PadsynthSpec))
-> [(Double, PadsynthSpec)] -> [(D, PadsynthSpec)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Double -> D) -> (Double, PadsynthSpec) -> (D, PadsynthSpec)
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
first Double -> D
double) [(Double, PadsynthSpec)]
specs)
MorphSpec -> (D, Tab) -> Sig -> SE Sig2
morpheusOsc MorphSpec
morphSpec (D
baseFreq, Tab
tab) (D -> Sig
sig D
freq)
quadMorphsynthOscMultiCps :: MorphSpec -> [[(Double, PadsynthSpec)]] -> (Sig, Sig) -> D -> SE Sig2
quadMorphsynthOscMultiCps :: MorphSpec -> [[(Double, PadsynthSpec)]] -> Sig2 -> D -> SE Sig2
quadMorphsynthOscMultiCps MorphSpec
morphSpec [[(Double, PadsynthSpec)]]
specs (Sig
x, Sig
y) D
freq = do
[(D, Tab)]
freqTabs <- ([(Double, PadsynthSpec)] -> SE (D, Tab))
-> [[(Double, PadsynthSpec)]] -> SE [(D, Tab)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM [(Double, PadsynthSpec)] -> SE (D, Tab)
getFreqTab [[(Double, PadsynthSpec)]]
specs
let mainFreq :: D
mainFreq = (D, Tab) -> D
forall a b. (a, b) -> a
fst ((D, Tab) -> D) -> (D, Tab) -> D
forall a b. (a -> b) -> a -> b
$ [(D, Tab)] -> (D, Tab)
forall a. [a] -> a
head [(D, Tab)]
freqTabs
MorphSpec -> D -> [(Sig, Tab)] -> Sig2 -> Sig -> SE Sig2
morpheusOsc2 MorphSpec
morphSpec D
mainFreq (((D, Tab) -> (Sig, Tab)) -> [(D, Tab)] -> [(Sig, Tab)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (D -> (D, Tab) -> (Sig, Tab)
forall b. D -> (D, b) -> (Sig, b)
toTab D
mainFreq) [(D, Tab)]
freqTabs) (Sig
x, Sig
y) (D -> Sig
sig D
freq)
where
getFreqTab :: [(Double, PadsynthSpec)] -> SE (D, Tab)
getFreqTab [(Double, PadsynthSpec)]
spec = D -> [(D, PadsynthSpec)] -> SE (D, Tab)
layeredPadsynthSpec D
freq (((Double, PadsynthSpec) -> (D, PadsynthSpec))
-> [(Double, PadsynthSpec)] -> [(D, PadsynthSpec)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Double -> D) -> (Double, PadsynthSpec) -> (D, PadsynthSpec)
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
first Double -> D
double) [(Double, PadsynthSpec)]
spec)
toTab :: D -> (D, b) -> (Sig, b)
toTab D
mainFreq (D
frq, b
t) = (D -> Sig
sig (D -> Sig) -> D -> Sig
forall a b. (a -> b) -> a -> b
$ D
frq D -> D -> D
forall a. Fractional a => a -> a -> a
/ D
mainFreq, b
t)