Skip to content
This repository has been archived by the owner. It is now read-only.
Experimental JACK MIDI sequencer/arpeggiator
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.




    * BoxySeq is something between sequencer and arpeggiator.

Core Concept

    * Use a window-manager-like window-placement-algorithm to generate pitch and velocity data for events.
    * Sequences events in real time.
    * Uses the JACK Audio Connection Kit MIDI API.
    * Each event sequenced is displayed as a coloured box which appears and then disappears.

Placement Algorithm

    * Behaviour based upon the Fluxbox Window Manager.
    * Row-Smart or Column-Smart placement
    * Left-to-Right or Right-to-Left placement
    * Top-to-Bottom or Bottom-to-top.
    * Fast implementation using an array combined with bit manipulation to store used/unused state of space in grid.
    * No placement made which causes overlap to occur.
    * Events dropped, discarded, tossed away, ignored, not sequenced if cannot be placed.

Event Pitch/Velocity Mapping to 2D Grid

    * Event does not have meaningful pitch/velocity data until placed by placement algorithm.
    * X coordinate maps to pitch.
    * Y coordinate maps to velocity.

Grid Dimension

    * MIDI pitch range is (integer) 0 to 127
    * MIDI velocity range is (integer) 0 to 127
    * Therefor the grid is 128 x 128 units.


    * A boundary is a box marking an area in the grid where events are to be placed.
    * Events can only be placed within a boundary.
    * Multiple boundaries may be used in a single grid.
    * Boundaries may overlap each other.
    * Boundaries that overlap each other does not causes events to overlap each other.
    * The options for the placement strategy are per boundary.


    * The pattern is the rhythmic sequence of events.
    * No event within the pattern holds meaningful pitch and velocity data.
    * The pattern defines minimum and maximum values for the width and height of the event boxes.
    * The pattern randomly generates the dimensions of the event boxes before outputting them.

MIDI Output

    * One voice per pitch per channel per MIDI port.

Where the potential for more than one voice per pitch per channel per MIDI port occurs, choose one of the following:

    * Utilize width of second event box to find a different pitch between X and X + Box Width, OR
    * Do not output any MIDI messages for the event, but still place the event, OR
    * Discard the event without outputting any MIDI messages and do not perform placement of it.

Routing I - BoxySeq Port Abstraction

    * The BoxySeq port abstraction sits between a pattern and boundary.
    * Via a port, a single pattern can output one or more boundaries.
    * Via a port, a single boundary can read input from one or more patterns.
    * Via a port, multiple patterns can output to multiple boundaries.
    * A port cannot read input or write output to any other BoxySeq port.

Routing II - BoxySeq MIDI Output Port Abstraction

    * The BoxySeq MIDI output port abstraction sits between a boundary and actual MIDI output.
    * Via the port, a single boundary can output to a single MIDI port and channel
    * Via the port, a single boundary can output to multiple MIDI ports and/or channels (TODO: output to multiple MIDI 
channels on the same port is probably unimplemented right now).

Routing III - Limitations

    * Routing implementation is limited.
    * Routing implementation is temporary.

Definitely Planned and Possibly Planned Features

    * See:

You can’t perform that action at this time.