module Vivid.UGens (
lfTri
, lfSaw
, sinOsc
, fSinOsc
, whiteNoise
, pinkNoise
, brownNoise
, xLine
, line
, soundIn0
, mouseX
, mouseY
, bpf
, lpf
, hpf
, clip
, playBuf1
, recordBuf1
, localBuf
, fft
, ifft
, pv_binScramble
, pv_randComb
, (~*)
, (~+)
, (~/)
, (~-)
, (~>)
, midiCPS
, abs'
, neg
, binaryOp
, biOp
, unaryOp
, uOp
, varSaw
, syncSaw
, impulse
, pan2
, out
, lfPar
, lfCub
, lfPulse
, mix
, freeVerb
, pitchShift
, lag
, module Vivid.UGens.Args
) where
import Vivid.SynthDef
import Vivid.UGens.Args
import Control.Applicative
import Data.ByteString (ByteString)
import Data.List.Split (chunksOf)
lfTri :: Freq -> SDState Signal
lfTri (Freq freq) = do
freq' <- toSigM freq
addUGen $ UGen (UGName_S "LFTri") AR [freq', Constant 0] 1
lfSaw :: Freq -> SDState Signal
lfSaw (Freq freq) = do
freq' <- toSigM freq
addUGen $ UGen (UGName_S "LFSaw") AR [freq', Constant 0] 1
whiteNoise :: SDState Signal
whiteNoise = addUGen $ UGen (UGName_S "WhiteNoise") AR [] 1
pinkNoise :: SDState Signal
pinkNoise = addUGen $ UGen (UGName_S "PinkNoise") AR [] 1
brownNoise :: SDState Signal
brownNoise = addUGen $ UGen (UGName_S "BrownNoise") AR [] 1
sinOsc :: Freq -> SDState Signal
sinOsc (Freq i) = do
i' <- toSigM i
addUGen $ UGen (UGName_S "SinOsc") AR [i'] 1
bpf :: In -> Freq -> Rq -> SDState Signal
bpf (In i) (Freq freq) (Rq rq) = do
i' <- toSigM i
freq' <- toSigM freq
rq' <- toSigM rq
addUGen $ UGen (UGName_S "BPF") AR [i', freq', rq'] 1
lpf :: In -> Freq -> SDState Signal
lpf = passFilter "LPF"
hpf :: In -> Freq -> SDState Signal
hpf = passFilter "HPF"
passFilter :: ByteString -> In -> Freq -> SDState Signal
passFilter filterName (In inP) (Freq freq) = do
in' <- toSigM inP
freq' <- toSigM freq
addUGen $ UGen (UGName_S filterName) AR [in', freq'] 1
clip :: In -> Hi -> SDState Signal
clip (In i) (Hi hi) = do
i' <- toSigM i
hi' <- toSigM hi
lo' <- neg hi'
addUGen $ UGen (UGName_S "Clip") AR [i', lo', hi'] 1
soundIn0 :: SDState Signal
soundIn0 = do
nob <- addUGen $ UGen (UGName_S "NumOutputBuses") IR [] 1
addUGen $ UGen (UGName_S "In") AR [nob] 1
(~*) :: (ToSigM sig0, ToSigM sig1) => sig0 -> sig1 -> SDState Signal
(~*) = binaryOp Mul
(~+) :: (ToSigM i0, ToSigM i1) => i0 -> i1 -> SDState Signal
(~+) = binaryOp Add
(~/) :: (ToSigM i0, ToSigM i1) => i0 -> i1 -> SDState Signal
(~/) = binaryOp FDiv
(~>) :: (ToSigM i0, ToSigM i1) => i0 -> i1 -> SDState Signal
(~>) = binaryOp Gt
(~-) :: (ToSigM i0, ToSigM i1) => i0 -> i1 -> SDState Signal
(~-) = binaryOp Sub
binaryOp :: (ToSigM s0, ToSigM s1) => BinaryOp -> s0 -> s1 -> SDState Signal
binaryOp theBiOp s0 s1 = do
s0' <- toSigM s0
s1' <- toSigM s1
let sigs = [s0', s1']
calcRate <- maximum <$> mapM getCalcRate sigs
addUGen $ UGen (UGName_B theBiOp) calcRate sigs 1
biOp :: (ToSigM s0, ToSigM s1) => BinaryOp -> s0 -> s1 -> SDState Signal
biOp = binaryOp
unaryOp :: (ToSigM sig) => UnaryOp -> sig -> SDState Signal
unaryOp theUOp sig = do
sig' <- toSigM sig
calcRate <- getCalcRate sig'
addUGen $ UGen (UGName_U theUOp) calcRate [sig'] 1
uOp :: (ToSigM sig) => UnaryOp -> sig -> SDState Signal
uOp = unaryOp
midiCPS :: (ToSigM i) => i -> SDState Signal
midiCPS = unaryOp MIDICPS
cpsMIDI :: (ToSigM i) => i -> SDState Signal
cpsMIDI = unaryOp CPSMIDI
abs' :: (ToSigM i) => i -> SDState Signal
abs' = unaryOp Abs
neg :: ToSigM i => i -> SDState Signal
neg = unaryOp Neg
out :: (ToSigM i) => Float -> [i] -> SDState [Signal]
out busNum is = do
is' <- mapM toSigM is
addPolyUGen $ UGen (UGName_S "Out") AR (Constant busNum : is') (length is)
lfPar :: Freq -> SDState Signal
lfPar (Freq freq) = do
freq' <- toSigM freq
addUGen $ UGen (UGName_S "LFPar") AR [freq', Constant 0] 1
xLine :: Start -> End -> Dur -> DoneAction -> SDState Signal
xLine (Start start) (End end) (Dur dur) doneAction = do
start' <- toSigM start
end' <- toSigM end
dur' <- toSigM dur
addUGen $ UGen (UGName_S "XLine") KR [start', end', dur', Constant $ doneActionNum doneAction] 1
line :: Start -> End -> Dur -> DoneAction -> SDState Signal
line (Start start) (End end) (Dur dur) doneAction = do
start' <- toSigM start
end' <- toSigM end
dur' <- toSigM dur
addUGen $ UGen (UGName_S "Line") KR [start', end', dur', Constant $ doneActionNum doneAction] 1
lfCub :: Freq -> SDState Signal
lfCub (Freq freq) = do
freq' <- toSigM freq
addUGen $ UGen (UGName_S "LFCub") AR [freq'] 1
impulse :: Freq -> SDState Signal
impulse (Freq freq) = do
freq' <- toSigM freq
addUGen $ UGen (UGName_S "Impulse") AR [freq', Constant 0] 1
lfPulse :: Freq -> Width -> SDState Signal
lfPulse (Freq freq) (Width width) = do
freq' <- toSigM freq
width' <- toSigM width
addUGen $ UGen (UGName_S "LFPulse") AR [freq', Constant 0, width'] 1
mouseY :: MinVal -> MaxVal -> SDState Signal
mouseY = mouseGeneral "MouseY"
mouseX :: MinVal -> MaxVal -> SDState Signal
mouseX = mouseGeneral "MouseX"
mouseGeneral :: ByteString -> (MinVal -> MaxVal -> SDState Signal)
mouseGeneral ugenName (MinVal minVal) (MaxVal maxVal) = do
minVal' <- toSigM minVal
maxVal' <- toSigM maxVal
addUGen $ UGen (UGName_S ugenName) KR [minVal', maxVal', Constant 0, Constant 0.2] 1
varSaw :: Freq -> Width -> SDState Signal
varSaw (Freq freq) (Width width) = do
freq' <- toSigM freq
width' <- toSigM width
addUGen $ UGen (UGName_S "VarSaw") AR [freq', Constant 0, width'] 1
syncSaw :: SyncFreq -> SawFreq -> SDState Signal
syncSaw (SyncFreq syncFreq) (SawFreq sawFreq) = do
syncFreq' <- toSigM syncFreq
sawFreq' <- toSigM sawFreq
addUGen $ UGen (UGName_S "SyncSaw") AR [syncFreq', sawFreq'] 1
localBuf :: NumFrames -> NumChans -> SDState Signal
localBuf (NumFrames numFrames) (NumChans numChannels) = do
mlb <- addUGen $ UGen (UGName_S "MaxLocalBufs") IR [Constant 1] 1
numChannels' <- toSigM numChannels
numFrames' <- toSigM numFrames
addUGen $ UGen (UGName_S "LocalBuf") IR [numChannels', numFrames', mlb] 1
fft :: Buf -> In -> SDState Signal
fft (Buf buf) (In inp) = do
buf' <- toSigM buf
inp' <- toSigM inp
let args = [buf', inp', Constant 0.5, Constant 0, Constant 1, Constant 0]
addUGen $ UGen (UGName_S "FFT") KR args 1
ifft :: Buf -> SDState Signal
ifft (Buf buf) = do
buf' <- toSigM buf
addUGen $ UGen (UGName_S "IFFT") AR [buf', Constant 0, Constant 0] 1
pv_binScramble :: Buf -> Wipe -> Width -> Trigger -> SDState Signal
pv_binScramble (Buf buf) (Wipe wipe) (Width width) (Trigger trigger) = do
buf' <- toSigM buf
wipe' <- toSigM wipe
width' <- toSigM width
trigger' <- toSigM trigger
addUGen $ UGen (UGName_S "PV_BinScramble") KR [buf', wipe', width', trigger'] 1
pv_randComb :: Buf -> Wipe -> Trigger -> SDState Signal
pv_randComb (Buf buf) (Wipe wipe) (Trigger trigger) = do
buf' <- toSigM buf
wipe' <- toSigM wipe
trigger' <- toSigM trigger
addUGen $ UGen (UGName_S "PV_RandComb") KR [buf', wipe', trigger'] 1
mix :: (ToSigM s) => [s] -> SDState Signal
mix [] = error "empty mix"
mix [x] = toSigM x
mix xs = mix =<< (mapM mix' . chunksOf 4) =<< mapM toSigM xs
where
mix' :: [Signal] -> SDState Signal
mix' [] = error "something's broken"
mix' [x] = return x
mix' [a,b] = a ~+ b
mix' ins@[_,_,_] = addUGen $ UGen (UGName_S "Sum3") AR ins 1
mix' ins@[_,_,_,_] = addUGen $ UGen (UGName_S "Sum4") AR ins 1
mix' _ = error "that would be weird"
playBuf1 :: Buf -> SDState Signal
playBuf1 (Buf buf) = do
buf' <- toSigM buf
addUGen $ UGen (UGName_S "PlayBuf") AR [buf', Constant 1, Constant 1, Constant 0, Constant 0, Constant 2] 1
recordBuf1 :: In -> Buf -> SDState Signal
recordBuf1 (In inp) (Buf buf) = do
in' <- toSigM inp
buf' <- toSigM buf
addUGen $ UGen (UGName_S "RecordBuf") AR [buf', Constant 0, Constant 1, Constant 0, Constant 1, Constant 0, Constant 1, Constant 2, in'] 1
freeVerb :: In -> Mix -> Room -> Damp -> SDState Signal
freeVerb (In inp) (Mix mixS) (Room room) (Damp damp) = do
in' <- toSigM inp
mix' <- toSigM mixS
room' <- toSigM room
damp' <- toSigM damp
addUGen $ UGen (UGName_S "FreeVerb") AR [in', mix', room', damp'] 1
pitchShift :: In -> Ratio -> SDState Signal
pitchShift (In inp) (Ratio ratio) = do
in' <- toSigM inp
ratio' <- toSigM ratio
addUGen $ UGen (UGName_S "PitchShift") AR [in', Constant 0.2, ratio', Constant 0, Constant 0] 1
fSinOsc :: Freq -> SDState Signal
fSinOsc (Freq freq) = do
freq' <- toSigM freq
addUGen $ UGen (UGName_S "FSinOsc") AR [freq'] 1
pan2 :: In -> Pos -> SDState [Signal]
pan2 (In inp) (Pos pos) = do
in' <- toSigM inp
pos' <- toSigM pos
addPolyUGen $ UGen (UGName_S "Pan2") AR [in', pos'] 2
lag :: In -> Secs -> SDState Signal
lag (In inp) (Secs secs) = do
in' <- toSigM inp
secs' <- toSigM secs
addUGen $ UGen (UGName_S "Lag") AR [in', secs'] 1