module Harmonic.Interface.Tidal.Bridge
(
VoiceFunction
, voiceRange
, layerForVoicing
, warp
, rep
, arrange
, arrange'
, Tuning
, ecbc
, composite
, harmonics
, overtoneMap
, overtoneTable
, compositeSeries
, stringPitches
, partialOffset
, parallel
, harmonicState
, 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.Rules.Types.Pitch as Pitch
import qualified Harmonic.Interface.Tidal.Arranger as A
import Harmonic.Interface.Tidal.Form (Kinetics(..), IK)
import Harmonic.Interface.Tidal.Utils (mono')
import Data.Foldable (toList)
import Data.List (sort, nub, nubBy, intercalate)
import Data.Maybe (isJust)
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 :: [Char] -> Pattern Int
warp [Char]
str = 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
$ [Char] -> Pattern Int
forall a. (Enumerable a, Parseable a) => [Char] -> Pattern a
parseBP_E [Char]
str
rep :: PC.ProgressionContext -> Pattern Time -> Pattern Int
rep :: ProgressionContext -> Pattern Time -> Pattern Int
rep ProgressionContext
pc Pattern Time
repVal =
let barsN :: Int
barsN = 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
barsN 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
barsN]
layerForVoicing :: Layer -> PC.ProgressionContext -> (Bool, P.Progression)
layerForVoicing :: Layer -> ProgressionContext -> (Bool, Progression)
layerForVoicing Layer
lyr ProgressionContext
ctx =
let chromaBar :: CadenceState -> Bool
chromaBar CadenceState
cs = [PitchClass] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length (Cadence -> [PitchClass]
H.cadenceIntervals (CadenceState -> Cadence
H.stateCadence CadenceState
cs)) Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
5
derived :: Bool
derived = ProgressionContext -> Family
PC.pcFamily ProgressionContext
ctx Family -> Family -> Bool
forall a. Eq a => a -> a -> Bool
/= Family
PC.FPoly
Bool -> Bool -> Bool
&& ProgressionContext -> Progression
PC.modeLayer ProgressionContext
ctx Progression -> Progression -> Bool
forall a. Eq a => a -> a -> Bool
/= ProgressionContext -> Progression
PC.triadLayer ProgressionContext
ctx
Bool -> Bool -> Bool
&& (CadenceState -> Bool) -> [CadenceState] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all CadenceState -> Bool
chromaBar (Seq CadenceState -> [CadenceState]
forall a. Seq a -> [a]
forall (t :: * -> *) a. Foldable t => t a -> [a]
toList (Progression -> Seq CadenceState
P.unProgression (ProgressionContext -> Progression
PC.modeLayer ProgressionContext
ctx)))
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) Bool -> Bool -> Bool
|| Bool
derived)
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 -> Bool) -> Pattern Int -> Pattern Int
forall a. (a -> Bool) -> Pattern a -> Pattern a
filterValues (Kinetics -> Int -> Bool
kDegrees Kinetics
kin) ((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 ProgressionContext
progPat = 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
voicingsOf :: ProgressionContext -> ([[Note]], Int)
voicingsOf ProgressionContext
ctx =
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 (Layer -> ProgressionContext -> (Bool, Progression)
layerForVoicing Layer
lyr ProgressionContext
ctx))
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]]
in [[Note]] -> ()
forceAll [[Note]]
sc () -> ([[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)
cache :: [(ProgressionContext, ([[Note]], Int))]
cache = [ (ProgressionContext
ctx, ProgressionContext -> ([[Note]], Int)
voicingsOf ProgressionContext
ctx) | ProgressionContext
ctx <- Kinetics -> [ProgressionContext]
kProgs Kinetics
kin ]
cacheForced :: ()
cacheForced = ((ProgressionContext, ([[Note]], Int)) -> () -> ())
-> () -> [(ProgressionContext, ([[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 (\(ProgressionContext
_, ([[Note]]
scs, Int
_)) ()
acc -> [[Note]] -> ()
forceAll [[Note]]
scs () -> () -> ()
forall a b. a -> b -> b
`seq` ()
acc) () [(ProgressionContext, ([[Note]], Int))]
cache
lookupCache :: ProgressionContext -> ([[Note]], Int)
lookupCache ProgressionContext
ctx = case ProgressionContext
-> [(ProgressionContext, ([[Note]], Int))] -> Maybe ([[Note]], Int)
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup ProgressionContext
ctx [(ProgressionContext, ([[Note]], Int))]
cache of
Just ([[Note]], Int)
hit -> ([[Note]], Int)
hit
Maybe ([[Note]], Int)
Nothing -> ProgressionContext -> ([[Note]], Int)
voicingsOf ProgressionContext
ctx
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
|* [Char] -> Pattern Double -> Pattern ValueMap
pF [Char]
"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
$ (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
ctx ->
([[Note]], Int) -> Pattern Int -> Pattern Int -> Pattern ValueMap
arrangeLookup (ProgressionContext -> ([[Note]], Int)
lookupCache ProgressionContext
ctx) Pattern Int
chordPat Pattern Int
ranged
) Pattern ProgressionContext
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 (ArcF Time)
forall a b. EventF a b -> Maybe a
whole Event Int
nEv of
Maybe (ArcF Time)
Nothing -> []
Just ArcF Time
wArc ->
let onsetT :: Time
onsetT = ArcF Time -> Time
forall a. ArcF a -> a
start ArcF Time
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 = [Note] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Note]
sc
octv :: Int
octv = Int
noteVal Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
1 Int
scLen
idx :: Int
idx = Int
noteVal Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
1 Int
scLen
in [ Event Int
nEv { value = (sc !! idx) + fromIntegral (octv * 12) }
| Int
scLen Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0 ]
) [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
type Tuning = [(Pitch.NoteName, Int)]
ecbc :: Tuning
ecbc :: Tuning
ecbc = [(NoteName
Pitch.A, Int
2), (NoteName
Pitch.E, Int
3), (NoteName
Pitch.G, Int
3), (NoteName
Pitch.B, Int
3), (NoteName
Pitch.C, Int
4)]
partialOffset :: Int -> Int
partialOffset :: Int -> Int
partialOffset Int
partial = Double -> Int
forall b. Integral b => Double -> b
forall a b. (RealFrac a, Integral b) => a -> b
round (Double
12 Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double -> Double -> Double
forall a. Floating a => a -> a -> a
logBase Double
2 (Int -> Double
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
partial :: Double))
stringPitches :: (Pitch.NoteName, Int) -> [Int]
stringPitches :: (NoteName, Int) -> [Int]
stringPitches (NoteName
nm, Int
octv) =
let fund :: Int
fund = Int
12 Int -> Int -> Int
forall a. Num a => a -> a -> a
* (Int
octv Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) Int -> Int -> Int
forall a. Num a => a -> a -> a
+ PitchClass -> Int
Pitch.unPitchClass (NoteName -> PitchClass
Pitch.pitchClass NoteName
nm)
in [ Int
fund Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int -> Int
partialOffset Int
partial | Int
partial <- [Int
2, Int
3, Int
4, Int
5] ]
compositeSeries :: Tuning -> [Int]
compositeSeries :: Tuning -> [Int]
compositeSeries = [Int] -> [Int]
forall a. Ord a => [a] -> [a]
sort ([Int] -> [Int]) -> (Tuning -> [Int]) -> Tuning -> [Int]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Int] -> [Int]
forall a. Eq a => [a] -> [a]
nub ([Int] -> [Int]) -> (Tuning -> [Int]) -> Tuning -> [Int]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((NoteName, Int) -> [Int]) -> Tuning -> [Int]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (NoteName, Int) -> [Int]
stringPitches
viableSeries :: Layer -> PC.ProgressionContext -> ([[Int]], Int)
viableSeries :: Layer -> ProgressionContext -> ([[Int]], Int)
viableSeries Layer
lyr ProgressionContext
ctx =
let (Bool
chroma, Progression
p) = Layer -> ProgressionContext -> (Bool, Progression)
layerForVoicing Layer
lyr ProgressionContext
ctx
vs :: [[Int]]
vs = if Bool
chroma then VoiceFunction
A.strataModeFlow Progression
p else VoiceFunction
A.flow Progression
p
ser :: [Int]
ser = Tuning -> [Int]
compositeSeries Tuning
ecbc
per :: [[Int]]
per = [ [ Int
m | Int
m <- [Int]
ser, (Int
m Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
12) Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` (Int -> Int) -> [Int] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map (Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
12) [Int]
bar ] | [Int]
bar <- [[Int]]
vs ]
in ([[Int]]
per, [[Int]] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [[Int]]
vs)
composite :: (Double, Double)
-> IK
-> Layer
-> [Pattern Int]
-> Pattern ValueMap
composite :: (Double, Double)
-> IK -> Layer -> [Pattern Int] -> Pattern ValueMap
composite = (Int -> Bool)
-> Bool
-> (Double, Double)
-> IK
-> Layer
-> [Pattern Int]
-> Pattern ValueMap
seriesPlay (Bool -> Int -> Bool
forall a b. a -> b -> a
const Bool
True) Bool
False
harmonics :: Pitch.NoteName -> (Double, Double) -> IK -> Layer -> [Pattern Int] -> Pattern ValueMap
harmonics :: NoteName
-> (Double, Double)
-> IK
-> Layer
-> [Pattern Int]
-> Pattern ValueMap
harmonics NoteName
str = (Int -> Bool)
-> Bool
-> (Double, Double)
-> IK
-> Layer
-> [Pattern Int]
-> Pattern ValueMap
seriesPlay (Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Int]
owned) Bool
True
where
owned :: [Int]
owned = [[Int]] -> [Int]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [ (NoteName, Int) -> [Int]
stringPitches (NoteName, Int)
st | st :: (NoteName, Int)
st@(NoteName
nm, Int
_) <- Tuning
ecbc
, NoteName -> PitchClass
Pitch.pitchClass NoteName
nm PitchClass -> PitchClass -> Bool
forall a. Eq a => a -> a -> Bool
== NoteName -> PitchClass
Pitch.pitchClass NoteName
str ]
seriesPlay :: (Int -> Bool) -> Bool -> (Double, Double) -> IK -> Layer -> [Pattern Int] -> Pattern ValueMap
seriesPlay :: (Int -> Bool)
-> Bool
-> (Double, Double)
-> IK
-> Layer
-> [Pattern Int]
-> Pattern ValueMap
seriesPlay Int -> Bool
keep Bool
monoString (Double
lo, Double
hi) (Kinetics
kin, Pattern Int
chordPat) Layer
lyr [Pattern Int]
pats =
let contour :: Pattern Int
contour = [Pattern Int] -> Pattern Int
forall a. [Pattern a] -> Pattern a
stack [Pattern Int]
pats
progPat :: Pattern ProgressionContext
progPat = Kinetics -> Pattern ProgressionContext
kProg Kinetics
kin
cache :: [(ProgressionContext, ([[Int]], Int))]
cache = [ (ProgressionContext
ctx, Layer -> ProgressionContext -> ([[Int]], Int)
viableSeries Layer
lyr ProgressionContext
ctx) | ProgressionContext
ctx <- Kinetics -> [ProgressionContext]
kProgs Kinetics
kin ]
cacheForced :: ()
cacheForced = ((ProgressionContext, ([[Int]], Int)) -> () -> ())
-> () -> [(ProgressionContext, ([[Int]], Int))] -> ()
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\(ProgressionContext
_, ([[Int]]
vs, Int
cnt)) ()
acc -> [Int] -> Int
forall a. Num a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum ([[Int]] -> [Int]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[Int]]
vs) Int -> () -> ()
forall a b. a -> b -> b
`seq` Int
cnt Int -> () -> ()
forall a b. a -> b -> b
`seq` ()
acc) () [(ProgressionContext, ([[Int]], Int))]
cache
lookupCache :: ProgressionContext -> ([[Int]], Int)
lookupCache ProgressionContext
ctx = case ProgressionContext
-> [(ProgressionContext, ([[Int]], Int))] -> Maybe ([[Int]], Int)
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup ProgressionContext
ctx [(ProgressionContext, ([[Int]], Int))]
cache of
Just ([[Int]], Int)
hit -> ([[Int]], Int)
hit
Maybe ([[Int]], Int)
Nothing -> Layer -> ProgressionContext -> ([[Int]], Int)
viableSeries Layer
lyr ProgressionContext
ctx
voicing :: Pattern a -> Pattern a
voicing = if Bool
monoString then Pattern a -> Pattern a
forall a. Pattern a -> Pattern a
mono' else Pattern a -> Pattern a
forall a. a -> a
id
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
|* [Char] -> Pattern Double -> Pattern ValueMap
pF [Char]
"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
$ (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
ctx ->
Pattern Note -> Pattern ValueMap
midinote ((Int -> Note) -> Pattern Int -> Pattern Note
forall a b. (a -> b) -> Pattern a -> Pattern b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Int -> Note
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Pattern Int -> Pattern Int
forall a. Pattern a -> Pattern a
voicing (([[Int]], Int)
-> (Int -> Bool) -> Pattern Int -> Pattern Int -> Pattern Int
seriesLookup (ProgressionContext -> ([[Int]], Int)
lookupCache ProgressionContext
ctx) Int -> Bool
keep Pattern Int
chordPat Pattern Int
contour)))
) Pattern ProgressionContext
progPat
seriesLookup :: ([[Int]], Int) -> (Int -> Bool) -> Pattern Int -> Pattern Int -> Pattern Int
seriesLookup :: ([[Int]], Int)
-> (Int -> Bool) -> Pattern Int -> Pattern Int -> Pattern Int
seriesLookup ([[Int]]
viable, Int
nChords) Int -> Bool
keep Pattern Int
chordPat Pattern Int
contour
| Int
nChords Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 = Pattern Int
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
in (State -> [Event Int]) -> Maybe Time -> Maybe Int -> Pattern Int
forall a.
(State -> [Event a]) -> Maybe Time -> Maybe a -> Pattern a
Pattern (\State
st ->
(Event Int -> [Event Int]) -> [Event Int] -> [Event Int]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (\Event Int
ev -> case Event Int -> Maybe (ArcF Time)
forall a b. EventF a b -> Maybe a
whole Event Int
ev of
Maybe (ArcF Time)
Nothing -> []
Just ArcF Time
w ->
let ci :: Int
ci = Time -> Pattern Int -> Int
lookupChordAt (ArcF Time -> Time
forall a. ArcF a -> a
start ArcF Time
w) Pattern Int
chordIdx
vs :: [Int]
vs = [[Int]]
viable [[Int]] -> Int -> [Int]
forall a. HasCallStack => [a] -> Int -> a
!! (Int
ci Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
nChords)
in [ Event Int
ev { value = m } | Bool -> Bool
not ([Int] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Int]
vs)
, let m :: Int
m = [Int]
vs [Int] -> Int -> Int
forall a. HasCallStack => [a] -> Int -> a
!! (Event Int -> Int
forall a b. EventF a b -> b
value Event Int
ev Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` [Int] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Int]
vs)
, Int -> Bool
keep Int
m ]
) (Pattern Int -> State -> [Event Int]
forall a. Pattern a -> State -> [Event a]
query Pattern Int
contour State
st)
) Maybe Time
forall a. Maybe a
Nothing Maybe Int
forall a. Maybe a
Nothing
overtoneTable :: [Int] -> [(Int, Int, [(Pitch.NoteName, Int)])]
overtoneTable :: [Int] -> [(Int, Int, Tuning)]
overtoneTable [Int]
pcs =
let viable :: [Int]
viable = [ Int
m | Int
m <- Tuning -> [Int]
compositeSeries Tuning
ecbc, (Int
m Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
12) Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` (Int -> Int) -> [Int] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map (Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
12) [Int]
pcs ]
in [ (Int
i, Int
m, Int -> Tuning
sourcesOf Int
m) | (Int
i, Int
m) <- [Int] -> [Int] -> [(Int, Int)]
forall a b. [a] -> [b] -> [(a, b)]
zip [Int
0 ..] [Int]
viable ]
where
sourcesOf :: Int -> Tuning
sourcesOf Int
m = [ (NoteName
nm, Int -> Int
forall {a}. (Eq a, Num a) => a -> a
otNumber Int
partial)
| st :: (NoteName, Int)
st@(NoteName
nm, Int
_) <- Tuning
ecbc
, (Int
partial, Int
pitch) <- [Int] -> [Int] -> [(Int, Int)]
forall a b. [a] -> [b] -> [(a, b)]
zip [Int
2, Int
3, Int
4, Int
5 :: Int] ((NoteName, Int) -> [Int]
stringPitches (NoteName, Int)
st)
, Int
pitch Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
m ]
otNumber :: a -> a
otNumber a
partial = case a
partial of { a
2 -> a
1; a
3 -> a
2; a
4 -> a
1; a
5 -> a
3; a
other -> a
other }
overtoneMap :: PC.ProgressionContext -> Layer -> [Pattern Int] -> IO ()
overtoneMap :: ProgressionContext -> Layer -> [Pattern Int] -> IO ()
overtoneMap ProgressionContext
ctx Layer
lyr [Pattern Int]
pats = do
[Char] -> IO ()
putStrLn [Char]
"pitch names are scientific (60 = C4); the MPC and MIDI Monitor show one octave lower — compare by number"
let ints :: [Int]
ints = [Int] -> [Int]
forall a. Eq a => [a] -> [a]
nub [ Event Int -> Int
forall a b. EventF a b -> b
value Event Int
e | Event Int
e <- Pattern Int -> ArcF Time -> [Event Int]
forall a. Pattern a -> ArcF Time -> [Event a]
queryArc ([Pattern Int] -> Pattern Int
forall a. [Pattern a] -> Pattern a
stack [Pattern Int]
pats) (Time -> Time -> ArcF Time
forall a. a -> a -> ArcF a
Arc Time
0 Time
4), Event Int -> Bool
forall a. Event a -> Bool
eventHasOnset Event Int
e ]
pcName :: Int -> a
pcName Int
pc = [a
"C",a
"C#",a
"D",a
"D#",a
"E",a
"F",a
"F#",a
"G",a
"G#",a
"A",a
"A#",a
"B"] [a] -> Int -> a
forall a. HasCallStack => [a] -> Int -> a
!! (Int
pc Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
12)
pitchName :: Int -> [Char]
pitchName Int
m = Int -> [Char]
forall {a}. IsString a => Int -> a
pcName Int
m [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Int -> [Char]
forall a. Show a => a -> [Char]
show (Int
m Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
12 Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)
srcText :: [(a, a)] -> [Char]
srcText [(a, a)]
srcs = [Char] -> [[Char]] -> [Char]
forall a. [a] -> [[a]] -> [a]
intercalate [Char]
" / " [ a -> [Char]
forall a. Show a => a -> [Char]
show a
nm [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ a -> [Char]
forall a. Show a => a -> [Char]
show a
ot | (a
nm, a
ot) <- [(a, a)]
srcs ]
(Bool
chroma, Progression
p) = Layer -> ProgressionContext -> (Bool, Progression)
layerForVoicing Layer
lyr ProgressionContext
ctx
bars :: [[Int]]
bars = if Bool
chroma then VoiceFunction
A.strataModeFlow Progression
p else VoiceFunction
A.flow Progression
p
((Int, [Int]) -> IO ()) -> [(Int, [Int])] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (\(Int
bi, [Int]
bar) -> do
let pcs :: [Int]
pcs = [Int] -> [Int]
forall a. Eq a => [a] -> [a]
nub ((Int -> Int) -> [Int] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map (Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
12) [Int]
bar)
rows :: [(Int, Int, Tuning)]
rows = [Int] -> [(Int, Int, Tuning)]
overtoneTable [Int]
pcs
cnt :: Int
cnt = [(Int, Int, Tuning)] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [(Int, Int, Tuning)]
rows
[Char] -> IO ()
putStrLn ([Char]
"chord " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Int -> [Char]
forall a. Show a => a -> [Char]
show (Int
bi :: Int) [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
" [" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [[Char]] -> [Char]
unwords ((Int -> [Char]) -> [Int] -> [[Char]]
forall a b. (a -> b) -> [a] -> [b]
map Int -> [Char]
forall {a}. IsString a => Int -> a
pcName [Int]
pcs) [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"]"
[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ (if Int
cnt Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 then [Char]
" — no instrument tone" else [Char]
""))
((Int, Int, Tuning) -> IO ()) -> [(Int, Int, Tuning)] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (\(Int
i, Int
m, Tuning
srcs) ->
[Char] -> IO ()
putStrLn ([Char]
" " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Int -> [Char]
forall a. Show a => a -> [Char]
show Int
i [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
" / " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Int -> [Char]
forall a. Show a => a -> [Char]
show (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
cnt) [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"\t" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Int -> [Char]
pitchName Int
m
[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"\t" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Int -> [Char]
forall a. Show a => a -> [Char]
show Int
m [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"\t" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Tuning -> [Char]
forall {a} {a}. (Show a, Show a) => [(a, a)] -> [Char]
srcText Tuning
srcs)) [(Int, Int, Tuning)]
rows
if [Int] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Int]
ints Bool -> Bool -> Bool
|| Int
cnt Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 then () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return () else
[Char] -> IO ()
putStrLn ([Char]
" contour " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [[Char]] -> [Char]
unwords ((Int -> [Char]) -> [Int] -> [[Char]]
forall a b. (a -> b) -> [a] -> [b]
map Int -> [Char]
forall a. Show a => a -> [Char]
show [Int]
ints) [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
" -> "
[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [[Char]] -> [Char]
unwords [ Int -> [Char]
pitchName ([Int]
vs [Int] -> Int -> Int
forall a. HasCallStack => [a] -> Int -> a
!! (Int
i Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
cnt)) | let vs :: [Int]
vs = [ Int
m | (Int
_, Int
m, Tuning
_) <- [(Int, Int, Tuning)]
rows ], Int
i <- [Int]
ints ])
) ([Int] -> [[Int]] -> [(Int, [Int])]
forall a b. [a] -> [b] -> [(a, b)]
zip [Int
1 ..] [[Int]]
bars)
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 -> Bool) -> Pattern Int -> Pattern Int
forall a. (a -> Bool) -> Pattern a -> Pattern a
filterValues (Kinetics -> Int -> Bool
kDegrees Kinetics
kin) ((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 ProgressionContext
progPat = 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
voicingsOf :: ProgressionContext -> ([[Note]], Int)
voicingsOf ProgressionContext
ctx =
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 (Layer -> ProgressionContext -> (Bool, Progression)
layerForVoicing Layer
lyr ProgressionContext
ctx))
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]]
in [[Note]] -> ()
forceAll [[Note]]
sc () -> ([[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)
cache :: [(ProgressionContext, ([[Note]], Int))]
cache = [ (ProgressionContext
ctx, ProgressionContext -> ([[Note]], Int)
voicingsOf ProgressionContext
ctx) | ProgressionContext
ctx <- Kinetics -> [ProgressionContext]
kProgs Kinetics
kin ]
cacheForced :: ()
cacheForced = ((ProgressionContext, ([[Note]], Int)) -> () -> ())
-> () -> [(ProgressionContext, ([[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 (\(ProgressionContext
_, ([[Note]]
scs, Int
_)) ()
acc -> [[Note]] -> ()
forceAll [[Note]]
scs () -> () -> ()
forall a b. a -> b -> b
`seq` ()
acc) () [(ProgressionContext, ([[Note]], Int))]
cache
lookupCache :: ProgressionContext -> ([[Note]], Int)
lookupCache ProgressionContext
ctx = case ProgressionContext
-> [(ProgressionContext, ([[Note]], Int))] -> Maybe ([[Note]], Int)
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup ProgressionContext
ctx [(ProgressionContext, ([[Note]], Int))]
cache of
Just ([[Note]], Int)
hit -> ([[Note]], Int)
hit
Maybe ([[Note]], Int)
Nothing -> ProgressionContext -> ([[Note]], Int)
voicingsOf ProgressionContext
ctx
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
|* [Char] -> Pattern Double -> Pattern ValueMap
pF [Char]
"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
$ (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
ctx ->
([[Note]], Int) -> Pattern Int -> Pattern Int -> Pattern ValueMap
arrangeLookup' (ProgressionContext -> ([[Note]], Int)
lookupCache ProgressionContext
ctx) Pattern Int
chordPat Pattern Int
ranged
) Pattern ProgressionContext
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
harmonicState :: Layer -> IK -> ControlPattern
harmonicState :: Layer -> IK -> Pattern ValueMap
harmonicState Layer
lyr IK
k =
Time -> Pattern Time
forall a. a -> Pattern a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Time
stateLead Pattern Time -> Pattern ValueMap -> Pattern ValueMap
forall a. Pattern Time -> Pattern a -> Pattern a
<~ ([Event ValueMap] -> [Event ValueMap])
-> Pattern ValueMap -> Pattern ValueMap
forall a b. ([Event a] -> [Event b]) -> Pattern a -> Pattern b
withEvents ((Event ValueMap -> Event ValueMap -> Bool)
-> [Event ValueMap] -> [Event ValueMap]
forall a. (a -> a -> Bool) -> [a] -> [a]
nubBy Event ValueMap -> Event ValueMap -> Bool
forall {a} {a}. (Eq a, Eq a) => EventF a a -> EventF a a -> Bool
sameNote)
((Double, Double)
-> IK
-> (Int, Int)
-> Layer
-> VoiceFunction
-> (Progression -> Progression)
-> [Pattern Int]
-> Pattern ValueMap
arrange (Double
0, Double
1) (IK -> IK
forall {b}. (Kinetics, b) -> (Kinetics, b)
allDegrees IK
k) (Int
0, Int
11) Layer
lyr VoiceFunction
A.lite Progression -> Progression
forall a. a -> a
id
[Pattern Bool -> Pattern Int -> Pattern Int
forall a. Pattern Bool -> Pattern a -> Pattern a
struct ((Int -> Bool) -> Pattern Int -> Pattern Bool
forall a b. (a -> b) -> Pattern a -> Pattern b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Bool -> Int -> Bool
forall a b. a -> b -> a
const Bool
True) (IK -> Pattern Int
forall a b. (a, b) -> b
snd IK
k)) Pattern Int
"[0,1,2,3,4,5,6,7,8,9,10,11]"]
Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall a. Moddable a => Pattern a -> Pattern a -> Pattern a
|% Pattern Note -> Pattern ValueMap
note Pattern Note
12 Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall a. Num a => Pattern a -> Pattern a -> Pattern a
|+ Pattern Note -> Pattern ValueMap
note Pattern Note
48
# s "thru" # midichan 9 # legato 1 # pF "amp" 1)
where
sameNote :: EventF a a -> EventF a a -> Bool
sameNote EventF a a
x EventF a a
y = EventF a a -> Maybe a
forall a b. EventF a b -> Maybe a
whole EventF a a
x Maybe a -> Maybe a -> Bool
forall a. Eq a => a -> a -> Bool
== EventF a a -> Maybe a
forall a b. EventF a b -> Maybe a
whole EventF a a
y Bool -> Bool -> Bool
&& EventF a a -> a
forall a b. EventF a b -> a
part EventF a a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== EventF a a -> a
forall a b. EventF a b -> a
part EventF a a
y Bool -> Bool -> Bool
&& EventF a a -> a
forall a b. EventF a b -> b
value EventF a a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== EventF a a -> a
forall a b. EventF a b -> b
value EventF a a
y
allDegrees :: (Kinetics, b) -> (Kinetics, b)
allDegrees (Kinetics
kin, b
chordPat) = (Kinetics
kin { kDegrees = const True }, b
chordPat)
stateLead :: Time
stateLead :: Time
stateLead = Time
7Time -> Time -> Time
forall a. Fractional a => a -> a -> a
/Time
64
lookupChordAt :: Time -> Pattern Int -> Int
lookupChordAt :: Time -> Pattern Int -> Int
lookupChordAt Time
t Pattern Int
cpat =
case Pattern Int -> ArcF Time -> [Event Int]
forall a. Pattern a -> ArcF Time -> [Event a]
queryArc Pattern Int
cpat (Time -> Time -> ArcF Time
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 if Int
len Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0
then [Char] -> Chord
forall a. HasCallStack => [Char] -> a
error [Char]
"lookupChord: empty progression"
else [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 if Int
len Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0
then Pattern [Int]
forall a. Pattern a
silence
else (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