-- |
-- Module      : Harmonic.Interface.Tidal.Devices.S1
-- Description : Roland AIRA S-1 Tweak Synthesizer control map
--
-- Every parameter the S-1 exposes over MIDI, as a control function taking a
-- 0-1 value. CC numbers are quoted from the official Roland chart.
--
-- The synth answers on MIDI channel 6, baked into each function -- set the
-- S-1 to channel 6 on the device. Patterns compose as usual:
--
-- @, s1cutoff (lfo saw 0.2 0.9)@
module Harmonic.Interface.Tidal.Devices.S1
  (
    -- * Controls
    s1pat, s1seq, s1modwheel, s1portatime, s1pan, s1expression,
    s1portamode, s1damper, s1portasw, s1finetune, s1transpose, s1osclfo,
    s1oscrange, s1oscpwm, s1oscpwmsrc, s1oscbend, s1square, s1saw, s1sub,
    s1suboct, s1noise, s1noisemode, s1cutoff, s1res, s1filterenv,
    s1filterlfo, s1keytrack, s1filterbend, s1ampmode, s1lforate,
    s1lfowave, s1lfomod, s1lfomode, s1lfokeytrg, s1lfosync, s1attack,
    s1decay, s1sustain, s1release, s1envtrig, s1polymode, s1voice2sw,
    s1voice3sw, s1voice4sw, s1voice2shift, s1voice3shift, s1voice4shift,
    s1revlvl, s1revtime, s1dellvl, s1deltime, s1chorus, s1drawsw,
    s1drawmul, s1overtone, s1chopcomb
  ) 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

-- | The S-1 listens on MIDI channel 6.
s1chan :: Pattern ValueMap
s1chan :: ControlPattern
s1chan = Int -> ControlPattern
ch Int
6

-- | Pattern and bank selection. 's1seq' addresses a pattern within a bank
-- of eight, both 1-indexed.
s1pat :: Pattern Double -> ControlPattern
-- | A pattern within a bank of eight, both 1-indexed.
s1seq :: Pattern Double -> Pattern Double -> ControlPattern
s1pat :: Pattern Double -> ControlPattern
s1pat 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
# ControlPattern
s1chan
s1seq :: Pattern Double -> Pattern Double -> ControlPattern
s1seq Pattern Double
pat Pattern Double
bk   = Pattern Double -> ControlPattern
s1pat ((Pattern Double
patPattern Double -> Pattern Double -> Pattern Double
forall a. Num a => a -> a -> a
-Pattern Double
1)Pattern Double -> Pattern Double -> Pattern Double
forall a. Num a => a -> a -> a
+((Pattern Double
bkPattern Double -> Pattern Double -> Pattern Double
forall a. Num a => a -> a -> a
-Pattern Double
1)Pattern Double -> Pattern Double -> Pattern Double
forall a. Num a => a -> a -> a
*Pattern Double
8))

-- | Global and performance controls: modulation, portamento, pan,
-- expression, damper and tuning.
s1modwheel, s1portatime, s1pan, s1expression, s1portamode, s1damper,
  s1portasw, s1finetune, s1transpose :: Pattern Double -> ControlPattern
s1modwheel :: Pattern Double -> ControlPattern
s1modwheel Pattern Double
v   = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
1   Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
s1chan
s1portatime :: Pattern Double -> ControlPattern
s1portatime Pattern Double
v  = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
5   Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
s1chan
s1pan :: Pattern Double -> ControlPattern
s1pan 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
s1chan
s1expression :: Pattern Double -> ControlPattern
s1expression Pattern Double
v = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
11  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
s1chan
s1portamode :: Pattern Double -> ControlPattern
s1portamode Pattern Double
v  = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
31  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
s1chan
s1damper :: Pattern Double -> ControlPattern
s1damper Pattern Double
v     = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
64  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
s1chan
s1portasw :: Pattern Double -> ControlPattern
s1portasw Pattern Double
v    = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
65  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
s1chan
s1finetune :: Pattern Double -> ControlPattern
s1finetune 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
s1chan
s1transpose :: Pattern Double -> ControlPattern
s1transpose 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
s1chan

-- | Oscillator section: range, waveform mix, pulse width, sub and noise.
s1osclfo, s1oscrange, s1oscpwm, s1oscpwmsrc, s1oscbend, s1square,
  s1saw, s1sub, s1suboct, s1noise, s1noisemode :: Pattern Double -> ControlPattern
s1osclfo :: Pattern Double -> ControlPattern
s1osclfo 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
s1chan
s1oscrange :: Pattern Double -> ControlPattern
s1oscrange 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
s1chan
s1oscpwm :: Pattern Double -> ControlPattern
s1oscpwm 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
s1chan
s1oscpwmsrc :: Pattern Double -> ControlPattern
s1oscpwmsrc 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
s1chan
s1oscbend :: Pattern Double -> ControlPattern
s1oscbend 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
s1chan
s1square :: Pattern Double -> ControlPattern
s1square 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
s1chan
s1saw :: Pattern Double -> ControlPattern
s1saw 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
s1chan
s1sub :: Pattern Double -> ControlPattern
s1sub 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
s1chan
s1suboct :: Pattern Double -> ControlPattern
s1suboct Pattern Double
v     = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
22  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
s1chan
s1noise :: Pattern Double -> ControlPattern
s1noise 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
s1chan
s1noisemode :: Pattern Double -> ControlPattern
s1noisemode 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
s1chan

-- | Filter and amplifier: cutoff, resonance, envelope and LFO depth,
-- key tracking, amp mode.
s1cutoff, s1res, s1filterenv, s1filterlfo, s1keytrack, s1filterbend,
  s1ampmode :: Pattern Double -> ControlPattern
s1cutoff :: Pattern Double -> ControlPattern
s1cutoff 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
s1chan
s1res :: Pattern Double -> ControlPattern
s1res 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
s1chan
s1filterenv :: Pattern Double -> ControlPattern
s1filterenv 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
s1chan
s1filterlfo :: Pattern Double -> ControlPattern
s1filterlfo 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
s1chan
s1keytrack :: Pattern Double -> ControlPattern
s1keytrack 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
s1chan
s1filterbend :: Pattern Double -> ControlPattern
s1filterbend Pattern Double
v = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
27  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
s1chan
s1ampmode :: Pattern Double -> ControlPattern
s1ampmode 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
s1chan

-- | LFO and envelope: rate, waveform, trigger mode, and the four ADSR
-- stages.
s1lforate, s1lfowave, s1lfomod, s1lfomode, s1lfokeytrg, s1lfosync,
  s1attack, s1decay, s1sustain, s1release, s1envtrig :: Pattern Double -> ControlPattern
s1lforate :: Pattern Double -> ControlPattern
s1lforate 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
s1chan
s1lfowave :: Pattern Double -> ControlPattern
s1lfowave 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
s1chan
s1lfomod :: Pattern Double -> ControlPattern
s1lfomod 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
s1chan
s1lfomode :: Pattern Double -> ControlPattern
s1lfomode 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
s1chan
s1lfokeytrg :: Pattern Double -> ControlPattern
s1lfokeytrg Pattern Double
v  = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
105 Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
s1chan
s1lfosync :: Pattern Double -> ControlPattern
s1lfosync Pattern Double
v    = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
106 Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
s1chan
s1attack :: Pattern Double -> ControlPattern
s1attack 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
s1chan
s1decay :: Pattern Double -> ControlPattern
s1decay 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
s1chan
s1sustain :: Pattern Double -> ControlPattern
s1sustain 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
s1chan
s1release :: Pattern Double -> ControlPattern
s1release 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
s1chan
s1envtrig :: Pattern Double -> ControlPattern
s1envtrig 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
s1chan

-- | Chord mode: the polyphony switch and the three additional voices with
-- their semitone shifts.
s1polymode, s1voice2sw, s1voice3sw, s1voice4sw, s1voice2shift,
  s1voice3shift, s1voice4shift :: Pattern Double -> ControlPattern
s1polymode :: Pattern Double -> ControlPattern
s1polymode Pattern Double
v    = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
80 Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
s1chan
s1voice2sw :: Pattern Double -> ControlPattern
s1voice2sw Pattern Double
v    = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
81 Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
s1chan
s1voice3sw :: Pattern Double -> ControlPattern
s1voice3sw Pattern Double
v    = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
82 Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
s1chan
s1voice4sw :: Pattern Double -> ControlPattern
s1voice4sw Pattern Double
v    = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
83 Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
s1chan
s1voice2shift :: Pattern Double -> ControlPattern
s1voice2shift 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
s1chan
s1voice3shift :: Pattern Double -> ControlPattern
s1voice3shift 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
s1chan
s1voice4shift :: Pattern Double -> ControlPattern
s1voice4shift 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
s1chan

-- | The onboard reverb, delay and chorus.
s1revlvl, s1revtime, s1dellvl, s1deltime, s1chorus :: Pattern Double -> ControlPattern
s1revlvl :: Pattern Double -> ControlPattern
s1revlvl 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
s1chan
s1revtime :: Pattern Double -> ControlPattern
s1revtime 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
s1chan
s1dellvl :: Pattern Double -> ControlPattern
s1dellvl 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
s1chan
s1deltime :: Pattern Double -> ControlPattern
s1deltime 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
s1chan
s1chorus :: Pattern Double -> ControlPattern
s1chorus Pattern Double
v     = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
93  Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
s1chan

-- | The advanced oscillator page: draw, multiply, overtone and chop\/comb.
s1drawsw, s1drawmul, s1overtone, s1chopcomb :: Pattern Double -> ControlPattern
s1drawsw :: Pattern Double -> ControlPattern
s1drawsw Pattern Double
v     = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
107 Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
s1chan
s1drawmul :: Pattern Double -> ControlPattern
s1drawmul Pattern Double
v    = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
102 Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
s1chan
s1overtone :: Pattern Double -> ControlPattern
s1overtone Pattern Double
v   = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
103 Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
s1chan
s1chopcomb :: Pattern Double -> ControlPattern
s1chopcomb Pattern Double
v   = Pattern Double -> Pattern Double -> ControlPattern
ctl Pattern Double
104 Pattern Double
v ControlPattern -> ControlPattern -> ControlPattern
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# ControlPattern
s1chan