{-# LANGUAGE FlexibleContexts #-}
module Harmonic.Interface.Tidal.Bridge
(
VoiceFunction
, voiceRange
, layerForVoicing
, warp
, rep
, arrange
, arrange'
, parallel
, lookupChordAt
, lookupChord
, lookupProgression
, overlapF
, overlapB
, overlap
, forceAll
) where
import qualified Harmonic.Rules.Types.Progression as P
import qualified Harmonic.Rules.Types.ProgressionContext as PC
import Harmonic.Rules.Types.ProgressionContext (Layer(..))
import qualified Harmonic.Rules.Types.Harmony as H
import qualified Harmonic.Interface.Tidal.Arranger as A
import Harmonic.Interface.Tidal.Form (Kinetics(..), IK)
import Data.List (nub)
import Data.Maybe (isJust)
import Data.Foldable (toList)
import Sound.Tidal.Context hiding (voice)
type VoiceFunction = P.Progression -> [[Int]]
voiceRange :: (Int, Int) -> Pattern Int -> Pattern Int
voiceRange :: (Int, Int) -> Pattern Int -> Pattern Int
voiceRange (Int
lo, Int
hi) = (Int -> Bool) -> Pattern Int -> Pattern Int
forall a. (a -> Bool) -> Pattern a -> Pattern a
filterValues (\Int
v -> Int
v Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
lo Bool -> Bool -> Bool
&& Int
v Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
hi)
forceAll :: [[Note]] -> ()
forceAll :: [[Note]] -> ()
forceAll = ([Note] -> () -> ()) -> () -> [[Note]] -> ()
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\[Note]
xs ()
acc -> (Note -> () -> ()) -> () -> [Note] -> ()
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Note -> () -> ()
forall a b. a -> b -> b
seq ()
acc [Note]
xs) ()
warp :: String -> Pattern Int
warp :: String -> Pattern Int
warp String
s = Pattern Time -> Pattern Int -> Pattern Int
forall a. Pattern Time -> Pattern a -> Pattern a
slow Pattern Time
4 (Pattern Int -> Pattern Int) -> Pattern Int -> Pattern Int
forall a b. (a -> b) -> a -> b
$ String -> Pattern Int
forall a. (Enumerable a, Parseable a) => String -> Pattern a
parseBP_E String
s
rep :: PC.ProgressionContext -> Pattern Time -> Pattern Int
rep :: ProgressionContext -> Pattern Time -> Pattern Int
rep ProgressionContext
pc Pattern Time
repVal =
let n :: Int
n = ProgressionContext -> Int
PC.pcLength ProgressionContext
pc
in Pattern Time -> Pattern Int -> Pattern Int
forall a. Pattern Time -> Pattern a -> Pattern a
slow (Int -> Pattern Time
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n Pattern Time -> Pattern Time -> Pattern Time
forall a. Num a => a -> a -> a
* Pattern Time
repVal Pattern Time -> Pattern Time -> Pattern Time
forall a. Num a => a -> a -> a
* Pattern Time
4) (Pattern Int -> Pattern Int) -> Pattern Int -> Pattern Int
forall a b. (a -> b) -> a -> b
$ [Pattern Int] -> Pattern Int
forall a. [Pattern a] -> Pattern a
fastcat ([Pattern Int] -> Pattern Int) -> [Pattern Int] -> Pattern Int
forall a b. (a -> b) -> a -> b
$ (Int -> Pattern Int) -> [Int] -> [Pattern Int]
forall a b. (a -> b) -> [a] -> [b]
map Int -> Pattern Int
forall a. a -> Pattern a
forall (f :: * -> *) a. Applicative f => a -> f a
pure [Int
1..Int
n]
layerForVoicing :: Layer -> PC.ProgressionContext -> (Bool, P.Progression)
layerForVoicing :: Layer -> ProgressionContext -> (Bool, Progression)
layerForVoicing Layer
lyr ProgressionContext
ctx =
let chroma :: Bool
chroma = Layer
lyr Layer -> Layer -> Bool
forall a. Eq a => a -> a -> Bool
/= Layer
T Bool -> Bool -> Bool
&& Maybe (Seq (Tristrata, StrataLabel)) -> Bool
forall a. Maybe a -> Bool
isJust (ProgressionContext -> Maybe (Seq (Tristrata, StrataLabel))
PC.pcProvenance ProgressionContext
ctx)
in (Bool
chroma, Layer -> ProgressionContext -> Progression
PC.layer Layer
lyr ProgressionContext
ctx)
arrange :: (Double, Double)
-> IK
-> (Int, Int)
-> Layer
-> VoiceFunction
-> (P.Progression -> P.Progression)
-> [Pattern Int]
-> Pattern ValueMap
arrange :: (Double, Double)
-> IK
-> (Int, Int)
-> Layer
-> VoiceFunction
-> (Progression -> Progression)
-> [Pattern Int]
-> Pattern ValueMap
arrange (Double
lo, Double
hi) (Kinetics
kin, Pattern Int
chordPat) (Int, Int)
register Layer
lyr VoiceFunction
voiceFunc Progression -> Progression
modifier [Pattern Int]
pats =
let
ranged :: Pattern Int
ranged = (Int, Int) -> Pattern Int -> Pattern Int
voiceRange (Int, Int)
register ([Pattern Int] -> Pattern Int
forall a. [Pattern a] -> Pattern a
stack [Pattern Int]
pats)
progPat :: Pattern (Bool, Progression)
progPat = (ProgressionContext -> (Bool, Progression))
-> Pattern ProgressionContext -> Pattern (Bool, Progression)
forall a b. (a -> b) -> Pattern a -> Pattern b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Layer -> ProgressionContext -> (Bool, Progression)
layerForVoicing Layer
lyr) (Kinetics -> Pattern ProgressionContext
kProg Kinetics
kin)
effectiveVF :: (Bool, Progression) -> [[Int]]
effectiveVF (Bool
chroma, Progression
p) =
if Bool
chroma then VoiceFunction
A.strataModeFlow Progression
p else VoiceFunction
voiceFunc Progression
p
allEvents :: [Event (Bool, Progression)]
allEvents = Pattern (Bool, Progression) -> Arc -> [Event (Bool, Progression)]
forall a. Pattern a -> Arc -> [Event a]
queryArc Pattern (Bool, Progression)
progPat (Time -> Time -> Arc
forall a. a -> a -> ArcF a
Arc Time
0 Time
1000)
uniqueProgs :: [(Bool, Progression)]
uniqueProgs = [(Bool, Progression)] -> [(Bool, Progression)]
forall a. Eq a => [a] -> [a]
nub ((Event (Bool, Progression) -> (Bool, Progression))
-> [Event (Bool, Progression)] -> [(Bool, Progression)]
forall a b. (a -> b) -> [a] -> [b]
map Event (Bool, Progression) -> (Bool, Progression)
forall a b. EventF a b -> b
value [Event (Bool, Progression)]
allEvents)
cache :: [((Bool, Progression), ([[Note]], Int))]
cache = [ ((Bool, Progression)
key, let vs :: [[Int]]
vs = (Bool, Progression) -> [[Int]]
effectiveVF ((Progression -> Progression)
-> (Bool, Progression) -> (Bool, Progression)
forall a b. (a -> b) -> (Bool, a) -> (Bool, b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Progression -> Progression
modifier (Bool, Progression)
key)
sc :: [[Note]]
sc = ([Int] -> [Note]) -> [[Int]] -> [[Note]]
forall a b. (a -> b) -> [a] -> [b]
map ((Int -> Note) -> [Int] -> [Note]
forall a b. (a -> b) -> [a] -> [b]
map Int -> Note
forall a b. (Integral a, Num b) => a -> b
fromIntegral) [[Int]]
vs :: [[Note]]
nc :: Int
nc = [[Int]] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [[Int]]
vs
forced :: ()
forced = [[Note]] -> ()
forceAll [[Note]]
sc
in ()
forced () -> ([[Note]], Int) -> ([[Note]], Int)
forall a b. a -> b -> b
`seq` ([[Note]]
sc, Int
nc))
| (Bool, Progression)
key <- [(Bool, Progression)]
uniqueProgs ]
cacheForced :: ()
cacheForced = (((Bool, Progression), ([[Note]], Int)) -> () -> ())
-> () -> [((Bool, Progression), ([[Note]], Int))] -> ()
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\((Bool, Progression)
_, ([[Note]]
s, Int
_)) ()
acc -> [[Note]] -> ()
forceAll [[Note]]
s () -> () -> ()
forall a b. a -> b -> b
`seq` ()
acc) () [((Bool, Progression), ([[Note]], Int))]
cache
lookupCache :: (Bool, Progression) -> ([[Note]], Int)
lookupCache (Bool, Progression)
key = case (Bool, Progression)
-> [((Bool, Progression), ([[Note]], Int))]
-> Maybe ([[Note]], Int)
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup (Bool, Progression)
key [((Bool, Progression), ([[Note]], Int))]
cache of
Just ([[Note]], Int)
hit -> ([[Note]], Int)
hit
Maybe ([[Note]], Int)
Nothing -> let vs :: [[Int]]
vs = (Bool, Progression) -> [[Int]]
effectiveVF ((Progression -> Progression)
-> (Bool, Progression) -> (Bool, Progression)
forall a b. (a -> b) -> (Bool, a) -> (Bool, b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Progression -> Progression
modifier (Bool, Progression)
key)
sc :: [[Note]]
sc = ([Int] -> [Note]) -> [[Int]] -> [[Note]]
forall a b. (a -> b) -> [a] -> [b]
map ((Int -> Note) -> [Int] -> [Note]
forall a b. (a -> b) -> [a] -> [b]
map Int -> Note
forall a b. (Integral a, Num b) => a -> b
fromIntegral) [[Int]]
vs :: [[Note]]
forced :: ()
forced = [[Note]] -> ()
forceAll [[Note]]
sc
in ()
forced () -> ([[Note]], Int) -> ([[Note]], Int)
forall a b. a -> b -> b
`seq` ([[Note]]
sc, [[Int]] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [[Int]]
vs)
in ()
cacheForced () -> Pattern ValueMap -> Pattern ValueMap
forall a b. a -> b -> b
`seq` (Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall a. Num a => Pattern a -> Pattern a -> Pattern a
|* String -> Pattern Double -> Pattern ValueMap
pF String
"amp" (Kinetics -> Pattern Double
kDynamic Kinetics
kin)) (Pattern ValueMap -> Pattern ValueMap)
-> Pattern ValueMap -> Pattern ValueMap
forall a b. (a -> b) -> a -> b
$
Pattern Bool -> Pattern ValueMap -> Pattern ValueMap
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)) (Pattern ValueMap -> Pattern ValueMap)
-> Pattern ValueMap -> Pattern ValueMap
forall a b. (a -> b) -> a -> b
$
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
$ ((Bool, Progression) -> Pattern ValueMap)
-> Pattern (Bool, Progression) -> 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 (\(Bool, Progression)
key ->
([[Note]], Int) -> Pattern Int -> Pattern Int -> Pattern ValueMap
arrangeLookup ((Bool, Progression) -> ([[Note]], Int)
lookupCache (Bool, Progression)
key) Pattern Int
chordPat Pattern Int
ranged
) Pattern (Bool, Progression)
progPat
arrangeLookup :: ([[Note]], Int)
-> Pattern Int
-> Pattern Int
-> Pattern ValueMap
arrangeLookup :: ([[Note]], Int) -> Pattern Int -> Pattern Int -> Pattern ValueMap
arrangeLookup ([[Note]]
scales, Int
nChords) Pattern Int
chordPat Pattern Int
ranged
| Int
nChords Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 = Pattern ValueMap
forall a. Pattern a
silence
| Bool
otherwise =
let chordIdx :: Pattern Int
chordIdx = (Int -> Int) -> Pattern Int -> Pattern Int
forall a b. (a -> b) -> Pattern a -> Pattern b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Int
i -> (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
nChords) Pattern Int
chordPat
mapped :: Pattern Note
mapped = (State -> [Event Note]) -> Maybe Time -> Maybe Note -> Pattern Note
forall a.
(State -> [Event a]) -> Maybe Time -> Maybe a -> Pattern a
Pattern (\State
st ->
let noteEvs :: [Event Int]
noteEvs = Pattern Int -> State -> [Event Int]
forall a. Pattern a -> State -> [Event a]
query Pattern Int
ranged State
st
in (Event Int -> [Event Note]) -> [Event Int] -> [Event Note]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (\Event Int
nEv -> case Event Int -> Maybe Arc
forall a b. EventF a b -> Maybe a
whole Event Int
nEv of
Maybe Arc
Nothing -> []
Just Arc
wArc ->
let onsetT :: Time
onsetT = Arc -> Time
forall a. ArcF a -> a
start Arc
wArc
ci :: Int
ci = Time -> Pattern Int -> Int
lookupChordAt Time
onsetT Pattern Int
chordIdx
sc :: [Note]
sc = [[Note]]
scales [[Note]] -> Int -> [Note]
forall a. HasCallStack => [a] -> Int -> a
!! (Int
ci Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
nChords)
noteVal :: Int
noteVal = Event Int -> Int
forall a b. EventF a b -> b
value Event Int
nEv
scLen :: Int
scLen = Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
1 ([Note] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Note]
sc)
octave :: Int
octave = Int
noteVal Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
scLen
idx :: Int
idx = Int
noteVal Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
scLen
in [Event Int
nEv { value = (sc !! idx) + fromIntegral (octave * 12) }]
) [Event Int]
noteEvs
) Maybe Time
forall a. Maybe a
Nothing Maybe Note
forall a. Maybe a
Nothing
in Pattern Note -> Pattern ValueMap
note Pattern Note
mapped
arrange' :: (Double, Double)
-> IK
-> (Int, Int)
-> Layer
-> VoiceFunction
-> (P.Progression -> P.Progression)
-> [Pattern Int]
-> Pattern ValueMap
arrange' :: (Double, Double)
-> IK
-> (Int, Int)
-> Layer
-> VoiceFunction
-> (Progression -> Progression)
-> [Pattern Int]
-> Pattern ValueMap
arrange' (Double
lo, Double
hi) (Kinetics
kin, Pattern Int
chordPat) (Int, Int)
register Layer
lyr VoiceFunction
voiceFunc Progression -> Progression
modifier [Pattern Int]
pats =
let
ranged :: Pattern Int
ranged = (Int, Int) -> Pattern Int -> Pattern Int
voiceRange (Int, Int)
register ([Pattern Int] -> Pattern Int
forall a. [Pattern a] -> Pattern a
stack [Pattern Int]
pats)
progPat :: Pattern (Bool, Progression)
progPat = (ProgressionContext -> (Bool, Progression))
-> Pattern ProgressionContext -> Pattern (Bool, Progression)
forall a b. (a -> b) -> Pattern a -> Pattern b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Layer -> ProgressionContext -> (Bool, Progression)
layerForVoicing Layer
lyr) (Kinetics -> Pattern ProgressionContext
kProg Kinetics
kin)
effectiveVF :: (Bool, Progression) -> [[Int]]
effectiveVF (Bool
chroma, Progression
p) =
if Bool
chroma then VoiceFunction
A.strataModeFlow Progression
p else VoiceFunction
voiceFunc Progression
p
allEvents :: [Event (Bool, Progression)]
allEvents = Pattern (Bool, Progression) -> Arc -> [Event (Bool, Progression)]
forall a. Pattern a -> Arc -> [Event a]
queryArc Pattern (Bool, Progression)
progPat (Time -> Time -> Arc
forall a. a -> a -> ArcF a
Arc Time
0 Time
1000)
uniqueProgs :: [(Bool, Progression)]
uniqueProgs = [(Bool, Progression)] -> [(Bool, Progression)]
forall a. Eq a => [a] -> [a]
nub ((Event (Bool, Progression) -> (Bool, Progression))
-> [Event (Bool, Progression)] -> [(Bool, Progression)]
forall a b. (a -> b) -> [a] -> [b]
map Event (Bool, Progression) -> (Bool, Progression)
forall a b. EventF a b -> b
value [Event (Bool, Progression)]
allEvents)
cache :: [((Bool, Progression), ([[Note]], Int))]
cache = [ ((Bool, Progression)
key, let vs :: [[Int]]
vs = (Bool, Progression) -> [[Int]]
effectiveVF ((Progression -> Progression)
-> (Bool, Progression) -> (Bool, Progression)
forall a b. (a -> b) -> (Bool, a) -> (Bool, b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Progression -> Progression
modifier (Bool, Progression)
key)
sc :: [[Note]]
sc = ([Int] -> [Note]) -> [[Int]] -> [[Note]]
forall a b. (a -> b) -> [a] -> [b]
map ((Int -> Note) -> [Int] -> [Note]
forall a b. (a -> b) -> [a] -> [b]
map Int -> Note
forall a b. (Integral a, Num b) => a -> b
fromIntegral) [[Int]]
vs :: [[Note]]
nc :: Int
nc = [[Int]] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [[Int]]
vs
forced :: ()
forced = [[Note]] -> ()
forceAll [[Note]]
sc
in ()
forced () -> ([[Note]], Int) -> ([[Note]], Int)
forall a b. a -> b -> b
`seq` ([[Note]]
sc, Int
nc))
| (Bool, Progression)
key <- [(Bool, Progression)]
uniqueProgs ]
cacheForced :: ()
cacheForced = (((Bool, Progression), ([[Note]], Int)) -> () -> ())
-> () -> [((Bool, Progression), ([[Note]], Int))] -> ()
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\((Bool, Progression)
_, ([[Note]]
s, Int
_)) ()
acc -> [[Note]] -> ()
forceAll [[Note]]
s () -> () -> ()
forall a b. a -> b -> b
`seq` ()
acc) () [((Bool, Progression), ([[Note]], Int))]
cache
lookupCache :: (Bool, Progression) -> ([[Note]], Int)
lookupCache (Bool, Progression)
key = case (Bool, Progression)
-> [((Bool, Progression), ([[Note]], Int))]
-> Maybe ([[Note]], Int)
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup (Bool, Progression)
key [((Bool, Progression), ([[Note]], Int))]
cache of
Just ([[Note]], Int)
hit -> ([[Note]], Int)
hit
Maybe ([[Note]], Int)
Nothing -> let vs :: [[Int]]
vs = (Bool, Progression) -> [[Int]]
effectiveVF ((Progression -> Progression)
-> (Bool, Progression) -> (Bool, Progression)
forall a b. (a -> b) -> (Bool, a) -> (Bool, b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Progression -> Progression
modifier (Bool, Progression)
key)
sc :: [[Note]]
sc = ([Int] -> [Note]) -> [[Int]] -> [[Note]]
forall a b. (a -> b) -> [a] -> [b]
map ((Int -> Note) -> [Int] -> [Note]
forall a b. (a -> b) -> [a] -> [b]
map Int -> Note
forall a b. (Integral a, Num b) => a -> b
fromIntegral) [[Int]]
vs :: [[Note]]
forced :: ()
forced = [[Note]] -> ()
forceAll [[Note]]
sc
in ()
forced () -> ([[Note]], Int) -> ([[Note]], Int)
forall a b. a -> b -> b
`seq` ([[Note]]
sc, [[Int]] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [[Int]]
vs)
in ()
cacheForced () -> Pattern ValueMap -> Pattern ValueMap
forall a b. a -> b -> b
`seq` (Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall a. Num a => Pattern a -> Pattern a -> Pattern a
|* String -> Pattern Double -> Pattern ValueMap
pF String
"amp" (Kinetics -> Pattern Double
kDynamic Kinetics
kin)) (Pattern ValueMap -> Pattern ValueMap)
-> Pattern ValueMap -> Pattern ValueMap
forall a b. (a -> b) -> a -> b
$
Pattern Bool -> Pattern ValueMap -> Pattern ValueMap
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)) (Pattern ValueMap -> Pattern ValueMap)
-> Pattern ValueMap -> Pattern ValueMap
forall a b. (a -> b) -> a -> b
$
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
$ ((Bool, Progression) -> Pattern ValueMap)
-> Pattern (Bool, Progression) -> 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 (\(Bool, Progression)
key ->
([[Note]], Int) -> Pattern Int -> Pattern Int -> Pattern ValueMap
arrangeLookup' ((Bool, Progression) -> ([[Note]], Int)
lookupCache (Bool, Progression)
key) Pattern Int
chordPat Pattern Int
ranged
) Pattern (Bool, Progression)
progPat
arrangeLookup' :: ([[Note]], Int)
-> Pattern Int
-> Pattern Int
-> Pattern ValueMap
arrangeLookup' :: ([[Note]], Int) -> Pattern Int -> Pattern Int -> Pattern ValueMap
arrangeLookup' ([[Note]]
scales, Int
nChords) Pattern Int
chordPat Pattern Int
ranged
| Int
nChords Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 = Pattern ValueMap
forall a. Pattern a
silence
| Bool
otherwise =
let chordIdx :: Pattern Int
chordIdx = (Int -> Int) -> Pattern Int -> Pattern Int
forall a b. (a -> b) -> Pattern a -> Pattern b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Int
i -> (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
nChords) Pattern Int
chordPat
chordPats :: [Pattern ValueMap]
chordPats = ([Note] -> Pattern ValueMap) -> [[Note]] -> [Pattern ValueMap]
forall a b. (a -> b) -> [a] -> [b]
map (\[Note]
sc -> Pattern Note -> Pattern ValueMap
note ([Note] -> Pattern Int -> Pattern Note
forall a. Num a => [a] -> Pattern Int -> Pattern a
toScale [Note]
sc Pattern Int
ranged)) [[Note]]
scales
in Pattern Int -> [Pattern ValueMap] -> Pattern ValueMap
forall a. Pattern Int -> [Pattern a] -> Pattern a
squeeze Pattern Int
chordIdx [Pattern ValueMap]
chordPats
parallel :: Pattern Note -> ControlPattern -> ControlPattern
parallel :: Pattern Note -> Pattern ValueMap -> Pattern ValueMap
parallel Pattern Note
offs Pattern ValueMap
pat = Pattern ValueMap
pat Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall a. Num a => Pattern a -> Pattern a -> Pattern a
|+ Pattern Note -> Pattern ValueMap
note Pattern Note
offs
lookupChordAt :: Time -> Pattern Int -> Int
lookupChordAt :: Time -> Pattern Int -> Int
lookupChordAt Time
t Pattern Int
cpat =
case Pattern Int -> Arc -> [Event Int]
forall a. Pattern a -> Arc -> [Event a]
queryArc Pattern Int
cpat (Time -> Time -> Arc
forall a. a -> a -> ArcF a
Arc Time
t (Time
t Time -> Time -> Time
forall a. Num a => a -> a -> a
+ Time
1Time -> Time -> Time
forall a. Fractional a => a -> a -> a
/Time
10000000)) of
[] -> Int
0
(Event Int
e:[Event Int]
_) -> Event Int -> Int
forall a b. EventF a b -> b
value Event Int
e
lookupChord :: PC.ProgressionContext -> Int -> H.Chord
lookupChord :: ProgressionContext -> Int -> Chord
lookupChord ProgressionContext
pc Int
idx =
let prog :: Progression
prog = ProgressionContext -> Progression
PC.triadLayer ProgressionContext
pc
len :: Int
len = Progression -> Int
P.progLength Progression
prog
chords :: [Chord]
chords = Progression -> [Chord]
P.progChords Progression
prog
wrappedIdx :: Int
wrappedIdx = Int
idx Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
len
in [Chord]
chords [Chord] -> Int -> Chord
forall a. HasCallStack => [a] -> Int -> a
!! Int
wrappedIdx
lookupProgression :: PC.ProgressionContext -> Pattern Int -> Pattern [Int]
lookupProgression :: ProgressionContext -> Pattern Int -> Pattern [Int]
lookupProgression ProgressionContext
pc Pattern Int
idxPat =
let prog :: Progression
prog = ProgressionContext -> Progression
PC.triadLayer ProgressionContext
pc
len :: Int
len = Progression -> Int
P.progLength Progression
prog
voicings :: [[Int]]
voicings = VoiceFunction
A.flow Progression
prog
in (Int -> [Int]) -> Pattern Int -> Pattern [Int]
forall a b. (a -> b) -> Pattern a -> Pattern b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Int
idx -> [[Int]]
voicings [[Int]] -> Int -> [Int]
forall a. HasCallStack => [a] -> Int -> a
!! (Int
idx Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
len)) Pattern Int
idxPat
overlapF :: Int -> P.Progression -> P.Progression
overlapF :: Int -> Progression -> Progression
overlapF = Int -> Progression -> Progression
A.progOverlapF
overlapB :: Int -> P.Progression -> P.Progression
overlapB :: Int -> Progression -> Progression
overlapB = Int -> Progression -> Progression
A.progOverlapB
overlap :: Int -> P.Progression -> P.Progression
overlap :: Int -> Progression -> Progression
overlap = Int -> Progression -> Progression
A.progOverlap