= Synergy
:toc: macro
:toclevels: 4
:icons:

Synergy is a semi-modular MIDI sequencer.


In a nutshell, its main features are:

* MIDI event routing, transformation, and monitoring
* Linear and / or pattern based sequencing
* Polymetric and polyrhythmic sequencing
* Multi-instantiable sequencer / processing "nodes"
** e.g. a "tracker" style sequence editor (features pattern zooming and freely configurable column layouts)
** Dedicated drum and automation editors
** Timeline / clip editor (arranger)
* Advanced preset system for single nodes or complex multi-node setups
* Standard MIDI file import and export
* Page-oriented UI that requires very little "mousing"
** Very few dialog windows to minimize "attention context switching"
** Fast workflow: Keyboard shortcuts for almost everything
** Many UI and replay functions can be mapped to MIDI controllers (remote control)
* Built-in synth editors
** Roland MKS-50 / Alpha Juno
** Oberheim Matrix 1000
** Elektron Analog Rytm (librarian)
** DSI Prophet 12


toc::[]

[[feature_overview]]
== Concept and Feature Overview

The main concepts and features of this software are:

* A hierarchical "node"-based MIDI event flow
   ** Nodes are grouped into "pipes"
     *** Master pipe output is sent to all pipes
     *** Each pipe processes MIDI input / output events separately
     **** The output of devices marked as "global" will be available in subsequent nodes
     *** The output of all pipes is merged before it is being sent out via MIDI
   ** Multi-instancing of nodes
     *** Polyrhythmic and polymetric sequencing
     *** Node organization / grouping (e.g. drums / bass / lead / chords)
     *** Synchronized pattern changes during editing and / or replay
        **** e.g. automation node linked to tracker node
        **** lctrl-x HOME or END to show dialog and send out program change on auto device A (END) or B (HOME) to all pipes
   ** Each node can store up to 127 patterns


* Nodes can be sequenced by other nodes (A+B "auto devices")
   ** Via sequencer-internal MIDI messages (program change, RPN)
   ** Common control features:
     *** Change patterns
     *** Change play offset
     *** Mute / unmute tracks
     *** Velocity scaling and offset
     *** Note duration scaling and offset
     *** Note transposition
     *** Restart / Reset / Seek
     *** Time scaling (speed up / slow down)
     *** Clock+Gate signals
   ** + other node-specific remote control options
   ** Example applications:
     *** Create complex rhythms without resorting to sliced sample loops
     *** Trigger automation sequence fragments
     *** Decouple note and timing information

* Export standard MIDI files
 ** For further processing in other sequencers / DAWs

* Full (N)RPN support
* Polyphonic key pressure (aftertouch) support
* SysEx support
* Page oriented UI (very few dialog windows)
* Keyboard-friendly UI
   ** Lots of shortcuts
   ** Large parts of the application can be used without touching a mouse
* Mouse-friendly UI
   ** e.g. most number edit fields can be used like dials and support undo
* MIDI input monitor (view RAW or transformed input events)
* MIDI input mapper / transformer ("morph scenes")
   ** Redirect and / or transform MIDI controller input to other MIDI devices
   ** 4 parallel "scene" slots with 16 entries each
   *** Incoming events are first processed by scene A. The remaining events are then processed by scenes B, C, D.
* MIDI output monitor (view RAW events)
* MIDI map contexts
** Remote-control the application via MIDI
** Global map context
*** Can be forced by pressing 'g' or by MIDI controller events assigned to the MMC_FORCE_GLOBAL map target
** Per-page / node map contexts
* Some nodes support Ableton Push (e.g. for arranging node clips)
* Generic Ableton Push support: Note / Controller mode
** Configurable octave
** Configurable key and mode (major, minor, ..)
** Dual (horizontal / vertical) and Quad split modes
*** MIDI channel per split region
* Support for Roger Linn's Linnstrument128
** via the "/seq/linnstrument arranger" Script node preset
* Device name aliases (can load projects on other machines or if the MIDI device names have changed)
* Device profiles (e.g. for controller names and hardware input type definitions (e.g. buttons))
* Sequencer-internal virtual MIDI devices (e.g. "play_a", "play_b", ..)
* Per-project controller aliases
* MIDI timing clock (configurable per device)
* MIDI transport control (MMC) (configurable per device)
* Comment editor (per node and pipe)
* Autosave (with configurable interval / number of files)
* OpenGL based user interface (reduced CPU load, especially at higher resolutions)
** Windowed or fullscreen mode
** x1..x4 scaling modes
** Post processing effects (e.g. scanlines, colorization)
** V-Sync
** FPS limiter
** Transparency effects
* SysEx manager for Elektron Analog Rytm (AnalogRytm node)
* SysEx editor for Roland Alpha Juno / MKS-50
* SysEx editor for Oberheim Matrix 1000 (works with early 1988 "black" models)
* SysEx editor for DSI Prophet 12 synthesizer


== Getting Started

=== Installation

Unpack the downloaded application, then run "synergy.exe".

TIP: It is recommended to change the default (app-path relative) project directory (see `Settings->Preferences`) and point it to some absolute location (e.g. `f:/synergy_data/`).

TIP: After installing new application releases, it is recommended (but not required) to sync the PROJECT_DIR/presets folder and copy any new presets to your custom project directory.

=== Device Setup
Once the application is running, go to `Settings->Device Setup` and select the MIDI devices you want to use (tick the "Use" checkbox).

CAUTION: To be on the safe side, choose the devices you want to open, then save the configuration and restart the application (dynamically opening / closing devices usually works fine but in case it doesn't, save the project and configuration, then restart the app).

[TIP]
====
It is highly recommended to assign device alias names since

* MIDI device names may sometimes change after reconnecting USB devices
* Non-USB MIDI ports usually have non-descriptive names like `MIDISport 4x4 Anniversary In A`, for example
====


==== Basic device settings
Each MIDI device has a couple of basic settings that are edited via the device table checkboxes:

[cols="1,6",options="header"]
|===========================================================
| Name    | Description
| Use     | When checked, open and start device
| Echo    | When checked, copy incoming events back to the default output device (see additional device settings). This option should be enabled when the MIDI device is set to "local off".
| Clock   | Send MIDI timing clock
| Rec     | Send MMC record message when MMC recording starts (e.g. start audio recording in DAW when `lshift - ENTER` is pressed)
| Play    | Send MMC start message when playback starts (e.g. start audio playback in DAW when `ENTER` is pressed)
|===========================================================

==== Input device event filter

Each input device has a MIDI message filter that can be configured by clicking the "Input Filter.." button.
All ticked message types will be filtered out.


==== Additional device settings
By clicking a device entry, additional device properties can be edited. These include the *device alias name*, the corresponding output device (for input devices), *note-off mode* (output devices only), *MIDI cache* (when enabled, filter out redundant output controller events), and the *Global* setting which determines whether events sent to a device will become available in subsequent pipes.

In addition to that, a *MIDI synth profile* can be selected for each MIDI channel. Synth profiles are used to display more senseful controller and note names in the UI (e.g. "Feedback Amount" instead of just "CC#114"), and *classify controller types* (e.g. absolute values, delta-type inc/dec rotary controllers, button-type controllers). The controller classification is necessary for MIDI map contexts, e.g. for remote-controlling the application via MIDI.

Finally, profiles are also used to assign *synth editors* (via the `dataClass` and `formClass` attributes). In order to be able to edit a synth with one of the built-in editors (Prophet12, Matrix1000, AlphaJuno), it is required to assign the proper synth profile(s) to the respective MIDI channel(s).

Synergy comes with a number of preset profiles for synths like the DSI Prophet 12, Oberheim Matrix 1000, Roland Alpha Juno, Moog Sub37, Elektron Analog Rytm, and various controllers like the Akai MPK49 or Korg Nano Kontrol.

The profiles are read from ASCII files located in the `midi_synth_profiles/` directory which is scanned during application startup.
In order to add a new synth profile, duplicate one of the existing profile files that is most closely resembling the new synth / controller, and edit it (__it would be nice if you'd send me a copy so I can include it in future releases!__).

Last but not least, a device setup can be *Project specific*, which is mostly useful when using an uncommon hardware setup (e.g. when synths are swapped in and out for a certain project), and / or for virtual MIDI devices.

==== Virtual MIDI devices (internal)

By default, the application creates 9 virtual MIDI devices that can be used for routing data within the application.
Virtual MIDI devices names are enclosed in '<' / '>' and are displayed with a yellow background color.

Keep in mind that, unless a device is configured as "Global", the initial event data is reset in each pipe (e.g. the virtual "<Scratch>" device).

===== Virtual MIDI device naming scheme

While virtual MIDI device names can be chosen arbitrarily, it does make sense to use a certain naming scheme.

For example, the default project template uses the following internal virtual MIDI device name aliases:
[cols="2,1,4",options="header"]
|===========================================================
| Internal Device Name    | Alias          | Suggested Use
| `<Scratch>`    | `<Scratch>`    | Temporary events (within pipes)
| `<internal_1>` | `<play_a>`     | Arpeggiated sounds, leads
| `<internal_2>` | `<play_b>`     | Bass
| `<internal_3>` | `<play_c>`     | Chords
| `<internal_4>` | `<play_d>`     | Drums
| `<internal_5>` | `<global>`     | Events available in subsequent nodes
| `<internal_6>` | `<playlist>`   | Node pattern selection / mute / seek control (usually sent from <<node_arranger,Arranger>> nodes)
| `<internal_7>` | `<control>`    | Can be used as MIDI mapper output ports for MIDI controllers that only provide input devices
| `<internal_8>` |                | __unassigned__
|===========================================================

==== Virtual MIDI devices (external)

In order to exchange MIDI data with other applications, it is recommended to install a virtual MIDI device driver, like for example Tobias Erichsen's excellent https://www.tobias-erichsen.de/software/loopmidi.html[loopMIDI].

===== Example setup for Propellerhead Reason

In order to sequence and control Reason devices, the following loopback device setup can be used:

[cols="1,1,4",options="header"]
|===========================================================
| Loopback Device Name     | Alias          | Suggested Use
| `reason_master` | -              | Currently focused device instance + Transport control ("Akai MPK49")
| `reason_a`      | `a:arps`       | Bus A: Arpeggiated sounds, leads
| `reason_b`      | `b:bassline`   | Bus B: Bass
| `reason_c`      | `c:chords`     | Bus C: Chords
| `reason_d`      | `d:drums`      | Bus D: Drums
| `reason_ctl_a`  | -              | Control Surface 1 (remote overrides) (generic "MIDI Multichannel Control Keyboard")
| `reason_ctl_b`  | -              | Control Surface 2 (remote overrides) (generic "MIDI Multichannel Control Keyboard")
| `reason_ctl_c`  | -              | Control Surface 3 (remote overrides) (generic "MIDI Multichannel Control Keyboard")
| `reason_ctl_d`  | -              | Control Surface 4 (remote overrides) (generic "MIDI Multichannel Control Keyboard")
|===========================================================

NOTE: Even when the actual master keyboard is not an Akai MPK49, selecting this device profile in _Reason_ will enable MIDI transport controls (e.g. start / stop / record).

NOTE: In practice, a single control surface (`reason_ctl_a`) will usually suffice since each device supports up to 16 MIDI channels (=> around 2000 unique continuous controller numbers).

TIP: In Reason, the "Advanced MIDI device" tab is used to map MIDI bus A..D events to the rack devices. Events from the Control Surface devices can be mapped to device parameters via the "remote override" feature.

[TIP]
====
In order to keep track of the Reason "remote override" controller mappings, it is highly recommended to name the mapped controllers in Synergy via the *CtlTag* page.

In order to do so, press ``` on US keyboards or `^` on german keyboards, then click *Add* to name the last seen controller.

Naming controllers this way will override default MIDI synth profile controller names (i.e. useful in many cases, not just with Reason).
====



=== MIDI input and output devices

One important thing to understand is that all sequencer nodes operate on *output* devices only.

In the early days of MIDI, regular serial ports were used for data exchange and the list of inputs and outputs was always symmetrical since each (physically present) port served as both an input and output.

Since the advent of USB MIDI and virtual MIDI devices, these I/O port lists are not necessarily symmetrical anymore. A USB MIDI controller for example may provide several input ports and no output ports, other devices may only have output ports, and so on.

In order to control nodes with MIDI controllers, the controller events need to be transformed to output devices, which can either be actual output devices (e.g. synthesizers), or virtual output devices (e.g. for controllers that don't provide an actual output device).

==== Record and Play events

Even though all events processed by sequencer nodes will be "output events", i.e. associated with output devices, a distinction between "record" and "play" events will still be made.

"Record" events are events received from actual input devices (e.g. MIDI controllers). When these events are processed by sequencer nodes, they will remain "record" events.

"Play" events are events that have been synthesized by sequencer nodes (e.g. by playing back a <<node_tracker,Tracker>> pattern).

This separation is necessary to distinguish event origins when e.g. using MIDI learn functions while the replay is running.


=== MIDI Mapper (morph scenes)

All incoming input events are routed through the MIDI Mapper (see `Input->MIDI Morph Scenes`, tap ``` twice (`^` on german keyboards)), whose job it is to transform input to output events.

The MIDI mapper supports eight "groups" (A, B, C, D, E, F, G, H), and each group supports up to 16 "scenes" of which one can be active at a time.
Groups / scenes can be selected either via the keyboard (F3/F4, F5/F6, F7/F8, F9/F10 (A..D), and lalt-F3/F4, lalt-F5/F6, lalt-F7/F8, lalt-F9/F10 (E..H)), or by assigning MIDI controllers to the global GLOBAL_SCENE_* map targets.

Incoming MIDI events will first be processed by group A, and all events that do not match any of the map entries in the active scene of group A will be handed over to group B, and so on.

NOTE: For example, in order to control different synths with a single master keyboard, several scenes can be used, each with the same source filter(s) but different destination(s).

TIP: Scene selection can be remoted-controlled via the global MIDI map context (see `GLOBAL_SCENE_*` targets)

Most of the time, event processing in the MIDI mapper involves only basic copy operations where the input event type matches the output event type.

It is possible, however, to morph event types (e.g. NRPN to CC), or transpose / remap / discard certain event values / ranges.

It is also possible to match only certain input values or ranges, or clip them. This can be used to create keyboard splits, for example.

TIP: Keep in mind that all incoming events will be processed by sequencer nodes, which allows for much more sophisticated event transformations (e.g. via <<node_modmatrix,ModMatrix>> nodes).

TIP: Also keep in mind that the output of the "master pipe" (the first pipe) will be made available to all other pipes. For this reason, it is usually preferable to place any input-processing nodes in the master pipe.

=== MIDI Map Contexts

Each UI page and node editor is associated with a MIDI Map Context that can be used for remote-controlling application features via MIDI input events (before they are processed by the MIDI mapper).

In addition to that, a global map context exists (see `Input->UI Global`) that is available everywhere but has lower priority than the page or node editor map contexts.

It is possible to force the global context by holding down `g` or by assigning a MIDI controller to the global `MMC_FORCE_GLOBAL` map target.

At the time of writing (early 2018), Synergy supports over one thousand map targets, which are too numerous to list here (todo!).

Some interesting targets include:

* Transport Control (start / stop / record / song position / song markers / loop mode and region)
* Song speed (BPM, tap)
* UI navigation (e.g. page selection, input focus, value editing, and basic yes / no dialog responses)
* Node navigation (prev / next pipe / node)
* MIDI Mapper scene selection
* Input controller utilities (discard, collect, resend)
* Ableton Push mode (MMC / kbd / ctl / usr)
* Ableton Push Arranger clip-matrix mode configuration
* Pattern selection (during node editing)

TIP: When mapping targets to Ableton Push input events, the input event often determines the pad number for bidirectional feedback (pad colorization and / or rotary encoder labels)

TIP: press `lctrl - m` to edit the map context of a UI page or node editor


=== Push and Linnstrument MIDI controller support

==== Ableton Push

When a Push controller is connected and its input and output devices are enabled in the Device Setup (the device aliases must be set to "Push"), it can be used as following:

* General:
** Select main pages via top row pads
*** PipeMap, PipeRoot, Pipe, Node, MidiDevs, SubSongs, MidiMon, Project
** Context-sensitive rotary encoder functions (e.g. select pattern nr, select BPM and loop length, etc)
** Touching the rotary encoder below the "Metronome" button will temporarily override the current map context and activate the global context
* PipeMap page:
** Select edit mode (edit / mute / solo / move) (first 4 pads of row 5) and exec the selected action by tapping on a node pad (lower left 6x4 pad area)
** Select patterns (right bottom area)
* <<node_arranger,Arranger>> node editor page:
** Clip matrix
*** Timeline play mode _must_ be disabled for this to work
*** Each column is associated with a node
*** Each row represents a clip matrix scene (up to 128).
**** Each scene stores the pattern number, duration, and number of loops for each node (see Push display).
**** The currently active scene will flash periodically
*** Scenes can be imported via the "Auto Generate" button in the "Scene" tab
*** The buttons right next to each row (1/16t, 1/16, ..) are used to select / queue a scene
*** Depending on the current mode (selected by the first 4 pads of the second row from the top), tapping a node pad will either select a node or play / queue the node pattern
**** When immediate mode is enabled, the action will be performed instantly, otherwise the pad has to be tapped twice
* <<node_tracker,Tracker>> node editor page:
** Push pads can be used to set/clear notes and move blocks. To be honest, it's easier to use the regular interface, though.
** (todo) document me
* CtlTag page
** Push pad pressure can be used to send MIDI events
** (todo) document me

The main drawback here is that the Push functions are tied to specific UI pages, i.e. the clip matrix for example can only be used when an Arranger node is being edited.

Last but not least, keep in mind that the pad functions can be configured in the MIDI map context editor. While editing a map context, the pad colors can be configured by pressing the "Tap Tempo" button.


===== Keyboard Mode
In addition to the aforementioned functions, the Push controller can also be used in keyboard mode, which is toggled via the global PUSH_TOGGLE_KBD map target (bound to the Push "Select" button in the default project template).

In this mode, it acts like some sort of poor man's Linnstrument. The pad grid can be split horizontally and / or vertically. Each split is assigned a dedicated MIDI channel, i.e. the first split sends events on <push>:1, the second one on <push>:2, and so on.

The rotary encoders are used to configure the current octave, row-add, key (C,C#,D,..) , mode (major/minor/..), and horizontal shift.

The keyboard mode is available regardless of the currently active UI page.

It's not only useful for actual note input: In combination with a <<node_modmatrix,ModMatrix>> or <<node_Script,Script>> node, the note on events can be converted to program change events (=> node pattern selection).

TIP: In order to convert note ons to (used) pattern selection program changes, insert a <<node_script,Script>> node before the node you want to control (in the same pipe), and load the "`*/note/note_to_usedpatnr*`" preset. In the "I/O" tab, select the note input device and channel, and the program change output device and channel (should match the other node's auto-dev A or B setting). In the "Param" tab, there's a combobox that lets you choose the MIDI base note (i.e. the note that corresponds to the first (used) pattern. C-3 by default).

IMPORTANT: Keep in mind that node processing works with _output_ devices only. I.e. in order to use the Push keyboard events, they have to be mapped to an output device via a MIDI "morph scene". The easiest way to do this is to map all incoming "`*Push*`" events to a virtual MIDI device named "`*<push>*`".



==== Roger Linn Linnstrument128

===== Setup

(Extended) Support for the Linnstrument is implemented via the <<node_script,Script>> node.
First you need to instantiate a <<node_script,Script>> node in the master pipe (the first one), then load the "`*/seq/linnstrument arranger*`" preset.

In the "I/O" tab, the variable "`*linn*`" has to be set to the actual Linnstrument device (usually called "`*linnstrument*`"), while the variable "`*linn_mapped*`" has to be set to a (virtual) output device (i.e. one of the "`*<internal 1..16>*` devices. It is usually a good idea to assign an alias name in the Device Setup, e.g. "`*<linnstrument>*`").

You will also need to set up (and activate) a MIDI morph scene that forwards all "`*linnstrument*`" input device events to the virtual "`*<linnstrument>*`" output device.

IMPORTANT: It may be necessary to turn the MIDI cache off for devices that are used to send out MPE events. Some synths expect a CC#74 brightness event immediately before a note on, even when the CC value has not changed since the last note on.

In order to toggle between regular Linnstrument mode and the arranger mode, simply mute / unmute the script node.
When the node is muted, the first (top-most) Linnstrument preset is loaded.
When the node is unmuted, the last (bottom) Linnstrument preset is loaded.

This last preset must be configured as following:

* Split point: 12 columns left, 13 columns right
* Row per channel mode (both left and right)
* No row offset
* Channels left: 1..8
* Channels right: 9..16
* Transpose left: octave:+1, lights:+6
* Transpose right: octave:-1, lights:-6
* Pitchbend range left: 24 semitones
* Footswitch function set to CC65 (Portamento SW)
** tested with a (regular) mono footswitch pedal

NOTE: If you don't have a foot pedal, just route / transform another MIDI event with a <<node_modmatrix,ModMatrix>> node, e.g. a note on/off or CC event generated by a MIDI controller button

The footswitch is used to toggle between arranger and fader mode. 
It can be set to either toggle or momentary mode in the "Param" tab.

===== General
Each Linnstrument pad row corresponds to one output port.
These ports are configured in the source code and the default configuration looks like this:

NOTE: row number 1 is the bottom row, row number 8 the top row

====== Note and Program Change Ports

[cols="1,1,1,4"]
|==============================================================
| Row             | Device    | Channel  | Intended Purpose
| 1               | <play_d>  | 1        | Drums (bd, sd, cp, ..)
| 2               | <play_d>  | 2        | Drums (lt, mt, ht, ..)
| 3               | <play_d>  | 3        | Drums (ch, oh, cy, ..)
| 4               | <play_d>  | 4        | Drums (fx)
| 5               | <play_b>  | 1        | Bass
| 6               | <play_a>  | 1        | Keys
| 7               | <play_a>  | 9        | Lead
| 8               | <play_c>  | 1        | Chords
|==============================================================

NOTE: Technically speaking, the note and program change ports can be configured separately (`*left_note_ports*` and `*right_prgchg_ports*` arrays, see script source). By default, they use the same setup.


====== Modulation Ports

[cols="1,1,1,4"]
|==============================================================
| Row             | Device    | Channel  | Intended Purpose
| 1               | vst_d     | 1        | Drums (bd, sd, cp,..)
| 2               | vst_d     | 2        | Drums (lt, mt, ht,..)
| 3               | vst_d     | 3        | Drums (ch, oh, cy,..)
| 4               | vst_d     | 4        | Drums (fx)
| 5               | vst_b     | 1        | Bass
| 6               | vst_a     | 1        | Keys
| 7               | vst_e     | 1        | Lead
| 8               | vst_c     | 1        | Chords
|==============================================================

These modulation ports are configured by the `*left_modulation_ports*` array (see script source).

The "intended purpose" is just a suggestion, of course. Feel free to use those ports as you see fit.


===== Arranger mode

The left hand side (left split) pads are used as CC#1 modulation wheel faders.
In addition to that, pressure and y-position send CC#2 breath control and CC#11 expression events.

NOTE: When the "`*Send Notes*`" option is enabled (Param tab), the left hand side pads will also send MIDI notes to the program change output ports. This can be used to play TrigSeq tracks or select arranger marker clips. When the "`*Send Notes (Midi Map)*`" option is enabled, the pads send button events that can be mapped in a MIDI map context (i.e. for remote-controlling the application).

The right hand side pads are used to select the current play pattern for the first node that corresponds to the row's program change port (i.e. the node's auto-dev A or B port has to match the row's output port).

In addition to that, x-pos, y-pos, and pressure generate pitchbend, CC#74 brightness, and channel pressure events.

====== Arranger mode toolbar
The right-most pad column is used as a toolbar:

[cols="1,1,4"]
|======================================================================================================================
| Row   | Color    | Function
| 1     | Orange   | While held down, discard MIDI events
| 2     | Cyan     | While held down, collect MIDI events and send them when the pad is released
| 3     | Green    | Select prgchg mode / toggle pattern pages 1+2
| 4     | Blue     | Select fader mini-mode / toggle fader pages 1+2
| 5     | White    | Clear modifier (clear fader or scene)
| 6     | Lime     | Toggle node navigation mode (when active, tap pattern pad to open its editor)
| 7     | White    | Open next arranger editor
| 8     | Yellow   | Toggle scene menu (hold pad + tap scene pad to save scene, tap scene pad to load scene)
|======================================================================================================================

====== Arranger mode fader mini-mode
When the fader midi-mode is active, the right hand side pads turn into faders.

Horizontal movement sends CC#16 general purpose 1 (fader page 1), or CC#18 general purpose 3 (fader page 2) events.

Vertical movement (pad y-pos) sends CC#17 general purpose 2 (fader page 1), or CC#19 general purpose 4 (fader page 2) events.


===== Fader mode
The fader mode is activated (or toggled) by pressing the footswitch pedal (CC#65).

In this mode, 16 faders can be edited per current output port. The current output port is set when a pattern or CC fader is tapped (in non-fader mode).

TIP: Hold down the "discard" modifier (orange toolbar pad) to just select a port without changing the current fader value (or selecting a pattern).

====== Fader mode toolbar
Like in the arranger mode, the right-most pad column is used as a toolbar:

[cols="1,1,4"]
|======================================================================================================================
| Row   | Color    | Function
| 1     | Orange   | While held down, discard MIDI events
| 2     | Cyan     | While held down, collect MIDI events and send them when the pad is released
| 3     | -        | -
| 4     | -        | -
| 5     | White    | Clear modifier (clear fader or scene)
| 6     | -        | -
| 7     | -        | -
| 8     | Yellow   | Toggle output port selection menu
|======================================================================================================================

===== Scenes

All fader states and current pattern selections can be stored in up to 24 scenes.

Scenes are saved by activating the scene menu (in arranger mode), then holding down the scene menu pad and tapping one of the scene slots (in the upper two rows).

Vice versa, scenes are loaded by tapping a scene slot while the scene menu is active.

NOTE: The rightmost pad color of each fader indicates whether the fader value is unknown (white), or valid (orange). When a scene is loaded, only the valid faders will generate CC/pitchbend/channel pressure events. In order to invalidate a fader, hold down the clear modifier (white toolbar pad) and tap one of the fader pads.

NOTE: Clearing a left-hand-side fader in arranger mode also clears the pattern selection. Hold down the discard modifier to only clear the pattern selection, or the discard_collect modifier to only clear the modwheel/breathcontrol/expr fader values.

NOTE: When loading a scene, holding down the discard modifier (orange toolbar pad) will only load the pattern selection, while holding down the discard_collect modifier (cyan toolbar pad) will only load the fader values


===== Last but not least

* You can use as many Linnstrument script nodes as you like. Just make sure only one is active at a time.
* Any script modifications are saved with the project file (e.g. the output port mapping)
* By targeting an <<node_arranger,Arranger> node that has one or more markers, pattern selection can become a scene selection, i.e. selecting one of the arranger markers will change the patterns of any number of nodes
* Take a look at the Params tab which contains many additional settings (e.g. footswitch polarity inversion)
* While the script node is being edited, the status bar will display additional info messages
* The "`*mpe latch cc*`" <<node_script,Script>> preset can be used to e.g. latch the y-position (cc#74 brightness) at note on. This can be useful for avoiding unintended "smear" effects.



== Node Overview

The following (multi-instantiable) sequencer nodes are currently available.


[.lead]
[[node_tracker]]
=== Tracker

[#img-node_tracker] 
.Tracker
[link=images/screenshots/node_tracker-06May2017a.png] 
image::images/screenshots/node_tracker-06May2017a.png[Tracker,640,400]

This is the most complex, and most versatile sequencer node in this application.

Main features:

* Undo / redo (with configurable history size)
* Arbitrary pattern length
* Arbitrary number of tracks per pattern
* Arbitrary step resolution / pattern zooming / microtiming
* 32bit floating point precision for all controller values
* Instrument-based MIDI device+channel selection (any instrument can play on any track)
** Instrument selection can optionally trigger MIDI program change and / or bank select
* Multiple note / velocity / duration / pressure controllers per track (for chords)
* Customizable track / cel layouts and colors
** Cels can be displayed as hex, letter (0..9, A..Z, a..z), 2 or 3 digit pattern number, 4/8/16/32 char wide bars (to visualize envelopes), or colored rectangles (for orientation)
** Auto-colorization (via lctrl-x k, preserves custom cel colors)
* User definable controller cels (CTL_USR[1..16])
** CC, (N)RPN, Program Change
** (Optional) controller reset values (automatically sent when instrument is selected)
** Can send controller events to MIDI devices/channels other than the one selected in the instrument 
** MIDI learn function
* Auto-note-off mode
** Note duration is scaled by current "Duration" (see Play tab)
* Recording of MIDI controller input and / or output from previous nodes (can be filtered and quantized)
* Loop or oneshot pattern mode
* Arpeggiator mode
* External clock sync mode (clock, gate)
* Controller / track / pattern block editing modes
* Mini-hex editing mode
** lshift + 0..9,A..F to enter values without moving the cursor down to the next step
** also works with bar-style cels
* Slide effect (via MIDI pitchbend)
** A CTL_INSTR event > 0 will force the note to be retriggered
* Track delay effect
* Note repeat effect
* Break / seek effect (continue replay at step 'x' or stop pattern replay)
** Seek time is scaled by current "Off / Len" (see Play tab)
* Per-step mute / unmute effect
* Controller injection via auto device RPNs
** Temporarily replace parts of a pattern by data sent from other nodes
* PolyStep play
** Trigger arbitrary pattern steps by other nodes (via RPN auto device messages)
** The <<TrigSeq>> node has a dedicated "SingleTrack Polystep" output mode for this
* Chord-clear-step mode
** Auto-clear step note events when new chord is recorded via MIDI
* Chord-advance mode
** Move cursor to next step not until all chord notes have been released
* Tap mode
** Timed recording of steps from other pattern
** Default source pattern is the last pattern copied to the clipboard (lctrl-c)
** Notes >= C-4 select / record source pattern step #n, < C-4 advances source pointer to next step (and records it)
* Background recording mode
** Recording continues even when the tracker node is not currently being edited
* Overdub and raster recording modes
** Raster recording mode clears the current recording steps unless no event has been recorded since the last pattern loop
* "KeyJazz" (play/enter notes with PC keyboard) (a MIDI keyboard is highly recommended, though)
** Can be locked to a specific node and track (useful for editing controller patterns/tracks)
* Import Elektron Analog Rytm drum machine patterns
* Import drum patterns from TrigSeq node
* Import MIDI sequences from Monitor node
* Import standard MIDI files
** e.g. for ReCycle `.mid` output
* Graphical envelope editor
** Freedraw, line, and cubic bezier spline editing modes
** Replace-mode restricts editing to already existing events

==== Auto Device Ports

[cols="1,6",options="header"]
|===========================================================
| Event          | Description
| Prg.Chg        | Change pattern (0..127 => 01A..31D)
| RPN 100..115   | Record / Redirect event to USRCTL1..16 (0..255)
| RPN 500        | Reset (1, 0)
| RPN 501        | Run pattern (1, 0)
| RPN 502        | Clock+Gate signal (1, 0)
| RPN 503        | Clock signal (1,0)
| RPN 504        | Gate signal (1, 0)
| RPN 505        | Gate time (ticks)
| RPN 506        | Gate time multiplier (ticks)
| RPN 507        | Gate time divisor (ticks)
| RPN 508        | Retrig step(s)
| RPN 509        | Restart pattern (1, 0)
| RPN 510        | Mute / Unmute node (1, 0)
| RPN 511        | Transpose (0..127 => 0=-64; 64=0; 127=+63)
| RPN 512        | Mute temporary (1, 0)
| RPN 513        | Toggle Mute node (1, 0)
| RPN 514        | Toggle Mute temporary (1, 0)
| RPN 520        | Mute node (recordable in arranger) (1, 0)
| RPN 521        | Solo node (recordable in arranger) (1, 0)
| RPN 522        | Mute pipe (recordable in arranger) (1, 0)
| RPN 523        | Solo pipe (recordable in arranger) (1, 0)
| RPN 524        | Change pattern (recordable in arranger) (0..127 => 01A..31D) 
| RPN 570        | External clock enable/disable (1,0)
| RPN 550        | Pattern Offset/Length scaling (ticks)
| RPN 551        | Pattern Offset/Length multiplier (ticks)
| RPN 552        | Pattern Offset/Length divisor (ticks)
| RPN 553        | Pattern Offset (seek)
| RPN 554        | Pattern length (16th units by default)
| RPN 555        | Pattern Seek Offset (16th, sent by arranger)
| RPN 556        | Pattern Seek Relative Pre Tick (16ths units by default) (0=prev, 1=next, >=2 = val - 0x80)
| RPN 557        | Pattern Seek Relative Post Tick (16ths units by default) (0=prev, 1=next, >=2 = val - 0x80)
| RPN 559        | Queue Pattern Offset (applied when sequence loops)
| RPN 560        | Queue Pattern Length (applied when sequence loops)
| RPN 582        | Speed Scaling (0..16383 => 0=*0, 8192=*1, 16383=*4)
| RPN 583        | Position Scaling (0..16383 => 0=*0, 8192=*1, 16383=*4)
| RPN 590        | Note Velocity Scaling (0..255 => 0=*1/8, 128=1, 255=*8)
| RPN 591        | Note Velocity Offset (0..255 => 0=-128, 128=0, 255=+127)
| RPN 592        | Note Duration Scaling (0..255 => 0=*1/4, 128=*1, 255=*4)
| RPN 593        | Note Duration Offset (0..255 => 0=-128, 128=0, 255=+127)
| RPN 600        | PolyStep 1 step nr (0..255)
| RPN 601        | PolyStep 2 step nr (0..255)
| RPN 602        | PolyStep 3 step nr (0..255)
| RPN 603        | PolyStep 4 step nr (0..255)
| RPN 604        | PolyStep 5 step nr (0..255)
| RPN 605        | PolyStep 6 step nr (0..255)
| RPN 606        | PolyStep 7 step nr (0..255)
| RPN 607        | PolyStep 8 step nr (0..255)
| RPN 608        | PolyStep 9 step nr (0..255)
| RPN 609        | PolyStep 10 step nr (0..255)
| RPN 610        | PolyStep 11 step nr (0..255)
| RPN 611        | PolyStep 12 step nr (0..255)
| RPN 612        | PolyStep 13 step nr (0..255)
| RPN 613        | PolyStep 14 step nr (0..255)
| RPN 614        | PolyStep 15 step nr (0..255)
| RPN 615        | PolyStep 16 step nr (0..255)
| RPN 616        | PolyStep 1 pattern nr (0..127)
| RPN 617        | PolyStep 2 pattern nr (0..127)
| RPN 618        | PolyStep 3 pattern nr (0..127)
| RPN 619        | PolyStep 4 pattern nr (0..127)
| RPN 620        | PolyStep 5 pattern nr (0..127)
| RPN 621        | PolyStep 6 pattern nr (0..127)
| RPN 622        | PolyStep 7 pattern nr (0..127)
| RPN 623        | PolyStep 8 pattern nr (0..127)
| RPN 624        | PolyStep 9 pattern nr (0..127)
| RPN 625        | PolyStep 10 pattern nr (0..127)
| RPN 626        | PolyStep 11 pattern nr (0..127)
| RPN 627        | PolyStep 12 pattern nr (0..127)
| RPN 628        | PolyStep 13 pattern nr (0..127)
| RPN 629        | PolyStep 14 pattern nr (0..127)
| RPN 630        | PolyStep 15 pattern nr (0..127)
| RPN 631        | PolyStep 16 pattern nr (0..127)
| RPN 632        | PolyStep 1 track nr (0..n)
| RPN 633        | PolyStep 2 track nr (0..n)
| RPN 634        | PolyStep 3 track nr (0..n)
| RPN 635        | PolyStep 4 track nr (0..n)
| RPN 636        | PolyStep 5 track nr (0..n)
| RPN 637        | PolyStep 6 track nr (0..n)
| RPN 638        | PolyStep 7 track nr (0..n)
| RPN 639        | PolyStep 8 track nr (0..n)
| RPN 640        | PolyStep 9 track nr (0..n)
| RPN 641        | PolyStep 10 track nr (0..n)
| RPN 642        | PolyStep 11 track nr (0..n)
| RPN 643        | PolyStep 12 track nr (0..n)
| RPN 644        | PolyStep 13 track nr (0..n)
| RPN 645        | PolyStep 14 track nr (0..n)
| RPN 646        | PolyStep 15 track nr (0..n)
| RPN 647        | PolyStep 16 track nr (0..n)
| RPN 2003       | Reset external note input (e.g. arp notes) (1, 0)
| RPN 2004       | Slide Note Off (when sliding, send note off for slide base note) (1, 0)
| RPN 2100..2147 | Inject envelope value for ctl id 0..47 (temporarily overrides pattern data) (0..255)
|===========================================================

==== Ctl / Env Ids

RPNs 2100..2147 are mapped to the following pattern controllers.

[cols="1,2,6",options="header"]
|===========================================================
| Id | Name        | Description
| 0  | CTL_NOTE1   | MIDI base note 1, >0=note on, <0=note off
| 1  | CTL_NOTE2   | MIDI base note 2, >0=note on, <0=note off
| 2  | CTL_NOTE3   | MIDI base note 3, >0=note on, <0=note off
| 3  | CTL_NOTE4   | MIDI base note 4, >0=note on, <0=note off
| 4  | CTL_NOTE5   | MIDI base note 5, >0=note on, <0=note off
| 5  | CTL_VEL1    | Note-on / off velocity 1 (0..127)
| 6  | CTL_VEL2    | Note-on / off velocity 2 (0..127)
| 7  | CTL_VEL3    | Note-on / off velocity 3 (0..127)
| 8  | CTL_VEL4    | Note-on / off velocity 4 (0..127)
| 9  | CTL_VEL5    | Note-on / off velocity 5 (0..127)
| 10 | CTL_DUR1    | Note duration 1 (ticks) value 0=manual note off
| 11 | CTL_DUR2    | Note duration 1 (ticks) value 0=manual note off
| 12 | CTL_DUR3    | Note duration 1 (ticks) value 0=manual note off
| 13 | CTL_DUR4    | Note duration 1 (ticks) value 0=manual note off
| 14 | CTL_DUR5    | Note duration 1 (ticks) value 0=manual note off
| 15 | CTL_POLYAT1 | Note polyphonic aftertouch 1
| 16 | CTL_POLYAT2 | Note polyphonic aftertouch 2
| 17 | CTL_POLYAT3 | Note polyphonic aftertouch 3
| 18 | CTL_POLYAT4 | Note polyphonic aftertouch 4
| 19 | CTL_POLYAT5 | Note polyphonic aftertouch 5
| 20 | CTL_INSTR   | Instrument select (0..61 => 0..9, A-Z, a..z)
| 21 | CTL_PC      | Program change
| 22 | CTL_AT      | Channel aftertouch
| 23 | CTL_PB      | Pitch bend modulation (0..64.0..127.0)
| 24 | CTL_SLIDE   | Note slide (0=off, 1..255=speed)
| 25 | CTL_DELAY   | Track delay (#ticks)
| 26 | CTL_RETRIG  | Note retrig ($xy: x=tick delta y=#repeats)
| 27 | CTL_BPM     | Beats Per Minute, 32..255  (global!)
| 28 | CTL_MUTE    | Mute step (0=play, >0=mute)
| 29 | CTL_SEEK    | Seek to step (multiply arg by offlen ticks, 16th units by default)
| 30 | reserved    | reserved
| 31 | CTL_COLOR   | Cel color (UI only)
| 32 | CTL_USR1    | User defined controller #1
| 33 | CTL_USR2    | User defined controller #2
| 34 | CTL_USR3    | User defined controller #3
| 35 | CTL_USR4    | User defined controller #4
| 36 | CTL_USR5    | User defined controller #5
| 37 | CTL_USR6    | User defined controller #6
| 38 | CTL_USR7    | User defined controller #7
| 39 | CTL_USR8    | User defined controller #8
| 40 | CTL_USR9    | User defined controller #9
| 41 | CTL_USR10   | User defined controller #10
| 42 | CTL_USR11   | User defined controller #11
| 43 | CTL_USR12   | User defined controller #12
| 44 | CTL_USR13   | User defined controller #13
| 45 | CTL_USR14   | User defined controller #14
| 46 | CTL_USR15   | User defined controller #15
| 47 | CTL_USR16   | User defined controller #16
|===========================================================

==== PolyStep

The PolyStep feature basically turns patterns into lookup tables.

It can be used to play up to 16 arbitrary steps per tick, from arbitrary patterns and tracks.

Table entries (steps) are expected to be located at 16th note offsets. The slicing offset can be changed by editing the "Off / Len" setting in the "Play" settings (or via RPNs).

Steps are played when a "poly stepnr" event is received on one of the automation ports (RPNs 600..615).

If no "poly tracknr" and / or "poly patnr" event occurs on the same tick, the currently selected pattern is used instead, and all tracks will be played.

A typical application for this feature is to decouple note + timing info.

The PolyStep pattern contains only the notes, along with optional controller data per note, and the controlling node (which sends the RPN events that trigger the steps) contains the timing info.
The <<TrigSeq>> node for example supports dedicated (single + multi track) polystep output modes.


[.lead]
[[node_arranger]]
=== Arranger

[#img-node_arranger] 
.Arranger
[link=images/screenshots/node_arranger-06May2017a.png] 
image::images/screenshots/node_arranger-06May2017a.png[Arranger,640,400]

This node is used for arranging patterns / clips of other nodes on a timeline.

It can also be used for the live-arrangement of patterns via an Ableton Push controller.

Main features:

* Graphical, DAW-like timeline editor
** Editing tools: Select, Draw, Erase, Razor, Mute
** Multi-clip editing
** Insert snapshot of currently playing patterns
** Undo / redo (with configurable history size)
* Nodes can be assigned to specific arranger nodes
* Change / start node patterns      
** Configurable play offsets OR free-running pattern changes
* Can record pattern and mute / solo state changes
* Ableton Push clip-matrix support
** Auto-create arranger setup by scanning available node patterns
* Timeline Marker clips / regions
** Especially useful when using multiple arranger nodes
** Can be triggered by index via auto-dev note-on (C-3..)
** Can be triggered by pattern nr via auto-dev prgchg (0..n)
** Aligned to 16th notes (see 16th setting in "Play" tab)
** Marker play modes:
*** "Mrk: Change": Jump into next marker region via modulo offset
*** "Mrk: Reset": Restart next marker region from the beginning
*** "Mrk: Reset All": Restart next marker region from the beginning and force track clip start offsets


==== Auto Device Ports

[cols="1,6",options="header"]
|===========================================================
| Event          | Description
| Prg.Chg        | Change pattern / Select Marker Clip (0..127 => 01A..31D)
| RPN 510        | Mute / Unmute node (1, 0)
| RPN 512        | Mute temporary (1, 0)
| RPN 513        | Toggle Mute node (1, 0)
| RPN 514        | Toggle Mute temporary (1, 0)
| RPN 520        | Mute node (recordable in arranger) (1, 0)
| RPN 521        | Solo node (recordable in arranger) (1, 0)
| RPN 522        | Mute pipe (recordable in arranger) (1, 0)
| RPN 523        | Solo pipe (recordable in arranger) (1, 0)
| RPN 524        | Change pattern (recordable in (other) arranger) (0..127 => 01A..31D) 
| RPN 555        | Pattern Seek Offset (16th, sent by (other) arranger)
| Note C-3..G-A  | Select Marker Clip (01A..23A)
|===========================================================



[.lead]
[[node_trigseq]]
=== TrigSeq

[#img-node_trigseq] 
.TrigSeq
[link=images/screenshots/node_trigseq-06May2017a.png] 
image::images/screenshots/node_trigseq-06May2017a.png[TrigSeq,640,400]

This node is tailored towards percussion / drum sequences.

Main features:

* Up to 16 tracks
* Individual track lengths and speeds (step note durations)
* Micro timing (LMB drag step in upper area or via lshift-cursor)
** Per step
** Per track offset
* Mini undo / redo
* Non-destructive quantization
* Swing / shuffle (per track)
* Shift / Reverse / Randomize functions
* Various output modes (e.g. notes, program change+offset, temporary mutes, polystep, clock+gate, ..)
** Output mode dependent step replay arguments:
*** Arg1: Usually the velocity index (0..3) (visualized by step color)
*** Arg2: Optional per-step argument in the range 1..n (LMB drag step in lower area or via lctrl-x cursor)
*** Arg3: Per-track argument that can be offset for all tracks (see Pattern tab)
** Polystep output for tight coupling with tracker node (trigseq for timing, tracker for note/step data)
*** see "polystep_*" pipe presets
* MIDI step recording
** Via the "auto device" MIDI port
** Default base note is C-3 (36)
** Roll note is F-4 (53)
* Note repeat (roll)
** Note length can be configured per track
** Repeat can be enabled globally per pattern, per track, and / or per step
* Euclidean pattern generator
* External clock sync mode (clock, gate)
* Foldable tracks
* Micro-timing track support
** Configured in track setup ('t')
** Timing will be applied to all tracks
** Timing presets (load / save)

==== Auto Device Ports

[cols="1,6",options="header"]
|===========================================================
| Event          | Description
| Prg.Chg        | Change pattern (0..127 => 01A..31D)
| RPN 510        | Mute / Unmute node (1, 0)
| RPN 512        | Mute temporary (1, 0)
| RPN 513        | Toggle Mute node (1, 0)
| RPN 514        | Toggle Mute temporary (1, 0)
| RPN 500        | Reset (1, 0)
| RPN 501        | Run pattern (1, 0)
| RPN 502        | Clock+Gate signal (1, 0)
| RPN 503        | Clock signal (1,0)
| RPN 504        | Gate signal (1, 0)
| RPN 505        | Gate time (ticks)
| RPN 506        | Gate time multiplier (ticks)
| RPN 507        | Gate time divisor (ticks)
| RPN 509        | Restart pattern (1, 0)
| RPN 511        | Transpose (0..127 => 0=-64; 64=0; 127=+63)
| RPN 520        | Mute node (recordable in arranger) (1, 0)
| RPN 521        | Solo node (recordable in arranger) (1, 0)
| RPN 522        | Mute pipe (recordable in arranger) (1, 0)
| RPN 523        | Solo pipe (recordable in arranger) (1, 0)
| RPN 524        | Change pattern (recordable in arranger) (0..127 => 01A..31D) 
| RPN 570        | External clock enable/disable (1,0)
| RPN 550        | Pattern Offset/Length scaling (ticks)
| RPN 551        | Pattern Offset/Length multiplier (ticks)
| RPN 552        | Pattern Offset/Length divisor (ticks)
| RPN 553        | Pattern Offset (seek)
| RPN 555        | Pattern Seek Offset (16th, sent by arranger)
| RPN 582        | Speed Scaling (0..16383 => 0=*0, 8192=*1, 16383=*4)
| RPN 583        | Position Scaling (0..16383 => 0=*0, 8192=*1, 16383=*4)
| RPN 590        | Note Velocity Scaling (0..255 => 0=*1/8, 128=1, 255=*8)
| RPN 591        | Note Velocity Offset (0..255 => 0=-128, 128=0, 255=+127)
| RPN 592        | Note Duration Scaling (0..255 => 0=*1/4, 128=*1, 255=*4)
| RPN 593        | Note Duration Offset (0..255 => 0=-128, 128=0, 255=+127)
| Note C-3..D#4  | Trigger track 1..16
| Note G-4       | Mute all tracks (temporarily while key is pressed)
| Note A-4       | Global-Repeat all track steps when triggered
| Note B-4       | Global-Repeat all track steps
| Note C-5..D#6  | Repeat track 1..16 step
| Note C-7..D#8  | Mute track 1..16
|===========================================================




[.lead]
[[node_modmatrix]]
=== ModMatrix

[#img-node_modmatrix] 
.ModMatrix
[link=images/screenshots/node_modmatrix-06May2017a.png] 
image::images/screenshots/node_modmatrix-06May2017a.png[ModMatrix,640,400]

This node is the swiss army knife for transforming and combining MIDI events.

Main features:

* User definable presets
* Transform and even generate MIDI events in various ways
** Copy, test, add, mix, mul, blend, scale, logic ops (and, or, ..), clamp, wrap, select, ..
** Scale filters (phrygian, lydian, ..)
* Graphical mini programming language that allows for very complex modulations
** No typing required
** Modulation setups can also be generated from text-based script files
** Text-based scripts can be generated from modulation setups (e.g. for sharing on web forums)
* Arbitrary number of modulation entries
* Up to 4 macro controls that can be referenced in modulation entries
* Can generate (smoothed) random values
* Persistent internal registers for advanced use (e.g. LFOs)
* (Quantized) Sample&Hold of input values
* Value range conversion modifiers (e.g. 7bit => -1..1)
* Graphical input / output monitoring
* MIDI learn function


==== Auto Device Ports

[cols="1,6",options="header"]
|===========================================================
| Event          | Description
| Prg.Chg        | Change pattern (0..127 => 01A..31D)
| RPN 500        | Reset (1, 0)
| RPN 510        | Mute / Unmute node (1, 0)
| RPN 512        | Mute temporary (1, 0)
| RPN 513        | Toggle Mute node (1, 0)
| RPN 514        | Toggle Mute temporary (1, 0)
| RPN 520        | Mute node (recordable in arranger) (1, 0)
| RPN 521        | Solo node (recordable in arranger) (1, 0)
| RPN 522        | Mute pipe (recordable in arranger) (1, 0)
| RPN 523        | Solo pipe (recordable in arranger) (1, 0)
| RPN 524        | Change pattern (recordable in arranger) (0..127 => 01A..31D) 
|===========================================================


[.lead]
[[node_monitor]]
=== Monitor

[#img-node_monitor] 
.Monitor
[link=images/screenshots/node_monitor-06May2017a.png] 
image::images/screenshots/node_monitor-06May2017a.png[Monitor,640,400]

This node is meant to be used as MIDI monitor and "tape"-like scratchpad recorder.

* Capture MIDI controller input or output from previous nodes
* Input can be filtered
* Record incoming events to a ringbuffer
** Can be used as a scratchpad MIDI recorder
*** Let it run in the background to capture any "happy accident" melody / chord progressions
* Single-frame overdub recording
** Toggle frame-Lock via 'l' or 'd' shortcut
* Basic editing functions (e.g. merge or delete frames)
* Ringbuffer replay can be controlled by other nodes
** Seek absolute, seek relative, play frame, ..
** Ringbuffer frames can be triggered via auto-dev note-on (C-3..)
*** Dynamic trigger note duration: Override note duration
*** Velocity modes: Keep, Replace, Multiply, Add
* Ringbuffer replay can be transformed to other MIDI device+channel

==== Auto Device Ports

[cols="1,6",options="header"]
|===========================================================
| Event          | Description
| Prg.Chg        | Change pattern (0..127 => 01A..31D)
| RPN 500        | Reset (1, 0)
| RPN 501        | Run pattern (1, 0)
| RPN 504        | Gate signal (1, 0)
| RPN 509        | Restart pattern (1, 0)
| RPN 510        | Mute / Unmute node (1, 0)
| RPN 511        | Transpose (0..127 => 0=-64; 64=0; 127=+63)
| RPN 512        | Mute temporary (1, 0)
| RPN 513        | Toggle Mute node (1, 0)
| RPN 514        | Toggle Mute temporary (1, 0)
| RPN 520        | Mute node (recordable in arranger) (1, 0)
| RPN 521        | Solo node (recordable in arranger) (1, 0)
| RPN 522        | Mute pipe (recordable in arranger) (1, 0)
| RPN 523        | Solo pipe (recordable in arranger) (1, 0)
| RPN 524        | Change pattern (recordable in (other) arranger) (0..127 => 01A..31D) 
| RPN 553        | Pattern Offset (seek to frame idx)
| RPN 554        | Pattern length (number of frames)
| RPN 555        | Pattern Seek Offset (16th, sent by (other) arranger)
| RPN 556        | Pattern Seek Relative Pre FrameIdx (0=prev, 1=next, >=2 = val - 0x80)
| RPN 557        | Pattern Seek Relative Post FrameIdx (0=prev, 1=next, >=2 = val - 0x80)
| RPN 558        | Pattern Offset (#frames, added to base offset set via RPN 553)
| RPN 590        | Note Velocity Scaling (0..255 => 0=*1/8, 128=1, 255=*8)
| RPN 591        | Note Velocity Offset (0..255 => 0=-128, 128=0, 255=+127)
| RPN 592        | Note Duration Scaling (0..255 => 0=*1/4, 128=*1, 255=*4)
| RPN 593        | Note Duration Offset (0..255 => 0=-128, 128=0, 255=+127)
| Note C-3..G-A  | Trigger frame 0..n notes (+optionally scale velocities and / or use dynamic note durations)
|===========================================================



[.lead]
[[node_ctlmorph]]
=== CtlMorph

[#img-node_ctlmorph] 
.CtlMorph
[link=images/screenshots/node_ctlmorph-06May2017a.png] 
image::images/screenshots/node_ctlmorph-06May2017a.png[CtlMorph,640,400]

This node can blend between user definable controller sets, e.g. for patch morphing.

Main features:

* Supports all regular MIDI controller message types (CC / (N)RPN)
* Up to 8 controller groups per pattern
* Arbitrary number of controllers per group
* Min / Max / Center values per controller
* Master input controller to control min..max blending (per group)
* Symmetric and asymmetric blending (configurable per controller)
* Various utility functions to create morphs between controller sets
* Can copy current MIDI output state to controller set
* Controller rate limiter and temporal distribution
* MIDI learn function
* Cyclic Multi-Morph
** Pattern Offset, Range, and morph position
** The node can be configured to send an initial morph position when it is being reset
** All parameters can be overridden by sending RPNs to the auto device MIDI port(s)

==== Auto Device Ports

[cols="1,6",options="header"]
|===========================================================
| Event          | Description
| Prg.Chg        | Change pattern (0..127 => 01A..31D)
| RPN 100..199   | Redirected to current group output entry 1..100 "t" (normalized, 0..16383)
| RPN 510        | Mute / Unmute node (1, 0)
| RPN 512        | Mute temporary (1, 0)
| RPN 513        | Toggle Mute node (1, 0)
| RPN 514        | Toggle Mute temporary (1, 0)
| RPN 520        | Mute node (recordable in arranger) (1, 0)
| RPN 521        | Solo node (recordable in arranger) (1, 0)
| RPN 522        | Mute pipe (recordable in arranger) (1, 0)
| RPN 523        | Solo pipe (recordable in arranger) (1, 0)
| RPN 9000       | Cyclic morph pattern offset (1A..30D)
| RPN 9001       | Cyclic morph pattern range (2..121)
| RPN 9002       | Cyclic morph position (normalized, 0..16383)
| RPN 9100       | Group 1 Reset (1)
| RPN 9200       | Group 2 Reset (1)
| RPN 9300       | Group 3 Reset (1)
| RPN 9400       | Group 4 Reset (1)
| RPN 9500       | Group 5 Reset (1)
| RPN 9600       | Group 6 Reset (1)
| RPN 9700       | Group 7 Reset (1)
| RPN 9800       | Group 8 Reset (1)
|===========================================================

IMPORTANT: For the "Copy MIDI output state to center values" (lctrl-o) Tools menu function to work as expected, the synth must be set to local off and a MIDI morph scene must be created that routes events from the synth's input device to the synth's output device (software echo).


[.lead]
[[node_auto]]
=== Auto

[#img-node_auto] 
.Auto
[link=images/screenshots/node_auto-06May2017a.png] 
image::images/screenshots/node_auto-06May2017a.png[Auto,640,400]

This node is dedicated to controller automation envelopes.

Main features:

* Arbitrary number of controller tracks
* Arbitrary number of lanes per track
* Multiple curves can be stacked and combined via various operators
** similar to layers in a graphics editor like Photoshop
* MIDI learn function

==== Auto Device Ports

[cols="1,6",options="header"]
|===========================================================
| Event          | Description
| Prg.Chg        | Change pattern (0..127 => 01A..31D)
| RPN 500        | Reset (1, 0)
| RPN 509        | Restart pattern (1, 0)
| RPN 510        | Mute / Unmute node (1, 0)
| RPN 511        | Transpose (0..127 => 0=-64; 64=0; 127=+63)
| RPN 512        | Mute temporary (1, 0)
| RPN 513        | Toggle Mute node (1, 0)
| RPN 514        | Toggle Mute temporary (1, 0)
| RPN 520        | Mute node (recordable in arranger) (1, 0)
| RPN 521        | Solo node (recordable in arranger) (1, 0)
| RPN 522        | Mute pipe (recordable in arranger) (1, 0)
| RPN 523        | Solo pipe (recordable in arranger) (1, 0)
| RPN 524        | Change pattern (recordable in (other) arranger) (0..127 => 01A..31D) 
| RPN 555        | Pattern Seek Offset (16th, sent by (other) arranger)
| RPN 590        | Note Velocity Scaling (0..255 => 0=*1/8, 128=1, 255=*8)
| RPN 591        | Note Velocity Offset (0..255 => 0=-128, 128=0, 255=+127)
| RPN 592        | Note Duration Scaling (0..255 => 0=*1/4, 128=*1, 255=*4)
| RPN 593        | Note Duration Offset (0..255 => 0=-128, 128=0, 255=+127)
|===========================================================


[.lead]
[[node_keymap]]
=== KeyMap

[#img-node_keymap] 
.KeyMap
[link=images/screenshots/node_keymap-06May2017a.png] 
image::images/screenshots/node_keymap-06May2017a.png[KeyMap,640,400]

This is a utility node for mapping note on/off input events to various output events.

Main features:

* Input events can be mapped to output note / polyphonic key pressure / pitchbend / modwheel / expression / breathcontrol / program change events

* For example, this node can be used to select patterns via MIDI keys, or create keyboard splits
* Different kinds of velocity curves can be applied to outgoing note events


==== Auto Device Ports

[cols="1,6",options="header"]
|===========================================================
| Event          | Description
| Prg.Chg        | Change pattern (0..127 => 01A..31D)
| RPN 510        | Mute / Unmute node (1, 0)
| RPN 512        | Mute temporary (1, 0)
| RPN 513        | Toggle Mute node (1, 0)
| RPN 514        | Toggle Mute temporary (1, 0)
| RPN 520        | Mute node (recordable in arranger) (1, 0)
| RPN 521        | Solo node (recordable in arranger) (1, 0)
| RPN 522        | Mute pipe (recordable in arranger) (1, 0)
| RPN 523        | Solo pipe (recordable in arranger) (1, 0)
| RPN 524        | Change pattern (recordable in (other) arranger) (0..127 => 01A..31D) 
|===========================================================



[.lead]
[[node_monopoly]]
=== MonoPoly

[#img-node_monopoly] 
.MonoPoly
[link=images/screenshots/node_monopoly-06May2017a.png] 
image::images/screenshots/node_monopoly-06May2017a.png[MonoPoly,640,400]

This node distributes incoming note and controller events to multiple output devices.

Main features:

* Unison, Round Robin, Random, Newest, Oldest, Highest, Lowest, .. trigger modes
* Can mirror output events to another device (for layering)
* Originally developed for use with a Vermona Perfourmer synthesizer
** ..but can be used with any other MIDI synth, too

NOTE: The easiest way to copy all events within a pipe from one MIDI port to another is to use a MonoPoly node with the trigger mode set to "Unison"


==== Auto Device Ports

[cols="1,6",options="header"]
|===========================================================
| Event          | Description
| Prg.Chg        | Change pattern (0..127 => 01A..31D)
| RPN 510        | Mute / Unmute node (1, 0)
| RPN 512        | Mute temporary (1, 0)
| RPN 513        | Toggle Mute node (1, 0)
| RPN 514        | Toggle Mute temporary (1, 0)
| RPN 520        | Mute node (recordable in arranger) (1, 0)
| RPN 521        | Solo node (recordable in arranger) (1, 0)
| RPN 522        | Mute pipe (recordable in arranger) (1, 0)
| RPN 523        | Solo pipe (recordable in arranger) (1, 0)
| RPN 524        | Change pattern (recordable in (other) arranger) (0..127 => 01A..31D) 
| RPN 4000       | Next output idx (0..3)
|===========================================================


[.lead]
[[node_buffer]]
=== Buffer

[#img-node_buffer] 
.Buffer
[link=images/screenshots/node_buffer-06May2017a.png] 
image::images/screenshots/node_buffer-06May2017a.png[Buffer,640,400]

This node records incoming events and replays them using up to four play heads (fugue-like).

Main features:

* Play heads can be transposed and filtered by various scales (major, minor, pentatonic, ..)
* Play heads can cycle through different parts of the recording buffer
* Configurable recording raster sizes (1/64 .. 1/1)
* Hold mode
* Double-buffer mode
* Arpeggiator mode

==== Auto Device Ports

[cols="1,6",options="header"]
|===========================================================
| Event          | Description
| Prg.Chg        | Change pattern (0..127 => 01A..31D)
| RPN 510        | Mute / Unmute node (1, 0)
| RPN 512        | Mute temporary (1, 0)
| RPN 513        | Toggle Mute node (1, 0)
| RPN 514        | Toggle Mute temporary (1, 0)
| RPN 520        | Mute node (recordable in arranger) (1, 0)
| RPN 521        | Solo node (recordable in arranger) (1, 0)
| RPN 522        | Mute pipe (recordable in arranger) (1, 0)
| RPN 523        | Solo pipe (recordable in arranger) (1, 0)
| RPN 524        | Change pattern (recordable in (other) arranger) (0..127 => 01A..31D) 
| RPN 6100       | Buffer 1 enable (1, 0)
| RPN 6101       | Buffer 1 disable (1, 0)
| RPN 6200       | Buffer 2 enable (1, 0)
| RPN 6201       | Buffer 2 disable (1, 0)
| RPN 6300       | Buffer 3 enable (1, 0)
| RPN 6301       | Buffer 3 disable (1, 0)
| RPN 6400       | Buffer 4 enable (1, 0)
| RPN 6401       | Buffer 4 disable (1, 0)
|===========================================================



[.lead]
[[node_analogrytm]]
=== AnalogRytm

[#img-node_analogrytm] 
.AnalogRytm
[link=images/screenshots/node_analogrytm-06May2017b.png] 
image::images/screenshots/node_analogrytm-06May2017b.png[AnalogRytm,640,400]

This is a utility node that was especially designed for Elektron's Analog Rytm drum computer / synthesizer.

* Receive, send, manage patterns, kits, mute and performance controller states
* Send track sounds
* Map Analog Rytm hardware interface controls to arbitrary MIDI events or actions (e.g. load kit/mute state)


==== Auto Device Ports

[cols="1,6",options="header"]
|===========================================================
| Event          | Description
| RPN 510        | Mute / Unmute node (1, 0)
| RPN 512        | Mute temporary (1, 0)
| RPN 513        | Toggle Mute node (1, 0)
| RPN 514        | Toggle Mute temporary (1, 0)
| RPN 520        | Mute node (recordable in arranger) (1, 0)
| RPN 521        | Solo node (recordable in arranger) (1, 0)
| RPN 522        | Mute pipe (recordable in arranger) (1, 0)
| RPN 523        | Solo pipe (recordable in arranger) (1, 0)
| RPN 8000       | Snapshot select (0..127)
| RPN 8001       | Kit Send (uid 0..n)
| RPN 8002       | Kit Mix (send unlocked tracks) (uid 0..n)
| RPN 8010       | Kit Send BD1 (kit uid 0..n)
| RPN 8011       | Kit Send SD2 (kit uid 0..n)
| RPN 8012       | Kit Send RS3 (kit uid 0..n)
| RPN 8013       | Kit Send CP4 (kit uid 0..n)
| RPN 8014       | Kit Send BT5 (kit uid 0..n)
| RPN 8015       | Kit Send LT6 (kit uid 0..n)
| RPN 8016       | Kit Send MT7 (kit uid 0..n)
| RPN 8017       | Kit Send HT8 (kit uid 0..n)
| RPN 8018       | Kit Send CH9 (kit uid 0..n)
| RPN 8019       | Kit Send OH10 (kit uid 0..n)
| RPN 8020       | Kit Send CY11 (kit uid 0..n)
| RPN 8021       | Kit Send CB12 (kit uid 0..n)
|===========================================================


[.lead]
[[node_delay]]
=== Delay

[#img-node_delay] 
.Delay
[link=images/screenshots/node_delay-06May2017a.png] 
image::images/screenshots/node_delay-06May2017a.png[Delay,640,400]

This node delays incoming MIDI events.

Main features:

* Input device and channel filter
* Configure delay time as ticks or 16ths
* Automate delay time
** Hold automated delay time for "n" ticks (or indefinitely)
* Applications:
** MIDI echoes
** "Swing"


==== Auto Device Ports

[cols="1,6",options="header"]
|===========================================================
| Event          | Description
| RPN 510        | Mute / Unmute node (1, 0)
| RPN 512        | Mute temporary (1, 0)
| RPN 513        | Toggle Mute node (1, 0)
| RPN 514        | Toggle Mute temporary (1, 0)
| RPN 520        | Mute node (recordable in arranger) (1, 0)
| RPN 521        | Solo node (recordable in arranger) (1, 0)
| RPN 522        | Mute pipe (recordable in arranger) (1, 0)
| RPN 523        | Solo pipe (recordable in arranger) (1, 0)
| RPN 13000      | Delay Ticks (0..n)
| RPN 13001      | Delay 256th (0..n)
|===========================================================


[.lead]
[[node_proxy]]
=== Proxy

[#img-node_proxy] 
.Proxy
[link=images/screenshots/node_proxy-26May2017a.png] 
image::images/screenshots/node_proxy-26May2017a.png[Proxy,640,400]

The proxy node acts as a link to synth-specific editors.

It is currently supported by the builtin Prophet 12 editor and has the following features:

* Temporary parameter changes via NRPN
** The NRPNs are received on the MIDI port configured as "Input"
*** The MIDI port should be set to the "Prophet 12" synth profile in the device configuration
** When the replay starts, the patch automatically reverts to its original configuration
*** The patch can be reset at any time by sending the "Com: Reset" RPN to the "Auto Device"
* Virtual program changes and bank selects
** Received as RPNs on the MIDI port configured as "Auto Device"
*** The MIDI port should be set to the "internal" synth profile in the device configuration
** The program is changed by sending the differences to the current patch via NRPN
* Realtime morphing between patches
** Either by setting the src / dest program and bank and the blend amount via multiple RPNs
** Or by using the multi-morph position RPN to morph between patches in the project-specific bank P17
*** A single RPN message will configure the src / dest / blend amount settings in this case
**** RPN value 0 = first patch, 16383 = last patch in the morph range
*** The morph program offset and range is configured in the UI and it can be overridden via RPNs
*** The node can be configured to send an initial morph position when it is reset
** The morph settings are received as RPNs on the MIDI port configured as "Auto Device" (A and / or B)


==== Auto Device Ports

[cols="1,6",options="header"]
|===========================================================
| Event          | Description
| RPN 500        | Reset (1, 0)
| RPN 510        | Mute / Unmute node (1, 0)
| RPN 512        | Mute temporary (1, 0)
| RPN 513        | Toggle Mute node (1, 0)
| RPN 514        | Toggle Mute temporary (1, 0)
| RPN 520        | Mute node (recordable in arranger) (1, 0)
| RPN 521        | Solo node (recordable in arranger) (1, 0)
| RPN 522        | Mute pipe (recordable in arranger) (1, 0)
| RPN 523        | Solo pipe (recordable in arranger) (1, 0)
| RPN 14000      | Proxy Bank Select (morph single) (0..127)
| RPN 14001      | Proxy Program Change (morph single) (0..127)
| RPN 14002      | Proxy Bank Select Morph Dest (morph single) (0..127)
| RPN 14003      | Proxy Program Change Morph Dest (morph single) (0..127)
| RPN 14004      | Proxy Morph Amount Dest (morph single) (0..16383)
| RPN 14020      | Proxy Multi-Morph Offset (0..n)
| RPN 14021      | Proxy Multi-Morph Range (1..n)
| RPN 14022      | Proxy Multi-Morph Position (0..16383)
|===========================================================


[[autodevice]]
== AutoDevice MIDI Implementation Overview
The following table shows which nodes react to which "auto device" MIDI events (see node "Play" tabs).

Please notice that some nodes support node-specific events which are *not* listed in this table. Please refer to the application tooltips (RPN selection) or the "midi_synth_profiles/internal.msp" text file for further info.

Some nodes (e.g. AnalogRytm, Auto, Buffer, ModMatrix, MonoPoly, Proxy) also use additional input devices that support additional MIDI events.

[cols="^.>,13*",options="header"]
|===========================================================
| Event
|+++<div class=upright>AnalogRytm</div>+++
|+++<div class=upright>Arranger</div>+++
|+++<div class=upright>Auto</div>+++
|+++<div class=upright>Buffer</div>+++
|+++<div class=upright>CtlMorph</div>+++
|+++<div class=upright>Delay</div>+++
|+++<div class=upright>Keymap</div>+++
|+++<div class=upright>ModMatrix</div>+++
|+++<div class=upright>Monitor</div>+++
|+++<div class=upright>MonoPoly</div>+++
|+++<div class=upright>Proxy</div>+++
|+++<div class=upright>Tracker</div>+++
|+++<div class=upright>TrigSeq</div>+++

| Note
| -
| image:images/yes.png[y]
| -
| image:images/yes.png[y]
| -
| -
| image:images/yes.png[y]
| -
| image:images/yes.png[y]
| -
| -
| image:images/yes.png[y]
| image:images/yes.png[y]

| PrgChg
| -
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| -
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| -
| image:images/yes.png[y]
| image:images/yes.png[y]

| RPN Com: Reset
| -
| -
| image:images/yes.png[y]
| -
| -
| -
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| -
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]

| RPN Com: Run
| -
| -
| image:images/yes.png[y]
| -
| -
| -
| -
| -
| image:images/yes.png[y]
| -
| -
| image:images/yes.png[y]
| image:images/yes.png[y]

| RPN Com: Clock + Gate
| -
| -
| -
| -
| -
| -
| -
| -
| -
| -
| -
| image:images/yes.png[y]
| image:images/yes.png[y]

| RPN Com: Clock
| -
| -
| -
| -
| -
| -
| -
| -
| -
| -
| -
| image:images/yes.png[y]
| image:images/yes.png[y]

| RPN Com: Gate
| -
| -
| -
| -
| -
| -
| -
| -
| image:images/yes.png[y]
| -
| -
| image:images/yes.png[y]
| image:images/yes.png[y]

| RPN Com: Gatetime
| -
| -
| -
| -
| -
| -
| -
| -
| -
| -
| -
| image:images/yes.png[y]
| image:images/yes.png[y]

| RPN Com: Gatetime Mul
| -
| -
| -
| -
| -
| -
| -
| -
| -
| -
| -
| image:images/yes.png[y]
| image:images/yes.png[y]

| RPN Com: Gatetime Div
| -
| -
| -
| -
| -
| -
| -
| -
| -
| -
| -
| image:images/yes.png[y]
| image:images/yes.png[y]

| RPN Com: Retrig
| -
| -
| -
| -
| -
| -
| -
| -
| -
| -
| -
| image:images/yes.png[y]
| -

| RPN Com: Restart
| -
| -
| image:images/yes.png[y]
| -
| -
| -
| -
| -
| image:images/yes.png[y]
| -
| -
| image:images/yes.png[y]
| image:images/yes.png[y]

| RPN Com: Mute
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]

| RPN Com: Transpose
| -
| -
| -
| -
| -
| -
| -
| -
| image:images/yes.png[y]
| -
| -
| image:images/yes.png[y]
| image:images/yes.png[y]

| RPN Com: Mute Temp
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]

| RPN Com: Mute Toggle
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]

| RPN Com: Mute Temp Toggle
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]

| RPN Com: UI Node Mute
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]

| RPN Com: UI Node Solo
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]

| RPN Com: UI Pipe Mute
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]

| RPN Com: UI Pipe Solo
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]

| RPN Com: UI Node PrgChg
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| -
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| image:images/yes.png[y]
| -
| image:images/yes.png[y]
| image:images/yes.png[y]

| RPN Com: Off/Len Scale
| -
| -
| -
| -
| -
| -
| -
| -
| -
| -
| -
| image:images/yes.png[y]
| image:images/yes.png[y]

| RPN Com: Off/Len Multiplier
| -
| -
| -
| -
| -
| -
| -
| -
| -
| -
| -
| image:images/yes.png[y]
| image:images/yes.png[y]

| RPN Com: Off/Len Divisor
| -
| -
| -
| -
| -
| -
| -
| -
| -
| -
| -
| image:images/yes.png[y]
| image:images/yes.png[y]

| RPN Com: Offset
| -
| -
| -
| -
| -
| -
| -
| -
| image:images/yes.png[y]
| -
| -
| image:images/yes.png[y]
| image:images/yes.png[y]

| RPN Com: Length
| -
| -
| -
| -
| -
| -
| -
| -
| image:images/yes.png[y]
| -
| -
| image:images/yes.png[y]
| -

| RPN Com: Seek Offset
| -
| image:images/yes.png[y]
| image:images/yes.png[y]
| -
| -
| -
| -
| -
| image:images/yes.png[y]
| -
| -
| image:images/yes.png[y]
| -

| RPN Com: Seek Relative (Pre)
| -
| -
| -
| -
| -
| -
| -
| -
| image:images/yes.png[y]
| -
| -
| image:images/yes.png[y]
| -

| RPN Com: Seek Relative (Post)
| -
| -
| -
| -
| -
| -
| -
| -
| image:images/yes.png[y]
| -
| -
| image:images/yes.png[y]
| -

| RPN Com: Offset Add
| -
| -
| -
| -
| -
| -
| -
| -
| image:images/yes.png[y]
| -
| -
| image:images/yes.png[y]
| -

| RPN Com: Offset Queued
| -
| -
| -
| -
| -
| -
| -
| -
| -
| -
| -
| image:images/yes.png[y]
| -

| RPN Com: Length Queued
| -
| -
| -
| -
| -
| -
| -
| -
| -
| -
| -
| image:images/yes.png[y]
| -

| RPN Com: Sig Beats
| -
| -
| -
| -
| -
| -
| -
| -
| -
| -
| -
| image:images/yes.png[y]
| -

| RPN Com: Sig NoteLen
| -
| -
| -
| -
| -
| -
| -
| -
| -
| -
| -
| image:images/yes.png[y]
| -

| RPN Com: Speed
| -
| -
| image:images/yes.png[y]
| -
| -
| -
| -
| -
| image:images/yes.png[y]
| -
| -
| image:images/yes.png[y]
| image:images/yes.png[y]

| RPN Com: Position Scale
| -
| -
| image:images/yes.png[y]
| -
| -
| -
| -
| -
| image:images/yes.png[y]
| -
| -
| image:images/yes.png[y]
| image:images/yes.png[y]

| RPN Com: Vel Scale
| -
| -
| image:images/yes.png[y]
| -
| -
| -
| -
| -
| image:images/yes.png[y]
| -
| -
| image:images/yes.png[y]
| image:images/yes.png[y]

| RPN Com: Vel Offset
| -
| -
| image:images/yes.png[y]
| -
| -
| -
| -
| -
| image:images/yes.png[y]
| -
| -
| image:images/yes.png[y]
| image:images/yes.png[y]

| RPN Com: Dur Scale
| -
| -
| image:images/yes.png[y]
| -
| -
| -
| -
| -
| image:images/yes.png[y]
| -
| -
| image:images/yes.png[y]
| image:images/yes.png[y]

| RPN Com: Dur Offset
| -
| -
| image:images/yes.png[y]
| -
| -
| -
| -
| -
| image:images/yes.png[y]
| -
| -
| image:images/yes.png[y]
| image:images/yes.png[y]

| RPN Com: PolyStep *
| -
| -
| -
| -
| -
| -
| -
| -
| -
| -
| -
| image:images/yes.png[y]
| -

|===========================================================


[[keyboard]]
== Keyboard Shortcuts

NOTE: These lists assume a US keyboard layout. On a german keyboard for example, swap 'z' for 'y', ']' for '*', '``' for '^', and so on.


[.lead]
[[kbd_global]]
=== Global
[cols="^2,1*4"]
|===========================================================
| Key Sequence             | Description
| *F3*                     | _Select previous MIDI morph scene "A"_
| *F4*                     | _Select next MIDI morph scene "A"_
| *F5*                     | _Select previous MIDI morph scene "B"_
| *F6*                     | _Select next MIDI morph scene "B"_
| *F7*                     | _Select previous MIDI morph scene "C"_
| *F8*                     | _Select next MIDI morph scene "C"_
| *F9*                     | _Select previous MIDI morph scene "D"_
| *F10*                    | _Select next MIDI morph scene "D"_
| *lalt - F3*              | _Select previous MIDI morph scene "E"_
| *lalt - F4*              | _Select next MIDI morph scene "E"_
| *lalt - F5*              | _Select previous MIDI morph scene "F"_
| *lalt - F6*              | _Select next MIDI morph scene "F"_
| *lalt - F7*              | _Select previous MIDI morph scene "G"_
| *lalt - F8*              | _Select next MIDI morph scene "G"_
| *lalt - F9*              | _Select previous MIDI morph scene "H"_
| *lalt - F10*             | _Select next MIDI morph scene "H"_
| *F12*                    | _Toggle metronome click_
| *lctrl - x (NUMPAD) +*   | _Show BPM dialog_
| (NUMPAD) *ENTER*         | _Start/stop replay_
| (NUMPAD) lshift - *ENTER*| _Start/stop replay and send/don't send MMC record event(s)_
| (NUMPAD) *1*             | _Transport: Go to previous bar_
| (NUMPAD) *2*             | _Transport: Go to next bar_
| (NUMPAD) *3*             | _Transport: Toggle cycle/loop_
| (NUMPAD) *4*             | _Transport: Go to previous marker_
| (NUMPAD) *6*             | _Transport: Go to next marker_
| (NUMPAD) *7*             | _Transport: Go to previous beat_
| (NUMPAD) *9*             | _Transport: Go to next beat_
| (NUMPAD) */*             | _Transport: Decrease cycle length_
| (NUMPAD) ***             | _Transport: Increase cycle length_
| (NUMPAD) *.*             | _Transport: Save scratch marker_
| (NUMPAD) *0*             | _Transport: Load scratch marker_
| (NUMPAD) *5*             | _Transport: Load marker (key 0..9 follows)_
| (NUMPAD) *8*             | _Transport: Save marker (key 0..9 follows)_
| (NUMPAD) *-*             | _Decrease BPM (beats per minute)_
| (NUMPAD) *lshift - -*    | _Half BPM (beats per minute)_
| (NUMPAD) *+*             | _Increase BPM (beats per minute)_
| (NUMPAD) *lshift - +*    | _Double BPM (beats per minute)_
| (NUMPAD) *lctrl - 1*     | _Show pipemap page_
| (NUMPAD) *lctrl - 2*     | _Show preferences page_
| (NUMPAD) *lctrl - 3*     | _Show current node editor page_
| (NUMPAD) *lctrl - 4*     | _Show MIDI devices setup page_
| (NUMPAD) *lctrl - 5*     | _Show project page_
| (NUMPAD) *lctrl - 6*     | _Show MIDI map page_
| (NUMPAD) *lctrl - 7*     | _Show piperoot page_
| (NUMPAD) *lctrl - 8*     | _Show current pipe page_
| (NUMPAD) *lctrl - 9*     | _Show audiotool page_
| (NUMPAD) *lctrl - 0*     | _Show SysEx page_
| (NUMPAD) *lctrl - ENTER* | _Show MIDI input monitor page_
| (NUMPAD) *lctrl - +*     | _Show MIDI output monitor page_
| (NUMPAD) *lctrl - x 0*   | _Select multi-scene 1 OR subsong 0 (main) [see config]_
| (NUMPAD) *lctrl - x 1*   | _Select multi-scene 2 OR subsong 1 (main) [see config]_
| (NUMPAD) *lctrl - x 2*   | _Select multi-scene 3 OR subsong 2 (main) [see config]_
| (NUMPAD) *lctrl - x 3*   | _Select multi-scene 4 OR subsong 3 (main) [see config]_
| (NUMPAD) *lctrl - x 4*   | _Select multi-scene 5 OR subsong 4 (main) [see config]_
| (NUMPAD) *lctrl - x 5*   | _Select multi-scene 6 OR subsong 5 (main) [see config]_
| (NUMPAD) *lctrl - x 6*   | _Select multi-scene 7 OR subsong 6 (main) [see config]_
| (NUMPAD) *lctrl - x 7*   | _Select multi-scene 8 OR subsong 7 (main) [see config]_
| (NUMPAD) *lctrl - x 8*   | _Select multi-scene 9 OR subsong 8 (main) [see config]_
| (NUMPAD) *lctrl - x 9*   | _Select multi-scene 10 OR subsong 9 (main) [see config]_
| *b*                      | _Go to previous page (back)_
| *n*                      | _Go to next page (forward)_
| *q*                      | _Go to previous or parent page_
| *g*                      | _Force global MIDI map context (as long as key is held down)_
| *lctrl - m*              | _Edit current MIDI map context_
| *lctrl - s*              | _Toggle pipe solo_
| *lctrl - d*              | _Toggle node solo_
| *lctrl - lshift - d*     | _Toggle node mute_
| *right menu key*         | _Toggle keyboard focus selection mode_
| *`*: (once)              | _Edit controller aliases (^ on german keyboards)_
| *`*: (twice)             | _Edit current MIDI morph scene (^ on german keyboards)_
| *RIGHT MENU KEY*         | _Toggle keyboard focus selection mode_
| *ESC*                    | _Go to previous or parent page / cancel dialog_
| *lctrl - x x*            | _Bring 'Eureka' window to front (if process is running)_
| *lshift - q*             | _Quit application (dialog)_
|===========================================================


[.lead]
[[kbd_pipemap]]
=== PipeMap

[cols="^2,1*4"]
|===========================================================
| Key Sequence          | Description
| *UP*                  | _Select previous pipe_
| *DOWN*                | _Select next pipe_
| *LEFT*                | _Select previous pipe or node_
| *RIGHT*               | _Select next pipe or node_
| *lshift - HOME*       | _Select first node_
| *lshift - END*        | _Select last node_
| *PAGEUP*              | _Select first node_
| *PAGEDOWN*            | _Select last node_
| *lshift - PAGEUP*     | _Select next action_
| *lshift - PAGEDOWN*   | _Select previous action_
| *1*                   | _Select 'EXEC' action_
| *2*                   | _Select 'EDIT' action_
| *3*                   | _Select 'MUTE' action_
| *4*                   | _Select 'SOLO' action_
| *5*                   | _Select 'MOVE' action_
| *r*                   | _Show pipe root_
| *a*                   | _Show pipe or node context menu_
| *s*                   | _Toggle pipe or node solo_
| *lctrl - s*           | _Toggle pipe solo_
| *d*                   | _Toggle pipe or node mute_
| *lctrl - d*           | _Toggle pipe mute_
| *INSERT*              | _Insert new pipe or node_
| *lshift - INSERT*     | _Clone pipe or node_
| *DELETE*              | _Delete pipe or node_
| *lshift - LEFT*       | _Move node to the left_
| *lshift - RIGHT*      | _Move node to the right_
| *lshift - UP*         | _Move pipe up_
| *lshift - DOWN*       | _Move pipe down_
| *f*                   | _Select next arranger node_
| *lctrl - lshift - c*  | _Edit node comment_
| *HOME*                | _Select next used node pattern_
| *END*                 | _Select previous used node pattern_
| *(NUMPAD) lshift - 1* | _Select used node pattern #1_
| *(NUMPAD) lshift - 2* | _Select used node pattern #2_
| *(NUMPAD) lshift - 3* | _Select used node pattern #3_
| *(NUMPAD) lshift - 4* | _Select used node pattern #4_
| *(NUMPAD) lshift - 5* | _Select used node pattern #5_
| *(NUMPAD) lshift - 6* | _Select used node pattern #6_
| *(NUMPAD) lshift - 7* | _Select used node pattern #7_
| *(NUMPAD) lshift - 8* | _Select used node pattern #8_
| *(NUMPAD) lshift - 9* | _Select used node pattern #9_
| *(NUMPAD) lshift - 0* | _Select empty pattern (--/)_
|===========================================================


[.lead]
[[kbd_node]]
=== Node (common)

[cols="^2,1*4"]
|===========================================================
| Key Sequence             | Description
| *lctrl - lshift - LEFT*  | _Select previous node_
| *lctrl - lshift - RIGHT* | _Select next node_
| *lctrl - lshift - UP*    | _Select previous pipe_
| *lctrl - lshift - DOWN*  | _Select next pipe_
| *lctrl - g*              | _Enter pattern number_
| *HOME*                   | _Select next edit+play pattern (+1)_
| *lctrl - HOME*           | _Select next edit+play pattern group (+4)_
| *lctrl - lshift - HOME*  | _Select next used pattern_
| *END*                    | _Select previous edit+play pattern (-1)_
| *lctrl - END*            | _Select previous edit+play pattern group (-4)_
| *lctrl - lshift - END*   | _Select previous used pattern_
| *lctrl - x 1*            | _Set pipenode 'A'_
| *lctrl - x 2*            | _Set pipenode 'B'_
| *lctrl - x d*            | _Toggle pattern manager_
| *lctrl - x z*            | _Jump between pipenodes 'A' / 'B' ('y' on german keyboards)_
| *lctrl - x END*          | _Global program change (master pipe, auto dev+ch A)_
| *lctrl - x HOME*         | _Global program change (master pipe, auto dev+ch B)_
| *lctrl - lshift - c*     | _Edit node comment_
| *lctrl - c*              | _Copy pattern to clipboard_
| *lctrl - w*              | _Cut pattern to clipboard_
| *lctrl - v*              | _Paste pattern clipboard_
| *lctrl - r*              | _Clone pattern (4)_
| *lctrl - lshift - r*     | _Clone pattern (1)_
| *lctrl - x F3*           | _Delete pattern_
| *lctrl - s*              | _Solo pipe_
| *lctrl - d*              | _Solo node (within pipe)_
| *lctrl - lshift - s*     | _Mute pipe_
| *lctrl - lshift - d*     | _Mute node_
| *(NUMPAD) lshift - 1*    | _Select used node pattern #1_
| *(NUMPAD) lshift - 2*    | _Select used node pattern #2_
| *(NUMPAD) lshift - 3*    | _Select used node pattern #3_
| *(NUMPAD) lshift - 4*    | _Select used node pattern #4_
| *(NUMPAD) lshift - 5*    | _Select used node pattern #5_
| *(NUMPAD) lshift - 6*    | _Select used node pattern #6_
| *(NUMPAD) lshift - 7*    | _Select used node pattern #7_
| *(NUMPAD) lshift - 8*    | _Select used node pattern #8_
| *(NUMPAD) lshift - 9*    | _Select used node pattern #9_
| *(NUMPAD) lshift - 0*    | _Select empty pattern (--/)_
|===========================================================


[.lead]
[[kbd_arranger]]
=== Arranger

==== Global

[cols="^2,1*4"]
|===========================================================
| Key Sequence             | Description
| *1*                      | _Select 'Scene' tab_
| *2*                      | _Select 'Pattern' tab_
| *3*                      | _Select 'Timeline' tab_
| *4*                      | _Select 'Play' tab_
|===========================================================


==== Timeline | Tool Selection

NOTE: in grid cursor mode ('x'), the draw/razor/mute tools are executed immediately

[cols="^2,1*4"]
|===========================================================
| Key Sequence             | Description
| *q*                      | _Select 'Select' / 'Move' tool_
| *w*                      | _Select 'Draw' tool_
| *e*                      | _Select 'Erase' tool_
| *r*                      | _Select 'Razor' tool_
| *t*                      | _Select 'Mute' tool_
|===========================================================


==== Timeline | Common

[cols="^2,1*4"]
|===========================================================
| Key Sequence             | Description
| *RETURN*                 | _Edit first selected clip (same as RMB-click)_
| *CURSOR keys*            | _Select clips (+shift to add to selection, +lctrl to select on all tracks)_
| *lshift - CURSOR*        | _Expand selection_
| *lctrl - x e*            | _Toggle edge-selection mode (move to start/end before selecting prev/next clip)_
| *x*                      | _Toggle grid-cursor / selection-cursor keyboard modes_
| *lctrl - LEFT*           | _Grid cursor mode: move cursor left (modulo 4)_
| *lctrl - RIGHT*          | _Grid cursor mode: move cursor right (modulo 4)_
| *lctrl - LEFT*           | _Selection cursor mode: Go to marker clip start or previous marker_
| *lctrl - RIGHT*          | _Selection cursor mode: Go to next marker_
| *lctrl - lalt - LEFT*    | _Go to marker clip start or previous marker_
| *lctrl - lalt - RIGHT*   | _Go to next marker_
| *lctrl - c*              | _Copy selected clips to clipboard_
| *lctrl - v*              | _Paste clips from clipboard (overwrite)_
| *lctrl - lshift - v*     | _Paste clips from clipboard (insert silence / move following clips)_
| *z*                      | _Switch between marker track and regular track_
| *lshift - z*             | _Y-Expand selection (toggle)_
| *lctrl - UP*             | _Y-Expand selection (upper becomes cursor track)_
| *lctrl - DOWN*           | _Y-Expand selection (lower becomes cursor track)_
| *lctrl - LEFT / RIGHT*   | _Selection-cursor mode: select left / right clips on all tracks_
| *lctrl - lshift - LEFT / RIGHT*   | _Grid-cursor-cursor mode: expand selection left / right and align (modulo 4)_
| *INSERT*                 | _Insert silence_
| *lshift - INSERT*        | _Insert silence (all tracks)_
| *DELETE*                 | _Delete selected clips or insert silence when there's no selection_
| *lshift - DELETE*        | _Delete selected clips and move OR delete on all tracks in grid-cursor mode_
| *lctrl - DELETE*         | _Delete selected clips (muted only)_
| *lctrl - lshift - DELETE*| _Delete selected clips and move (muted only)_
| *lctrl - a*              | _Select all track clips (when clip is selected), then all clips, then none_
| *lctrl - x a*            | _Set selected clip lengths to pattern lengths_
| *c*                      | _Loop selected clip(s)_
| *lshift - c*             | _Set cursor to loop start / end_
| *f*                      | _Center display to replay offset (follow)_
| *lctrl - lshift - f*     | _Cycle through auto-follow modes (off, paged, smooth)_
| *lctrl - f*              | _Toggle zoom to selected clip(s)_
| *lshift - f*             | _Toggle show-all_
| *lctrl - x f*            | _Toggle Force (override multi-clip properties) mode_
| *g*                      | _Choose pattern for selected clip(s) (popup)_
| *d*                      | _Toggle track mute (last selected clip track)_
| *lshift - d*             | _Toggle mute all tracks_
| *s*                      | _Toggle track solo (last selected clip track)_
| *h*                      | _Toggle track lock (last selected clip track)_
| *lshift - l*             | _Invert track locks_
| *lctrl - l*              | _Clear track locks_
| *lctrl - h*              | _Align selected clips to grid_
| *m*                      | _Show / hide marker track_
| *p*                      | _Select next play mode (cycle)_
| *lshift - s*             | _Toggle snap-to-grid_
| *v*                      | _Insert snapshot of currently playing pattern (current track)_
| *lshift - v*             | _Insert snapshot of currently playing patterns (all tracks)_
| *lctrl - n*              | _Insert unused pattern (group) at cursor position (clipboard selection determines search start offset)_
| *lctrl - lshift - n*     | _Insert unused pattern (sub) at cursor position (clipboard selection determines search start offset)_
| *lshift - HOME*          | _Go to start (offset 0)_
| *lshift - END*           | _Go to loop start_
| *lctrl - HOME*           | _Increment pattern nr of selected clips by +4
| *HOME*                   | _Increment pattern nr of selected clips by +1
| *lctrl - END*            | _Decrement pattern nr of selected clips by -4
| *END*                    | _Decrement pattern nr of selected clips by -1
| *SPACE*                  | _Start / stop replay_
| *lctrl - SPACE*          | _Stop replay and don't rewind to start offset_
| *lshift - SPACE*         | _Queue play position (same as LMB-dblclick)_
| *RCTRL*                  | _Toggle clip mute+patternr state recording_
| *lshift - RCTRL*         | _Copy clip mute+patternnr state from arranger (at edit offset)_
| *a*                      | _Show tools and options menu_
| *lshift - a*             | _Focus grid size widget_
| *lshift - [*             | _Zoom out (WHEEL up)_
| *lshift - ]*             | _Zoom in (WHEEL down)_
| *lctrl - x s*            | _Toggle main / scratch timelines_
|===========================================================




[.lead]
[[kbd_tracker]]
=== Tracker

==== Edit

[cols="^2,1*4"]
|===========================================================
| Key Sequence             | Description
| *lalt - e*               | _Open Edit pulldown menu_
| *rctrl*                  | _Toggle edit mode_
| *backspace*              | _Toggle relative shift mode_
| *lshift - ]*             | _Zoom in_
| *lshift - [*             | _Zoom out_
| *'* or *f*               | _Toggle zoom preset (a-umlaut on german kbd)_
| *lshift - a*             | _Enter step resolution / zoom (focus widget)_
| *lshift - d*             | _Enter default note duration  (focus widget)_
| *lctrl - 0*              | _Set step advance to 0 steps_
| *lctrl - 1*              | _Set step advance to 1 step_
| *lctrl - 2*              | _Set step advance to 2 steps_
| *lctrl - 3*              | _Set step advance to 3 steps_
| *lctrl - 4*              | _Set step advance to 4 steps_
| *lctrl - 5*              | _Set step advance to 5 steps_
| *lctrl - 6*              | _Set step advance to 6 steps_
| *lctrl - 7*              | _Set step advance to 7 steps_
| *lctrl - 8*              | _Set step advance to 8 steps_
| *lctrl - 9*              | _Advance to next event after editing a step_
| *lctrl - lshift - 0*     | _Set micro-shift to 96 ticks_
| *lctrl - lshift - 1*     | _Set micro-shift to 1 tick_
| *lctrl - lshift - 2*     | _Set micro-shift to 2 ticks_
| *lctrl - lshift - 3*     | _Set micro-shift to 3 ticks_
| *lctrl - lshift - 4*     | _Set micro-shift to 4 ticks_
| *lctrl - lshift - 5*     | _Set micro-shift to 6 ticks_
| *lctrl - lshift - 6*     | _Set micro-shift to 8 ticks_
| *lctrl - lshift - 7*     | _Set micro-shift to 12 ticks_
| *lctrl - lshift - 8*     | _Set micro-shift to 24 ticks_
| *lctrl - lshift - 9*     | _Set micro-shift to 48 ticks_
| *lctrl - x o*            | _Toggle chord clear-step mode_
| *lctrl - x t*            | _Start / stop tap mode_
| *lctrl - t*              | _Collapse pattern to scratch and start tap mode_
| *lctrl - f*              | _Detail-edit value_
| *lctrl - z*              | _Toggle note on / off or detail-edit value_
| *lctrl - \*              | _Toggle timing view (< on german kbd)_
| *lctrl - lshift - \*     | _Toggle timing view move lock (< on german kbd)_
| *lctrl - y*              | _Undo_
| *lctrl - lshift - y*     | _Redo_
| *lctrl - lshift - TAB*   | _Toggle envelope view_
| *lctrl - lshift - x*     | _Toggle focus envelope view edit mode widget_
| *lctrl - x TAB*          | _Toggle pattern / play / arp views_
|===========================================================

==== Cursor

[cols="^2,1*4"]
|===========================================================
| Key Sequence             | Description
| *lalt - c*               | _Open Cursor pulldown menu_
| *lctrl - x q*            | _Toggle autoscroll mode_
| *lctrl - x r*            | _Toggle wrap-around mode_
| *lshift - TAB*           | _Move cursor to previous track_
| *TAB*                    | _Move cursor to next track_
| *lctrl - LEFT*           | _Move cursor to first cel or previous track_
| *lctrl - RIGHT*          | _Move cursor to next cel or next track_
| *UP*                     | _Move cursor to previous row_
| *PAGEUP*                 | _Move cursor "n" rows up and align_
| *lctrl - UP*             | _Move cursor "n" rows up_
| *DOWN*                   | _Move cursor to next row_
| *PAGEDOWN*               | _Move cursor "n" rows down and align_
| *lctrl - DOWN*           | _Move cursor "n" rows down_
| *lshift - HOME*          | _Move cursor to first row_
| *lshift - END*           | _Move cursor to last row_
| *LEFT*                   | _Move cursor to previous cel_
| *RIGHT*                  | _Move cursor to next cel_
| *lctrl - lalt - LEFT*    | _Move cursor to previous column group_
| *lctrl - lalt - RIGHT*   | _Move cursor to next column group_
| *lctrl - PAGEUP*         | _Move cursor to previous event_
| *lctrl - PAGEDOWN*       | _Move cursor to next event_
| *lctrl - x SPACE*        | _Show cel select / edit / add / delete dialog_
|===========================================================

==== Replay

[cols="^2,1*4"]
|===========================================================
| Key Sequence             | Description
| *lalt - r*               | _Open Replay pulldown menu_
| *lctrl - RETURN*         | _Set replay pattern_
| *RETURN*                 | _Play step_
| *lshift - RETURN*        | _Play note cel and cycle_
| *SPACE*                  | _Start / stop pattern replay_
| *lctrl - SPACE*          | _Start / stop pattern replay from current row_
| *lctrl - x w*            | _Toggle stop-and-goto-bookmark mode_
| *lshift - SPACE*         | _Set (editor) pattern replay start offset_
| *RSHIFT*                 | _Start recording (press RETURN to undo+restart)_
|===========================================================

==== Track

[cols="^2,1*4"]
|===========================================================
| Key Sequence             | Description
| *lalt - t*               | _Open Track pulldown menu_
| *lctrl - x s*            | _Edit track layout_
| *lctrl - x i*            | _Add cel_
| *lctrl - x n*            | _Add note cel_
| *lctrl - x p*            | _Toggle all VEL and DUR ctl styles (bar4<>hex, hi_nibble<>hex)
| *lctrl - x [*            | _Toggle alternative cel styles (u-umlaut on german kbd)
| *lshift - e*             | _Reverse track_
| *lshift - o*             | _Rotate track up_
| *lshift - p*             | _Rotate track down_
| *lctrl - x l*            | _Lock keyjazz to current track and node_
| *lctrl - x k*            | _Auto-colorize cels (preserves custom cel colors)_
|===========================================================

==== Pattern

[cols="^2,1*4"]
|===========================================================
| Key Sequence             | Description
| *lalt - p*               | _Open Pattern pulldown menu_
| *lctrl - n*              | _Create new pattern_
| *lctrl - lshift - n*     | _Create new pattern (sub)_
| *lctrl - r*              | _Clone pattern_
| *lctrl - lshift - r*     | _Clone pattern (sub)_
| *lctrl - x F3*           | _Free pattern_
| *lshift - BACKSPACE*     | _Clear pattern_
| *lctrl - x c*            | _Copy pattern to clipboard_
| *lctrl - x v*            | _Paste pattern clipboard_
| *lshift - F7*            | _Import pattern from AnalogRytm node (pattern clipboard)_
| *lshift - F8*            | _Import pattern from TrigSeq node (current play pattern)_
| *lshift - F9*            | _Import pattern from Monitor node (pattern clipboard)_
| *lctrl - lshift - F9*    | _Import pattern from Monitor node (pattern clipboard). Temporarily enable Play->"Filter"+"All")_
| *END*                    | _Edit previous pattern (-1)_
| *lctrl - END*            | _Edit previous pattern (-4)_
| *HOME*                   | _Edit next pattern (+1)_
| *lctrl - HOME*           | _Edit next pattern (+4)_
| *lctrl - l*              | _Edit pattern length_
| *lctrl - lshift - l*     | _Set pattern length to cursor position_
| *lshift - n*             | _Edit pattern name (focus widget)_
| *lctrl - p*              | _Double pattern length_
| *lctrl - lshift - p*     | _Double pattern length and duplicate events_
| *lctrl - x e*            | _Reverse pattern_
| *lctrl - x PAGEUP*       | _Rotate pattern up_
| *lctrl - x PAGEDOWN*     | _Rotate pattern down_
|===========================================================

==== Events

[cols="^2,1*4"]
|===========================================================
| Key Sequence             | Description
| *lalt - v*               | _Open Events pulldown menu_
| *lctrl - BACKSPACE*      | _Delete cel envelope_
| *DELETE*                 | _Delete step (current ctl) or clear block_
| *lctrl - DELETE*         | _Delete tick (current ctl) or clear block_
| *lshift - DELETE*        | _Delete step or block (all ctls)_
| *lctrl - lshift - DELETE*| _Delete tick (all ctls)_
| *\*                      | _Clear event or clear block (when there is a selection)_
| *lshift - \*             | _Clear event(s) (all ctls)_
| *INSERT*                 | _Insert step (current ctl)_
| *lctrl - INSERT*         | _Insert tick (current ctl)_
| *lshift - INSERT*        | _Insert step (all ctls)_
| *lctrl - lshift - INSERT*| _Insert tick (all ctls)_
| *lctrl - x m*            | _Show Multiply delta times by constant dialog_
| *lctrl - x f*            | _Calc delay ticks (microshift to CTL_DELAY)_
| *lctrl - x RSHIFT*       | _Toggle note-off recording_
| *lctrl - x RCTRL*        | _Toggle CTL_DUR recording_
| *lctrl - x RETURN*       | _Toggle quantized recording_
| *lctrl - x h*            | _Toggle audio latency compensated recording (see prefs)_
| *lctrl - x UP*           | _Increase step or block controller value(s) (coarse)_
| *lctrl - x DOWN*         | _Decrease step or block controller value(s) (coarse)_
| *lctrl - x RIGHT*        | _Increase step or block controller value(s) (fine)_
| *lctrl - x LEFT*         | _Decrease step or block controller value(s) (fine)_
|===========================================================

==== Block

[cols="^2,1*4"]
|===========================================================
| Key Sequence             | Description
| *lalt - b*               | _Open Block pulldown menu_
| *lctrl - x b*            | _Cycle through block modes_
| *lctrl - b*              | _Set block start_
| *lctrl - e*              | _Set block end_
| *lctrl - a*              | _Select entire pattern or none_
| *lshift - <CURSOR>*      | _Set selection_
| *lctrl - c*              | _Copy block or pattern (when there is no selection)_
| *lctrl - v*              | _Paste block (replace) or paste pattern (when there is no selection)_
| *lctrl - lshift - v*     | _Paste block (insert) or paste pattern (when there is no selection)_
| *lshift - F2*            | _Transpose block up_
| *lshift - F1*            | _Transpose block down_
| *lshift - F3*            | _Free envelope(s) (depends on block mode)_
| *lctrl - lshift - UP*    | _Move block up one step_
| *lctrl - lshift - LEFT*  | _Move block up one tick_
| *lctrl - lshift - DOWN*  | _Move block down one step_
| *lctrl - lshift - RIGHT* | _Move block down one tick_
| *lctrl - lshift - a*     | _Quantize block or pattern (when there is no selection)_
| *lctrl - i*              | _Interpolate controller values (current ctl)_
|===========================================================

==== Instrument

[cols="^2,1*4"]
|===========================================================
| Key Sequence             | Description
| *lalt - i*               | _Open Instrument pulldown menu_
| *lctrl - TAB*            | _Toggle pattern / instrument views_
| *F1*                     | _KeyJazz octave up_
| *F2*                     | _KeyJazz octave down_
| *lshift - s*             | _Enter default velocity (focus widget)_
| *lctrl - [*              | _Select previous instrument_
| *lctrl - ]*              | _Select next instrument_
| *lshift - f*             | _Enter instrument nr (focus widget)_
| *lctrl - F12*            | _Toggle keyjazz mode_
| *lctrl - x a*            | _Select keyjazz instrument from current step and toggle edit mode_
| *1*                      | _In InstrumentView: focus instruments table_
| *2*                      | _In InstrumentView: focus instrument name textfield_
| *3*                      | _In InstrumentView: focus params table_
| *4*                      | _In InstrumentView: focus param name textfield_
| *5*                      | _In InstrumentView: focus param type combobox_
| *RIGHT*                  | _In InstrumentView: focus param table when instrument table has focus_
| *LEFT*                   | _In InstrumentView: focus instrument table when param table has focus_
|===========================================================


[.lead]
[[kbd_trigseq]]
=== TrigSeq

==== General

[cols="^2,1*4"]
|===========================================================
| Key Sequence             | Description
| *a*                      | _Show context menu_
| *f*                      | _Fold / unfold tracks_
| *t*                      | _Show track setup dialog_
| *e*                      | _Show euclidean rhythm dialog_
| *RCTRL*                  | _Toggle MIDI live recording_
| *u*                      | _Undo / Redo_
|===========================================================

==== Track

[cols="^2,1*4"]
|===========================================================
| Key Sequence             | Description
| *lshift - BACKSPACE*     | _Clear track_
| *BACKSPACE*              | _Clear track trigs+repeats_
| *lalt - BACKSPACE*       | _Clear track microtime_
| *lctrl - BACKSPACE*      | _Clear track args+repeats_
| *r*                      | _Reverse track trigs_
| *j*                      | _Randomize track trigs_
| *lctrl - j*              | _Randomize repeats_
| *lshift - j*             | _Randomize arg1 (velocity)_
| *lshift - k*             | _Load arg2 identity (0, 1, 2, ..)_
| *o*                      | _Rotate track left_
| *p*                      | _Rotate track right_
| *INSERT*                 | _Insert step_
| *DELETE*                 | _Delete step_
| *lshift - PAGEUP*        | _Increment length_
| *lshift - PAGEDOWN*      | _Decrement length_
| *s*                      | _Solo track_
| *d*                      | _Mute track_
| *lctrl - l*              | _Focus track length widget_
| *PAGEUP*                 | _Inc track length_
| *PAGEDOWN*               | _Dec track length_
| *lctrl - h*              | _Focus swing amount widget_
| *lctrl - t*              | _Focus note length widget_
| *lshift - x*             | _Cut to track clipboard_
| *lshift - c*             | _Copy to track clipboard_
| *lshift - v*             | _Paste track clipboard_
| *lctrl - lshift - v*     | _Paste track clipboard to all patterns_
|===========================================================

==== Pattern

[cols="^2,1*4"]
|===========================================================
| Key Sequence                     | Description
| *lctrl - lshift - BACKSPACE*     | _Clear pattern_
| *lshift - r*                     | _Reverse pattern_
| *lshift - o*                     | _Rotate pattern left_
| *lshift - p*                     | _Rotate pattern right_
| *lshift - INSERT*                | _Insert step on all tracks_
| *lshift - DELETE*                | _Delete step on all tracks_
| *lctrl - w*                      | _Cut pattern to clipboard_
| *lctrl - c*                      | _Copy pattern to clipboard_
| *lctrl - v*                      | _Paste pattern clipboard_
| *lctrl - r*                      | _Clone pattern_
| *lctrl - lshift - r*             | _Clone pattern (sub)_
|===========================================================

==== Step

[cols="^2,1*4"]
|===========================================================
| Key Sequence            | Description
| *LEFT*                  | _Move cursor left_
| *RIGHT*                 | _Move cursor right_
| *UP*                    | _Move cursor up_
| *DOWN*                  | _Move cursor down_
| *lshift - HOME*         | _Move cursor to first track_
| *lshift - END*          | _Move cursor to last track_
| *lctrl - LEFT*          | _Move step left_
| *lctrl - RIGHT*         | _Move step right_
| *lctrl - UP*            | _Move step up_
| *lctrl - DOWN*          | _Move step down_
| *SPACE*                 | _Toggle trig_
| *lctrl - SPACE*         | _Toggle repeat_
| *RETURN*                | _Play step (all tracks)_
| *w*                     | _Play track trigger_
| *lshift - w*            | _Play step (current track, and even if track is muted)_
| *x*                     | _Cut step to clipboard_
| *c*                     | _Copy step to clipboard_
| *v*                     | _Paste step clipboard_
| *1*                     | _Set step arg1 (velocity index) to 0_
| *2*                     | _Set step arg1 (velocity index) to 1_
| *3*                     | _Set step arg1 (velocity index) to 2_
| *4*                     | _Set step arg1 (velocity index) to 3_
| *lctrl - x RIGHT*       | _Increment step arg2 (e.g. note duration) by 1_
| *lctrl - x UP*          | _Increment step arg2 (e.g. note duration) by 4_
| *lctrl - x LEFT*        | _Decrement step arg2 (e.g. note duration) by 1_
| *lctrl - x DOWN*        | _Decrement step arg2 (e.g. note duration) by 4_
| *lshift - LEFT*         | _Microtime-shift step to the left_
| *lshift - RIGHT*        | _Microtime-shift step to the right_
| *h*                     | _Toggle microtime limit (full step or 1/4 step)_
|===========================================================

==== TrackSetup

[cols="^2,1*4"]
|===========================================================
| Key Sequence             | Description
| *ESCAPE*                 | _Close dialog_
| *a*                      | _Focus arg3_
| *c*                      | _Focus close button_
| *d*                      | _Focus tick duration_
| *f*                      | _Focus-cycle forced-output widgets_
| *j*                      | _Focus-cycle jitter widgets_
| *r*                      | _Focus-cycle repeat widgets_
| *s*                      | _Focus microshift_
| *t*                      | _Focus-cycle transform widgets_
| *v*                      | _Focus-cycle velocity 0..3 widgets_
|===========================================================

NOTE: Hold down a modifier key (lctrl, lshift, lalt, ..) in case the currently focused widget has already consumed the key event.


[.lead]
[[kbd_ctlmorph]]
=== CtlMorph

[cols="^2,1*4"]
|===========================================================
| Key Sequence             | Description
| *a*                      | _Show group tools menu_
| *INSERT*                 | _Add new entry_
| *lshift - INSERT*        | _Clone selected entry_
| *lctrl - o*              | _Update entries with current controller state_
| *lctrl - g*              | _Show cyclic morph dialog_
| *lshift - r*             | _Group reset (reset to center values)_
|===========================================================



[[demo_videos]]
== Demo Videos
This video shows the creation of a very simple track:
https://vimeo.com/218650191

A demonstration of the CtlMorph node (Moog Sub37 parameter blending):
https://vimeo.com/219268566

A demonstration of the Prophet 12 specific virtual program change, temporary parameter update, and patch morphing features:
https://vimeo.com/219669148

A demonstration of the Prophet 12 editor multi-edit feature:
https://vimeo.com/220633861

A demonstration of the "AudioTool" wav slicer and SXT (Reason NNXT) sample patch generator ("alt" drum slicing):
https://vimeo.com/222076715

A demonstration of the "AudioTool" wav slicer and SXT (Reason NNXT) sample patch generator (multisampled Osc):
https://vimeo.com/222076984

A demonstration of the "AudioTool" autolooper. This one uses some slightly more difficult material (FM4 patch with 3x unison, i.e. a lot of phasing):
https://vimeo.com/222077307

A demonstration of the "AudioTool" autolooper. This one uses some rather difficult material with chorus and delay FX (in stereo):
https://vimeo.com/222077607

A demonstration of the "AudioTool" SampleChain and Kit generator and uploader for the Elektron Analog Rytm drum computer:
https://vimeo.com/222077897

A demonstration of the "AudioTool" VariChain and Kit generator and uploader for the Elektron Analog Rytm drum computer. The resulting "varichain" sample is about half the size of the "samplechain" version:
https://vimeo.com/222078031

A demonstration of the cascaded arranger clip state recording feature:
https://vimeo.com/263346576




[[license]]
== License
This software is available "`free as in beer`" and is likely to become "`free as in speech`" (open source) in the future.

It is currently not permitted to redistribute this software, though.



[[downloads]]
== Downloads

=== GNU | Linux
A Linux port exists and will be released in the near future.

=== Microsoft Windows (7/8/10) (x64)

* `[10Jun2018]` http://miditracker.org/files/synergy-miditracker-10Jun2018.7z[synergy-miditracker-10Jun2018.7z] (latest)
* `[23May2018]` http://miditracker.org/files/synergy-miditracker-23May2018.7z[synergy-miditracker-23May2018.7z]
* `[05Apr2018]` http://miditracker.org/files/synergy-miditracker-05Apr2018.7z[synergy-miditracker-05Apr2018.7z]
* `[02Apr2018]` http://miditracker.org/files/synergy-miditracker-02Apr2018.7z[synergy-miditracker-02Apr2018.7z]

Legacy 32bit / x86 releases:

* `[10Jun2018]` http://miditracker.org/files/synergy-miditracker-x86-10Jun2018.7z[synergy-miditracker-x86-10Jun2018.7z] (latest)
* `[26Nov2017]` http://miditracker.org/files/synergy-miditracker-26Nov2017.7z[synergy-miditracker-26Nov2017.7z]
* `[14Sep2017]` http://miditracker.org/files/synergy-miditracker-14Sep2017.7z[synergy-miditracker-14Sep2017.7z]
* `[10Sep2017]` http://miditracker.org/files/synergy-miditracker-10Sep2017.7z[synergy-miditracker-10Sep2017.7z]
* `[09Sep2017]` http://miditracker.org/files/synergy-miditracker-09Sep2017.7z[synergy-miditracker-09Sep2017.7z]
* `[22Aug2017]` http://miditracker.org/files/synergy-miditracker-22Aug2017.7z[synergy-miditracker-22Aug2017.7z]
* `[20Aug2017]` http://miditracker.org/files/synergy-miditracker-20Aug2017.7z[synergy-miditracker-20Aug2017.7z]
* `[18Jun2017]` http://miditracker.org/files/synergy-miditracker-18Jun2017.7z[synergy-miditracker-18Jun2017.7z]
* `[07Jun2017]` http://miditracker.org/files/synergy-miditracker-07Jun2017.7z[synergy-miditracker-07Jun2017.7z]
* `[05Jun2017]` http://miditracker.org/files/synergy-miditracker-05Jun2017.7z[synergy-miditracker-05Jun2017.7z]
* `[28May2017]` http://miditracker.org/files/synergy-miditracker-28May2017.7z[synergy-miditracker-28May2017.7z]
* `[23May2017]` http://miditracker.org/files/synergy-miditracker-23May2017.7z[synergy-miditracker-23May2017.7z]

http://www.miditracker.org/changelog.txt[Changelog]
