module Csound.Control.Sf(
Sf(Sf), sf2, sfTemp,
sfMsg, sfMsg3, sfMsgm, sfMsg3m, sfMsgLooper,
sfMsgTemp, sfMsgTemp3, sfMsgTempm, sfMsgTemp3m, sfMsgLooperTemp,
sfKey, sfKey3, sfKeym, sfKey3m, sfKeyLooper,
sfCps, sfCps3, sfCpsm, sfCps3m, sfCpsLooper
) where
import Csound.Typed
import Csound.Typed.Opcode
import Csound.Tuning
import Csound.Control.Midi
sf2 :: Sf -> D -> SE (Sig, Sig)
sf2 :: Sf -> D -> SE (Sig, Sig)
sf2 Sf
sf D
sust = (Msg -> SE (Sig, Sig)) -> SE (Sig, Sig)
forall a. (Num a, Sigs a) => (Msg -> SE a) -> SE a
midi ((Msg -> SE (Sig, Sig)) -> SE (Sig, Sig))
-> (Msg -> SE (Sig, Sig)) -> SE (Sig, Sig)
forall a b. (a -> b) -> a -> b
$ Sf -> D -> Msg -> SE (Sig, Sig)
sfMsg3 Sf
sf D
sust
sfTemp :: Temp -> Sf -> D -> SE (Sig, Sig)
sfTemp :: Temp -> Sf -> D -> SE (Sig, Sig)
sfTemp Temp
tm Sf
sf D
sust = (Msg -> SE (Sig, Sig)) -> SE (Sig, Sig)
forall a. (Num a, Sigs a) => (Msg -> SE a) -> SE a
midi ((Msg -> SE (Sig, Sig)) -> SE (Sig, Sig))
-> (Msg -> SE (Sig, Sig)) -> SE (Sig, Sig)
forall a b. (a -> b) -> a -> b
$ Temp -> Sf -> D -> Msg -> SE (Sig, Sig)
sfMsgTemp3 Temp
tm Sf
sf D
sust
sfMsg :: Sf -> D -> Msg -> SE (Sig, Sig)
sfMsg :: Sf -> D -> Msg -> SE (Sig, Sig)
sfMsg = SfFun (Sig, Sig) -> Sf -> D -> Msg -> SE (Sig, Sig)
forall a. (SigSpace a, Sigs a) => SfFun a -> Sf -> D -> Msg -> SE a
genSfMsg SfFun (Sig, Sig)
sfplay
sfMsg3 :: Sf -> D -> Msg -> SE (Sig, Sig)
sfMsg3 :: Sf -> D -> Msg -> SE (Sig, Sig)
sfMsg3 = SfFun (Sig, Sig) -> Sf -> D -> Msg -> SE (Sig, Sig)
forall a. (SigSpace a, Sigs a) => SfFun a -> Sf -> D -> Msg -> SE a
genSfMsg SfFun (Sig, Sig)
sfplay3
sfMsgm :: Sf -> D -> Msg -> SE Sig
sfMsgm :: Sf -> D -> Msg -> SE Sig
sfMsgm = SfFun Sig -> Sf -> D -> Msg -> SE Sig
forall a. (SigSpace a, Sigs a) => SfFun a -> Sf -> D -> Msg -> SE a
genSfMsg SfFun Sig
sfplaym
sfMsg3m :: Sf -> D -> Msg -> SE Sig
sfMsg3m :: Sf -> D -> Msg -> SE Sig
sfMsg3m = SfFun Sig -> Sf -> D -> Msg -> SE Sig
forall a. (SigSpace a, Sigs a) => SfFun a -> Sf -> D -> Msg -> SE a
genSfMsg SfFun Sig
sfplay3m
sfMsgLooper :: Sig -> Sig -> Sig -> Sf -> D -> Msg -> SE (Sig, Sig)
sfMsgLooper :: Sig -> Sig -> Sig -> Sf -> D -> Msg -> SE (Sig, Sig)
sfMsgLooper Sig
start Sig
end Sig
crossfade = SfFun (Sig, Sig) -> Sf -> D -> Msg -> SE (Sig, Sig)
forall a. (SigSpace a, Sigs a) => SfFun a -> Sf -> D -> Msg -> SE a
genSfMsg (SfFun (Sig, Sig) -> Sf -> D -> Msg -> SE (Sig, Sig))
-> SfFun (Sig, Sig) -> Sf -> D -> Msg -> SE (Sig, Sig)
forall a b. (a -> b) -> a -> b
$
\D
vel D
key Sig
amp Sig
cps Sf
sf -> D -> D -> Sig -> Sig -> Sf -> Sig -> Sig -> Sig -> (Sig, Sig)
sflooper D
vel D
key Sig
amp Sig
cps Sf
sf Sig
start Sig
end Sig
crossfade
sfMsgTemp :: Temp -> Sf -> D -> Msg -> SE (Sig, Sig)
sfMsgTemp :: Temp -> Sf -> D -> Msg -> SE (Sig, Sig)
sfMsgTemp = SfFun (Sig, Sig) -> Temp -> Sf -> D -> Msg -> SE (Sig, Sig)
forall a.
(SigSpace a, Sigs a) =>
SfFun a -> Temp -> Sf -> D -> Msg -> SE a
genSfMsgTemp SfFun (Sig, Sig)
sfplay
sfMsgTemp3 :: Temp -> Sf -> D -> Msg -> SE (Sig, Sig)
sfMsgTemp3 :: Temp -> Sf -> D -> Msg -> SE (Sig, Sig)
sfMsgTemp3 = SfFun (Sig, Sig) -> Temp -> Sf -> D -> Msg -> SE (Sig, Sig)
forall a.
(SigSpace a, Sigs a) =>
SfFun a -> Temp -> Sf -> D -> Msg -> SE a
genSfMsgTemp SfFun (Sig, Sig)
sfplay3
sfMsgTempm :: Temp -> Sf -> D -> Msg -> SE Sig
sfMsgTempm :: Temp -> Sf -> D -> Msg -> SE Sig
sfMsgTempm = SfFun Sig -> Temp -> Sf -> D -> Msg -> SE Sig
forall a.
(SigSpace a, Sigs a) =>
SfFun a -> Temp -> Sf -> D -> Msg -> SE a
genSfMsgTemp SfFun Sig
sfplaym
sfMsgTemp3m :: Temp -> Sf -> D -> Msg -> SE Sig
sfMsgTemp3m :: Temp -> Sf -> D -> Msg -> SE Sig
sfMsgTemp3m = SfFun Sig -> Temp -> Sf -> D -> Msg -> SE Sig
forall a.
(SigSpace a, Sigs a) =>
SfFun a -> Temp -> Sf -> D -> Msg -> SE a
genSfMsgTemp SfFun Sig
sfplay3m
sfMsgLooperTemp :: Sig -> Sig -> Sig -> Temp -> Sf -> D -> Msg -> SE (Sig, Sig)
sfMsgLooperTemp :: Sig -> Sig -> Sig -> Temp -> Sf -> D -> Msg -> SE (Sig, Sig)
sfMsgLooperTemp Sig
start Sig
end Sig
crossfade = SfFun (Sig, Sig) -> Temp -> Sf -> D -> Msg -> SE (Sig, Sig)
forall a.
(SigSpace a, Sigs a) =>
SfFun a -> Temp -> Sf -> D -> Msg -> SE a
genSfMsgTemp (SfFun (Sig, Sig) -> Temp -> Sf -> D -> Msg -> SE (Sig, Sig))
-> SfFun (Sig, Sig) -> Temp -> Sf -> D -> Msg -> SE (Sig, Sig)
forall a b. (a -> b) -> a -> b
$
\D
vel D
key Sig
amp Sig
cps Sf
sf -> D -> D -> Sig -> Sig -> Sf -> Sig -> Sig -> Sig -> (Sig, Sig)
sflooper D
vel D
key Sig
amp Sig
cps Sf
sf Sig
start Sig
end Sig
crossfade
sfKey :: Sf -> D -> D -> D -> (Sig, Sig)
sfKey :: Sf -> D -> D -> D -> (Sig, Sig)
sfKey = SfFun (Sig, Sig) -> Sf -> D -> D -> D -> (Sig, Sig)
forall a. SigSpace a => SfFun a -> Sf -> D -> D -> D -> a
genSfKey SfFun (Sig, Sig)
sfplay
sfKey3 :: Sf -> D -> D -> D -> (Sig, Sig)
sfKey3 :: Sf -> D -> D -> D -> (Sig, Sig)
sfKey3 = SfFun (Sig, Sig) -> Sf -> D -> D -> D -> (Sig, Sig)
forall a. SigSpace a => SfFun a -> Sf -> D -> D -> D -> a
genSfKey SfFun (Sig, Sig)
sfplay3
sfKeym :: Sf -> D -> D -> D -> Sig
sfKeym :: Sf -> D -> D -> D -> Sig
sfKeym = SfFun Sig -> Sf -> D -> D -> D -> Sig
forall a. SigSpace a => SfFun a -> Sf -> D -> D -> D -> a
genSfKey SfFun Sig
sfplaym
sfKey3m :: Sf -> D -> D -> D -> Sig
sfKey3m :: Sf -> D -> D -> D -> Sig
sfKey3m = SfFun Sig -> Sf -> D -> D -> D -> Sig
forall a. SigSpace a => SfFun a -> Sf -> D -> D -> D -> a
genSfKey SfFun Sig
sfplay3m
sfKeyLooper :: Sig -> Sig -> Sig -> Sf -> D -> D -> D -> (Sig, Sig)
sfKeyLooper :: Sig -> Sig -> Sig -> Sf -> D -> D -> D -> (Sig, Sig)
sfKeyLooper Sig
start Sig
end Sig
crossfade = SfFun (Sig, Sig) -> Sf -> D -> D -> D -> (Sig, Sig)
forall a. SigSpace a => SfFun a -> Sf -> D -> D -> D -> a
genSfKey (SfFun (Sig, Sig) -> Sf -> D -> D -> D -> (Sig, Sig))
-> SfFun (Sig, Sig) -> Sf -> D -> D -> D -> (Sig, Sig)
forall a b. (a -> b) -> a -> b
$
\D
vel D
key Sig
amp Sig
cps Sf
sf -> D -> D -> Sig -> Sig -> Sf -> Sig -> Sig -> Sig -> (Sig, Sig)
sflooper D
vel D
key Sig
amp Sig
cps Sf
sf Sig
start Sig
end Sig
crossfade
sfCps :: Sf -> D -> D -> D -> (Sig, Sig)
sfCps :: Sf -> D -> D -> D -> (Sig, Sig)
sfCps = SfFun (Sig, Sig) -> Sf -> D -> D -> D -> (Sig, Sig)
forall a.
(Tuple a, SigSpace a) =>
SfFun a -> Sf -> D -> D -> D -> a
genSfCps SfFun (Sig, Sig)
sfplay
sfCps3 :: Sf -> D -> D -> D -> (Sig, Sig)
sfCps3 :: Sf -> D -> D -> D -> (Sig, Sig)
sfCps3 = SfFun (Sig, Sig) -> Sf -> D -> D -> D -> (Sig, Sig)
forall a.
(Tuple a, SigSpace a) =>
SfFun a -> Sf -> D -> D -> D -> a
genSfCps SfFun (Sig, Sig)
sfplay3
sfCpsm :: Sf -> D -> D -> D -> Sig
sfCpsm :: Sf -> D -> D -> D -> Sig
sfCpsm = SfFun Sig -> Sf -> D -> D -> D -> Sig
forall a.
(Tuple a, SigSpace a) =>
SfFun a -> Sf -> D -> D -> D -> a
genSfCps SfFun Sig
sfplaym
sfCps3m :: Sf -> D -> D -> D -> Sig
sfCps3m :: Sf -> D -> D -> D -> Sig
sfCps3m = SfFun Sig -> Sf -> D -> D -> D -> Sig
forall a.
(Tuple a, SigSpace a) =>
SfFun a -> Sf -> D -> D -> D -> a
genSfCps SfFun Sig
sfplay3m
sfCpsLooper :: Sig -> Sig -> Sig -> Sf -> D -> D -> D -> (Sig, Sig)
sfCpsLooper :: Sig -> Sig -> Sig -> Sf -> D -> D -> D -> (Sig, Sig)
sfCpsLooper Sig
start Sig
end Sig
crossfade = SfFun (Sig, Sig) -> Sf -> D -> D -> D -> (Sig, Sig)
forall a.
(Tuple a, SigSpace a) =>
SfFun a -> Sf -> D -> D -> D -> a
genSfCps (SfFun (Sig, Sig) -> Sf -> D -> D -> D -> (Sig, Sig))
-> SfFun (Sig, Sig) -> Sf -> D -> D -> D -> (Sig, Sig)
forall a b. (a -> b) -> a -> b
$
\D
vel D
key Sig
amp Sig
cps Sf
sf -> D -> D -> Sig -> Sig -> Sf -> Sig -> Sig -> Sig -> (Sig, Sig)
sflooper D
vel D
key Sig
amp Sig
cps Sf
sf Sig
start Sig
end Sig
crossfade
type SfFun a = D -> D -> Sig -> Sig -> Sf -> a
genSfMsg :: (SigSpace a, Sigs a) => SfFun a -> Sf -> D -> Msg -> SE a
genSfMsg :: SfFun a -> Sf -> D -> Msg -> SE a
genSfMsg SfFun a
play Sf
sf D
sustain Msg
msg = a -> SE a
forall (m :: * -> *) a. Monad m => a -> m a
return (a -> SE a) -> a -> SE a
forall a b. (a -> b) -> a -> b
$ Sig -> a -> a
forall a. SigSpace a => Sig -> a -> a
mul Sig
env (a -> a) -> a -> a
forall a b. (a -> b) -> a -> b
$ SfFun a
play (Msg -> D
veloc Msg
msg) (Msg -> D
notnum Msg
msg) Sig
1 Sig
1 Sf
sf
where env :: Sig
env = D -> D -> Sig
sfEnv D
sustain (Msg -> D
veloc Msg
msg D -> D -> D
forall a. Fractional a => a -> a -> a
/ D
127)
genSfMsgTemp :: (SigSpace a, Sigs a) => SfFun a -> Temp -> Sf -> D -> Msg -> SE a
genSfMsgTemp :: SfFun a -> Temp -> Sf -> D -> Msg -> SE a
genSfMsgTemp SfFun a
play Temp
tm Sf
sf D
sustain Msg
msg = a -> SE a
forall (m :: * -> *) a. Monad m => a -> m a
return (a -> SE a) -> a -> SE a
forall a b. (a -> b) -> a -> b
$ SfFun a -> Sf -> D -> D -> D -> a
forall a.
(Tuple a, SigSpace a) =>
SfFun a -> Sf -> D -> D -> D -> a
genSfCps SfFun a
play Sf
sf D
sustain (Msg -> D -> D
ampmidi Msg
msg D
1) (Temp -> Msg -> D
cpsmidi' Temp
tm Msg
msg)
genSfKey :: SigSpace a => SfFun a -> Sf -> D -> D -> D -> a
genSfKey :: SfFun a -> Sf -> D -> D -> D -> a
genSfKey SfFun a
play Sf
sf D
sustain D
vel D
key = Sig -> a -> a
forall a. SigSpace a => Sig -> a -> a
mul Sig
env (a -> a) -> a -> a
forall a b. (a -> b) -> a -> b
$ SfFun a
play D
vel D
key Sig
1 Sig
1 Sf
sf
where env :: Sig
env = D -> D -> Sig
sfEnv D
sustain (D
vel D -> D -> D
forall a. Fractional a => a -> a -> a
/ D
127)
genSfCps :: (Tuple a, SigSpace a) => SfFun a -> Sf -> D -> D -> D -> a
genSfCps :: SfFun a -> Sf -> D -> D -> D -> a
genSfCps SfFun a
play Sf
sf D
sustain D
amp D
cps = Sig -> a -> a
forall a. SigSpace a => Sig -> a -> a
mul Sig
env (a -> a) -> a -> a
forall a b. (a -> b) -> a -> b
$ SfFun a
play (D
127 D -> D -> D
forall a. Num a => a -> a -> a
* D
amp) (D -> D
f2m D
cps) Sig
1 (D -> Sig
sig D
cps) Sf
sf a -> D -> a
forall a. Tuple a => a -> D -> a
`withD` D
1
where env :: Sig
env = D -> D -> Sig
sfEnv D
sustain D
amp
sfEnv :: D -> D -> Sig
sfEnv :: D -> D -> Sig
sfEnv D
sustain D
amp = D -> Sig
sig D
frac Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
env
where
frac :: D
frac = D
amp D -> D -> D
forall a. Fractional a => a -> a -> a
/ D
8000
env :: Sig
env = [D] -> D -> D -> Sig
linsegr [D
0, D
0.007, D
1] D
sustain D
0
f2m :: D -> D
f2m :: D -> D
f2m D
cps = D -> D
forall a. SigOrD a => a -> a
round' (D
12 D -> D -> D
forall a. Num a => a -> a -> a
* (D -> D
forall a. Floating a => a -> a
log (D
cps D -> D -> D
forall a. Fractional a => a -> a -> a
/ D
220) D -> D -> D
forall a. Fractional a => a -> a -> a
/ D -> D
forall a. Floating a => a -> a
log D
2) D -> D -> D
forall a. Num a => a -> a -> a
+ D
57)