module Csound.Air.Wave.Sync(
SyncSmooth(..),
sawSync, isawSync, pulseSync, sqrSync, triSync, bloscSync,
sawSync', isawSync', pulseSync', sqrSync', triSync', bloscSync',
rndSawSync, rndIsawSync, rndPulseSync, rndSqrSync, rndTriSync, rndBloscSync,
sawSyncAbs, isawSyncAbs, pulseSyncAbs, sqrSyncAbs, triSyncAbs, bloscSyncAbs,
sawSyncAbs', isawSyncAbs', pulseSyncAbs', sqrSyncAbs', triSyncAbs', bloscSyncAbs',
sawSyncBy, isawSyncBy, pulseSyncBy, sqrSyncBy, triSyncBy, bloscSyncBy,
sawSyncBy', isawSyncBy', pulseSyncBy', sqrSyncBy', triSyncBy', bloscSyncBy',
sawSyncAbsBy, isawSyncAbsBy, pulseSyncAbsBy, sqrSyncAbsBy, triSyncAbsBy, bloscSyncAbsBy,
sawSyncAbsBy', isawSyncAbsBy', pulseSyncAbsBy', sqrSyncAbsBy', triSyncAbsBy', bloscSyncAbsBy',
rawTriSync, rawSqrSync, rawSawSync, rawPwSync,
rawTriSyncBy, rawSqrSyncBy, rawSawSyncBy, rawPwSyncBy,
rawTriSyncAbs, rawSqrSyncAbs, rawSawSyncAbs, rawPwSyncAbs,
rawTriSyncAbsBy, rawSqrSyncAbsBy, rawSawSyncAbsBy, rawPwSyncAbsBy,
softSync, rawSoftSync, softSyncBy, rawSoftSyncBy,
softSyncAbs, rawSoftSyncAbs, softSyncAbsBy, rawSoftSyncAbsBy
) where
import Data.Default
import Csound.Typed
import Csound.Typed.Opcode hiding (lfo)
import Csound.Tab
import Csound.SigSpace
import Csound.Air.Wave
rndPhsSync :: (D -> Sig -> Sig -> Sig) -> (Sig -> Sig -> SE Sig)
rndPhsSync f ratio cps = fmap (\x -> f x ratio cps) $ rnd 1
rndSawSync :: Sig -> Sig -> SE Sig
rndSawSync = rndPhsSync sawSync'
rndIsawSync :: Sig -> Sig -> SE Sig
rndIsawSync = rndPhsSync isawSync'
rndPulseSync :: Sig -> Sig -> SE Sig
rndPulseSync = rndPhsSync pulseSync'
rndSqrSync :: Sig -> Sig -> SE Sig
rndSqrSync = rndPhsSync sqrSync'
rndTriSync :: Sig -> Sig -> SE Sig
rndTriSync = rndPhsSync triSync'
rndBloscSync :: Tab -> Sig -> Sig -> SE Sig
rndBloscSync t = rndPhsSync (bloscSync' t)
rawTriSyncBy :: SyncSmooth -> Sig -> Sig -> Sig
rawTriSyncBy = oscSyncBy triTab
rawSqrSyncBy :: SyncSmooth -> Sig -> Sig -> Sig
rawSqrSyncBy = oscSyncBy sqrTab
rawSawSyncBy :: SyncSmooth -> Sig -> Sig -> Sig
rawSawSyncBy = oscSyncBy sawTab
rawPwSyncBy :: Double -> SyncSmooth -> Sig -> Sig -> Sig
rawPwSyncBy duty = oscSyncBy (pwTab duty)
rawTriSync :: Sig -> Sig -> Sig
rawTriSync = rawTriSyncBy def
rawSqrSync :: Sig -> Sig -> Sig
rawSqrSync = rawSqrSyncBy def
rawSawSync :: Sig -> Sig -> Sig
rawSawSync = rawSawSyncBy def
rawPwSync :: Double -> Sig -> Sig -> Sig
rawPwSync duty = rawPwSyncBy duty def
rawTriSyncAbsBy :: SyncSmooth -> Sig -> Sig -> Sig
rawTriSyncAbsBy = oscSyncAbsBy triTab
rawSqrSyncAbsBy :: SyncSmooth -> Sig -> Sig -> Sig
rawSqrSyncAbsBy = oscSyncAbsBy sqrTab
rawSawSyncAbsBy :: SyncSmooth -> Sig -> Sig -> Sig
rawSawSyncAbsBy = oscSyncAbsBy sawTab
rawPwSyncAbsBy :: Double -> SyncSmooth -> Sig -> Sig -> Sig
rawPwSyncAbsBy duty = oscSyncAbsBy (pwTab duty)
rawTriSyncAbs :: Sig -> Sig -> Sig
rawTriSyncAbs = rawTriSyncAbsBy def
rawSqrSyncAbs :: Sig -> Sig -> Sig
rawSqrSyncAbs = rawSqrSyncAbsBy def
rawSawSyncAbs :: Sig -> Sig -> Sig
rawSawSyncAbs = rawSawSyncAbsBy def
rawPwSyncAbs :: Double -> Sig -> Sig -> Sig
rawPwSyncAbs duty = rawPwSyncAbsBy duty def
oscSyncBy :: Tab -> SyncSmooth -> Sig -> Sig -> Sig
oscSyncBy tab smoothType cpsRatio cps = oscSyncAbsBy tab smoothType (cpsRatio * cps) cps
oscSyncAbsBy :: Tab -> SyncSmooth -> Sig -> Sig -> Sig
oscSyncAbsBy tab smoothType slaveCps cps = (\smoothFun -> syncOsc smoothFun tab (ar slaveCps) (ar cps)) $ case smoothType of
RawSync -> (\_ _ -> 1)
SawSync -> (\amaster _ -> (1 amaster))
TriSync -> (const $ readSync uniTriTab)
TrapSync -> (const $ readSync uniTrapTab)
UserSync gen -> (const $ readSync gen)
where
readSync ft async = table3 async ft `withD` 1
uniSawTab = setSize 4097 $ elins [1, 0]
uniTriTab = setSize 4097 $ elins [0, 1, 0]
uniTrapTab = setSize 4097 $ elins [1, 1, 0]
syncOsc smoothFun ftab slaveCps cps = dcblock $ aout
where
(amaster, asyncMaster) = syncphasor cps 0
(aslave, asyncSlave) = syncphasor slaveCps asyncMaster
aosc = table3 aslave ftab `withD` 1
aout = aosc * smoothFun amaster asyncMaster
softSync :: SigSpace a => (Sig -> a) -> Sig -> (Sig -> a)
softSync = softSyncBy def
rawSoftSync :: SigSpace a => (Sig -> a) -> Sig -> (Sig -> a)
rawSoftSync = rawSoftSyncBy def
softSyncBy :: SigSpace a => SyncSmooth -> (Sig -> a) -> Sig -> (Sig -> a)
softSyncBy = genSoftSync sqr blosc
rawSoftSyncBy :: SigSpace a => SyncSmooth -> (Sig -> a) -> Sig -> (Sig -> a)
rawSoftSyncBy = genSoftSync rawSqr oscBy
softSyncAbs :: SigSpace a => (Sig -> a) -> Sig -> (Sig -> a)
softSyncAbs = softSyncAbsBy def
rawSoftSyncAbs :: SigSpace a => (Sig -> a) -> Sig -> (Sig -> a)
rawSoftSyncAbs = rawSoftSyncAbsBy def
softSyncAbsBy :: SigSpace a => SyncSmooth -> (Sig -> a) -> Sig -> (Sig -> a)
softSyncAbsBy = genSoftSyncAbs sqr blosc
rawSoftSyncAbsBy :: SigSpace a => SyncSmooth -> (Sig -> a) -> Sig -> (Sig -> a)
rawSoftSyncAbsBy = genSoftSyncAbs rawSqr oscBy
genSoftSync :: SigSpace a => (Sig -> Sig) -> (Tab -> Sig -> Sig) -> SyncSmooth -> (Sig -> a) -> Sig -> (Sig -> a)
genSoftSync cpsSwitchWave smoothTabWave smoothType wave ratio cps = genSoftSyncAbs cpsSwitchWave smoothTabWave smoothType wave (ratio * cps) cps
genSoftSyncAbs :: SigSpace a => (Sig -> Sig) -> (Tab -> Sig -> Sig) -> SyncSmooth -> (Sig -> a) -> Sig -> (Sig -> a)
genSoftSyncAbs cpsSwitchWave smoothTabWave smoothType wave slaveCps cps = flip mul rawSync $ case smoothType of
RawSync -> 1
SawSync -> smoothTabWave uniSawTab cps
TriSync -> smoothTabWave uniTriTab cps
TrapSync -> smoothTabWave uniTrapTab cps
UserSync t -> smoothTabWave t cps
where
rawSync = wave (ar $ ar slaveCps * (ar $ cpsSwitchWave cps))