{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeFamilies, NoMonoLocalBinds #-}
{-# LANGUAGE NoIncoherentInstances #-}
{-# LANGUAGE NoMonomorphismRestriction #-}
{-# LANGUAGE NoUndecidableInstances #-}
module Vivid.UGens.Algebraic (
(~+)
, (~-)
, (~*)
, (~**)
, (~/)
, binaryOp
, biOp
, unaryOp
, uOp
, midiCPS
, cpsMIDI
, abs'
, neg
, tanh'
, clip2
, xor
) where
import Vivid.SynthDef
import Prelude
infixl 7 ~*
(~*) :: (ToSig i0 a, ToSig i1 a) => i0 -> i1 -> SDBody' a Signal
(~*) = binaryOp Mul
infixr 8 ~**
(~**) :: (ToSig i0 a, ToSig i1 a) => i0 -> i1 -> SDBody' a Signal
(~**) = binaryOp Pow
infixl 6 ~+
(~+) :: (ToSig i0 a, ToSig i1 a) => i0 -> i1 -> SDBody' a Signal
(~+) = binaryOp Add
infixl 7 ~/
(~/) :: (ToSig i0 a, ToSig i1 a) => i0 -> i1 -> SDBody' a Signal
(~/) = binaryOp FDiv
infixl 6 ~-
(~-) :: (ToSig i0 a, ToSig i1 a) => i0 -> i1 -> SDBody' a Signal
(~-) = binaryOp Sub
binaryOp :: (ToSig s0 a, ToSig s1 a) => BinaryOp -> s0 -> s1 -> SDBody' a Signal
binaryOp theBiOp s0 s1 = do
s0' <- toSig s0
s1' <- toSig s1
calcRate <- max <$> getCalcRate s0' <*> getCalcRate s1'
let sigs = [s0', s1']
addUGen $ UGen (UGName_B theBiOp) calcRate sigs 1
biOp :: (ToSig s0 a, ToSig s1 a) => BinaryOp -> s0 -> s1 -> SDBody' a Signal
biOp = binaryOp
unaryOp :: (ToSig sig a) => UnaryOp -> sig -> SDBody' a Signal
unaryOp theUOp sig = do
sig' <- toSig sig
calcRate <- getCalcRate sig'
addUGen $ UGen (UGName_U theUOp) calcRate [sig'] 1
uOp :: (ToSig sig a) => UnaryOp -> sig -> SDBody' a Signal
uOp = unaryOp
midiCPS :: (ToSig i a) => i -> SDBody' a Signal
midiCPS = unaryOp MIDICPS
cpsMIDI :: (ToSig i a) => i -> SDBody' a Signal
cpsMIDI = unaryOp CPSMIDI
abs' :: (ToSig i a) => i -> SDBody' a Signal
abs' = unaryOp Abs
neg :: (ToSig i a) => i -> SDBody' a Signal
neg = unaryOp Neg
tanh' :: ToSig i a => i -> SDBody' a Signal
tanh' i = uOp TanH i
clip2 :: (ToSig s0 a, ToSig s1 a) => s0 -> s1 -> SDBody' a Signal
clip2 = biOp Clip2
xor :: (ToSig s0 a, ToSig s1 a) => s0 -> s1 -> SDBody' a Signal
xor = biOp BitXor