module Sound.Tidal.Params where

import Sound.Tidal.Stream
import Sound.Tidal.Pattern
import Sound.OSC.FD
import Sound.OSC.Datum
import Data.Map as Map

make' :: (a -> Datum) -> Param -> Pattern a -> OscPattern
make' toOsc par p = fmap (\x -> Map.singleton par (defaultV x)) p
  where defaultV a = Just $ toOsc a

sound :: Pattern String -> OscPattern
sound = make' string sound_p
sound_p = S "sound" Nothing

offset :: Pattern Double -> OscPattern
offset = make' float offset_p
offset_p = F "offset" (Just 0)

begin :: Pattern Double -> OscPattern
begin = make' float begin_p
begin_p = F "begin" (Just 0)

end :: Pattern Double -> OscPattern
end = make' float end_p
end_p = F "end" (Just 1)

speed :: Pattern Double -> OscPattern
speed = make' float speed_p
speed_p = F "speed" (Just 1)

pan :: Pattern Double -> OscPattern
pan = make' float pan_p
pan_p = F "pan" (Just 0.5)

velocity :: Pattern Double -> OscPattern
velocity = make' float velocity_p
velocity_p = F "velocity" (Just 0)

vowel :: Pattern String -> OscPattern
vowel = make' string vowel_p
vowel_p = S "vowel" (Just "")

cutoff :: Pattern Double -> OscPattern
cutoff = make' float cutoff_p
cutoff_p = F "cutoff" (Just 0)

resonance :: Pattern Double -> OscPattern
resonance = make' float resonance_p
resonance_p = F "resonance" (Just 0)

accelerate :: Pattern Double -> OscPattern
accelerate = make' float accelerate_p
accelerate_p = F "accelerate" (Just 0)

shape :: Pattern Double -> OscPattern
shape = make' float shape_p
shape_p = F "shape" (Just 0)

kriole :: Pattern Int -> OscPattern
kriole = make' int32 kriole_p
kriole_p = I "kriole" (Just 0)

gain :: Pattern Double -> OscPattern
gain = make' float gain_p
gain_p = F "gain" (Just 1)

cut :: Pattern Int -> OscPattern
cut = make' int32 cut_p
cut_p = I "cut" (Just (0))

delay :: Pattern Double -> OscPattern
delay = make' float delay_p
delay_p = F "delay" (Just (0))

delaytime :: Pattern Double -> OscPattern
delaytime = make' float delaytime_p
delaytime_p = F "delaytime" (Just (-1))

delayfeedback :: Pattern Double -> OscPattern
delayfeedback = make' float delayfeedback_p
delayfeedback_p = F "delayfeedback" (Just (-1))

crush :: Pattern Double -> OscPattern
crush = make' float crush_p
crush_p = F "crush" (Just 0)

coarse :: Pattern Int -> OscPattern
coarse = make' int32 coarse_p
coarse_p = I "coarse" (Just 0)

hcutoff :: Pattern Double -> OscPattern
hcutoff = make' float hcutoff_p
hcutoff_p = F "hcutoff" (Just 0)

hresonance :: Pattern Double -> OscPattern
hresonance = make' float hresonance_p
hresonance_p = F "hresonance" (Just 0)

bandf :: Pattern Double -> OscPattern
bandf = make' float bandf_p
bandf_p = F "bandf" (Just 0)

bandq :: Pattern Double -> OscPattern
bandq = make' float bandq_p
bandq_p = F "bandq" (Just 0)

unit :: Pattern String -> OscPattern
unit = make' string unit_p
unit_p = S "unit" (Just "rate")

loop :: Pattern Int -> OscPattern
loop = make' int32 loop_p
loop_p = I "loop" (Just 1)