module Harmonic.Interface.Tidal.Form
(
FormNode(..)
, FormTime(..)
, Transition(..)
, Kinetics(..)
, IK
, at
, at'
, rh
, rh'
, iK
, lK
, formK
, beatsPerBar
, ki
, slate
, mark
, mark'
, markbar
, marksec
, markAt
, kinPick
, isolate
, isolate'
, withForm
) where
import Data.List (nub, sortOn)
import qualified Harmonic.Rules.Types.ProgressionContext as PC
import Sound.Tidal.Context
data FormTime = Secs Double | Bars Double
deriving (Int -> FormTime -> ShowS
[FormTime] -> ShowS
FormTime -> [Char]
(Int -> FormTime -> ShowS)
-> (FormTime -> [Char]) -> ([FormTime] -> ShowS) -> Show FormTime
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> FormTime -> ShowS
showsPrec :: Int -> FormTime -> ShowS
$cshow :: FormTime -> [Char]
show :: FormTime -> [Char]
$cshowList :: [FormTime] -> ShowS
showList :: [FormTime] -> ShowS
Show, FormTime -> FormTime -> Bool
(FormTime -> FormTime -> Bool)
-> (FormTime -> FormTime -> Bool) -> Eq FormTime
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: FormTime -> FormTime -> Bool
== :: FormTime -> FormTime -> Bool
$c/= :: FormTime -> FormTime -> Bool
/= :: FormTime -> FormTime -> Bool
Eq)
data Transition = Smooth | Snap
deriving (Int -> Transition -> ShowS
[Transition] -> ShowS
Transition -> [Char]
(Int -> Transition -> ShowS)
-> (Transition -> [Char])
-> ([Transition] -> ShowS)
-> Show Transition
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Transition -> ShowS
showsPrec :: Int -> Transition -> ShowS
$cshow :: Transition -> [Char]
show :: Transition -> [Char]
$cshowList :: [Transition] -> ShowS
showList :: [Transition] -> ShowS
Show, Transition -> Transition -> Bool
(Transition -> Transition -> Bool)
-> (Transition -> Transition -> Bool) -> Eq Transition
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Transition -> Transition -> Bool
== :: Transition -> Transition -> Bool
$c/= :: Transition -> Transition -> Bool
/= :: Transition -> Transition -> Bool
Eq)
data FormNode = FormNode
{ FormNode -> FormTime
fnTime :: FormTime
, FormNode -> Double
fnKinetics :: Double
, FormNode -> Double
fnDynamic :: Double
, FormNode -> ProgressionContext
fnProg :: PC.ProgressionContext
, FormNode -> Transition
fnTrans :: Transition
} deriving (Int -> FormNode -> ShowS
[FormNode] -> ShowS
FormNode -> [Char]
(Int -> FormNode -> ShowS)
-> (FormNode -> [Char]) -> ([FormNode] -> ShowS) -> Show FormNode
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> FormNode -> ShowS
showsPrec :: Int -> FormNode -> ShowS
$cshow :: FormNode -> [Char]
show :: FormNode -> [Char]
$cshowList :: [FormNode] -> ShowS
showList :: [FormNode] -> ShowS
Show, FormNode -> FormNode -> Bool
(FormNode -> FormNode -> Bool)
-> (FormNode -> FormNode -> Bool) -> Eq FormNode
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: FormNode -> FormNode -> Bool
== :: FormNode -> FormNode -> Bool
$c/= :: FormNode -> FormNode -> Bool
/= :: FormNode -> FormNode -> Bool
Eq)
data Kinetics = Kinetics
{ Kinetics -> Pattern Double
kSignal :: Pattern Double
, Kinetics -> Pattern Double
kDynamic :: Pattern Double
, Kinetics -> Pattern ProgressionContext
kProg :: Pattern PC.ProgressionContext
, Kinetics -> [ProgressionContext]
kProgs :: [PC.ProgressionContext]
, Kinetics -> Double
kLoopSecs :: Double
, Kinetics -> Double
kCps :: Double
, Kinetics -> Int -> Bool
kDegrees :: Int -> Bool
}
type IK = (Kinetics, Pattern Int)
at, at', rh, rh' :: Double -> Double -> Double -> PC.ProgressionContext -> FormNode
at :: Double -> Double -> Double -> ProgressionContext -> FormNode
at Double
t Double
k Double
d ProgressionContext
pc = FormTime
-> Double -> Double -> ProgressionContext -> Transition -> FormNode
FormNode (Double -> FormTime
Secs Double
t) Double
k Double
d ProgressionContext
pc Transition
Smooth
at' :: Double -> Double -> Double -> ProgressionContext -> FormNode
at' Double
t Double
k Double
d ProgressionContext
pc = FormTime
-> Double -> Double -> ProgressionContext -> Transition -> FormNode
FormNode (Double -> FormTime
Secs Double
t) Double
k Double
d ProgressionContext
pc Transition
Snap
rh :: Double -> Double -> Double -> ProgressionContext -> FormNode
rh Double
b Double
k Double
d ProgressionContext
pc = FormTime
-> Double -> Double -> ProgressionContext -> Transition -> FormNode
FormNode (Double -> FormTime
Bars Double
b) Double
k Double
d ProgressionContext
pc Transition
Smooth
rh' :: Double -> Double -> Double -> ProgressionContext -> FormNode
rh' Double
b Double
k Double
d ProgressionContext
pc = FormTime
-> Double -> Double -> ProgressionContext -> Transition -> FormNode
FormNode (Double -> FormTime
Bars Double
b) Double
k Double
d ProgressionContext
pc Transition
Snap
iK :: Double -> [FormNode] -> Pattern Int -> IK
iK :: Double -> [FormNode] -> Pattern Int -> IK
iK Double
bpm [FormNode]
nodes Pattern Int
chordPat = (Double -> [FormNode] -> Kinetics
formK Double
bpm [FormNode]
nodes, Pattern Int
chordPat)
lK :: Pattern Double
-> Pattern Double
-> PC.ProgressionContext
-> Pattern Int
-> IK
lK :: Pattern Double
-> Pattern Double -> ProgressionContext -> Pattern Int -> IK
lK Pattern Double
sigP Pattern Double
dyn ProgressionContext
pc Pattern Int
chordPat = (Pattern Double
-> Pattern Double
-> Pattern ProgressionContext
-> [ProgressionContext]
-> Double
-> Double
-> (Int -> Bool)
-> Kinetics
Kinetics Pattern Double
sigP Pattern Double
dyn (ProgressionContext -> Pattern ProgressionContext
forall a. a -> Pattern a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ProgressionContext
pc) [ProgressionContext
pc] Double
0 Double
0 (Bool -> Int -> Bool
forall a b. a -> b -> a
const Bool
True), Pattern Int
chordPat)
beatsPerBar :: Double
beatsPerBar :: Double
beatsPerBar = Double
4
barCycles :: Double -> Double
barCycles :: Double -> Double
barCycles Double
b
| Double
b Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
< Double
1 = [Char] -> Double
forall a. HasCallStack => [Char] -> a
error ([Char]
"bar " [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ Double -> [Char]
forall a. Show a => a -> [Char]
show Double
b [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ [Char]
": bars count from 1 (bar 1 = the start of the form)")
| Bool
otherwise = (Double
b Double -> Double -> Double
forall a. Num a => a -> a -> a
- Double
1) Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
beatsPerBar
nodeCycles :: Double -> FormNode -> Double
nodeCycles :: Double -> FormNode -> Double
nodeCycles Double
cpsV FormNode
nd = case FormNode -> FormTime
fnTime FormNode
nd of
Secs Double
secs -> Double
secs Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
cpsV
Bars Double
b -> Double -> Double
barCycles Double
b
nodeSecs :: Double -> FormNode -> Double
nodeSecs :: Double -> FormNode -> Double
nodeSecs Double
cpsV FormNode
nd = case FormNode -> FormTime
fnTime FormNode
nd of
Secs Double
secs -> Double
secs
Bars Double
b -> Double -> Double
barCycles Double
b Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ Double
cpsV
formK :: Double -> [FormNode] -> Kinetics
formK :: Double -> [FormNode] -> Kinetics
formK Double
bpm [FormNode]
nodes0 = Kinetics
{ kSignal :: Pattern Double
kSignal = Double -> [FormNode] -> (FormNode -> Double) -> Pattern Double
formSignal Double
cpsV [FormNode]
nodes FormNode -> Double
fnKinetics
, kDynamic :: Pattern Double
kDynamic = Double -> [FormNode] -> (FormNode -> Double) -> Pattern Double
formSignal Double
cpsV [FormNode]
nodes FormNode -> Double
fnDynamic
, kProg :: Pattern ProgressionContext
kProg = Double
-> [FormNode]
-> (FormNode -> ProgressionContext)
-> Pattern ProgressionContext
forall a. Double -> [FormNode] -> (FormNode -> a) -> Pattern a
formStep Double
cpsV [FormNode]
nodes FormNode -> ProgressionContext
fnProg
, kProgs :: [ProgressionContext]
kProgs = [ProgressionContext] -> [ProgressionContext]
forall a. Eq a => [a] -> [a]
nub ((FormNode -> ProgressionContext)
-> [FormNode] -> [ProgressionContext]
forall a b. (a -> b) -> [a] -> [b]
map FormNode -> ProgressionContext
fnProg [FormNode]
nodes)
, kLoopSecs :: Double
kLoopSecs = case [FormNode]
nodes of
(FormNode
_:FormNode
_:[FormNode]
_) -> Double -> FormNode -> Double
nodeSecs Double
cpsV ([FormNode] -> FormNode
forall a. HasCallStack => [a] -> a
last [FormNode]
nodes)
[FormNode]
_ -> Double
0
, kCps :: Double
kCps = Double
cpsV
, kDegrees :: Int -> Bool
kDegrees = Bool -> Int -> Bool
forall a b. a -> b -> a
const Bool
True
}
where
cpsV :: Double
cpsV = Double
bpm Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ Double
60
nodes :: [FormNode]
nodes = (FormNode -> Double) -> [FormNode] -> [FormNode]
forall b a. Ord b => (a -> b) -> [a] -> [a]
sortOn (Double -> FormNode -> Double
nodeCycles Double
cpsV) [FormNode]
nodes0
formSignal :: Double -> [FormNode] -> (FormNode -> Double) -> Pattern Double
formSignal :: Double -> [FormNode] -> (FormNode -> Double) -> Pattern Double
formSignal Double
_ [] FormNode -> Double
_ = Pattern Double
forall a. Pattern a
silence
formSignal Double
_ [FormNode
node] FormNode -> Double
accessor = Double -> Pattern Double
forall a. a -> Pattern a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Double -> Double
forall a b. (Real a, Fractional b) => a -> b
realToFrac (Double -> Double) -> Double -> Double
forall a b. (a -> b) -> a -> b
$ FormNode -> Double
accessor FormNode
node)
formSignal Double
cpsV [FormNode]
nodes FormNode -> Double
accessor =
let totalCycles :: Time
totalCycles = Double -> Time
forall a b. (Real a, Fractional b) => a -> b
realToFrac (Double -> FormNode -> Double
nodeCycles Double
cpsV ([FormNode] -> FormNode
forall a. HasCallStack => [a] -> a
last [FormNode]
nodes)) :: Time
pairs :: [(FormNode, FormNode)]
pairs = [FormNode] -> [FormNode] -> [(FormNode, FormNode)]
forall a b. [a] -> [b] -> [(a, b)]
zip [FormNode]
nodes (Int -> [FormNode] -> [FormNode]
forall a. Int -> [a] -> [a]
drop Int
1 [FormNode]
nodes)
segments :: [(Time, Pattern Double)]
segments = [ ( Double -> Time
forall a b. (Real a, Fractional b) => a -> b
realToFrac (Double -> FormNode -> Double
nodeCycles Double
cpsV FormNode
n2 Double -> Double -> Double
forall a. Num a => a -> a -> a
- Double -> FormNode -> Double
nodeCycles Double
cpsV FormNode
n1)
, case FormNode -> Transition
fnTrans FormNode
n1 of
Transition
Snap -> Double -> Pattern Double
forall a. a -> Pattern a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Double -> Double
forall a b. (Real a, Fractional b) => a -> b
realToFrac (Double -> Double) -> Double -> Double
forall a b. (a -> b) -> a -> b
$ FormNode -> Double
accessor FormNode
n1)
Transition
Smooth -> Pattern Time -> Pattern Double -> Pattern Double
forall a. Pattern Time -> Pattern a -> Pattern a
segment Pattern Time
16 (Pattern Double -> Pattern Double)
-> Pattern Double -> Pattern Double
forall a b. (a -> b) -> a -> b
$ 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 b. (Real a, Fractional b) => a -> b
realToFrac (Double -> Pattern Double) -> Double -> Pattern Double
forall a b. (a -> b) -> a -> b
$ FormNode -> Double
accessor FormNode
n1)
(Double -> Pattern Double
forall a b. (Real a, Fractional b) => a -> b
realToFrac (Double -> Pattern Double) -> Double -> Pattern Double
forall a b. (a -> b) -> a -> b
$ FormNode -> Double
accessor FormNode
n2) Pattern Double
forall a. (Fractional a, Real a) => Pattern a
saw
)
| (FormNode
n1, FormNode
n2) <- [(FormNode, FormNode)]
pairs
]
in Pattern Time -> Pattern Double -> Pattern Double
forall a. Pattern Time -> Pattern a -> Pattern a
slow (Time -> Pattern Time
forall a. a -> Pattern a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Time
totalCycles) (Pattern Double -> Pattern Double)
-> Pattern Double -> Pattern Double
forall a b. (a -> b) -> a -> b
$ [(Time, Pattern Double)] -> Pattern Double
forall a. [(Time, Pattern a)] -> Pattern a
timecat [(Time, Pattern Double)]
segments
formStep :: Double -> [FormNode] -> (FormNode -> a) -> Pattern a
formStep :: forall a. Double -> [FormNode] -> (FormNode -> a) -> Pattern a
formStep Double
_ [] FormNode -> a
_ = Pattern a
forall a. Pattern a
silence
formStep Double
_ [FormNode
node] FormNode -> a
accessor = a -> Pattern a
forall a. a -> Pattern a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (FormNode -> a
accessor FormNode
node)
formStep Double
cpsV [FormNode]
nodes FormNode -> a
accessor =
let totalCycles :: Time
totalCycles = Double -> Time
forall a b. (Real a, Fractional b) => a -> b
realToFrac (Double -> FormNode -> Double
nodeCycles Double
cpsV ([FormNode] -> FormNode
forall a. HasCallStack => [a] -> a
last [FormNode]
nodes)) :: Time
pairs :: [(FormNode, FormNode)]
pairs = [FormNode] -> [FormNode] -> [(FormNode, FormNode)]
forall a b. [a] -> [b] -> [(a, b)]
zip [FormNode]
nodes (Int -> [FormNode] -> [FormNode]
forall a. Int -> [a] -> [a]
drop Int
1 [FormNode]
nodes)
segments :: [(Time, Pattern a)]
segments = [ ( Double -> Time
forall a b. (Real a, Fractional b) => a -> b
realToFrac (Double -> FormNode -> Double
nodeCycles Double
cpsV FormNode
n2 Double -> Double -> Double
forall a. Num a => a -> a -> a
- Double -> FormNode -> Double
nodeCycles Double
cpsV FormNode
n1)
, a -> Pattern a
forall a. a -> Pattern a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (FormNode -> a
accessor FormNode
n1)
)
| (FormNode
n1, FormNode
n2) <- [(FormNode, FormNode)]
pairs
]
in Pattern Time -> Pattern a -> Pattern a
forall a. Pattern Time -> Pattern a -> Pattern a
slow (Time -> Pattern Time
forall a. a -> Pattern a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Time
totalCycles) (Pattern a -> Pattern a) -> Pattern a -> Pattern a
forall a b. (a -> b) -> a -> b
$ [(Time, Pattern a)] -> Pattern a
forall a. [(Time, Pattern a)] -> Pattern a
timecat [(Time, Pattern a)]
segments
ki :: (Double, Double) -> IK -> Pattern a -> Pattern a
ki :: forall a. (Double, Double) -> IK -> Pattern a -> Pattern a
ki (Double
lo, Double
hi) (Kinetics
kin, Pattern Int
_) = Pattern Bool -> Pattern a -> Pattern a
forall a. Pattern Bool -> Pattern a -> Pattern a
mask ((Double -> Bool) -> Pattern Double -> Pattern Bool
forall a b. (a -> b) -> Pattern a -> Pattern b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Double
x -> Double
x Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
>= Double
lo Bool -> Bool -> Bool
&& Double
x Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
<= Double
hi) (Kinetics -> Pattern Double
kSignal Kinetics
kin))
slate :: (Double, Double) -> IK -> [Pattern a] -> Pattern a
slate :: forall a. (Double, Double) -> IK -> [Pattern a] -> Pattern a
slate (Double, Double)
band IK
k [Pattern a]
pats = (Double, Double) -> IK -> Pattern a -> Pattern a
forall a. (Double, Double) -> IK -> Pattern a -> Pattern a
ki (Double, Double)
band IK
k (Pattern a -> Pattern a) -> Pattern a -> Pattern a
forall a b. (a -> b) -> a -> b
$ [Pattern a] -> Pattern a
forall a. [Pattern a] -> Pattern a
stack [Pattern a]
pats
markAt :: FormTime -> IK -> [Pattern a] -> Pattern a
markAt :: forall a. FormTime -> IK -> [Pattern a] -> Pattern a
markAt FormTime
ft (Kinetics
kin, Pattern Int
_) [Pattern a]
pats =
let body :: Pattern a
body = [Pattern a] -> Pattern a
forall a. [Pattern a] -> Pattern a
stack [Pattern a]
pats
cpsV :: Double
cpsV = Kinetics -> Double
kCps Kinetics
kin
loopC :: Time
loopC = Double -> Time
forall a b. (Real a, Fractional b) => a -> b
realToFrac (Kinetics -> Double
kLoopSecs Kinetics
kin Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
cpsV) :: Time
c :: Time
c = Double -> Time
forall a b. (Real a, Fractional b) => a -> b
realToFrac (case FormTime
ft of
Bars Double
b -> Double -> Double
barCycles Double
b
Secs Double
t -> Double
t Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
cpsV) :: Time
in if Double
cpsV Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
<= Double
0 then Pattern a
forall a. Pattern a
silence
else if Time
loopC Time -> Time -> Bool
forall a. Ord a => a -> a -> Bool
<= Time
0 then Time -> Time -> Pattern a -> Pattern a
forall a. Time -> Time -> Pattern a -> Pattern a
playFor Time
c (Time
c Time -> Time -> Time
forall a. Num a => a -> a -> a
+ Time
1) (Time -> Pattern a -> Pattern a
forall a. Time -> Pattern a -> Pattern a
rotR Time
c Pattern a
body)
else if Time
c Time -> Time -> Time
forall a. Num a => a -> a -> a
+ Time
1 Time -> Time -> Bool
forall a. Ord a => a -> a -> Bool
> Time
loopC then Pattern a
forall a. Pattern a
silence
else Pattern Time -> Pattern a -> Pattern a
forall a. Pattern Time -> Pattern a -> Pattern a
slow (Time -> Pattern Time
forall a. a -> Pattern a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Time
loopC) (Pattern a -> Pattern a) -> Pattern a -> Pattern a
forall a b. (a -> b) -> a -> b
$ Arc -> Pattern a -> Pattern a
forall a. Arc -> Pattern a -> Pattern a
compressArc (Time -> Time -> Arc
forall a. a -> a -> ArcF a
Arc (Time
c Time -> Time -> Time
forall a. Fractional a => a -> a -> a
/ Time
loopC) ((Time
c Time -> Time -> Time
forall a. Num a => a -> a -> a
+ Time
1) Time -> Time -> Time
forall a. Fractional a => a -> a -> a
/ Time
loopC)) Pattern a
body
mark, markbar :: Double -> IK -> [Pattern a] -> Pattern a
mark :: forall a. Double -> IK -> [Pattern a] -> Pattern a
mark = FormTime -> IK -> [Pattern a] -> Pattern a
forall a. FormTime -> IK -> [Pattern a] -> Pattern a
markAt (FormTime -> IK -> [Pattern a] -> Pattern a)
-> (Double -> FormTime) -> Double -> IK -> [Pattern a] -> Pattern a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Double -> FormTime
Bars
markbar :: forall a. Double -> IK -> [Pattern a] -> Pattern a
markbar = Double -> IK -> [Pattern a] -> Pattern a
forall a. Double -> IK -> [Pattern a] -> Pattern a
mark
mark', marksec :: Double -> IK -> [Pattern a] -> Pattern a
mark' :: forall a. Double -> IK -> [Pattern a] -> Pattern a
mark' = FormTime -> IK -> [Pattern a] -> Pattern a
forall a. FormTime -> IK -> [Pattern a] -> Pattern a
markAt (FormTime -> IK -> [Pattern a] -> Pattern a)
-> (Double -> FormTime) -> Double -> IK -> [Pattern a] -> Pattern a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Double -> FormTime
Secs
marksec :: forall a. Double -> IK -> [Pattern a] -> Pattern a
marksec = Double -> IK -> [Pattern a] -> Pattern a
forall a. Double -> IK -> [Pattern a] -> Pattern a
mark'
kinPick :: IK -> [Pattern a] -> Pattern a
kinPick :: forall a. IK -> [Pattern a] -> Pattern a
kinPick IK
_ [] = Pattern a
forall a. Pattern a
silence
kinPick (Kinetics
kin, Pattern Int
_) [Pattern a]
pats =
let nPats :: Int
nPats = [Pattern a] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Pattern a]
pats
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
nPats
window :: p -> Pattern a -> Pattern a
window p
i Pattern a
p =
let lo :: Double
lo = p -> Double
forall a b. (Integral a, Num b) => a -> b
fromIntegral p
i Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
step
hi :: Double
hi = p -> Double
forall a b. (Integral a, Num b) => a -> b
fromIntegral (p
i p -> p -> p
forall a. Num a => a -> a -> a
+ p
1) Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
step
inWin :: Double -> Bool
inWin Double
x | p
i p -> p -> Bool
forall a. Eq a => a -> a -> Bool
== p
0 = Double
x Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
>= Double
lo Bool -> Bool -> Bool
&& Double
x Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
<= Double
hi
| Bool
otherwise = Double
x Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
> Double
lo Bool -> Bool -> Bool
&& Double
x Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
<= Double
hi
in Pattern Bool -> Pattern a -> Pattern a
forall a. Pattern Bool -> Pattern a -> Pattern a
mask ((Double -> Bool) -> Pattern Double -> Pattern Bool
forall a b. (a -> b) -> Pattern a -> Pattern b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Double -> Bool
inWin (Kinetics -> Pattern Double
kSignal Kinetics
kin)) Pattern a
p
in [Pattern a] -> Pattern a
forall a. [Pattern a] -> Pattern a
stack ((Int -> Pattern a -> Pattern a)
-> [Int] -> [Pattern a] -> [Pattern a]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith Int -> Pattern a -> Pattern a
forall {p} {a}. Integral p => p -> Pattern a -> Pattern a
window [Int
0 :: Int ..] [Pattern a]
pats)
isolate, isolate' :: (Int, Int) -> IK -> IK
isolate :: (Int, Int) -> IK -> IK
isolate (Int
lo, Int
hi) = (Int -> Bool) -> IK -> IK
withDegrees (\Int
d -> Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
lo Bool -> Bool -> Bool
&& Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
hi)
isolate' :: (Int, Int) -> IK -> IK
isolate' (Int
lo, Int
hi) = (Int -> Bool) -> IK -> IK
withDegrees (\Int
d -> Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
lo Bool -> Bool -> Bool
|| Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
hi)
withDegrees :: (Int -> Bool) -> IK -> IK
withDegrees :: (Int -> Bool) -> IK -> IK
withDegrees Int -> Bool
keep (Kinetics
kin, Pattern Int
chordPat) =
(Kinetics
kin { kDegrees = \Int
d -> Kinetics -> Int -> Bool
kDegrees Kinetics
kin Int
d Bool -> Bool -> Bool
&& Int -> Bool
keep Int
d }, Pattern Int
chordPat)
withForm :: IK -> (PC.ProgressionContext -> Pattern ValueMap) -> Pattern ValueMap
withForm :: IK -> (ProgressionContext -> Pattern ValueMap) -> Pattern ValueMap
withForm (Kinetics
kin, Pattern Int
_) ProgressionContext -> Pattern ValueMap
f = Pattern (Pattern ValueMap) -> Pattern ValueMap
forall b. Pattern (Pattern b) -> Pattern b
innerJoin (Pattern (Pattern ValueMap) -> Pattern ValueMap)
-> Pattern (Pattern ValueMap) -> Pattern ValueMap
forall a b. (a -> b) -> a -> b
$ (ProgressionContext -> Pattern ValueMap)
-> Pattern ProgressionContext -> Pattern (Pattern ValueMap)
forall a b. (a -> b) -> Pattern a -> Pattern b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ProgressionContext -> Pattern ValueMap
f (Kinetics -> Pattern ProgressionContext
kProg Kinetics
kin)