-- |
-- Module      : Harmonic.Interface.Tidal.Devices.P6
-- Description : Roland AIRA P-6 Creative Sampler control map
--
-- Preset selection, pad triggering and the full granular-engine control set.
-- CC numbers are quoted from the official Roland P-6 MIDI chart.
--
-- All three play channels are reassigned from the device defaults, so the
-- device must be configured to match:
--
-- @
-- Auto CH = 3   keyboard \/ chromatic sample playback (device default 15)
-- S.CH    = 4   global sample trigger, 48 pads at default pitch (default 11)
-- G.CH    = 5   granular engine, notes and CC (device default 4)
-- Program = 16  preset select, fixed on the device
-- @
module Harmonic.Interface.Tidal.Devices.P6
  (
    -- * Presets, pads and granular controls
    p6prog, p6note, p6trig, p6pad, p6grainSize, p6headPos, p6headSpeed,
    p6grains, p6grainShape, p6spread, p6grainJitter, p6grainRev,
    p6grainTimeKF, p6coarseTune, p6fineTune, p6detune, p6filterType,
    p6cutoff, p6res, p6filterEnv, p6filterKF, p6filterVel, p6attack,
    p6decay, p6sustain, p6release, p6envMode, p6envTimeKF, p6ampSwitch,
    p6startMode, p6level, p6pan, p6autoPan, p6levelJitter, p6lofi,
    p6lofiSw, p6sample, p6outputBus, p6sendDelay, p6sendReverb, p6revTime,
    p6delTime, p6revLevel, p6delLevel
  ) where

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

-- A MIDI control-change line: a 0-1 value on the wire's 0-127 range. Tidal's
-- own @cc@ is a SuperDirt string parameter, a different thing entirely, so
-- this stays local rather than becoming an ambiguous export.
ctl :: Pattern Double -> Pattern Double -> ControlPattern
ctl :: Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
num Pattern Double
v = Pattern Double -> ControlPattern
control (Pattern Double
v Pattern Double -> Pattern Double -> Pattern Double
forall a. Num a => a -> a -> a
* Pattern Double
127) ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern String -> ControlPattern
midicmd Pattern String
"control" ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> ControlPattern
ctlNum Pattern Double
num

-- | Sample triggering answers on channel 4, the granular engine on 5.
p6trigChan, p6granChan :: Pattern ValueMap
p6trigChan :: ControlPattern
p6trigChan = Int -> ControlPattern
ch Int
4
p6granChan :: ControlPattern
p6granChan = Int -> ControlPattern
ch Int
5

-- Preset selection (ch 16, range 0-63)
-- | Select a preset, 0-63, on the program channel.
p6prog :: Pattern Double -> ControlPattern
p6prog :: Pattern Double -> ControlPattern
p6prog Pattern Double
p = Pattern String -> ControlPattern
midicmd Pattern String
"program" ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
#Pattern Double -> ControlPattern
progNum Pattern Double
p ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Int -> ControlPattern
ch Int
16

-- Notes 48-95 map to bank A pad 1 through bank H pad 6 (8 banks × 6 pads)
-- | The MIDI note for bank @b@, pad @n@: notes 48-95 map bank A pad 1
-- through bank H pad 6, eight banks of six.
p6note :: Int -> Int -> Int
-- | Trigger bank @b@, pad @n@ on a boolean rhythm.
p6trig :: Int -> Int -> Pattern Bool -> ControlPattern
-- | Trigger pad @n@ counting straight through all 48, ignoring banks.
p6pad :: Int -> Pattern Bool -> ControlPattern
p6note :: Int -> Int -> Int
p6note Int
b Int
pad   = Int
48 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ (Int
bInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1)Int -> Int -> Int
forall a. Num a => a -> a -> a
*Int
6 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ (Int
padInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1)
p6trig :: Int -> Int -> Pattern Bool -> ControlPattern
p6trig Int
b Int
pad Pattern Bool
pat = Pattern Bool -> ControlPattern -> ControlPattern
forall a. Pattern Bool -> Pattern a -> Pattern a
struct Pattern Bool
pat (ControlPattern -> ControlPattern)
-> ControlPattern -> ControlPattern
forall a b. (a -> b) -> a -> b
$ Pattern Note -> ControlPattern
midinote (Int -> Pattern Note
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Int -> Int
p6note Int
b Int
pad)) ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6trigChan ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> ControlPattern
sustain Pattern Double
0.1
p6pad :: Int -> Pattern Bool -> ControlPattern
p6pad  Int
pad Pattern Bool
pat = Pattern Bool -> ControlPattern -> ControlPattern
forall a. Pattern Bool -> Pattern a -> Pattern a
struct Pattern Bool
pat (ControlPattern -> ControlPattern)
-> ControlPattern -> ControlPattern
forall a b. (a -> b) -> a -> b
$ Pattern Note -> ControlPattern
midinote (Int -> Pattern Note
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
48Int -> Int -> Int
forall a. Num a => a -> a -> a
+Int
pad))     ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6trigChan ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> ControlPattern
sustain Pattern Double
0.1

-- | The grain engine proper: size, head position and speed, grain count,
-- shape, spread, jitter, reverse and time key-follow.
p6grainSize, p6headPos, p6headSpeed, p6grains, p6grainShape,
  p6spread, p6grainJitter, p6grainRev, p6grainTimeKF :: Pattern Double -> ControlPattern
p6grainSize :: Pattern Double -> ControlPattern
p6grainSize Pattern Double
v   = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
23  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan
p6headPos :: Pattern Double -> ControlPattern
p6headPos Pattern Double
v     = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
19  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan
p6headSpeed :: Pattern Double -> ControlPattern
p6headSpeed Pattern Double
v   = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
20  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan
p6grains :: Pattern Double -> ControlPattern
p6grains Pattern Double
v      = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
21  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan
p6grainShape :: Pattern Double -> ControlPattern
p6grainShape Pattern Double
v  = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
15  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan
p6spread :: Pattern Double -> ControlPattern
p6spread Pattern Double
v      = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
25  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan
p6grainJitter :: Pattern Double -> ControlPattern
p6grainJitter Pattern Double
v = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
68  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan
p6grainRev :: Pattern Double -> ControlPattern
p6grainRev Pattern Double
v    = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
3   Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan
p6grainTimeKF :: Pattern Double -> ControlPattern
p6grainTimeKF Pattern Double
v = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
16  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan

-- | Coarse and fine tuning, and detune spread across grains.
p6coarseTune, p6fineTune, p6detune :: Pattern Double -> ControlPattern
p6coarseTune :: Pattern Double -> ControlPattern
p6coarseTune Pattern Double
v  = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
76  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan
p6fineTune :: Pattern Double -> ControlPattern
p6fineTune Pattern Double
v    = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
18  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan
p6detune :: Pattern Double -> ControlPattern
p6detune Pattern Double
v      = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
13  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan

-- | Filter section: type, cutoff, resonance, envelope depth, key follow
-- and velocity sensitivity.
p6filterType, p6cutoff, p6res, p6filterEnv, p6filterKF, p6filterVel :: Pattern Double -> ControlPattern
p6filterType :: Pattern Double -> ControlPattern
p6filterType Pattern Double
v  = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
12  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan
p6cutoff :: Pattern Double -> ControlPattern
p6cutoff Pattern Double
v      = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
74  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan
p6res :: Pattern Double -> ControlPattern
p6res Pattern Double
v         = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
71  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan
p6filterEnv :: Pattern Double -> ControlPattern
p6filterEnv Pattern Double
v   = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
24  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan
p6filterKF :: Pattern Double -> ControlPattern
p6filterKF Pattern Double
v    = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
26  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan
p6filterVel :: Pattern Double -> ControlPattern
p6filterVel Pattern Double
v   = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
78  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan

-- | The amplitude envelope: four stages, mode, time key-follow, amp switch
-- and start mode.
p6attack, p6decay, p6sustain, p6release, p6envMode, p6envTimeKF,
  p6ampSwitch, p6startMode :: Pattern Double -> ControlPattern
p6attack :: Pattern Double -> ControlPattern
p6attack Pattern Double
v      = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
73  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan
p6decay :: Pattern Double -> ControlPattern
p6decay Pattern Double
v       = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
75  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan
p6sustain :: Pattern Double -> ControlPattern
p6sustain Pattern Double
v     = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
30  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan
p6release :: Pattern Double -> ControlPattern
p6release Pattern Double
v     = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
72  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan
p6envMode :: Pattern Double -> ControlPattern
p6envMode Pattern Double
v     = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
29  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan
p6envTimeKF :: Pattern Double -> ControlPattern
p6envTimeKF Pattern Double
v   = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
77  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan
p6ampSwitch :: Pattern Double -> ControlPattern
p6ampSwitch Pattern Double
v   = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
28  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan
p6startMode :: Pattern Double -> ControlPattern
p6startMode Pattern Double
v   = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
79  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan

-- | Level, pan, auto-pan and per-grain level jitter.
p6level, p6pan, p6autoPan, p6levelJitter :: Pattern Double -> ControlPattern
p6level :: Pattern Double -> ControlPattern
p6level Pattern Double
v       = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
7   Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan
p6pan :: Pattern Double -> ControlPattern
p6pan Pattern Double
v         = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
10  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan
p6autoPan :: Pattern Double -> ControlPattern
p6autoPan Pattern Double
v     = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
9   Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan
p6levelJitter :: Pattern Double -> ControlPattern
p6levelJitter Pattern Double
v = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
14  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan

-- | The lo-fi stage and its switch.
p6lofi, p6lofiSw :: Pattern Double -> ControlPattern
p6lofi :: Pattern Double -> ControlPattern
p6lofi Pattern Double
v        = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
17  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan
p6lofiSw :: Pattern Double -> ControlPattern
p6lofiSw Pattern Double
v      = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
87  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan

-- | Sample choice and output routing, including the two effect sends.
p6sample, p6outputBus, p6sendDelay, p6sendReverb :: Pattern Double -> ControlPattern
p6sample :: Pattern Double -> ControlPattern
p6sample Pattern Double
v      = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
88  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan
p6outputBus :: Pattern Double -> ControlPattern
p6outputBus Pattern Double
v   = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
84  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan
p6sendDelay :: Pattern Double -> ControlPattern
p6sendDelay Pattern Double
v   = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
85  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan
p6sendReverb :: Pattern Double -> ControlPattern
p6sendReverb Pattern Double
v  = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
86  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan

-- | The onboard reverb and delay.
p6revTime, p6delTime, p6revLevel, p6delLevel :: Pattern Double -> ControlPattern
p6revTime :: Pattern Double -> ControlPattern
p6revTime Pattern Double
v     = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
89  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan
p6delTime :: Pattern Double -> ControlPattern
p6delTime Pattern Double
v     = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
90  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan
p6revLevel :: Pattern Double -> ControlPattern
p6revLevel Pattern Double
v    = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
91  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan
p6delLevel :: Pattern Double -> ControlPattern
p6delLevel Pattern Double
v    = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
92  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
p6granChan