1. seq192(1)
  2. User manual
  3. seq192(1)


seq192 - live MIDI sequencer


seq192 [OPTION...]


seq192 is a MIDI sequencer for live situations that is meant to be controlled with OSC messages and sync with other applications using jack transport.


-h, --help
Show available options
-f, --file file
Load midi file on startup
-c, --config file
Load config file on startup
-p, --osc-port port
OSC input port (udp port number or unix socket path)
-j, --jack-transport
Sync to jack transport
-n, --no-gui
Enable headless mode
-v, --version
Show version and exit


Seq192 allows writing and playing MIDI sequences and organizing them in screensets.

Main window

The main window consist in a toolbar and a sequence grid.

Edit window

The edit window consist in a menu, a toolbar, a pianoroll and an event editor.

Important note

Each window has its own undo/redo history:

- main window: screnset name and sequences (position and content)
- edit window: MIDI events, sequence name, number of measures and time signature


When --jack-transport is set, seq192 will

- follow start / stop commands from other clients
- send start / stop commands to other clients
- use the transport master's bpm
- set its position to 0 whenever the transport stops or restarts
- **not** attempt to reposition within sequences


The configration file is located in $XDG_CONFIG_HOME/seq192/config.json (~/.config/seq192/config.json by default), but can be loaded from any location using --config. It allows customizing the following aspects of seq192:

- MIDI bus names
- MIDI channel names per bus
- Sequence colors as css color strings (per bus or per channel )
- Note names in the piano roll (per bus or per channel)
- Control names in the event dropdown (per bus or per channel )


    "buses": {
        "0": {
            "name": "Sampler",
            "channels": {
                "0": {
                    "name": "Drums",
                    "color": "orange",
                    "notes": {
                        "64": "Kick",
                        "65": "Snare",
                        "66": "Hihat"
                    "controls": {
                        "1": "Custom cc name ",
                        "2": "Etc"
        "1": {
            "name": "Bass synth",
                "0": {"name": "Trap bass"},
                "1": {"name": "Wobble"}


Start playback or restart if already playing
Stop playback
/bpm <float_or_int: bpm>
Set bpm
/swing <float_or_int: position>
Set swing strength (0: no swing, >0: swing, <0: anti-swing)
/swing/reference <float_or_int: position>
Set swing reference (8: 8ths will swing, 16: 16th will swing, etc)
/cursor <float_or_int: position>
Set playhead position (affects all sequences). Position is >= 0 and expressed in quarter notes (0 = first beat)
/screenset <int: screen>
Change active screen set
Disable all sequences and cancel queued sequences
/sequence <string: mode> <int: column> <int: row>
Set sequence(s) state
mode: "solo", "on", "off", "toggle", "record", "record_on", "record_off", "sync", "clear", "copy", "cut", "paste", "delete"; only one sequence can be recording at a time; "record_off" mode doesn't require any argument
column: column number on screen set (zero indexed)
row: row number; if omitted, all rows are affected; multiple rows can be specified
/sequence <string: mode> <string: name>
Set sequence(s) state
name: sequence name or osc pattern (can match multiple sequence names); multiple names can be specified
/sequence/queue <string: mode> <int: column> <int: row>
Same as /sequence but affected sequences will change state only on next cycle
/sequence/trig <string: mode> <int: column> <int: row>
Same as /sequence and (re)start playback
/status <string: address>
Send sequencer's status as json, without sequences informations
address: osc.udp://ip:port or osc.unix:///path/to/socket ; if omitted the response will be sent to the sender
/status/extended <string: address>
Send sequencer's status as json, including sequences informations


    "screenset": int,
    "screensetName": "string",
    "playing": int,
    "bpm": int,
    "tick": int,
    "sequences": [
            "col": int,
            "row": int,
            "name": "string",
            "time": "string",
            "bars": int,
            "ticks": int,
            "queued": int,
            "playing": int,
            "timesPlayed": int,
            "recording": int

Sequencer status

screenset: current screenset
screensetName: current screenset's name
playing: playback state
bpm: current bpm
tick: playback tick (192 ticks = 1 quarter note)

Sequences statuses (1 per active sequence in current screenset)

col: column position
row: row position
name: sequence name
time: sequence time signature (eg "4/4")
bars: number of bars in sequence
ticks: sequence length
queued: sequence's queued state
playing: sequence's playing state
timesPlayed: number of times the sequence played since last enabled
recording: sequence's recording state


seq192 is written by Jean-Emmanuel Doucet and based on

seq24, written by
Rob C. Buse, Ivan Hernandez, Guido Scholz, Dana Olson, Jaakko Sipari, Peter Leigh, Anthony Green, Daniel Ellis, Sebastien Alaiwan, Kevin Meinert, Andrea delle Canne
seq32, written by

Copyright © 2021-2023 Jean-Emmanuel Doucet jean-emmanuel@ammd.net

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see https://www.gnu.org/licenses/.

Sources: https://github.com/jean-emmanuel/seq192

  1. May 2023
  2. seq192(1)