-- | Not exported by default because many of these have the same
--   names as in "Control.Arrow"

{-# LANGUAGE NoMonomorphismRestriction #-}
{-# LANGUAGE ExtendedDefaultRules #-}

module Vivid.ByteBeat (
     (&&&)
   , (|||)
   , (>>>)
   , (<<<)
     -- Reexported from Vivid.UGens.Algebraic:
   , xor

   , byteBeatFromHelpFile
   , baseThing
   ) where


import Vivid.SynthDef
-- import Vivid.SynthDef.ToSig
import Vivid.UGens.Algebraic
import Vivid.UGens.Args
import Vivid.UGens.Generators.Deterministic (impulse)
import Vivid.UGens.Triggers (pulseCount)

(&&&), (|||), (>>>), (<<<)
   :: (ToSig s0 a, ToSig s1 a) => s0 -> s1 -> SDBody' a Signal
-- | Bitwise @and@
(&&&) = biOp BitAnd
-- | Bitwise @or@
(|||) = biOp BitOr
-- | Bit shift right
(>>>) = biOp ShiftRight
-- | Bit shift left
(<<<) = biOp ShiftLeft
-- Also 'xor' from Vivid.UGens.Algebraic


-- | E.g.
-- 
--   > play byteBeatFromHelpFile
byteBeatFromHelpFile :: SDBody' a Signal
byteBeatFromHelpFile = baseThing $ \t ->
   (((t ~* 15) &&& (t >>> 5)) |||
    ((t ~* 5)  &&& (t >>> 3)) |||
    ((t ~* 2)  &&& (t >>> 9)) |||
    ((t ~* 8)  &&& (t >>> 11)))
   ~- 3

-- | E.g.
-- 
--   > play $ baseThing $ \t -> t &&& (t >>> 8)
baseThing :: (Signal -> SDBody' a Signal) -> SDBody' a Signal
baseThing f = do
   t <- pulseCount (trig_ $ impulse (freq_ 8e3))
   sig0 <- f t
   sig1 <- biOp Mod sig0 256
   ((sig1 ~/ 127) ~- 1) ~* 0.1