-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | MIDI support for tidal
--   
--   MIDI support for Tidal. Supports Volca Keys, Bass and Beats and other
--   synths. Interface is likely to change significantly.
@package tidal-midi
@version 0.9.10


-- | Mappings between Tidal's <a>Param</a>s and MIDI control changes
module Sound.Tidal.MIDI.Control
n_p :: Param
legato_p :: Param

-- | Map a <a>Double</a> to <a>Int</a> using given min/max values
type RangeMapFunc = (Int, Int) -> Double -> Int

-- | Make sure you apply <tt>cutShape midiShape</tt> to an <a>ParamMap</a>
--   before passing it into a function wanting this type
type MIDINoteShape = ParamMap

-- | Describe mapping a Tidal <a>Param</a> in terms of MIDI
data ControlChange
CC :: Param -> Int -> (Int, Int) -> RangeMapFunc -> ControlChange

-- | the <a>Param</a> this control will apply to
[param] :: ControlChange -> Param

-- | the MIDI parameter number to map to
[midi] :: ControlChange -> Int

-- | the range this MIDI parameter accepts, by default this is (0,127)
[range] :: ControlChange -> (Int, Int)

-- | the function to apply mapping floating point values from pattern to
--   MIDI integer values
[scalef] :: ControlChange -> RangeMapFunc
NRPN :: Param -> Int -> (Int, Int) -> RangeMapFunc -> ControlChange

-- | the <a>Param</a> this control will apply to
[param] :: ControlChange -> Param

-- | the MIDI parameter number to map to
[midi] :: ControlChange -> Int

-- | the range this MIDI parameter accepts, by default this is (0,127)
[range] :: ControlChange -> (Int, Int)

-- | the function to apply mapping floating point values from pattern to
--   MIDI integer values
[scalef] :: ControlChange -> RangeMapFunc
SysEx :: Param -> Int -> (Int, Int) -> RangeMapFunc -> ControlChange

-- | the <a>Param</a> this control will apply to
[param] :: ControlChange -> Param

-- | the MIDI parameter number to map to
[midi] :: ControlChange -> Int

-- | the range this MIDI parameter accepts, by default this is (0,127)
[range] :: ControlChange -> (Int, Int)

-- | the function to apply mapping floating point values from pattern to
--   MIDI integer values
[scalef] :: ControlChange -> RangeMapFunc

-- | A definition for using a Tidal with specific MIDI device type.
--   
--   By default, every <a>ControllerShape</a> accepts the following
--   <a>Param</a>s:
--   
--   <ul>
--   <li><a>dur</a></li>
--   <li><a>n</a></li>
--   <li><a>velocity</a></li>
--   <li><a>nudge</a></li>
--   <li><a>unit</a></li>
--   </ul>
--   
--   which will define the MIDI note to be played.
data ControllerShape
ControllerShape :: [ControlChange] -> Double -> ControllerShape

-- | a list of controls that can be understood by a certain device type
[controls] :: ControllerShape -> [ControlChange]

-- | the latency to be used when sending out MIDI messages, this is passed
--   to <a>Shape</a>
[latency] :: ControllerShape -> Double

-- | A simple shape defining the <a>Param</a>s that are used for generating
--   MIDI notes.
--   
--   This simplifies splitting a <a>ParamMap</a> into params for notes and
--   control values.
midiShape :: Shape

-- | Turns a <a>MIDINoteShape</a> into concrete values for scheduling.
computeTiming :: Tempo -> Ratio Integer -> MIDINoteShape -> ((Int, Int, Ratio Integer), Double)

-- | Converts a <a>ControllerShape</a>s controls into <a>Param</a>s and
--   makes a <a>Shape</a> This acts as an interface between Tidal's
--   scheduling loop and MIDI scheduling.
toShape :: ControllerShape -> Shape

-- | A <a>RangeMapFunc</a> that simply passes <a>floor</a>s <a>Double</a>s.
--   
--   This can be used if a MIDI parameter of a device has different
--   meanings for each value, e.g. the type of oscillator has to be
--   specified by either "0", "1", "2" or "3" each representing a different
--   waveform (sine, tri, square, rand)
passThru :: (Int, Int) -> Double -> Int

-- | Default mapping function from Double to Int.
--   
--   <pre>
--   &gt;&gt;&gt; mapRange (0, 127) 0.5
--   63
--   </pre>
mapRange :: (Int, Int) -> Double -> Int

-- | Helper function for creating a standard ControlChange for MIDI
--   parameter
mCC :: Param -> Int -> ControlChange

-- | Helper function for creating a standard ControlChange for a
--   non-registered MIDI parameter
mNRPN :: Param -> Int -> ControlChange

-- | Helper function for creating a ControlChange for a non-registered MIDI
--   parameter with a custom range
mrNRPN :: Param -> Int -> (Int, Int) -> ControlChange

-- | Translate a <a>ControllerShape</a>s controls into a list of
--   <a>Param</a>
toParams :: ControllerShape -> [Param]

-- | Translate a Tidal <a>Param</a> into the corresponding MIDI parameter
--   number according to a specific <a>ControllerShape</a>
ctrlN :: Num b => ControllerShape -> Param -> Maybe b

-- | Find the first <a>ControlChange</a> that uses <a>Param</a>
paramN :: ControllerShape -> Param -> Maybe ControlChange

module Sound.Tidal.MIDI.CC
ccallController :: ControllerShape
ccall :: Shape
cc0 :: Pattern Double -> ParamPattern
cc1 :: Pattern Double -> ParamPattern
cc2 :: Pattern Double -> ParamPattern
cc3 :: Pattern Double -> ParamPattern
cc4 :: Pattern Double -> ParamPattern
cc5 :: Pattern Double -> ParamPattern
cc6 :: Pattern Double -> ParamPattern
cc7 :: Pattern Double -> ParamPattern
cc8 :: Pattern Double -> ParamPattern
cc9 :: Pattern Double -> ParamPattern
cc10 :: Pattern Double -> ParamPattern
cc11 :: Pattern Double -> ParamPattern
cc12 :: Pattern Double -> ParamPattern
cc13 :: Pattern Double -> ParamPattern
cc14 :: Pattern Double -> ParamPattern
cc15 :: Pattern Double -> ParamPattern
cc16 :: Pattern Double -> ParamPattern
cc17 :: Pattern Double -> ParamPattern
cc18 :: Pattern Double -> ParamPattern
cc19 :: Pattern Double -> ParamPattern
cc20 :: Pattern Double -> ParamPattern
cc21 :: Pattern Double -> ParamPattern
cc22 :: Pattern Double -> ParamPattern
cc23 :: Pattern Double -> ParamPattern
cc24 :: Pattern Double -> ParamPattern
cc25 :: Pattern Double -> ParamPattern
cc26 :: Pattern Double -> ParamPattern
cc27 :: Pattern Double -> ParamPattern
cc28 :: Pattern Double -> ParamPattern
cc29 :: Pattern Double -> ParamPattern
cc30 :: Pattern Double -> ParamPattern
cc31 :: Pattern Double -> ParamPattern
cc32 :: Pattern Double -> ParamPattern
cc33 :: Pattern Double -> ParamPattern
cc34 :: Pattern Double -> ParamPattern
cc35 :: Pattern Double -> ParamPattern
cc36 :: Pattern Double -> ParamPattern
cc37 :: Pattern Double -> ParamPattern
cc38 :: Pattern Double -> ParamPattern
cc39 :: Pattern Double -> ParamPattern
cc40 :: Pattern Double -> ParamPattern
cc41 :: Pattern Double -> ParamPattern
cc42 :: Pattern Double -> ParamPattern
cc43 :: Pattern Double -> ParamPattern
cc44 :: Pattern Double -> ParamPattern
cc45 :: Pattern Double -> ParamPattern
cc46 :: Pattern Double -> ParamPattern
cc47 :: Pattern Double -> ParamPattern
cc48 :: Pattern Double -> ParamPattern
cc49 :: Pattern Double -> ParamPattern
cc50 :: Pattern Double -> ParamPattern
cc51 :: Pattern Double -> ParamPattern
cc52 :: Pattern Double -> ParamPattern
cc53 :: Pattern Double -> ParamPattern
cc54 :: Pattern Double -> ParamPattern
cc55 :: Pattern Double -> ParamPattern
cc56 :: Pattern Double -> ParamPattern
cc57 :: Pattern Double -> ParamPattern
cc58 :: Pattern Double -> ParamPattern
cc59 :: Pattern Double -> ParamPattern
cc60 :: Pattern Double -> ParamPattern
cc61 :: Pattern Double -> ParamPattern
cc62 :: Pattern Double -> ParamPattern
cc63 :: Pattern Double -> ParamPattern
cc64 :: Pattern Double -> ParamPattern
cc65 :: Pattern Double -> ParamPattern
cc66 :: Pattern Double -> ParamPattern
cc67 :: Pattern Double -> ParamPattern
cc68 :: Pattern Double -> ParamPattern
cc69 :: Pattern Double -> ParamPattern
cc70 :: Pattern Double -> ParamPattern
cc71 :: Pattern Double -> ParamPattern
cc72 :: Pattern Double -> ParamPattern
cc73 :: Pattern Double -> ParamPattern
cc74 :: Pattern Double -> ParamPattern
cc75 :: Pattern Double -> ParamPattern
cc76 :: Pattern Double -> ParamPattern
cc77 :: Pattern Double -> ParamPattern
cc78 :: Pattern Double -> ParamPattern
cc79 :: Pattern Double -> ParamPattern
cc80 :: Pattern Double -> ParamPattern
cc81 :: Pattern Double -> ParamPattern
cc82 :: Pattern Double -> ParamPattern
cc83 :: Pattern Double -> ParamPattern
cc84 :: Pattern Double -> ParamPattern
cc85 :: Pattern Double -> ParamPattern
cc86 :: Pattern Double -> ParamPattern
cc87 :: Pattern Double -> ParamPattern
cc88 :: Pattern Double -> ParamPattern
cc89 :: Pattern Double -> ParamPattern
cc90 :: Pattern Double -> ParamPattern
cc91 :: Pattern Double -> ParamPattern
cc92 :: Pattern Double -> ParamPattern
cc93 :: Pattern Double -> ParamPattern
cc94 :: Pattern Double -> ParamPattern
cc95 :: Pattern Double -> ParamPattern
cc96 :: Pattern Double -> ParamPattern
cc97 :: Pattern Double -> ParamPattern
cc98 :: Pattern Double -> ParamPattern
cc99 :: Pattern Double -> ParamPattern
cc100 :: Pattern Double -> ParamPattern
cc101 :: Pattern Double -> ParamPattern
cc102 :: Pattern Double -> ParamPattern
cc103 :: Pattern Double -> ParamPattern
cc104 :: Pattern Double -> ParamPattern
cc105 :: Pattern Double -> ParamPattern
cc106 :: Pattern Double -> ParamPattern
cc107 :: Pattern Double -> ParamPattern
cc108 :: Pattern Double -> ParamPattern
cc109 :: Pattern Double -> ParamPattern
cc110 :: Pattern Double -> ParamPattern
cc111 :: Pattern Double -> ParamPattern
cc112 :: Pattern Double -> ParamPattern
cc113 :: Pattern Double -> ParamPattern
cc114 :: Pattern Double -> ParamPattern
cc115 :: Pattern Double -> ParamPattern
cc116 :: Pattern Double -> ParamPattern
cc117 :: Pattern Double -> ParamPattern
cc118 :: Pattern Double -> ParamPattern
cc119 :: Pattern Double -> ParamPattern
cc120 :: Pattern Double -> ParamPattern
cc121 :: Pattern Double -> ParamPattern
cc122 :: Pattern Double -> ParamPattern
cc123 :: Pattern Double -> ParamPattern
cc124 :: Pattern Double -> ParamPattern
cc125 :: Pattern Double -> ParamPattern
cc126 :: Pattern Double -> ParamPattern
cc127 :: Pattern Double -> ParamPattern

module Sound.Tidal.MIDI.Blofeld
mod_w :: Pattern Double -> ParamPattern
br_ctrl :: Pattern Double -> ParamPattern
ft_ctrl :: Pattern Double -> ParamPattern
gl_rate :: Pattern Double -> ParamPattern
ch_vol :: Pattern Double -> ParamPattern
pan_ :: Pattern Double -> ParamPattern
arp_rng :: Pattern Double -> ParamPattern
arp_len :: Pattern Double -> ParamPattern
arp_act :: Pattern Double -> ParamPattern
lfo1shape :: Pattern Double -> ParamPattern
lfo1speed :: Pattern Double -> ParamPattern
lfo1sync :: Pattern Double -> ParamPattern
lfo1delay :: Pattern Double -> ParamPattern
lfo2shape :: Pattern Double -> ParamPattern
lfo2speed :: Pattern Double -> ParamPattern
lfo2sync :: Pattern Double -> ParamPattern
lfo2delay :: Pattern Double -> ParamPattern
lfo3shape :: Pattern Double -> ParamPattern
lfo3speed :: Pattern Double -> ParamPattern
lfo3sync :: Pattern Double -> ParamPattern
lfo3delay :: Pattern Double -> ParamPattern
osc1oct :: Pattern Double -> ParamPattern
osc1semi :: Pattern Double -> ParamPattern
osc1detune :: Pattern Double -> ParamPattern
osc1fm :: Pattern Double -> ParamPattern
osc1shape :: Pattern Double -> ParamPattern
bank_sel :: Pattern Double -> ParamPattern
osc1pw :: Pattern Double -> ParamPattern
osc1pwm :: Pattern Double -> ParamPattern
osc2oct :: Pattern Double -> ParamPattern
osc2semi :: Pattern Double -> ParamPattern
osc2detune :: Pattern Double -> ParamPattern
osc2fm :: Pattern Double -> ParamPattern
osc2shape :: Pattern Double -> ParamPattern
osc2pw :: Pattern Double -> ParamPattern
osc2pwm :: Pattern Double -> ParamPattern
osc3oct :: Pattern Double -> ParamPattern
osc3semi :: Pattern Double -> ParamPattern
osc3detune :: Pattern Double -> ParamPattern
osc3fm :: Pattern Double -> ParamPattern
osc3shape :: Pattern Double -> ParamPattern
osc3pw :: Pattern Double -> ParamPattern
osc3pwm :: Pattern Double -> ParamPattern
sync :: Pattern Double -> ParamPattern
pitchmod :: Pattern Double -> ParamPattern
glide_mode :: Pattern Double -> ParamPattern
osc1lvl :: Pattern Double -> ParamPattern
osc1bal :: Pattern Double -> ParamPattern
ringmod_lvl :: Pattern Double -> ParamPattern
ringmod_bal :: Pattern Double -> ParamPattern
osc2lvl :: Pattern Double -> ParamPattern
osc2bal :: Pattern Double -> ParamPattern
osc3lvl :: Pattern Double -> ParamPattern
osc3bal :: Pattern Double -> ParamPattern
noise_lvl :: Pattern Double -> ParamPattern
noise_bal :: Pattern Double -> ParamPattern
noise_col :: Pattern Double -> ParamPattern
sus_ped :: Pattern Double -> ParamPattern
glide_act :: Pattern Double -> ParamPattern
sostenuto :: Pattern Double -> ParamPattern
routing :: Pattern Double -> ParamPattern
fil1tp :: Pattern Double -> ParamPattern
fil1cut :: Pattern Double -> ParamPattern
fil1res :: Pattern Double -> ParamPattern
fil1drv :: Pattern Double -> ParamPattern
fil1key :: Pattern Double -> ParamPattern
fil1enva :: Pattern Double -> ParamPattern
fil1envv :: Pattern Double -> ParamPattern
fil1cutmo :: Pattern Double -> ParamPattern
fil1fm :: Pattern Double -> ParamPattern
fil1pan :: Pattern Double -> ParamPattern
fil1panmod :: Pattern Double -> ParamPattern
fil2tp :: Pattern Double -> ParamPattern
fil2cut :: Pattern Double -> ParamPattern
fil2res :: Pattern Double -> ParamPattern
fil2drv :: Pattern Double -> ParamPattern
fil2key :: Pattern Double -> ParamPattern
fil2enva :: Pattern Double -> ParamPattern
fil2envv :: Pattern Double -> ParamPattern
fil2cutmo :: Pattern Double -> ParamPattern
fil2fm :: Pattern Double -> ParamPattern
fil2pan :: Pattern Double -> ParamPattern
fil2panmod :: Pattern Double -> ParamPattern
amp_vol :: Pattern Double -> ParamPattern
amp_vel :: Pattern Double -> ParamPattern
amp_mod :: Pattern Double -> ParamPattern
fx1mix :: Pattern Double -> ParamPattern
fx2mix :: Pattern Double -> ParamPattern
fe_att :: Pattern Double -> ParamPattern
fe_dec :: Pattern Double -> ParamPattern
fe_sus :: Pattern Double -> ParamPattern
fe_dec2 :: Pattern Double -> ParamPattern
fe_sus2 :: Pattern Double -> ParamPattern
fe_rel :: Pattern Double -> ParamPattern
ae_att :: Pattern Double -> ParamPattern
ae_dec :: Pattern Double -> ParamPattern
ae_sus :: Pattern Double -> ParamPattern
ae_dec2 :: Pattern Double -> ParamPattern
ae_sus2 :: Pattern Double -> ParamPattern
ae_rel :: Pattern Double -> ParamPattern
e3_att :: Pattern Double -> ParamPattern
e3_dec :: Pattern Double -> ParamPattern
e3_sus :: Pattern Double -> ParamPattern
e3_dec2 :: Pattern Double -> ParamPattern
e3_sus2 :: Pattern Double -> ParamPattern
e3_rel :: Pattern Double -> ParamPattern
e4_att :: Pattern Double -> ParamPattern
e4_dec :: Pattern Double -> ParamPattern
e4_sus :: Pattern Double -> ParamPattern
e4_dec2 :: Pattern Double -> ParamPattern
e4_sus2 :: Pattern Double -> ParamPattern
e4_rel :: Pattern Double -> ParamPattern
soff :: Pattern Double -> ParamPattern
res_ctrl :: Pattern Double -> ParamPattern
loc_cont :: Pattern Double -> ParamPattern
noff :: Pattern Double -> ParamPattern
blofeldController :: ControllerShape
blofeld :: Shape

module Sound.Tidal.MIDI.Ambika
ambikaController :: ControllerShape
ambikaSynth :: Shape
growl :: Pattern Double -> ParamPattern
fuzz :: Pattern Double -> ParamPattern
acrush :: Pattern Double -> ParamPattern
osc1range :: Pattern Double -> ParamPattern
osc1detune :: Pattern Double -> ParamPattern
osc1shape :: Pattern Double -> ParamPattern
osc1param :: Pattern Double -> ParamPattern
osc2range :: Pattern Double -> ParamPattern
osc2detune :: Pattern Double -> ParamPattern
osc2shape :: Pattern Double -> ParamPattern
osc2param :: Pattern Double -> ParamPattern
xmodtype :: Pattern Double -> ParamPattern
xmodamount :: Pattern Double -> ParamPattern
subshape :: Pattern Double -> ParamPattern
sublevel :: Pattern Double -> ParamPattern
noiselevel :: Pattern Double -> ParamPattern
filtermode :: Pattern Double -> ParamPattern
f1cutoff :: Pattern Double -> ParamPattern
f1res :: Pattern Double -> ParamPattern
f2cutoff :: Pattern Double -> ParamPattern
f2res :: Pattern Double -> ParamPattern
f2mode :: Pattern Double -> ParamPattern
lfo1sync :: Pattern Double -> ParamPattern
lfo1rate :: Pattern Double -> ParamPattern
lfo1shape :: Pattern Double -> ParamPattern
lfo2sync :: Pattern Double -> ParamPattern
lfo2rate :: Pattern Double -> ParamPattern
lfo2shape :: Pattern Double -> ParamPattern
lfo3sync :: Pattern Double -> ParamPattern
lfo3rate :: Pattern Double -> ParamPattern
lfo3shape :: Pattern Double -> ParamPattern
lfo4sync :: Pattern Double -> ParamPattern
lfo4rate :: Pattern Double -> ParamPattern
lfo4shape :: Pattern Double -> ParamPattern
mlegato :: Pattern Double -> ParamPattern
env1a :: Pattern Double -> ParamPattern
env1d :: Pattern Double -> ParamPattern
env1s :: Pattern Double -> ParamPattern
env1r :: Pattern Double -> ParamPattern
env2a :: Pattern Double -> ParamPattern
env2d :: Pattern Double -> ParamPattern
env2s :: Pattern Double -> ParamPattern
env2r :: Pattern Double -> ParamPattern
env3a :: Pattern Double -> ParamPattern
env3d :: Pattern Double -> ParamPattern
env3s :: Pattern Double -> ParamPattern
env3r :: Pattern Double -> ParamPattern
arpmode :: Pattern Double -> ParamPattern
arpdir :: Pattern Double -> ParamPattern
arpoct :: Pattern Double -> ParamPattern
arppat :: Pattern Double -> ParamPattern
arpres :: Pattern Double -> ParamPattern
parttuning :: Pattern Double -> ParamPattern
tuningspread :: Pattern Double -> ParamPattern
polymode :: Pattern Double -> ParamPattern
allsoundsoff :: Pattern Double -> ParamPattern
allnotesoff :: Pattern Double -> ParamPattern
resetallcontrollers :: Pattern Double -> ParamPattern


-- | Convenience functions to access <a>Sound.PortMidi</a> devices.
module Sound.Tidal.MIDI.Device

-- | Example usage:
--   
--   <pre>
--   &gt;&gt;&gt; putStrLn =&lt;&lt; displayOutputDevices
--   ID:	Name
--   0:	Midi Through Port-0
--   2:	DSI Tetra MIDI 1
--   </pre>
displayOutputDevices :: IO String

-- | Readable version of a list of indexed MIDI devices
displayDevices :: Show a => [(a, DeviceInfo)] -> String
getOutputDevices :: [(a, DeviceInfo)] -> [(a, DeviceInfo)]
getIndexedDevices :: IO [(Integer, DeviceInfo)]
getDevices :: IO [DeviceInfo]
getIDForDeviceName :: Num a => String -> IO (Maybe a)

module Sound.Tidal.MIDI.GMPerc
gmpercController :: ControllerShape
perc :: Pattern String -> ParamPattern
percN :: Num a => String -> a
gmperc :: Shape
balance :: Pattern Double -> ParamPattern
reverb :: Pattern Double -> ParamPattern
chorus :: Pattern Double -> ParamPattern

module Sound.Tidal.MIDI.KorgKP3
kp3 :: ControllerShape
oscKp3 :: Shape
xaxis :: Pattern Double -> ParamPattern
yaxis :: Pattern Double -> ParamPattern
padon :: Pattern Double -> ParamPattern
level :: Pattern Double -> ParamPattern
fxdepth :: Pattern Double -> ParamPattern
holdbut :: Pattern Double -> ParamPattern

module Sound.Tidal.MIDI.MBase01
mbase01Controller :: ControllerShape
mbase01 :: Shape
tune :: Pattern Double -> ParamPattern
pitch :: Pattern Double -> ParamPattern
harmonics :: Pattern Double -> ParamPattern
pulse :: Pattern Double -> ParamPattern
noise :: Pattern Double -> ParamPattern
eqlzr :: Pattern Double -> ParamPattern


-- | miniAtmegatron - Soulsby Synthesizers
--   
--   
--   <a>http://soulsbysynths.com/wp-content/uploads/2016/08/Mini-Manual.pdf</a>,
--   page 15
module Sound.Tidal.MIDI.MiniAtmegatron
matmController :: ControllerShape
matm :: Shape
fen :: Pattern Double -> ParamPattern
flo :: Pattern Double -> ParamPattern
alo :: Pattern Double -> ParamPattern
pen :: Pattern Double -> ParamPattern
plo :: Pattern Double -> ParamPattern
pwm :: Pattern Double -> ParamPattern
fln :: Pattern Double -> ParamPattern
fwv :: Pattern Double -> ParamPattern
ffl :: Pattern Double -> ParamPattern
ffe :: Pattern Double -> ParamPattern
fae :: Pattern Double -> ParamPattern
lfs :: Pattern Double -> ParamPattern
lss :: Pattern Double -> ParamPattern
por :: Pattern Double -> ParamPattern


-- | A bridge between evaluated Tidal patterns and MIDI events.
--   
--   This module contains functions necessary to mediate between
--   <a>Event</a>s generated from a Tidal <a>Pattern</a> and plain MIDI
--   events sent through <a>PMStream</a>.
module Sound.Tidal.MIDI.Output

-- | An abstract definition of a physical MIDI Output.
--   
--   Manages virtual streams to multiple channels of a single connection to
--   a MIDI device.
data Output
Output :: ControllerShape -> PMStream -> MVar ([ParamMap], [MIDIEvent]) -> MVar OutputState -> CULong -> UTCTime -> Output

-- | The ControllerShape defining which <a>Param</a>s will be available for
--   use
[cshape] :: Output -> ControllerShape

-- | The physical connection to the device, uses <tt>PortMidi</tt>
[conn] :: Output -> PMStream

-- | A buffer of currently used <a>Param</a>s and their <a>Value</a>s as
--   well as a list of <a>MIDIEvent</a>s to be sent on the next tick.
[buffer] :: Output -> MVar ([ParamMap], [MIDIEvent])

-- | Keeps track of connected virtual streams during one tick
[bufferstate] :: Output -> MVar OutputState

-- | the MIDI time when this output was created
[midistart] :: Output -> CULong

-- | the real time when this output was created
[rstart] :: Output -> UTCTime

-- | Keep track of virtual streams
--   
--   <ul>
--   <li>Reflects the number of virtual streams that have already stored
--   their events for this tick. Every time <a>TickedConnectionCount</a>
--   cycles, MIDI events will be sent out.</li>
--   <li><a>ConnectionCount</a> is increased on every new stream created
--   via <tt>midiSetters</tt></li>
--   <li>For each channel, currently used params and their values are
--   kept.</li>
--   <li>Output will only be scheduling, once <b>online</b>, i.e. when the
--   first stream is initialized</li>
--   </ul>
type OutputState = (TickedConnectionCount, ConnectionCount, [ParamMap], OutputOnline)
type MidiDeviceMap = Map String Output

-- | A Triplet of the deviation from the note <tt>a5</tt>, velocity and
--   duration
type TimedNote = (CLong, MIDIVelocity, MIDIDuration)

-- | Initialize a connection to the given MIDI device by Name
makeConnection :: MVar MidiDeviceMap -> String -> Int -> ControllerShape -> IO (ToMessageFunc, Output)

-- | Sends out MIDI events once all virtual streams have buffered their
--   events.
--   
--   This will be called after every tick
flushBackend :: Output -> Shape -> Tempo -> Int -> IO ()

-- | Sends out MIDI events due for this tick.
sendevents :: Output -> Shape -> Tempo -> Tick -> [MIDIEvent] -> [MIDIEvent] -> IO ([SentEvent], [MIDIEvent])

-- | Buffer a single tick's MIDI events for a single channel of a single
--   connection
store :: Output -> Int -> Tempo -> Tick -> Onset -> Offset -> MidiMap -> ParamMap -> IO ()

-- | Returns a function to be called on every tick, splits the given
--   <tt>ParamMap</tt> into MIDI note information and CCs.
mkStore :: Int -> Output -> IO ToMessageFunc

-- | Union the currently stored paramstate for certain channel with the
--   given one
storeParams :: Output -> Int -> ParamMap -> IO () -> IO ()

-- | Turn logicalOnset into MIDITime
scheduleTime :: (CULong, UTCTime) -> Double -> CULong

-- | Convert a <tt>Param</tt>'s <tt>Value</tt> into a MIDI consumable
--   datum.
--   
--   Applies range mapping and scaling functions according to
--   <tt>ControllerShape</tt>
toMidiValue :: ControllerShape -> Param -> Value -> Maybe Int

-- | Keep only params that are in a given shape, replace missing with
--   defaults
cutShape :: Shape -> ParamMap -> Maybe ParamMap

-- | Keep only params that are explicitly set (i.e. not default)
stripDefaults :: Maybe ParamMap -> Maybe ParamMap
changeState :: (OutputState -> OutputState) -> Output -> IO ()
readState :: (OutputState -> b) -> Output -> IO b

-- | open named MIDI output or use cached (PortMIDI doesn't like opening
--   two connections to the same device!)
useOutput :: MVar MidiDeviceMap -> String -> ControllerShape -> IO (Maybe Output)

-- | Example usage:
--   
--   <pre>
--   &gt;&gt;&gt; putStrLn =&lt;&lt; displayOutputDevices
--   ID:	Name
--   0:	Midi Through Port-0
--   2:	DSI Tetra MIDI 1
--   </pre>
displayOutputDevices :: IO String

-- | Creates an <a>Output</a> wrapping a PortMidi device
outputDevice :: DeviceID -> Int -> ControllerShape -> IO (Either Output PMError)
makeRawEvent :: MIDIMessage -> CULong -> PMEvent
noteOn :: MIDIChannel -> MIDINote -> MIDIVelocity -> MIDITime -> [MIDIEvent]
noteOff :: MIDIChannel -> MIDINote -> MIDITime -> [MIDIEvent]
makeCtrl :: MIDIChannel -> ControlChange -> MIDIDatum -> MIDITime -> [MIDIEvent]


-- | Entry functions for interacting with MIDI devices through Tidal.
module Sound.Tidal.MIDI.Stream

-- | Creates a single virtual stream to a MIDI device using a specific
--   <a>ControllerShape</a>
--   
--   Needs a <a>MidiDeviceMap</a> to operate, create one using
--   <a>midiDevices</a>!
midiStream :: MVar MidiDeviceMap -> String -> Int -> ControllerShape -> IO (ParamPattern -> IO ())

-- | Opens a connection to a MIDI device and wraps it in a <a>Backend</a>
--   implementation.
--   
--   Needs a <a>MidiDeviceMap</a> to operate, create one using
--   <a>midiDevices</a>!
midiBackend :: MVar MidiDeviceMap -> String -> Int -> ControllerShape -> IO (Backend a)

-- | Creates a single virtual state for a MIDI device using a specific
--   <a>ControllerShape</a>
--   
--   This state can be used to either create a <a>setter</a> or a
--   <a>transition</a> from it.
--   
--   Needs a <a>MidiDeviceMap</a> to operate, create one using
--   <a>midiDevices</a>!
midiState :: MVar MidiDeviceMap -> String -> Int -> ControllerShape -> IO (MVar (ParamPattern, [ParamPattern]))

-- | Connect to a MIDI device with a given name and channel, using a
--   <a>ControllerShape</a> to allow customized interaction with specific
--   MIDI synths.
--   
--   Needs a <a>MidiDeviceMap</a> to operate, create on using
--   <a>midiDevices</a>!
--   
--   Usage:
--   
--   <pre>
--   (m1, mt1) &lt;- midiSetters devices "My Synth Controller Device name" 1 synthController getNow
--   </pre>
--   
--   To find the correct name for your device see
--   <a>displayOutputDevices</a>
midiSetters :: MVar MidiDeviceMap -> String -> Int -> ControllerShape -> IO Time -> IO (ParamPattern -> IO (), (Time -> [ParamPattern] -> ParamPattern) -> ParamPattern -> IO ())

-- | Create a handle for all currently used <a>Output</a>s indexed by their
--   device name.
--   
--   We use this to cache once opened devices.
--   
--   This will be passed to _every_ initialization of a virtual stream to a
--   MIDI device and is necessary since, <tt>PortMidi</tt> only allows a
--   single connection to a device.
midiDevices :: IO (MVar MidiDeviceMap)

-- | Example usage:
--   
--   <pre>
--   &gt;&gt;&gt; putStrLn =&lt;&lt; displayOutputDevices
--   ID:	Name
--   0:	Midi Through Port-0
--   2:	DSI Tetra MIDI 1
--   </pre>
displayOutputDevices :: IO String

module Sound.Tidal.MIDI.Synth
synthController :: ControllerShape
synth :: Shape

module Sound.Tidal.MIDI.Context

module Sound.Tidal.MIDI.Synthino
synthinoController :: ControllerShape
synthino :: Shape
waveform :: Pattern Double -> ParamPattern
pitchlforate :: Pattern Double -> ParamPattern
pitchlfodepth :: Pattern Double -> ParamPattern
lfowaveform :: Pattern Double -> ParamPattern
filterlforate :: Pattern Double -> ParamPattern
filterlfodepth :: Pattern Double -> ParamPattern
peak :: Pattern Double -> ParamPattern
bpm :: Pattern Double -> ParamPattern
arplength :: Pattern Double -> ParamPattern
arptranspose :: Pattern Double -> ParamPattern
vol :: Pattern Double -> ParamPattern
off :: Pattern Double -> ParamPattern

module Sound.Tidal.MIDI.System1M
system1mController :: ControllerShape
system1m :: Shape
rmod :: Pattern Double -> ParamPattern
rlpcutoff :: Pattern Double -> ParamPattern
rport :: Pattern Double -> ParamPattern
rres :: Pattern Double -> ParamPattern
rcrush :: Pattern Double -> ParamPattern
rdelaytime :: Pattern Double -> ParamPattern
rosc1 :: Pattern Double -> ParamPattern
rosc2 :: Pattern Double -> ParamPattern
rsub :: Pattern Double -> ParamPattern
rnoise :: Pattern Double -> ParamPattern
rpitchenv :: Pattern Double -> ParamPattern
rpitchatk :: Pattern Double -> ParamPattern
rpitchdecay :: Pattern Double -> ParamPattern
rlfopitch :: Pattern Double -> ParamPattern
rlfofade :: Pattern Double -> ParamPattern
rlfofilter :: Pattern Double -> ParamPattern
rlforate :: Pattern Double -> ParamPattern
rlfoamp :: Pattern Double -> ParamPattern
rlfotype :: Pattern Double -> ParamPattern
rosc1type :: Pattern Double -> ParamPattern
rosc1range :: Pattern Double -> ParamPattern
rosc1color :: Pattern Double -> ParamPattern
rosc1xmod :: Pattern Double -> ParamPattern
rosc2color :: Pattern Double -> ParamPattern
rosc2tune :: Pattern Double -> ParamPattern
rosc1mod :: Pattern Double -> ParamPattern
rosc2type :: Pattern Double -> ParamPattern
rosc2range :: Pattern Double -> ParamPattern
rosc2mod :: Pattern Double -> ParamPattern
ramptone :: Pattern Double -> ParamPattern
rhpcutoff :: Pattern Double -> ParamPattern
rfilterenv :: Pattern Double -> ParamPattern
rfilterkey :: Pattern Double -> ParamPattern
rfilteratk :: Pattern Double -> ParamPattern
rfilterdecay :: Pattern Double -> ParamPattern
rfiltersustain :: Pattern Double -> ParamPattern
rfilterrelease :: Pattern Double -> ParamPattern
rampatk :: Pattern Double -> ParamPattern
rampdecay :: Pattern Double -> ParamPattern
rreverb :: Pattern Double -> ParamPattern
rdelay :: Pattern Double -> ParamPattern
rampsustain :: Pattern Double -> ParamPattern
ramprelease :: Pattern Double -> ParamPattern
rosc2ring :: Pattern Double -> ParamPattern
rosc2sync :: Pattern Double -> ParamPattern
rsubtype :: Pattern Double -> ParamPattern
rnoisetype :: Pattern Double -> ParamPattern
rlpftype :: Pattern Double -> ParamPattern
rlegato :: Pattern Double -> ParamPattern
rlfokeytrig :: Pattern Double -> ParamPattern
rtemposync :: Pattern Double -> ParamPattern
rmono :: Pattern Double -> ParamPattern


-- | Mapping and Abstractions for the analog four-voice synthesizer, TETR4
--   by Dave Smith Instruments.
--   
--   Rather than being a tutorial on how to write your own mappings for
--   your MIDI devices, this is more like the kitchen sink: it shows what
--   is possible.
--   
--   The DSI TETR4 has four separate voices that can (when set to
--   multi-mode) be controlled via four different MIDI channels. Almost
--   everything you can control directly on the device can be automated via
--   MIDI messages.
module Sound.Tidal.MIDI.Tetra

-- | The controller mapping for TETR4
--   
--   To get the most out of this device with tidal, I chose to use the
--   non-registered parameter (NRPN) variant to control it. This allows to
--   use the full spectrum for controls like <tt>cutoff</tt> that allow
--   more granular stepping than standard MIDI (164 instead of 128 steps).
--   
--   Many parameters diverge from the default ranges of 0 to 127 and
--   therefore this mapping uses the <tt>mapRange</tt> functionality for
--   controls to allow you to always use double params, e.g.:
--   
--   <pre>
--   &gt;&gt;&gt; t1 $ n (run 4) # famt "0.5" # cutoff "0.3" # resonance "0.8"
--   </pre>
--   
--   while <tt>famt</tt>, <tt>cutoff</tt> and <tt>resonance</tt> all have
--   different ranges of operation (0..254, 0..14 and 0..127 respectively)
--   
--   Some parameters are essentially mode switches and I chose to pass the
--   values you enter into patterns directly through to the resulting
--   control change. The method <tt>passThru</tt> on control specification
--   simply skips the scaling of values (you can write your own scaler if
--   you want).
--   
--   For very generic control I reused Tidal's own params, like
--   <tt>cutoff</tt>, <tt>attack</tt>, <tt>gain</tt>, <tt>pan</tt> and
--   <tt>release</tt>. Sometimes the defaults for Tidal do not make sense
--   for MIDI. See <tt>(_, cutoff_p)</tt> below the actual controller shape
--   for examples on how to deal with this.
tetraController :: ControllerShape
tetra :: Shape
notesoff :: Pattern Double -> ParamPattern
ccreset :: Pattern Double -> ParamPattern
damp :: Pattern Double -> ParamPattern
osc1freq :: Pattern Double -> ParamPattern
osc1detune :: Pattern Double -> ParamPattern
osc1shape :: Pattern Int -> ParamPattern
osc1glide :: Pattern Double -> ParamPattern
osc1kbd :: Pattern Int -> ParamPattern
osc2freq :: Pattern Double -> ParamPattern
osc2detune :: Pattern Double -> ParamPattern
osc2shape :: Pattern Int -> ParamPattern
osc2glide :: Pattern Double -> ParamPattern
osc2kbd :: Pattern Int -> ParamPattern
oscsync :: Pattern Double -> ParamPattern
glidemode :: Pattern Int -> ParamPattern
oscslop :: Pattern Double -> ParamPattern
oscmix :: Pattern Double -> ParamPattern
noise :: Pattern Double -> ParamPattern
kamt :: Pattern Double -> ParamPattern
cutoff_p :: Param
attack_p :: Param
release_p :: Param
decay_p :: Param
sustain_p :: Param
audiomod :: Pattern Double -> ParamPattern
fpoles :: Pattern Int -> ParamPattern
twopole :: ParamPattern
fourpole :: ParamPattern
famt :: Pattern Double -> ParamPattern
fvel :: Pattern Double -> ParamPattern
fdel :: Pattern Double -> ParamPattern
fatk :: Pattern Double -> ParamPattern
fdcy :: Pattern Double -> ParamPattern
fsus :: Pattern Double -> ParamPattern
frel :: Pattern Double -> ParamPattern
vcavol :: Pattern Double -> ParamPattern
vamt :: Pattern Double -> ParamPattern
vvel :: Pattern Double -> ParamPattern
vdel :: Pattern Double -> ParamPattern
lfo1rate :: Pattern Double -> ParamPattern
lfo1shape :: Pattern Int -> ParamPattern
lfo1amt :: Pattern Double -> ParamPattern
lfo1dest :: Pattern Double -> ParamPattern
lfo1sync :: Pattern Int -> ParamPattern
lfo2rate :: Pattern Double -> ParamPattern
lfo2shape :: Pattern Int -> ParamPattern
lfo2amt :: Pattern Double -> ParamPattern
lfo2dest :: Pattern Double -> ParamPattern
lfo2sync :: Pattern Int -> ParamPattern
lfo3rate :: Pattern Double -> ParamPattern
lfo3shape :: Pattern Int -> ParamPattern
lfo3amt :: Pattern Double -> ParamPattern
lfo3dest :: Pattern Double -> ParamPattern
lfo3sync :: Pattern Int -> ParamPattern
lfo4rate :: Pattern Double -> ParamPattern
lfo4shape :: Pattern Int -> ParamPattern
lfo4amt :: Pattern Double -> ParamPattern
lfo4dest :: Pattern Double -> ParamPattern
lfo4sync :: Pattern Int -> ParamPattern
emod :: Pattern Double -> ParamPattern
eamt :: Pattern Double -> ParamPattern
evel :: Pattern Double -> ParamPattern
edel :: Pattern Double -> ParamPattern
eatk :: Pattern Double -> ParamPattern
edcy :: Pattern Double -> ParamPattern
esus :: Pattern Double -> ParamPattern
erel :: Pattern Double -> ParamPattern
mod1src :: Pattern Double -> ParamPattern
mod1amt :: Pattern Double -> ParamPattern
mod1dst :: Pattern Double -> ParamPattern
mod2src :: Pattern Double -> ParamPattern
mod2amt :: Pattern Double -> ParamPattern
mod2dst :: Pattern Double -> ParamPattern
mod3src :: Pattern Double -> ParamPattern
mod3amt :: Pattern Double -> ParamPattern
mod3dst :: Pattern Double -> ParamPattern
mod4src :: Pattern Double -> ParamPattern
mod4amt :: Pattern Double -> ParamPattern
mod4dst :: Pattern Double -> ParamPattern
seq1dst :: Pattern Double -> ParamPattern
seq2dst :: Pattern Double -> ParamPattern
seq3dst :: Pattern Double -> ParamPattern
seq4dst :: Pattern Double -> ParamPattern
mwhl :: Pattern Double -> ParamPattern
mwhldst :: Pattern Int -> ParamPattern
aftt :: Pattern Double -> ParamPattern
afttdst :: Pattern Int -> ParamPattern
breath :: Pattern Double -> ParamPattern
breathdst :: Pattern Int -> ParamPattern
mvel :: Pattern Double -> ParamPattern
mveldst :: Pattern Int -> ParamPattern
foot :: Pattern Double -> ParamPattern
footdst :: Pattern Int -> ParamPattern
bendrng :: Pattern Int -> ParamPattern
kbpm :: Pattern Int -> ParamPattern
clockdiv :: Pattern Int -> ParamPattern
sqntrig :: Pattern Double -> ParamPattern
unisonkey :: Pattern Double -> ParamPattern
unisonmode :: Pattern Double -> ParamPattern
arpmode :: Pattern Double -> ParamPattern
erepeat :: Pattern Double -> ParamPattern
unison :: Pattern Double -> ParamPattern
arp :: Pattern Double -> ParamPattern
sqn :: Pattern Double -> ParamPattern
mcr1 :: Pattern Int -> ParamPattern
mcr2 :: Pattern Int -> ParamPattern
mcr3 :: Pattern Int -> ParamPattern
mcr4 :: Pattern Int -> ParamPattern
btnfreq :: Pattern Double -> ParamPattern
btnvel :: Pattern Double -> ParamPattern
btnmode :: Pattern Double -> ParamPattern
sub1vol :: Pattern Double -> ParamPattern
sub2vol :: Pattern Double -> ParamPattern
fbvol :: Pattern Double -> ParamPattern
ksplitpoint :: Pattern Double -> ParamPattern
kmode :: Pattern Double -> ParamPattern
knormal :: ParamPattern
kstack :: ParamPattern
ksplit :: ParamPattern

-- | Abstractions
--   
--   Though not yet finished, these are some examples on how to combine
--   multiple parameters into one single function you can use within your
--   patterns.
--   
--   Since Tidal 0.7 you can use the <tt>grp</tt> method to allow things
--   like:
--   
--   <pre>
--   &gt;&gt;&gt; t1 $ n (run 4) # adsr "0.1:0.6:0.3:0.9 0.8:0.3:0.9:0.1"
--   </pre>
--   
--   which alternates between two filter envelope shapes, the first one
--   with a sharp attack and a long decay/release and the latter with a
--   long attack, high sustain and a short release.
adsr :: Pattern String -> ParamPattern
atk3 :: Pattern String -> ParamPattern
dcy3 :: Pattern String -> ParamPattern
sus3 :: Pattern String -> ParamPattern
rel3' :: Pattern String -> ParamPattern
lfotri :: Pattern Double
lforsaw :: Pattern Double
lfosaw :: Pattern Double
lfopulse :: Pattern Double
lforand :: Pattern Double

-- | A hack to handle a param with completely different behavior for
--   certain parts of the range:
--   
--   <tt>lrate</tt> is limited from 0 to 150 and specifies values that will
--   produce an lfo frequency
--   
--   <tt>lstep</tt> however is essentially limited from 0 to 16 and
--   specifies values that will produce rhythmic lfo based on the _sequence
--   speed_. as taken from the manual:
--   
--   0: 32 steps 1: 16 steps 2: 8 steps 3: 6 steps 4: 4 steps 5: 3 steps 6:
--   2 steps 7: 1.5 steps 8: 1 step 9: 2/3 steps 10: 1/2 step 11: 1/3 step
--   12: 1/4 step 13: 1/6 step 14: 1/8 step 15: 1/16 step
lrate :: (Num b, Ord b, Functor f) => f b -> f b
lstep :: (Num b, Ord b, Functor f) => f b -> f b
lfo1 :: Pattern Int -> Pattern Double -> Pattern Double -> Pattern Double -> ParamPattern
lfo2 :: Pattern Int -> Pattern Double -> Pattern Double -> Pattern Double -> ParamPattern
lfo3 :: Pattern Int -> Pattern Double -> Pattern Double -> Pattern Double -> ParamPattern
lfo4 :: Pattern Int -> Pattern Double -> Pattern Double -> Pattern Double -> ParamPattern
mod1 :: Pattern Double -> Pattern Double -> Pattern Double -> ParamPattern
mod2 :: Pattern Double -> Pattern Double -> Pattern Double -> ParamPattern
mod3 :: Pattern Double -> Pattern Double -> Pattern Double -> ParamPattern
mod4 :: Pattern Double -> Pattern Double -> Pattern Double -> ParamPattern

-- | Modulation
--   
--   named sources and destinations to able to refer them for lfos, mods
--   and also sequences.
doublePattern :: Double -> Pattern Double
dosc1 :: Pattern Double
dosc2 :: Pattern Double
dosc :: Pattern Double
dmix :: Pattern Double
dnoise :: Pattern Double
dpw1 :: Pattern Double
dpw2 :: Pattern Double
dpw :: Pattern Double
dcut :: Pattern Double
dres :: Pattern Double
damod :: Pattern Double
dvca :: Pattern Double
dspread :: Pattern Double
dlfo1f :: Pattern Double
dlfo2f :: Pattern Double
dlfo3f :: Pattern Double
dlfo4f :: Pattern Double
dlfof :: Pattern Double
dlfo1a :: Pattern Double
dlfo2a :: Pattern Double
dlfo3a :: Pattern Double
dlfo4a :: Pattern Double
dlfoa :: Pattern Double
dfamt :: Pattern Double
dvamt :: Pattern Double
deamt :: Pattern Double
damt :: Pattern Double
dfatk :: Pattern Double
dvatk :: Pattern Double
deatk :: Pattern Double
datk :: Pattern Double
dfdcy :: Pattern Double
dvdcy :: Pattern Double
dedcy :: Pattern Double
ddcy :: Pattern Double
dfrel :: Pattern Double
dvrel :: Pattern Double
derel :: Pattern Double
drel :: Pattern Double
dmod1 :: Pattern Double
dmod2 :: Pattern Double
dmod3 :: Pattern Double
dmod4 :: Pattern Double
dfb :: Pattern Double
dsub1 :: Pattern Double
dsub2 :: Pattern Double
dshape :: Pattern Double
dslew :: Pattern Double
sseq1 :: Pattern Double
sseq2 :: Pattern Double
sseq3 :: Pattern Double
sseq4 :: Pattern Double
slfo1 :: Pattern Double
slfo2 :: Pattern Double
slfo3 :: Pattern Double
slfo4 :: Pattern Double
sfenv :: Pattern Double
svenv :: Pattern Double
seenv :: Pattern Double
spitchb :: Pattern Double
smodwh :: Pattern Double
saftert :: Pattern Double
sbreath :: Pattern Double
sfoot :: Pattern Double
sexpr :: Pattern Double
svel :: Pattern Double
snote :: Pattern Double
snoise :: Pattern Double

-- | Presets suck, but I constantly forget how to make drums with the
--   TETR4, so here are some defaults (that can mostly be changed when
--   using them) to make a snare and a kick.
--   
--   Use the snare like this:
--   
--   <pre>
--   &gt;&gt;&gt; t1 $ n "0(3,8)" # snare
--   </pre>
--   
--   To make it shorter:
--   
--   <pre>
--   &gt;&gt;&gt; t1 $ n "0(3,8)" # snare |-| release "0.1" |-| decay "0.1"
--   </pre>
snare :: ParamPattern

-- | usage would be:
--   
--   <pre>
--   &gt;&gt;&gt; t1 $ n "0 [[0 1] 1]" # kick
--   </pre>
--   
--   you can change the defaults by applying merge operations for certain
--   params:
--   
--   <pre>
--   &gt;&gt;&gt; t1 $ n "0(3,8)" # kick |+| edcy "0.05"
--   </pre>
--   
--   will give the kick more resonance
--   
--   <pre>
--   &gt;&gt;&gt; t1 $ n "0(3,8)" # kick |-| edcy "0.15"
--   </pre>
--   
--   will make it really dry
kick :: ParamPattern

-- | Since the TETR4 lacks a high-pass filter, things like snares and
--   especially cymbals are somewhat limited to filtered noise which sounds
--   okish.
--   
--   Therefore some presets for the different types of sounds you can get
--   from the TETR4 can come in handy and can also be combined and modified
--   with and through others:
--   
--   A chip tune like sound, reminds me of gameboys
chip :: ParamPattern

module Sound.Tidal.MIDI.VolcaBass
volcabassController :: ControllerShape
volcabass :: Shape

module Sound.Tidal.MIDI.VolcaBeats
volcabeatsController :: ControllerShape
volcabeats :: Shape

module Sound.Tidal.MIDI.VolcaFM
volcafmController :: ControllerShape
modattack :: Pattern Double -> ParamPattern
moddecay :: Pattern Double -> ParamPattern
carattack :: Pattern Double -> ParamPattern
cardecay :: Pattern Double -> ParamPattern
algrtm :: Pattern Double -> ParamPattern
algtm :: Pattern Double -> ParamPattern
algorithm :: Pattern Double -> ParamPattern
arp :: Pattern Double -> ParamPattern
arpdiv :: Pattern Double -> ParamPattern
volcafm :: Shape

module Sound.Tidal.MIDI.VolcaKeys
volcakeysController :: ControllerShape
volcakeys :: Shape
