module Sound.SC3.UGen.Operator where
import Data.Maybe
import Sound.SC3.Common
data Unary = Neg
| Not
| IsNil
| NotNil
| BitNot
| Abs
| AsFloat
| AsInt
| Ceil
| Floor
| Frac
| Sign
| Squared
| Cubed
| Sqrt
| Exp
| Recip
| MIDICPS
| CPSMIDI
| MIDIRatio
| RatioMIDI
| DbAmp
| AmpDb
| OctCPS
| CPSOct
| Log
| Log2
| Log10
| Sin
| Cos
| Tan
| ArcSin
| ArcCos
| ArcTan
| SinH
| CosH
| TanH
| Rand_
| Rand2
| LinRand_
| BiLinRand
| Sum3Rand
| Distort
| SoftClip
| Coin
| DigitValue
| Silence
| Thru
| RectWindow
| HanWindow
| WelchWindow
| TriWindow
| Ramp_
| SCurve
deriving (Eq,Show,Enum,Bounded,Read)
parse_unary :: Case_Rule -> String -> Maybe Unary
parse_unary cr = parse_enum cr
unaryTable :: [(Unary,String)]
unaryTable = []
unaryName :: Int -> String
unaryName n =
let e = toEnum n
in fromMaybe (show e) (lookup e unaryTable)
unaryIndex :: Case_Rule -> String -> Maybe Int
unaryIndex cr nm =
let ix = rlookup_str cr nm unaryTable
ix' = parse_unary cr nm
in fmap fromEnum (maybe ix' Just ix)
is_unary :: Case_Rule -> String -> Bool
is_unary cr = isJust . unaryIndex cr
data Binary = Add
| Sub
| Mul
| IDiv
| FDiv
| Mod
| EQ_
| NE
| LT_
| GT_
| LE
| GE
| Min
| Max
| BitAnd
| BitOr
| BitXor
| LCM
| GCD
| Round
| RoundUp
| Trunc
| Atan2
| Hypot
| Hypotx
| Pow
| ShiftLeft
| ShiftRight
| UnsignedShift
| Fill
| Ring1
| Ring2
| Ring3
| Ring4
| DifSqr
| SumSqr
| SqrSum
| SqrDif
| AbsDif
| Thresh
| AMClip
| ScaleNeg
| Clip2
| Excess
| Fold2
| Wrap2
| FirstArg
| RandRange
| ExpRandRange
deriving (Eq,Show,Enum,Bounded,Read)
parse_binary :: Case_Rule -> String -> Maybe Binary
parse_binary cr = parse_enum cr
binaryTable :: [(Binary,String)]
binaryTable =
[(Add,"+")
,(Sub,"-")
,(Mul,"*")
,(FDiv,"/")
,(Mod,"%")
,(EQ_,"==")
,(NE,"/=")
,(LT_,"<")
,(GT_,">")
,(LE,"<=")
,(GE,">=")
,(Pow,"**")]
binaryName :: Int -> String
binaryName n =
let e = toEnum n
in fromMaybe (show e) (lookup e binaryTable)
binaryIndex :: Case_Rule -> String -> Maybe Int
binaryIndex cr nm =
let ix = rlookup_str cr nm binaryTable
ix' = parse_binary cr nm
in fmap fromEnum (maybe ix' Just ix)
is_binary :: Case_Rule -> String -> Bool
is_binary cr = isJust . binaryIndex cr
resolve_operator :: Case_Rule -> String -> (String,Maybe Int)
resolve_operator cr nm =
case binaryIndex cr nm of
Just sp -> ("BinaryOpUGen",Just sp)
Nothing -> case unaryIndex cr nm of
Just sp -> ("UnaryOpUGen",Just sp)
_ -> (nm,Nothing)