module Sound.Conductive.IOI where
import Control.Concurrent.MVar
import Data.List
import Data.List.Utils
import Data.Maybe
import Sound.Conductive.ConductiveBaseData
import Sound.Conductive.MusicalEnvironment
import Sound.Conductive.MusicalTime
import Sound.Conductive.Player
makeIOIList :: (Num a) => a -> [a] -> [a]
makeIOIList start source = deltasToAbsolutes start $ cycle source
iOIFromList
:: MVar MusicalEnvironment -> Player -> String -> IO Double
iOIFromList e p m = let
minDiff = 0.1
start = playerStartingBeat p
b = playerBeat p
nextBeat currentBeat iOIList = let
nextTwoBeats = take 2 $ dropWhile (<= currentBeat) iOIList
in if ((head nextTwoBeats) currentBeat) < minDiff
then (nextTwoBeats!!1)
else (head nextTwoBeats)
in do il <- getIOIList e m
return $ nextBeat b il
newIOIFunctionAndIOIList
:: MVar MusicalEnvironment
-> String
-> Double
-> [Double]
-> IO MusicalEnvironment
newIOIFunctionAndIOIList env name startingBeat deltas = let
newFunc e p = iOIFromList e p name
newIOIList = makeIOIList startingBeat deltas
in do addIOIList env (name,newIOIList)
addIOI env (name,newFunc)
addIOIs e iois = let
addIOI e (x,y,z) = newIOIFunctionAndIOIList e x y z
in mapM_ (addIOI e) iois