module Harmonic.Interface.Tidal.Utils (
oct,
pullBy, pushBy,
humanise,
onset,
hemidemisemiquaver, demisemiquaver, semiquaver, quaver, crotchet, minim,
swing8, swing16,
over, (-->),
binaryrange,
pump,
mono', retrig,
) where
import Data.List (sortOn)
import Data.Maybe (mapMaybe)
import Sound.Tidal.Context
oct :: Pattern Note -> Pattern ValueMap
oct :: Pattern Note -> Pattern ValueMap
oct Pattern Note
k = Pattern Note -> Pattern ValueMap
note (Pattern Note
12 Pattern Note -> Pattern Note -> Pattern Note
forall a. Num a => a -> a -> a
* Pattern Note
k)
pullBy :: Pattern Time -> Pattern a -> Pattern a
pullBy :: forall a. Pattern Time -> Pattern a -> Pattern a
pullBy = Pattern Time -> Pattern a -> Pattern a
forall a. Pattern Time -> Pattern a -> Pattern a
(<~)
pushBy :: Pattern Time -> Pattern a -> Pattern a
pushBy :: forall a. Pattern Time -> Pattern a -> Pattern a
pushBy = Pattern Time -> Pattern a -> Pattern a
forall a. Pattern Time -> Pattern a -> Pattern a
(~>)
humanise :: Double -> Pattern ValueMap
humanise :: Double -> Pattern ValueMap
humanise Double
x = String -> Pattern Double -> Pattern ValueMap
pF String
"amp" (Pattern Double
-> Pattern Double -> Pattern Double -> Pattern Double
forall a. Num a => Pattern a -> Pattern a -> Pattern a -> Pattern a
range (Double -> Pattern Double
forall a. a -> Pattern a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (-Double
0.09 Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
x)) (Double -> Pattern Double
forall a. a -> Pattern a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Double
0.09 Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
x)) Pattern Double
forall a. Fractional a => Pattern a
rand)
onset :: Pattern a -> Pattern a
onset :: forall a. Pattern a -> Pattern a
onset Pattern a
pat = Pattern a
pat {query = q, pureValue = Nothing}
where
q :: State -> [EventF (ArcF Time) a]
q State
st = (EventF (ArcF Time) a -> EventF (ArcF Time) a)
-> [EventF (ArcF Time) a] -> [EventF (ArcF Time) a]
forall a b. (a -> b) -> [a] -> [b]
map EventF (ArcF Time) a -> EventF (ArcF Time) a
forall {b}. EventF (ArcF Time) b -> EventF (ArcF Time) b
align (Pattern a -> State -> [EventF (ArcF Time) a]
forall a. Pattern a -> State -> [Event a]
query Pattern a
pat State
st)
align :: EventF (ArcF Time) b -> EventF (ArcF Time) b
align EventF (ArcF Time) b
ev = case EventF (ArcF Time) b -> Maybe (ArcF Time)
forall a b. EventF a b -> Maybe a
whole EventF (ArcF Time) b
ev of
Maybe (ArcF Time)
Nothing -> EventF (ArcF Time) b
ev
Just (Arc Time
_ Time
we) ->
let ps :: Time
ps = ArcF Time -> Time
forall a. ArcF a -> a
start (EventF (ArcF Time) b -> ArcF Time
forall a b. EventF a b -> a
part EventF (ArcF Time) b
ev)
in if Time
ps Time -> Time -> Bool
forall a. Eq a => a -> a -> Bool
== Time -> Time
sam Time
ps
then EventF (ArcF Time) b
ev {whole = Just (Arc ps (min we (nextSam ps)))}
else EventF (ArcF Time) b
ev
hemidemisemiquaver, demisemiquaver, semiquaver, quaver, crotchet, minim :: Time
hemidemisemiquaver :: Time
hemidemisemiquaver = Time
1Time -> Time -> Time
forall a. Fractional a => a -> a -> a
/Time
64
demisemiquaver :: Time
demisemiquaver = Time
1Time -> Time -> Time
forall a. Fractional a => a -> a -> a
/Time
32
semiquaver :: Time
semiquaver = Time
1Time -> Time -> Time
forall a. Fractional a => a -> a -> a
/Time
16
quaver :: Time
quaver = Time
1Time -> Time -> Time
forall a. Fractional a => a -> a -> a
/Time
8
crotchet :: Time
crotchet = Time
1Time -> Time -> Time
forall a. Fractional a => a -> a -> a
/Time
4
minim :: Time
minim = Time
1Time -> Time -> Time
forall a. Fractional a => a -> a -> a
/Time
2
swing8, swing16 :: Pattern Time -> Pattern a -> Pattern a
swing8 :: forall a. Pattern Time -> Pattern a -> Pattern a
swing8 Pattern Time
x = Pattern Time -> Pattern Time -> Pattern a -> Pattern a
forall a. Pattern Time -> Pattern Time -> Pattern a -> Pattern a
swingBy (Pattern Time
x Pattern Time -> Pattern Time -> Pattern Time
forall a. Num a => a -> a -> a
- Pattern Time
0.5) Pattern Time
1
swing16 :: forall a. Pattern Time -> Pattern a -> Pattern a
swing16 Pattern Time
x = Pattern Time -> Pattern Time -> Pattern a -> Pattern a
forall a. Pattern Time -> Pattern Time -> Pattern a -> Pattern a
swingBy (Pattern Time
x Pattern Time -> Pattern Time -> Pattern Time
forall a. Num a => a -> a -> a
- Pattern Time
0.5) Pattern Time
2
over :: Pattern Double -> [a] -> Pattern a
over :: forall a. Pattern Double -> [a] -> Pattern a
over Pattern Double
_ [] = Pattern a
forall a. Pattern a
silence
over Pattern Double
ctrl [a]
xs =
let count :: Int
count = [a] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
xs
step :: Double
step = Double
1 Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ Int -> Double
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
count
in (Double -> a) -> Pattern Double -> Pattern a
forall a b. (a -> b) -> Pattern a -> Pattern b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Double
x -> [a]
xs [a] -> Int -> a
forall a. HasCallStack => [a] -> Int -> a
!! Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
0 (Double -> Int
forall b. Integral b => Double -> b
forall a b. (RealFrac a, Integral b) => a -> b
floor (Double -> Double -> Double
forall a. Ord a => a -> a -> a
min (Int -> Double
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
count Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)) (Double
x Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ Double
step)))) Pattern Double
ctrl
(-->) :: Pattern Double -> [a] -> Pattern a
--> :: forall a. Pattern Double -> [a] -> Pattern a
(-->) = Pattern Double -> [a] -> Pattern a
forall a. Pattern Double -> [a] -> Pattern a
over
binaryrange :: Pattern Int -> Pattern Int -> Pattern Bool
binaryrange :: Pattern Int -> Pattern Int -> Pattern Bool
binaryrange Pattern Int
lo Pattern Int
hi = Pattern Int -> Pattern Bool
binary (Pattern Int -> Pattern Bool) -> Pattern Int -> Pattern Bool
forall a b. (a -> b) -> a -> b
$ Pattern Int
lo Pattern Int -> Pattern Int -> Pattern Int
forall a. Num a => Pattern a -> Pattern a -> Pattern a
|+ Pattern Int -> Pattern Int
forall a. Num a => Pattern Int -> Pattern a
irand (Pattern Int
hi Pattern Int -> Pattern Int -> Pattern Int
forall a. Num a => a -> a -> a
- Pattern Int
lo)
pump :: Pattern Bool -> Pattern Double -> Double -> Pattern Double
pump :: Pattern Bool -> Pattern Double -> Double -> Pattern Double
pump Pattern Bool
st Pattern Double
depth Double
rls =
[Pattern Double] -> Pattern Double
forall a. [Pattern a] -> Pattern a
stack [ Time -> Pattern Double -> Pattern Double
forall a. Time -> Pattern a -> Pattern a
rotR (Double -> Time
forall a. Real a => a -> Time
toRational (Double
rls Double -> Double -> Double
forall a. Num a => a -> a -> a
* Int -> Double
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
i Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ Int -> Double
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
steps))
(Pattern Bool -> Pattern Double -> Pattern Double
forall a. Pattern Bool -> Pattern a -> Pattern a
struct Pattern Bool
st ((Double -> Double) -> Pattern Double -> Pattern Double
forall a b. (a -> b) -> Pattern a -> Pattern b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Int -> Double -> Double
forall {a}. Floating a => Int -> a -> a
gainAt Int
i) Pattern Double
depth))
| Int
i <- [Int
0 .. Int
steps] ]
where
steps :: Int
steps = Int
16 :: Int
gainAt :: Int -> a -> a
gainAt Int
i a
dp
| Int
i Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
steps = a
1
| Bool
otherwise = a
1 a -> a -> a
forall a. Num a => a -> a -> a
- a
dp a -> a -> a
forall a. Num a => a -> a -> a
* a -> a
forall a. Floating a => a -> a
exp (-a
4.5 a -> a -> a
forall a. Num a => a -> a -> a
* Int -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
i a -> a -> a
forall a. Fractional a => a -> a -> a
/ Int -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
steps)
mono' :: Pattern a -> Pattern a
mono' :: forall a. Pattern a -> Pattern a
mono' Pattern a
pat = Pattern a -> Pattern a
forall a. Pattern a -> Pattern a
splitQueries (Pattern a -> Pattern a) -> Pattern a -> Pattern a
forall a b. (a -> b) -> a -> b
$ Pattern a
pat { query = f, steps = Nothing, pureValue = Nothing }
where
look :: Time
look = Time
8 :: Time
onsetOf :: Event a -> Time
onsetOf = ArcF Time -> Time
forall a. ArcF a -> a
start (ArcF Time -> Time) -> (Event a -> ArcF Time) -> Event a -> Time
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Event a -> ArcF Time
forall a. Event a -> ArcF Time
wholeOrPart
f :: State -> [EventF (ArcF Time) a]
f State
st =
let a :: ArcF Time
a = State -> ArcF Time
arc State
st
c0 :: Time
c0 = Time -> Time
sam (ArcF Time -> Time
forall a. ArcF a -> a
start ArcF Time
a)
wide :: [EventF (ArcF Time) a]
wide = Pattern a -> State -> [EventF (ArcF Time) a]
forall a. Pattern a -> State -> [Event a]
query Pattern a
pat State
st { arc = Arc (c0 - look) (c0 + look + 1) }
uniq :: [EventF (ArcF Time) a]
uniq = [EventF (ArcF Time) a] -> [EventF (ArcF Time) a]
forall {a}. [Event a] -> [Event a]
dedupe ((EventF (ArcF Time) a -> Time)
-> [EventF (ArcF Time) a] -> [EventF (ArcF Time) a]
forall b a. Ord b => (a -> b) -> [a] -> [a]
sortOn EventF (ArcF Time) a -> Time
forall {a}. Event a -> Time
onsetOf [ EventF (ArcF Time) a
e | EventF (ArcF Time) a
e <- [EventF (ArcF Time) a]
wide, EventF (ArcF Time) a -> Maybe (ArcF Time)
forall a b. EventF a b -> Maybe a
whole EventF (ArcF Time) a
e Maybe (ArcF Time) -> Maybe (ArcF Time) -> Bool
forall a. Eq a => a -> a -> Bool
/= Maybe (ArcF Time)
forall a. Maybe a
Nothing ])
onsets :: [Time]
onsets = (EventF (ArcF Time) a -> Time) -> [EventF (ArcF Time) a] -> [Time]
forall a b. (a -> b) -> [a] -> [b]
map EventF (ArcF Time) a -> Time
forall {a}. Event a -> Time
onsetOf [EventF (ArcF Time) a]
uniq
nextAfter :: Time -> Maybe Time
nextAfter Time
s0 = case (Time -> Bool) -> [Time] -> [Time]
forall a. (a -> Bool) -> [a] -> [a]
dropWhile (Time -> Time -> Bool
forall a. Ord a => a -> a -> Bool
<= Time
s0) [Time]
onsets of
(Time
x:[Time]
_) -> Time -> Maybe Time
forall a. a -> Maybe a
Just Time
x
[] -> Maybe Time
forall a. Maybe a
Nothing
build :: Event b -> Maybe (Event b)
build Event b
ev =
let w :: ArcF Time
w = Event b -> ArcF Time
forall a. Event a -> ArcF Time
wholeOrPart Event b
ev
s0 :: Time
s0 = ArcF Time -> Time
forall a. ArcF a -> a
start ArcF Time
w
w' :: ArcF Time
w' = Time -> Time -> ArcF Time
forall a. a -> a -> ArcF a
Arc Time
s0 (Time -> (Time -> Time) -> Maybe Time -> Time
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (ArcF Time -> Time
forall a. ArcF a -> a
stop ArcF Time
w) (Time -> Time -> Time
forall a. Ord a => a -> a -> a
min (ArcF Time -> Time
forall a. ArcF a -> a
stop ArcF Time
w)) (Time -> Maybe Time
nextAfter Time
s0))
in (\ArcF Time
pt -> Event b
ev { whole = Just w', part = pt }) (ArcF Time -> Event b) -> Maybe (ArcF Time) -> Maybe (Event b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ArcF Time -> ArcF Time -> Maybe (ArcF Time)
subArc ArcF Time
a ArcF Time
w'
analog :: [EventF (ArcF Time) a]
analog = [ EventF (ArcF Time) a
e | EventF (ArcF Time) a
e <- Pattern a -> State -> [EventF (ArcF Time) a]
forall a. Pattern a -> State -> [Event a]
query Pattern a
pat State
st, EventF (ArcF Time) a -> Maybe (ArcF Time)
forall a b. EventF a b -> Maybe a
whole EventF (ArcF Time) a
e Maybe (ArcF Time) -> Maybe (ArcF Time) -> Bool
forall a. Eq a => a -> a -> Bool
== Maybe (ArcF Time)
forall a. Maybe a
Nothing ]
in (EventF (ArcF Time) a -> Maybe (EventF (ArcF Time) a))
-> [EventF (ArcF Time) a] -> [EventF (ArcF Time) a]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe EventF (ArcF Time) a -> Maybe (EventF (ArcF Time) a)
forall {b}. Event b -> Maybe (Event b)
build [EventF (ArcF Time) a]
uniq [EventF (ArcF Time) a]
-> [EventF (ArcF Time) a] -> [EventF (ArcF Time) a]
forall a. [a] -> [a] -> [a]
++ [EventF (ArcF Time) a]
analog
dedupe :: [Event a] -> [Event a]
dedupe [] = []
dedupe (Event a
e:[Event a]
es) = Event a
e Event a -> [Event a] -> [Event a]
forall a. a -> [a] -> [a]
: [Event a] -> [Event a]
dedupe ((Event a -> Bool) -> [Event a] -> [Event a]
forall a. (a -> Bool) -> [a] -> [a]
dropWhile ((Time -> Time -> Bool
forall a. Eq a => a -> a -> Bool
== Event a -> Time
forall {a}. Event a -> Time
onsetOf Event a
e) (Time -> Bool) -> (Event a -> Time) -> Event a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Event a -> Time
forall {a}. Event a -> Time
onsetOf) [Event a]
es)
retrig :: Pattern a -> Pattern a
retrig :: forall a. Pattern a -> Pattern a
retrig = Pattern a -> Pattern a
forall a. Pattern a -> Pattern a
mono'