qmidiarp - MIDI arpeggiator and LFO
QMidiArp is an advanced MIDI arpeggiator, programmable step sequencer and LFO.
It runs with either JACK MIDI or ALSA MIDI. It can hold any number of
arpeggiator or LFO modules running in parallel. The arpeggiator modules
produce sequences depending on the notes sent to their input port, which is
typically connected to a keyboard or another sequencer. The step sequencer
modules allow you to create simple linear, monophonic and globally
transposable sequences similar to the first analog sequencers. The MIDI LFOs
independently produce MIDI controller data of adjustable waveform, time
resolution, amplitude and duration. For each module, an input note filter is
available, and the output port and channel can be set independently. Since the
modules use a common sequencer queue, they are automatically in sync with each
other. QMidiArp works with an internal tick resolution of 192 ticks per beat.
The queue can be synchronized to an incoming MIDI realtime clock or as a JACK
transport client. Most of the relevant control elements are accessible via
MIDI controller through a MIDI-learn infrastructure. QMidiArp also has a log
tool displaying the history of incoming MIDI events in colors depending on
their type. QMidiArp is based on the Qt4 toolkit.
When no commandline options are given, QMidiArp starts as a JACK MIDI client
with an input port and two output ports. For starting QMidiArp as an ALSA
client, use the -a option. A new arpeggiator or LFO module can be created by
clicking one of the Add Arp..., Add LFO...
or Add Step
buttons, which will show a new tab with the chosen module in
the main area. The modules can be renamed or removed using the corresponding
buttons or menu functions. Modules can be detached from the main window to
control and view them in parallel. They can be brought back to the main window
again by clicking on the icon on the left side of each module title bar. They
can also be aligned side-by-side within the same window if the main window is
stretched sufficiently before reinserting a module. The entire setup
containing all arps, sequences and LFOs in the tab bar along with the
parameters set in the Settings
window can be saved to or loaded from a
QMidiArp XML file (.qmax). The tempo
of the queue can be set in beats
per minute and affects all modules. The queue is started and stopped by the
blue arrow button.
In ALSA mode, QMidiArp runs using its own clock and tempo, but it can optionally
use incoming MIDI clock events as clock and start/stop control source. If the
MIDI clock button
right of the tempo box is pressed, the running ALSA
queue is stopped, and QMidiArp will wait for an incoming "MIDI Clock
Start" event from an external source connected to QMidiArp's MIDI input.
Once this event is received, the queue is started using MIDI realtime clock
events as clock source. QMidiArp will best remain in sync with the incoming
MIDI clock if its internal tempo value (see above) approximately corresponds
to that of the incoming clock. The MIDI clock tempo is, however, measured
while the queue is running. Therefore, if the tempos of the MIDI clock and
that of QMidiArp differ, synchronization should become stable from the second
queue start. The queue will stop when a MIDI Clock Stop event is received.
During MIDI Clock operation, QMidiArp's own clock start and stop functions as
well as adding or loading new setups are disabled. They are enabled again by
unchecking the MIDI clock button.
When the Jack Transport Connect
button is pressed, QMidiArp will try to
connect to a running Jack server and then function as a Jack Transport client,
i.e. set its tempo and remain synchronized to a running Jack Transport master.
Note that QMidiArp will restart its queue from zero whenever Jack transport is
starting regardless of Jack Transport's position. This also applies in case of
a looping Jack Transport queue. The Jack button will be released automatically
if QMidiArp gets disconnected from Jack by a possible Jack shutdown or if Jack
is not available at connection time.
Note: MIDI Clock and Jack Transport button states will be saved with the
QMidiArp session file, and get active or inactive when a new session file is
QMidiArp's arpeggiators can produce complex patterns derived from the notes
played on a MIDI keyboard. QMidiArp's arpeggiator modules were inspired by the
MAP1 hardware arpeggiator by Rudi Linhard.
Input and Output panels
Each arpeggiator has an Input
and an Output
panel. The Input panel
defines the note range and the MIDI channel to which the arp is assigned.
Notes that pass this Input filter are sorted by pitch and added to the
internal note buffer of the arpeggiator. Incoming notes that do not match any
filter can either be discarded or forwarded to a selectable MIDI port (see
). The Output
panel holds settings for the MIDI
and output port
to which the arpeggiator notes will be
Arpeggio patterns can be selected and edited in the Pattern
are selectable from a combo box. The currently active
pattern is displayed as a piano roll type screen showing the base notes as
streaks. The y-scale of the graphics window corresponds to the index of the
notes in the pattern. Octave changes (see Editing patterns
) are shown
as additional horizontal lines. The notes that are eventually sent depend on
the input notes received by the arpeggiator. The received notes notes are
attributed in ascending order to the notes defined in the pattern. For
example, a single streak on the bottom of the arp display ("simple"
presets) means that at the first pass through the pattern, the lowermost note
played on the keyboard is played. If a chord is played on the keyboard and
only one note is present in the pattern, only the lowermost pressed note is
output at the first pass through the pattern. For the following repetitions of
the pattern, the chosen "repeat mode" is used to determine the
following notes. If the pattern contains stacked note streaks (chord mode),
chords played on the keyboard are also output as chords with polyphony up to
the number of notes defined in the stack.
This setting defines the behavior of the arpeggio over several repetitions of
the pattern when the number of notes pressed on the keyboard is higher than
the number of notes present in the pattern. When Repeat Mode
"Up", the next higher note played on the keyboard is played at each
repetition. With "Down", the next lower note is played. With a
single note present in the arp pattern, this creates classical linear
arpeggios. This way even simple patterns like "01" (or even
"0") will generate a complete arpeggio. When "Static" is
selected, this classical arpeggio mode will be disabled, and the output notes
QMidiArp's arpeggiators can run in three modes. "No trigger" will
cause the arp running continuously in synchronization with the internal or
external clock source. Even when new notes are played, they will be output
quantized to the running queue. "Kbd restart" will cause a reset of
the playhead position upon the next note to be output, but the output pattern
stays quantized to the queue. When "Kbd trigger" is selected, each
new note played in stakato will trigger the pattern with the timing of the
Editing Arp patterns
Arp patterns are defined by a text sequence containing the notes themselves as
numbers along with control changes for chord, tempo, velocity and octave
changes. When the Edit pattern
button in the pattern panel is clicked,
the current pattern preset appears as a text input line. The edited pattern
can be stored in the preset list by clicking on the Store pattern
button. The currently active pattern can be removed from the preset list by
clicking on the Remove pattern
button. All preset patterns are
immediately saved in the .qmidiarprc resource file when a pattern is stored or
removed, and the new pattern list is made available to the other arps in the
tab bar. Pattern presets are automatically loaded on each application start.
The syntax for the pattern text is as follows:
0..9 : Note indices
+ : One octave up
- : One octave down
= : Reset to standard octave
> : Double tempo
< : Half tempo
. : Reset to standard tempo
( ) : Chord, begin..end,
e.g. (012) would be a chord of the
lowermost three notes in the buffer
/ : Volume up by 20%
\ : Volume down by 20%
d : Double length
h : Half length
p : Pause
Any token is valid until the end of a pattern is reached. The token > will
e.g. double the tempo for all following notes of the pattern. When the loop
jumps back to the beginning of the pattern, the tempo is reset to its initial
value, i.e. a quarter note.
The timing, velocity and length of the output notes can be randomized using the
sliders in the Random
panel. These settings can be used to make the
arpeggiator sound less mechanical, but if they are set to higher values, they
add interesting accents to the patterns.
QMidiArp can modulate the velocity of the arpeggios with an envelope function
defined by Attack
time and Release
time. If an attack time is
set, the velocities of the output notes are ramped up during the attack time
defined in seconds. If a release time is set, notes released from the keyboard
are continued to be output while their velocity is ramped down linearly and
until the release time has reached its end. The envelope function only makes
sense if the sound driven by the arp is velocity-sensitive. It works best with
highly polyphonic patterns such as "Chord Oct 16 A".
sliders control a linear shift of timing, length and velocity
within each beat of the output pattern. This can be used to create swing
timing and accent. The Groove settings are adjusted for all arps
In parallel to the arps, QMidiArp can send MIDI controller data in form of a low
frequency oscillator (LFO) to the assigned output. The LFO data consist of
controller events that are in sync with the arpeggiator queue. The queue has
to be in running state to enable the LFO. Each LFO module has a
panel to define the shape of the outgoing data and an
panel to define MIDI Channel, ALSA port and controller number to
be produced. The waveform can currently be set to Sine, Saw Up, Saw Down,
Triangle, Square and Custom. The frequency
of the LFO can be set in
muliples and divisors of the arp tempo,
such that frequency of 1
produces one full wave per beat. If frequencies lower than 1 are selected, the
length of the wavetable has to be adjusted correspondingly to produce a full
wave. The time resolution
of the LFO determines the number of events
produced every beat and can be adjusted to up to 192 events per beat.
of the waveform can be adjusted from
0...127. Low resolutions
lead to audibly discrete rythmic controller
changes whereas higher resolution values lead to more continuous waves.
Muting individual wave points
Individual wave points can be muted/unmuted by clicking on the corresponding
location in the wave display with the right mouse button.
A muted wave
point is shown in darker color.
is selected, the waveform can be drawn with the left mouse
in the waveform display. A calculated waveform is copied to the
custom waveform whenever it is being modified by the mouse. This will
overwrite the previous custom waveform with the currently displayed waveform.
As all LFO operations, drawing and muting can be done while the queue is
running, and becomes effective immediately.
Play direction and looping
The play mode can be switched between:
->_> : Forward and Loop
<_<- : Backward and Loop
->_< : Forward and Bounce
>_<- : Backward and Bounce
->_| : Forward Single shot
|_<- : Backward Single shot
The direction and loop settings apply immediately when changed on the fly.
The LFO records incoming controller data as selected in the Input
when the Record
button is pressed. Note that the Record button itself
can be attributed to a MIDI toggle controller so that it provides a convenient
implementation of a controller motion sampler and looper.
LFO Input panel
The input panel contains settings on which MIDI CC
is to be recorded, how
the LFO acts to note events received on the input. As the arpeggiators, the
LFO can be restarted or (re-) triggered by notes played on the keyboard, and
the wave output can be stopped or not when Note Off
events are received
on the input Channel
LFO Output panel
The LFO output panel contains the port, channel
number settings of the LFO data produced by each LFO tab.
You can also mute
each LFO wave.
By clicking Add Step Sequencer...
in the control tool bar, a new
module can be added to the tab bar. Each of these modules produce a
simple linear (monophonic) sequence, similar to the first analog hardware
sequencers. The Seq modules are controllable while running, also in a similar
way to analog step sequencers.
Programming a sequence
As QMidiArp's LFO modules, the step sequencer can be programmed by adjusting
notes with left mouse clicks on the sequence display. The octave range is
fixed to 4. The lowest note is C2 if the global transpose is set to 0. Notes
can be muted with the right mouse click. The sequence length
adjusted between 1 and 8 beats, and the time resolution
can be set to
values between 1 and 16 per beat. A resolution of 4 means that 4 notes are
output every beat, i.e. sixteenth notes. The sequence can also be programmed
using the Record
function. When the Record
button is pressed,
notes received on the input port will be recorded step-by-step starting from
the last modified note. Programming can be done on the fly also when the
sequencer queue is running.
Controlling the sequence globally
There are sliders to adjust the global velocity
of the sequence in semitones.
Seq Input and Output panels
The Seq Input
panel determines how to handle incoming notes on the MIDI
set in the channel box. If Note
is checked, the sequence
will be globally transposed with the incoming note as transpose value. If
is checked in addition, the sequence will output notes with
the same velocity as that received on its input. The Input
determines how the sequence behaves when incoming notes are received. It can
be restarted, triggered and stopped with the timing of received notes as the
The Seq Output
panel is equivalent to that of arpeggiator and LFO
Note that accents within a pattern can be produced by running LFO modules in
parallel to the Seq module, and by sending to the same channel and port as the
The Settings window allows one to configure if and to which port incoming events
that do not match any module's input filter are forwarded ( unmatched
events). It also allows one to set whether incoming controller events are
recognized for muting and controlling the modules separately. If this option
is set, QMidiArp will recognize MIDI control events that can be attributed to
different parameters (see MIDI Control
). By checking the compact
all new created modules will show with small GUI elements to
be more economic in space when distributed as separate windows over the
All settings in this dialog are stored along with the module data in the qmax
QMidiArp supports MIDI control events if the Modules controllable by MIDI
option is checked in the Settings
Controllers can be attributed by right-clicking on the sliders or mute checkbox
in each module and selecting MIDI Learn.
QMidiArp will then wait for
MIDI control events, and moving a MIDI controller connected to QMidiArp's
input will attribute this controller to the control item. It is possible to
add several MIDI controllers to one item. If MIDI Forget
all controllers for that item are removed. If Cancel MIDI learning
selected, the learn process is stopped.
Note that by default, mute controllers are interpreted as toggles, i.e. the mute
state is toggled on reception of a value of 127 from the attributed
The Control Editor
is accessible from the View
menu. Controls can
be edited by MIDI control number, channel, and the minimum and maximum values
that are sent to the control item. Mute controllers have a special behaviour.
If minimum and maximum are equal,
the controller acts as toggler upon
reception of the adjusted value. If minimum is different
the corresponding module will be muted upon reception of minimum and unmuted
upon reception of maximum as values.
is pressed, the currently selected line will be removed,
reloads the current controller settings. Pressing
quits the control editor without applying changes, and only if
is pressed, the edited control list becomes active.
There is another dock window available for storing and restoring most of the
parameters of all modules at once. In this window, each module and its
storages appear as a column, the first column representing switches for all
modules globally. When the small Store
button on the left is clicked,
all modules will store their parameters in a location given by the current
row, and the next available storage location appears. Module storages can be
recalled by clicking on the buttons of each individual module or globally
(numbered buttons in the first column). Storage locations can be removed again
by clicking on the "arrow" button on the bottom of the list. When a
new module is added at a time when storage locations already exist for other
modules, the storage locations for the new module will be empty and can be
filled by using Store
again at this location.
When QMidiArp is running, the switch behavior will depend on the selection made
in the comboboxes in the first row of the window.
will cause parameter switches to occur when the module in the
second combobox reaches its pattern end. When individual switches are done the
module in the column of the clicked module determines the switch time.
will do parameter switches at the end of the number of beats
selected in the second combobox after the restore button is clicked.
The switch can be done by MIDI controller assigned by the MIDI Learn context
menu of the top button of each column. Note that it is the the controller
value that corresponds to the storage location, and that you may want to
adjust the range of controllers to your needs using the MIDI Control
With the Global Storage
handler, QMidiArp can act as a
simple but handy live sequencer tool. But the Golbal Storage
menu and in the main toolbar toggles visibility of the Global
The Event Log
displays incoming MIDI events. It is displayed in the
bottom area by default, but can be hidden if not needed or set floating as a
top-level window on the desktop. Logging can also be disabled generally or for
MIDI Clock events only.
There are currently three demo arpeggios. The demo.qma arpeggio was intended to
be used with the following sound types: Ch 1: Marimba, Ch 2: Celesta, Ch 3:
Acoustic Bass, but you can get interesting results if you use other instrument
The demo_seqlfo.qmax setup shows the use of the new sequencer and LFO modules
playing in parallel. The sequencer outputs should be routed to percussive
synthesizer sounds. The LFO data is intended to act on filter cutoff, which
has the standard controller CC#74. ZynAddSubFX by Paul Nasca reacts on these
filter cutoff controllers. The "Bass 1" and "Plucked 3"
presets from this synthesizer work well with this demo file.
- --portCount <num>
- Set the number of available ALSA output ports to <num>. The default
- Print possible command-line options and exit.
- Print version information and exit.
- Use the ALSA MIDI backend
- Use the JACK MIDI backend (default)
- Name of a valid QMidiArp (.qmax) XML file to be loaded on start.
QMidiArp XML files containing session data in XML text
Example QMidiArp files can be found in /usr/share/qmidiarp
Errors and warnings are written to stderr
Frank Kober, Nedko Arnaudov, Guido Scholz and Matthias Nagorni. This manual page
was written by Frank Kober <email@example.com>.