-- | Non-primitve math UGens.
module Sound.SC3.UGen.Math.Composite where

import Sound.SC3.Common.Math.Operator
import Sound.SC3.UGen.Type
import Sound.SC3.UGen.UGen

-- | Select /q/ or /r/ by /p/, ie. @if p == 1 then q else if p == 0 then r@.
ugen_if :: Num a => a -> a -> a -> a
ugen_if :: a -> a -> a -> a
ugen_if a
p a
q a
r = (a
p a -> a -> a
forall a. Num a => a -> a -> a
* a
q) a -> a -> a
forall a. Num a => a -> a -> a
+ ((a
1 a -> a -> a
forall a. Num a => a -> a -> a
- a
p) a -> a -> a
forall a. Num a => a -> a -> a
* a
r)

-- | Separate input into integral and fractional parts.
--
-- > ugen_integral_and_fractional_parts 1.5 == mce2 1 0.5
ugen_integral_and_fractional_parts :: UGen -> UGen
ugen_integral_and_fractional_parts :: UGen -> UGen
ugen_integral_and_fractional_parts UGen
n =
    let gt_eq_0 :: UGen
gt_eq_0 = let n' :: UGen
n' = UGen -> UGen
forall a. RealFracE a => a -> a
floorE UGen
n in UGen -> UGen -> UGen
mce2 UGen
n' (UGen
n UGen -> UGen -> UGen
forall a. Num a => a -> a -> a
- UGen
n')
        lt_0 :: UGen
lt_0 = let n' :: UGen
n' = UGen -> UGen
forall a. RealFracE a => a -> a
ceilingE UGen
n in UGen -> UGen -> UGen
mce2 UGen
n' (UGen
n UGen -> UGen -> UGen
forall a. Num a => a -> a -> a
- UGen
n')
    in UGen -> UGen -> UGen -> UGen
forall a. Num a => a -> a -> a -> a
ugen_if (UGen
n UGen -> UGen -> UGen
forall a. OrdE a => a -> a -> a
`greater_than_or_equal_to` UGen
0) UGen
gt_eq_0 UGen
lt_0

-- | Fractional midi into integral midi and cents detune.
--
-- > ugen_fmidi_to_midi_detune 60.5 == mce2 60 50
ugen_fmidi_to_midi_detune :: UGen -> UGen
ugen_fmidi_to_midi_detune :: UGen -> UGen
ugen_fmidi_to_midi_detune UGen
mnn =
    let (UGen
n,UGen
c) = UGen -> (UGen, UGen)
unmce2 (UGen -> UGen
ugen_integral_and_fractional_parts UGen
mnn)
    in UGen -> UGen -> UGen
mce2 UGen
n (UGen
c UGen -> UGen -> UGen
forall a. Num a => a -> a -> a
* UGen
100)