tidal 0.4 → 0.4.1
raw patch · 5 files changed
+37/−36 lines, 5 files
Files
- Sound/Tidal/Context.hs +1/−0
- Sound/Tidal/Stream.hs +11/−31
- Sound/Tidal/Tempo.hs +11/−3
- tidal.cabal +1/−1
- tidal.el +13/−1
Sound/Tidal/Context.hs view
@@ -10,3 +10,4 @@ import Sound.Tidal.Dirt as C import Sound.Tidal.Strategies as C import Sound.Tidal.Tempo as C+import Sound.Tidal.Time as C
Sound/Tidal/Stream.hs view
@@ -39,7 +39,7 @@ type OscPattern = Pattern OscMap -latency = 0.06+latency = 0.04 defaultDatum :: Param -> Maybe Datum defaultDatum (S _ (Just x)) = Just $ string x@@ -69,17 +69,12 @@ isSubset :: (Eq a) => [a] -> [a] -> Bool isSubset xs ys = all (\x -> elem x ys) xs -tpb = 1-bpb = 2- toMessage :: UDP -> OscShape -> Tempo -> Int -> (Double, OscMap) -> Maybe (IO ())-toMessage s shape change ticks (o, m) =+toMessage s shape change cycle (o, m) = do m' <- applyShape' shape m- let beat = fromIntegral ticks / fromIntegral tpb- logicalNow = (logicalTime change beat)- beat' = (fromIntegral ticks + 1) / fromIntegral tpb- logicalPeriod = (logicalTime change (beat + 1)) - logicalNow- --logicalOnset = ntpr_to_ut $ logicalNow + (logicalPeriod * o) + latency+ let cycleD = (fromIntegral cycle) :: Double+ logicalNow = (logicalTime change cycleD)+ logicalPeriod = (logicalTime change (cycleD + 1)) - logicalNow logicalOnset = logicalNow + (logicalPeriod * o) + latency sec = floor logicalOnset usec = floor $ 1000000 * (logicalOnset - (fromIntegral sec))@@ -112,7 +107,7 @@ stream :: String -> Int -> OscShape -> IO (OscPattern -> IO ()) stream address port shape = do patternM <- start address port shape- return $ \p -> do swapMVar patternM (slow bpb p)+ return $ \p -> do swapMVar patternM p return () streamcallback :: (OscPattern -> IO ()) -> String -> Int -> OscShape -> IO (OscPattern -> IO ())@@ -123,31 +118,16 @@ return f' onTick :: UDP -> OscShape -> MVar (OscPattern) -> Tempo -> Int -> IO ()-onTick s shape patternM change beats+onTick s shape patternM change cycles = do p <- readMVar patternM- let --tpb' = 2 :: Integer- tpb' = 1- beats' = (fromIntegral beats) :: Integer- a = beats' % tpb'- b = (beats' + 1) % tpb'+ let cycles' = (fromIntegral cycles) :: Integer+ a = cycles' % 1+ b = (cycles' + 1) % 1 messages = mapMaybe - (toMessage s shape change beats) + (toMessage s shape change cycles) (seqToRelOnsets (a, b) p)- --putStrLn $ (show a) ++ ", " ++ (show b)- --putStrLn $ "tick " ++ show ticks ++ " = " ++ show messages E.catch (sequence_ messages) (\msg -> putStrLn $ "oops " ++ show (msg :: E.SomeException)) return ()--{-ticker :: IO (MVar Rational)-ticker = do mv <- newMVar 0- --forkIO $ clocked "ticker" "127.0.0.1" "127.0.0.1" tpb (f mv)- forkIO $ clocked (f mv)- return mv- where f mv change ticks = do swapMVar mv ((fromIntegral ticks) / (fromIntegral tpb))- where f mv ticks = do swapMVar mv (fromIntegral ticks)- return ()- tpb = 32--} make :: (a -> Datum) -> OscShape -> String -> Pattern a -> OscPattern make toOsc s nm p = fmap (\x -> Map.singleton nParam (defaultV x)) p
Sound/Tidal/Tempo.hs view
@@ -46,7 +46,7 @@ tempoMVar :: IO (MVar (Tempo)) tempoMVar = do now <- getCurrentTime- mv <- newMVar (Tempo now 0 (126/60))+ mv <- newMVar (Tempo now 0 0.5) forkIO $ clocked $ f mv return mv where f mv change _ = do swapMVar mv change@@ -101,9 +101,17 @@ forkIO $ connectClient False clockip mTempo mBps return (mTempo, mBps) +bpsUtils :: IO ((Double -> IO (), IO (Rational)))+bpsUtils = do (mTempo, mBps) <- runClient+ let bpsSetter b = putMVar mBps b+ currentTime = do tempo <- readMVar mTempo+ now <- beatNow tempo+ return $ toRational now+ return (bpsSetter, currentTime)+ bpsSetter :: IO (Double -> IO ())-bpsSetter = do (_, mBps) <- runClient - return $ (\b -> putMVar mBps b)+bpsSetter = do (f, _) <- bpsUtils+ return f clocked :: (Tempo -> Int -> IO ()) -> IO () clocked callback =
tidal.cabal view
@@ -1,5 +1,5 @@ name: tidal-version: 0.4+version: 0.4.1 synopsis: Pattern language for improvised music -- description: homepage: http://yaxu.org/tidal/
tidal.el view
@@ -68,7 +68,8 @@ (tidal-send-string "d7 <- dirtStream") (tidal-send-string "d8 <- dirtStream") (tidal-send-string "d9 <- dirtStream")- (tidal-send-string "bps <- bpsSetter")+ (tidal-send-string "(cps, getNow) <- bpsUtils")+ (tidal-send-string "let bps x = cps (x/2)") (tidal-send-string "let hush = mapM_ ($ silence) [d1,d2,d3,d4,d5,d6,d7,d8,d9]") (tidal-send-string "let solo = (>>) hush") (tidal-send-string ":set prompt \"tidal> \"")@@ -126,9 +127,19 @@ (insert "main = do\n") (insert (if tidal-literate-p (tidal-unlit s) s)))) ++(defun tidal-get-now ()+ "Store the current cycle position in a variable called 'now'."+ (interactive)+ (tidal-send-string "now' <- getNow")+ (tidal-send-string "let now = nextSam now'")+ (tidal-send-string "let retrig = (now ~>)")+ )+ (defun tidal-run-line () "Send the current line to the interpreter." (interactive)+ (tidal-get-now) (let* ((s (buffer-substring (line-beginning-position) (line-end-position))) (s* (if tidal-literate-p@@ -142,6 +153,7 @@ (defun tidal-run-multiple-lines () "Send the current region to the interpreter as a single line." (interactive)+ (tidal-get-now) (save-excursion (mark-paragraph) (let* ((s (buffer-substring-no-properties (region-beginning)