-- |
-- Module      : Harmonic.Interface.Tidal.Devices.JV1010
-- Description : Roland JV-1010 drum map and continuo bank addressing
--
-- Two things the JV-1010 knows and nothing else does: which MIDI note each
-- drum voice sits on, and how a patch is named.
--
-- The kit answers on channel 10 and each voice takes a boolean rhythm:
--
-- @, kick "1 ~ ~ 1"@
--
-- The primed variants are the +60 alternate kit. \'hh\' and \'hh\'\' take a
-- two-symbol grid instead (@x@ closed, @o@ open), so one pattern carries both
-- hats.
--
-- A continuo voice is a full bank address — @(bank msb, bank lsb, program)@ —
-- so any card or internal set is reachable, not just the Orchestral board.
-- The JV-1010 selects a patch with Bank Select (CC0 msb \/ CC32 lsb) followed
-- by a Program Change; quote Orchestral-card numbers straight off Roland\'s
-- 001-255 listing via \'orch\', and reach the internal sets with \'presetA\'
-- and \'presetB\'.
module Harmonic.Interface.Tidal.Devices.JV1010
  ( -- * Drum kit (channel 10)
    kick, kick', kick'', kick2, kick2', snap, hhcl, hhcl', hhop, hhop',
    ride, ride', crash, click, click', snare, snare', cowbell, fm, fm',
    rimshot, rimshot', hh, hh'

    -- * Continuo bank addressing
  , ContinuoVoice
  , orch, presetA, presetB, orchMSB, orchLSB
  , harpV, harpPluckedV, harpsichordV, pianoV, celestaV, glockenV
  , tubularV, choirV, guitarV, organV
  ) where

import Sound.Tidal.Context
import Harmonic.Interface.Tidal.Instruments (ch, vel)

-- | The kit answers on MIDI channel 10.
kitChan :: Pattern ValueMap
kitChan :: Pattern ValueMap
kitChan = Int -> Pattern ValueMap
ch Int
10

-- | One drum voice each, taking a boolean rhythm. The primed names are the
-- +60 alternate kit; @kick2@ and @kick2'@ are the second bass drum.
kick, kick', kick'', kick2, kick2', snap, hhcl, hhcl', hhop, hhop',
  ride, ride', crash, click, click', snare, snare', cowbell, fm, fm',
  rimshot, rimshot' :: Pattern Bool -> ControlPattern
kick :: Pattern Bool -> Pattern ValueMap
kick Pattern Bool
pat = Pattern Bool -> Pattern ValueMap -> Pattern ValueMap
forall a. Pattern Bool -> Pattern a -> Pattern a
struct Pattern Bool
pat (Pattern ValueMap -> Pattern ValueMap)
-> Pattern ValueMap -> Pattern ValueMap
forall a b. (a -> b) -> a -> b
$ Pattern Note -> Pattern ValueMap
midinote Pattern Note
"0" Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern ValueMap
kitChan Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
sustain Pattern Double
0.05
kick' :: Pattern Bool -> Pattern ValueMap
kick' Pattern Bool
pat = Pattern Bool -> Pattern ValueMap -> Pattern ValueMap
forall a. Pattern Bool -> Pattern a -> Pattern a
struct Pattern Bool
pat (Pattern ValueMap -> Pattern ValueMap)
-> Pattern ValueMap -> Pattern ValueMap
forall a b. (a -> b) -> a -> b
$ Pattern Note -> Pattern ValueMap
midinote Pattern Note
"60" Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern ValueMap
kitChan Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
sustain Pattern Double
0.05
kick'' :: Pattern Bool -> Pattern ValueMap
kick'' Pattern Bool
pat = Pattern Bool -> Pattern ValueMap -> Pattern ValueMap
forall a. Pattern Bool -> Pattern a -> Pattern a
struct Pattern Bool
pat (Pattern ValueMap -> Pattern ValueMap)
-> Pattern ValueMap -> Pattern ValueMap
forall a b. (a -> b) -> a -> b
$ Pattern Note -> Pattern ValueMap
midinote Pattern Note
"70" Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern ValueMap
kitChan Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
sustain Pattern Double
0.05
kick2 :: Pattern Bool -> Pattern ValueMap
kick2 Pattern Bool
pat = Pattern Bool -> Pattern ValueMap -> Pattern ValueMap
forall a. Pattern Bool -> Pattern a -> Pattern a
struct Pattern Bool
pat (Pattern ValueMap -> Pattern ValueMap)
-> Pattern ValueMap -> Pattern ValueMap
forall a b. (a -> b) -> a -> b
$ Pattern Note -> Pattern ValueMap
midinote Pattern Note
"70" Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern ValueMap
kitChan Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
sustain Pattern Double
0.05
kick2' :: Pattern Bool -> Pattern ValueMap
kick2' Pattern Bool
pat = Pattern Bool -> Pattern ValueMap -> Pattern ValueMap
forall a. Pattern Bool -> Pattern a -> Pattern a
struct Pattern Bool
pat (Pattern ValueMap -> Pattern ValueMap)
-> Pattern ValueMap -> Pattern ValueMap
forall a b. (a -> b) -> a -> b
$ Pattern Note -> Pattern ValueMap
midinote Pattern Note
"80" Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern ValueMap
kitChan Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
sustain Pattern Double
0.05
snap :: Pattern Bool -> Pattern ValueMap
snap Pattern Bool
pat = Pattern Bool -> Pattern ValueMap -> Pattern ValueMap
forall a. Pattern Bool -> Pattern a -> Pattern a
struct Pattern Bool
pat (Pattern ValueMap -> Pattern ValueMap)
-> Pattern ValueMap -> Pattern ValueMap
forall a b. (a -> b) -> a -> b
$ Pattern Note -> Pattern ValueMap
midinote Pattern Note
"1" Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern ValueMap
kitChan Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
sustain Pattern Double
0.05
hhcl :: Pattern Bool -> Pattern ValueMap
hhcl Pattern Bool
pat = Pattern Bool -> Pattern ValueMap -> Pattern ValueMap
forall a. Pattern Bool -> Pattern a -> Pattern a
struct Pattern Bool
pat (Pattern ValueMap -> Pattern ValueMap)
-> Pattern ValueMap -> Pattern ValueMap
forall a b. (a -> b) -> a -> b
$ Pattern Note -> Pattern ValueMap
midinote Pattern Note
"2" Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern ValueMap
kitChan Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
sustain Pattern Double
0.05
hhcl' :: Pattern Bool -> Pattern ValueMap
hhcl' Pattern Bool
pat = Pattern Bool -> Pattern ValueMap -> Pattern ValueMap
forall a. Pattern Bool -> Pattern a -> Pattern a
struct Pattern Bool
pat (Pattern ValueMap -> Pattern ValueMap)
-> Pattern ValueMap -> Pattern ValueMap
forall a b. (a -> b) -> a -> b
$ Pattern Note -> Pattern ValueMap
midinote Pattern Note
"62" Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern ValueMap
kitChan Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
sustain Pattern Double
0.05
hhop :: Pattern Bool -> Pattern ValueMap
hhop Pattern Bool
pat = Pattern Bool -> Pattern ValueMap -> Pattern ValueMap
forall a. Pattern Bool -> Pattern a -> Pattern a
struct Pattern Bool
pat (Pattern ValueMap -> Pattern ValueMap)
-> Pattern ValueMap -> Pattern ValueMap
forall a b. (a -> b) -> a -> b
$ Pattern Note -> Pattern ValueMap
midinote Pattern Note
"3" Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern ValueMap
kitChan Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
sustain Pattern Double
0.05
hhop' :: Pattern Bool -> Pattern ValueMap
hhop' Pattern Bool
pat = Pattern Bool -> Pattern ValueMap -> Pattern ValueMap
forall a. Pattern Bool -> Pattern a -> Pattern a
struct Pattern Bool
pat (Pattern ValueMap -> Pattern ValueMap)
-> Pattern ValueMap -> Pattern ValueMap
forall a b. (a -> b) -> a -> b
$ Pattern Note -> Pattern ValueMap
midinote Pattern Note
"63" Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern ValueMap
kitChan Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
sustain Pattern Double
0.05
ride :: Pattern Bool -> Pattern ValueMap
ride Pattern Bool
pat = Pattern Bool -> Pattern ValueMap -> Pattern ValueMap
forall a. Pattern Bool -> Pattern a -> Pattern a
struct Pattern Bool
pat (Pattern ValueMap -> Pattern ValueMap)
-> Pattern ValueMap -> Pattern ValueMap
forall a b. (a -> b) -> a -> b
$ Pattern Note -> Pattern ValueMap
midinote Pattern Note
"4" Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern ValueMap
kitChan Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
sustain Pattern Double
0.05
ride' :: Pattern Bool -> Pattern ValueMap
ride' Pattern Bool
pat = Pattern Bool -> Pattern ValueMap -> Pattern ValueMap
forall a. Pattern Bool -> Pattern a -> Pattern a
struct Pattern Bool
pat (Pattern ValueMap -> Pattern ValueMap)
-> Pattern ValueMap -> Pattern ValueMap
forall a b. (a -> b) -> a -> b
$ Pattern Note -> Pattern ValueMap
midinote Pattern Note
"64" Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern ValueMap
kitChan Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
sustain Pattern Double
0.05
crash :: Pattern Bool -> Pattern ValueMap
crash Pattern Bool
pat = Pattern Bool -> Pattern ValueMap -> Pattern ValueMap
forall a. Pattern Bool -> Pattern a -> Pattern a
struct Pattern Bool
pat (Pattern ValueMap -> Pattern ValueMap)
-> Pattern ValueMap -> Pattern ValueMap
forall a b. (a -> b) -> a -> b
$ Pattern Note -> Pattern ValueMap
midinote Pattern Note
"5" Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern ValueMap
kitChan Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
sustain Pattern Double
0.05
click :: Pattern Bool -> Pattern ValueMap
click Pattern Bool
pat = Pattern Bool -> Pattern ValueMap -> Pattern ValueMap
forall a. Pattern Bool -> Pattern a -> Pattern a
struct Pattern Bool
pat (Pattern ValueMap -> Pattern ValueMap)
-> Pattern ValueMap -> Pattern ValueMap
forall a b. (a -> b) -> a -> b
$ Pattern Note -> Pattern ValueMap
midinote Pattern Note
"6" Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern ValueMap
kitChan Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
sustain Pattern Double
0.05
click' :: Pattern Bool -> Pattern ValueMap
click' Pattern Bool
pat = Pattern Bool -> Pattern ValueMap -> Pattern ValueMap
forall a. Pattern Bool -> Pattern a -> Pattern a
struct Pattern Bool
pat (Pattern ValueMap -> Pattern ValueMap)
-> Pattern ValueMap -> Pattern ValueMap
forall a b. (a -> b) -> a -> b
$ Pattern Note -> Pattern ValueMap
midinote Pattern Note
"66" Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern ValueMap
kitChan Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
sustain Pattern Double
0.05
snare :: Pattern Bool -> Pattern ValueMap
snare Pattern Bool
pat = Pattern Bool -> Pattern ValueMap -> Pattern ValueMap
forall a. Pattern Bool -> Pattern a -> Pattern a
struct Pattern Bool
pat (Pattern ValueMap -> Pattern ValueMap)
-> Pattern ValueMap -> Pattern ValueMap
forall a b. (a -> b) -> a -> b
$ Pattern Note -> Pattern ValueMap
midinote Pattern Note
"7" Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern ValueMap
kitChan Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
sustain Pattern Double
0.05
snare' :: Pattern Bool -> Pattern ValueMap
snare' Pattern Bool
pat = Pattern Bool -> Pattern ValueMap -> Pattern ValueMap
forall a. Pattern Bool -> Pattern a -> Pattern a
struct Pattern Bool
pat (Pattern ValueMap -> Pattern ValueMap)
-> Pattern ValueMap -> Pattern ValueMap
forall a b. (a -> b) -> a -> b
$ Pattern Note -> Pattern ValueMap
midinote Pattern Note
"67" Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern ValueMap
kitChan Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
sustain Pattern Double
0.05
cowbell :: Pattern Bool -> Pattern ValueMap
cowbell Pattern Bool
pat = Pattern Bool -> Pattern ValueMap -> Pattern ValueMap
forall a. Pattern Bool -> Pattern a -> Pattern a
struct Pattern Bool
pat (Pattern ValueMap -> Pattern ValueMap)
-> Pattern ValueMap -> Pattern ValueMap
forall a b. (a -> b) -> a -> b
$ Pattern Note -> Pattern ValueMap
midinote Pattern Note
"8" Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern ValueMap
kitChan Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
sustain Pattern Double
0.05
fm :: Pattern Bool -> Pattern ValueMap
fm Pattern Bool
pat = Pattern Bool -> Pattern ValueMap -> Pattern ValueMap
forall a. Pattern Bool -> Pattern a -> Pattern a
struct Pattern Bool
pat (Pattern ValueMap -> Pattern ValueMap)
-> Pattern ValueMap -> Pattern ValueMap
forall a b. (a -> b) -> a -> b
$ Pattern Note -> Pattern ValueMap
midinote Pattern Note
"9" Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern ValueMap
kitChan Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
sustain Pattern Double
0.05
fm' :: Pattern Bool -> Pattern ValueMap
fm' Pattern Bool
pat = Pattern Bool -> Pattern ValueMap -> Pattern ValueMap
forall a. Pattern Bool -> Pattern a -> Pattern a
struct Pattern Bool
pat (Pattern ValueMap -> Pattern ValueMap)
-> Pattern ValueMap -> Pattern ValueMap
forall a b. (a -> b) -> a -> b
$ Pattern Note -> Pattern ValueMap
midinote Pattern Note
"69" Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern ValueMap
kitChan Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
sustain Pattern Double
0.05
rimshot :: Pattern Bool -> Pattern ValueMap
rimshot Pattern Bool
pat = Pattern Bool -> Pattern ValueMap -> Pattern ValueMap
forall a. Pattern Bool -> Pattern a -> Pattern a
struct Pattern Bool
pat (Pattern ValueMap -> Pattern ValueMap)
-> Pattern ValueMap -> Pattern ValueMap
forall a b. (a -> b) -> a -> b
$ Pattern Note -> Pattern ValueMap
midinote Pattern Note
"[6,7]" Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern ValueMap
kitChan Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
sustain Pattern Double
0.05
rimshot' :: Pattern Bool -> Pattern ValueMap
rimshot' Pattern Bool
pat = Pattern Bool -> Pattern ValueMap -> Pattern ValueMap
forall a. Pattern Bool -> Pattern a -> Pattern a
struct Pattern Bool
pat (Pattern ValueMap -> Pattern ValueMap)
-> Pattern ValueMap -> Pattern ValueMap
forall a b. (a -> b) -> a -> b
$ Pattern Note -> Pattern ValueMap
midinote Pattern Note
"[66,67]" Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern ValueMap
kitChan Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
sustain Pattern Double
0.05

-- | Both hats from one grid: @x@ (or @1@) closed, @o@ (or @2@) open.
hh, hh' :: Pattern String -> ControlPattern
hh :: Pattern String -> Pattern ValueMap
hh Pattern String
pat = [Pattern ValueMap] -> Pattern ValueMap
forall a. [Pattern a] -> Pattern a
stack [
  Pattern Bool -> Pattern ValueMap -> Pattern ValueMap
forall a. Pattern Bool -> Pattern a -> Pattern a
struct ((String -> Bool) -> Pattern String -> Pattern Bool
forall a b. (a -> b) -> Pattern a -> Pattern b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (String -> [String] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [String
"x",String
"1"]) Pattern String
pat) (Pattern ValueMap -> Pattern ValueMap)
-> Pattern ValueMap -> Pattern ValueMap
forall a b. (a -> b) -> a -> b
$ Pattern Note -> Pattern ValueMap
midinote Pattern Note
2 Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern ValueMap
kitChan Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
sustain Pattern Double
0.05 Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
vel Pattern Double
0.5,
  Pattern Bool -> Pattern ValueMap -> Pattern ValueMap
forall a. Pattern Bool -> Pattern a -> Pattern a
struct ((String -> Bool) -> Pattern String -> Pattern Bool
forall a b. (a -> b) -> Pattern a -> Pattern b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (String -> [String] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [String
"o",String
"2"]) Pattern String
pat) (Pattern ValueMap -> Pattern ValueMap)
-> Pattern ValueMap -> Pattern ValueMap
forall a b. (a -> b) -> a -> b
$ Pattern Note -> Pattern ValueMap
midinote Pattern Note
3 Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern ValueMap
kitChan Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
sustain Pattern Double
0.05 Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
vel Pattern Double
0.5
  ]

hh' :: Pattern String -> Pattern ValueMap
hh' Pattern String
pat = [Pattern ValueMap] -> Pattern ValueMap
forall a. [Pattern a] -> Pattern a
stack [
  Pattern Bool -> Pattern ValueMap -> Pattern ValueMap
forall a. Pattern Bool -> Pattern a -> Pattern a
struct ((String -> Bool) -> Pattern String -> Pattern Bool
forall a b. (a -> b) -> Pattern a -> Pattern b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (String -> [String] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [String
"x",String
"1"]) Pattern String
pat) (Pattern ValueMap -> Pattern ValueMap)
-> Pattern ValueMap -> Pattern ValueMap
forall a b. (a -> b) -> a -> b
$ Pattern Note -> Pattern ValueMap
midinote Pattern Note
62 Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern ValueMap
kitChan Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
sustain Pattern Double
0.05 Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
vel Pattern Double
0.5,
  Pattern Bool -> Pattern ValueMap -> Pattern ValueMap
forall a. Pattern Bool -> Pattern a -> Pattern a
struct ((String -> Bool) -> Pattern String -> Pattern Bool
forall a b. (a -> b) -> Pattern a -> Pattern b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (String -> [String] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [String
"o",String
"2"]) Pattern String
pat) (Pattern ValueMap -> Pattern ValueMap)
-> Pattern ValueMap -> Pattern ValueMap
forall a b. (a -> b) -> a -> b
$ Pattern Note -> Pattern ValueMap
midinote Pattern Note
63 Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern ValueMap
kitChan Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
sustain Pattern Double
0.05 Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
vel Pattern Double
0.5
  ]

-- Bank addressing. JV-1010 preset banks are msb 81 / lsb 0-1; expansion
-- cards continue the lsb series.
-- | A full bank address: @(bank msb, bank lsb, program 0-127)@.
type ContinuoVoice = (Int, Int, Int)

-- | JV-1010 preset banks are msb 81 \/ lsb 0-1; expansion cards continue the
-- lsb series.
--
-- TODO confirm orchLSB on the device; adjust if the voice lands wrong.
orchMSB, orchLSB :: Int
orchMSB :: Int
orchMSB = Int
81
orchLSB :: Int
orchLSB = Int
32

-- | Orchestral-card patch @n@, quoted straight off Roland's 001-255 listing.
-- The card spans two 128-patch sub-banks, so the arithmetic is done here.
orch :: Int -> ContinuoVoice
orch :: Int -> ContinuoVoice
orch Int
patch = (Int
orchMSB, Int
orchLSB Int -> Int -> Int
forall a. Num a => a -> a -> a
+ ((Int
patch Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
128), (Int
patch Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
128)

-- | The internal preset banks, patch @n@ numbered 1-128 as printed.
presetA, presetB :: Int -> ContinuoVoice
presetA :: Int -> ContinuoVoice
presetA Int
patch = (Int
81, Int
0, Int
patch Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)
presetB :: Int -> ContinuoVoice
presetB Int
patch = (Int
81, Int
1, Int
patch Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)

-- | Named continuo voices, from the SR-JV80-02 Orchestral card unless
-- noted otherwise.
harpV, harpPluckedV, harpsichordV, pianoV, celestaV, glockenV, tubularV, choirV, guitarV, organV :: ContinuoVoice
harpV :: ContinuoVoice
harpV        = Int -> ContinuoVoice
orch Int
186   -- Harp 1        (default: Orpheus's lyre)
harpPluckedV :: ContinuoVoice
harpPluckedV = Int -> ContinuoVoice
orch Int
188   -- Plucked Harp
harpsichordV :: ContinuoVoice
harpsichordV = Int -> ContinuoVoice
orch Int
196   -- Harpsichord1  (Baroque continuo)
pianoV :: ContinuoVoice
pianoV       = Int -> ContinuoVoice
orch Int
192   -- ClasclPiano1
celestaV :: ContinuoVoice
celestaV     = Int -> ContinuoVoice
orch Int
200   -- Celesta 1
glockenV :: ContinuoVoice
glockenV     = Int -> ContinuoVoice
orch Int
211   -- Glocken 1
tubularV :: ContinuoVoice
tubularV     = Int -> ContinuoVoice
orch Int
216   -- TubulaBells1
choirV :: ContinuoVoice
choirV       = Int -> ContinuoVoice
orch Int
227   -- Choir 1
guitarV :: ContinuoVoice
guitarV      = Int -> ContinuoVoice
orch Int
185   -- Classical Gt
organV :: ContinuoVoice
organV       = Int -> ContinuoVoice
presetA Int
18 -- church/pipe organ from the internal set
                          -- TODO confirm patch number on the device