User Testing of JACK in Sequencer64
Chris Ahlstrom
2016-01-16 to 2018-05-01

===========================================================================
 SETTINGS TESTS
===========================================================================

These first tests are for JACK Transport, not "native" JACK.

These tests are done with qjackctl and hydrogen already running, and then
starting Sequencer64 with certain settings already made in sequencer64.rc.
They currently show some issues.

1.  [jack_transport]    == 1
    [jack_master]       == 0
    [jack_master_cond]  == 0

    We will run Qjackctl, Hydrogen, and Sequencer64.  By default, the
    first two applications show time in hours:minutes:seconds, while
    Sequencer64 shows it in bars:beats:pulses.

    a.  Run Qjackctl.
    b.  Run Hydrogen.  Set Tools / Preferences / Midi System / Midi driver
        to JackMidi.
    c.  Set Hydrogen to use JACK Transport, but not be Master.
    d.  Do not start the JACK transport in either application.  Make sure
        both applications' time is set to 00:00:00.
    e.  Run Sequencer64, making sure its time is 00:00:00.  Load a MIDI
        file in Sequencer64.  Also make sure the time-display button reads
        "HMS", to match the time format displayed by Qjackctl and Hydrogen.
    f.  Start playback (Space bar) in Sequencer64, then stop it (Escape)
        after a bit.
    g.  Start playback, but then use the Pause function (period).

    Actual/Expected Results (still in progress):

        a.  Hydrogen starts playing.  Qjackctl starts counting time.
            Sequencer64 starts counting time.  They all display the same
            "H:M:S" time at all times.
        b. Every Space restarts both, resetting the time.  Escape stops both,
            but doesn't reset the time.  Sequencer64 does not play.

    e. Now start Hydrogen's playback instead.

    Actual Results:

        Hydrogen plays, but Sequencer64 does not.  Hydrogen can pause,
        which keeps the time the same when restarted.  The Stop button in
        Hydrogen will cause the time to be restarted.

2.  [jack_transport]    == 1
    [jack_master]       == 1
    [jack_master_cond]  == 0

    Either edit sequencer64.rc, or make the setting in the GUI, and click
    JACK Disconnect, and then JACK Connect.

    Actual Results:

        Similar to scenario 1, except that now Sequencer64 also plays
        back.

        Are JACK slaves allowed to start/stop playback on the JACK buss?

    Bug:

        The main window Stop and Start buttons behave the same, except
        that, once the focus of the user-interface is on the Stop button,
        hitting the Space bar causes a fast start-then-stop action.

    Bug? (Probably not, I saw this in the code, too):

        Sequencer64, as Master:  BPM value cannot be modified from 120
        while transport is running.  It can be altered while it is stopped,
        and will affect the speed of playback..

    Still true?:

        At exit, we also "[Cannot release JACK timebase]", probably
        shouldn't be doing that.

    Done: We think we may not want to change the transport
    position unless we are the JACK Master.  We have added
    a relocate parameter.

    True?: Why doesn't the jack transport make seq24 progress?

If we disable Jack Master in Sequencer64 and enable it in Hydrogen,
then Hydrogren controls playback, including the speed.  It then doesn't
matter what the BPM is then set to in Sequencer64.

===========================================================================
Sequencer64 and Yoshimi Tests
===========================================================================

We test Sequencer64 with Yoshimi quite a lot.  First, Yoshimi has been
revived by Will Godfrey (and others), and is progressing rapidly.
Secondly, Yoshimi is aiming toward being runnable without a GUI.  And it
is lightweight.  Together with the fairly lightweight Sequencer64, one has
an efficient MIDI player.  Eventually, we hope to make Sequencer64 have a
command-line mode as well.

We first test the setup in ALSA mode, to verify that the basics are
working.  Then we'll test in JACK mode.

ALSA:

    Run Yoshimi from a console, in ALSA mode:

        $ yoshimi -a -A

    On our setup, Sequencer64 sees 6 ports.  Port 0 is a Thru port; ports
    1 to 4 are TiMidity ports; and port 5 is Yoshimi port 0.  So we want
    to force Sequencer64 to use the system's ALSA ports, the ALSA
    subsystem (without JACK transport) and ALSA buss 5 (device 5):

        $ sequencer64 -a -A -b 5

    Load a complex test tune, such as b4uacuse-GM-format.midi.

    Go to Yoshimi and enable multiple parts.  Any instrument, such as
    Simple Sound, is enough for this test.

    Finally, open the Song Editor in Sequencer64, and run it.
    You should hear the music, controlled by the Song Editor.

JACK:

    Run QJackCtl in order to get JACK running:

        $ qjackctl &

    Run Yoshimi from a console, in JACK mode:

        $ yoshimi -j -J         (don't use the ampersand)

    To make it available to JACK, run a MIDI bridge program:

        $ a2jmidid --export-hw &

    Run Sequencer64 from a console, in JACK Master mode:

        $ sequencer64 -J &

    In QJackCtl, make the following connections:

        Audio tab:

            yoshimi:left   ---------> system:playback_1
            yoshimi:right  ---------> system:playback_2

        MIDI tab:

            If the [manual-alsa-ports] section is set to 0, one will see
            the simple setup below:

                a2j:Midi Through 14 (capture): Midi Throu...
                    ---------> yoshimi-01:midi in

            If the [manual-alsa-ports] section is set to 1, one will see
            a more complex setup:

                a2j:sequencer64[130] (capture): sequ...
                    ---------> yoshimi-01:midi in

            The names differ in details depending on the exact versions of
            software.

            The bottom line is to connect the desired port in the
            "Readable Clients / Output Ports" section to the synthesizer's
            port in the "Writeable Clients / Input Ports" section.

    Load a complex test tune, such as b4uacuse-GM-format.midi.

    Go to Yoshimi and enable multiple parts.  Any instrument, such as
    Simple Sound, is enough for this test.

    Finally:

        If JACK Song Mode is set in your configuration, open the Song
        Editor in Sequencer64, and view it.  You can start the music from
        that view, or the main window.  You should hear the music,
        controlled by the Song Editor.

        Otherwise, you can use Live Mode and toggle the patterns in the
        main window.

    BUG:

        We had playback get pretty raggy after awhile!  Who caused this
        issue?  How can we diagnose it!

===========================================================================
MIDI Clock Testing
===========================================================================

    Testing of clocking (and JACK positioning) starts by defining
    SEQ64_USE_DEBUG_OUTPUT in the jack_assistant.cpp module, and
    rebuilding Sequencer64.

    Start qjackctl in order to get JACK running (use other methods if
    you wish):

        $ qjackctl &

    Install and run the "klick" application:

        $ klick -j -P &

    Run Sequencer64 from a console window, to see its internal messages:

        $ ./Sequencer64/sequencer64 -J

    Without loading a MIDI file, hit the Space bar to start "playback".
    Note the slow debug output.  This comes from printing the position
    information that the jack_process_callback() function sees.
    After a bit, stop the playback, and note that the debug output
    continues, but with the same values over and over. Then stop
    Sequencer64.  The output might look something like this:

    [JACK server already started]
    [JACK transport master]
    [JACK sync now enabled]
    00000  1383424 014:1:0188 4/4   192 110 4324290
    00001   100348 002:1:0287 4/4  1920 120 4322752
    00001   202748 003:1:0707 4/4  1920 120 4322752
    00001   305148 004:1:1127 4/4  1920 120 4322752
    00001   407548 005:1:1547 4/4  1920 120 4322752
    00001   509948 006:2:0047 4/4  1920 120 4322752
    00001   537596 006:3:0314 4/4  1920 120 4322752
    00001   537596 006:3:0314 4/4  1920 120 4322752
    00001   537596 006:3:0314 4/4  1920 120 4322752

    Now add Hydrogen to the mix.  Make sure it uses JACK transport, but
    not as JACK Master.

    $ Hydrogen &

    Restart Sequencer64 and start the playback, and note the output.

    [JACK server already started]
    [JACK transport master]
    [JACK sync now enabled]
    00000        0 001:1:0000 4/4   192 110 -1049990144
    00001        0 001:1:0000 4/4  1920 120 -1049990144
    00001        0 001:1:0000 4/4  1920 120 -1049990144
    00001   117758 002:1:1664 4/4  1920 120 4322752
    00001   220158 003:2:0164 4/4  1920 120 4322752
    00001   322558 004:2:0584 4/4  1920 120 4322752
    00001   424958 005:2:1004 4/4  1920 120 4322752
    00001   480254 005:4:1538 4/4  1920 120 4322752
    00001   480254 005:4:1538 4/4  1920 120 4322752
    00001   480254 005:4:1538 4/4  1920 120 4322752

    Another option is to stop playback in Sequencer64, change the
    BPM value in its main window, restart playback, and verify
    that Hydrogen shows the new BPM value.

    In Sequencer64, go to File / Options / JACK/LASH.  Uncheck
    JACK Master, click JACK Disconnect, and then JACK Connect.
    (You might see some silly GTK error messages; we won't show them).

    In Hydrogen, set it to JACK Master, and start playback there.
    After a bit, stop playback.  Sample output from Sequencer64:

    [JACK transport master]
    [JACK sync now enabled]
 A. 00000   480254 005:4:1538 4/4  1920 120 4322752     Seq64 starts, no play
 B. 00001   480254 006:1:0020 4/4  1920 120 4322752
    00001   480254 006:1:0020 4/4  1920 120 4322752
    00001   480254 006:1:0020 4/4  1920 120 4322752
    00001   480254 006:1:0020 4/4  1920 120 4322752
    00001   480254 006:1:0020 4/4  1920 120 4322752
 C. [JACK sync now disabled]                            Disconnect clicked
    [JACK server already started]
 D. [JACK transport slave]                              Connect clicked
    [JACK sync now enabled]
    00000   480254 006:1:0020 4/4  1920 120 4322752
    00000   480254 006:1:0020 4/4  1920 120 4322752
    00000   480254 006:1:0020 4/4  1920 120 4322752
    00000   480254 006:1:0020 4/4  1920 120 4322752
    00000   480254 006:1:0020 4/4  1920 120 4322752
    00000   480254 006:1:0020 4/4  1920 120 4322752
    00000   480254 006:1:0020 4/4  1920 120 4322752
    00000   480254 006:1:0020 4/4  1920 120 4322752
    00000   480254 006:1:0020 4/4  1920 120 4322752
    00000   480254 006:1:0020 4/4  1920 120 4322752
    00000   480254 006:1:0020 4/4  1920 120 4322752
 E. 00001   480254 006:1:0036 4/4   192 110 4322752     Hydrogen now Master
    00001   480254 006:1:0036 4/4   192 110 4322752
 F. 00001   568318 007:1:0008 4/4   192 110 4322752     Hydrogen playback start
    00001   670718 008:1:0056 4/4   192 110 4322752
    00001   773118 009:1:0108 4/4   192 110 4322752
    00001   875518 010:1:0160 4/4   192 110 4322752
    00001   977918 011:2:0020 4/4   192 110 4322752
    00001  1080318 012:2:0072 4/4   192 110 4322752
    00001  1182718 013:2:0120 4/4   192 110 4322752
    00001  1285118 014:2:0172 4/4   192 110 4322752
 G. 00001        0 001:1:0000 4/4   192 110 -979988768  Hydrogen playback stop
    00001        0 001:1:0000 4/4   192 110 -979988768
    00001        0 001:1:0000 4/4   192 110 -979988768

    We have labelled key points with capital letters.

    A. There are no JACK position bits set at first.  The initial
       non-1:1:0 position is just a leftover from the previous test.
       Maybe not?  The jack_position_t::ticks_per_beat field is 192 * 10,
       where 192 is the default PPQN of Sequencer64.  The
       jack_position_t::beats_per_minute field is also a Sequencer64
       default, 120 BPM.  The jack_position_t::bbt_offset value is not
       "valid".

    B. Once Sequencer64 is registered fully, the JACK process callback
       sees the JackPositionBBT bit set in the jack_position_t::valid
       field.

    C. The JACK Master setting of Sequencer64 is unchecked, and we
       disconnect from JACK.

    D. We reconnect to JACK, now as Slave.  The JackPositionBBT bit then
       turns off.

    E. We see Hydrogen to Master, and The JackPositionBBT bit then
       turns on.  Of interest is why Hydrogen does not seem to multiply
       the PPQN (192) by 10.0.  Is this a bug or is it deliberate?  Also of
       interest is that the BPM (beats per minute) value goes to 110, even
       though the Hydrogen display shows "120.00".  Again, is this a bug,
       or is it deliberate?  Well, the intended BPM is 110, but
       Sequencer64-as-Master changes it to 120, then Hydrogen-as-Master
       changes it to 110, but doesn't update its display.  A minor bug.

    F. Hydrogen starts the JACK transport.

    G. We stop Hydrogen playback.  Note how Hydrogen rewinds the
       transport.  Is that something Sequencer64 ought to do?
       Or should we implement a Pause functionality (if feasible) in
       Sequencer64?  Also of interest is how the
       jack_position_t::bbt_offset field goes negative.  Not sure if this
       means anything.

    Also see contrib/notes/bugs-to-investigate.txt starting at "BUG
    REPORTS" for more issues (solved) to look at.

    Now exit Hydrogen and Sequencer64, leaving qjackctl and klick running.
    Note that hitting play in qjackctrl starts the timer running, but its
    BBT display does not move, and klick produces no metronome sounds.

    Start Sequencer64 as JACK Master again.  Now the qjackctl buttons
    fully work.  BBT is shown, Sequencer64 moves, and klick produces the
    metronome sounds.

    Start Sequencer64 as JACK Slave.  We have to change this status from
    the user-interface, currently [1].  We see this status while it is
    Master:

        00001   525312 006:2:1704 4/4  1920 120 1502342208

    This status continues when we reconnect as JACK Slave.  Then, when we
    use the qjackctl buttons again, it gets wonky:

        00000    36864 000:8:0000 -2147483648/0     0   0 1502342208
        00000    69632 000:8:0000 -2147483648/0     0   0 1502342208

    and the results are the same as if no other clients are running: no
    BBT time shown, and no metronome sounds from klick.

    Note that this is normal.  Sequencer64 as slave registers no timebase
    callback, and so cannot get access to position data for modification.

    [1] Is this a bug:  -j from the command line doesn't turn off the JACK
        Master option stored in the "rc" configuration file.  We have to
        change the settings in the user-interface and disconnect and
        reconnect.

To get midiclock64 to emit clock, we could not rely on qjackctl alone.  We also
had to add in "seq64 -t -J", with yoshimi already running to allow seq64 to
play and show tick progress.

Once that was done, midiclock64 would yield this output:

% ./Midiclocker64/midiclocker64
init_jack()
JACK server already started!
jack_portsetup()
clock_process(1024): [JackTransportRolling]
00101   784384 010:2:1730 4/4  1920 140 0
send_rt_message(F8)
clock_process(1024): [JackTransportRolling]
00101   785408 010:2:1825 4/4  1920 140 0
send_rt_message(F8)
clock_process(1024): [JackTransportRolling]
00101   786432 010:3:0000 4/4  1920 140 0
send_rt_message(F8)
clock_process(1024): [JackTransportRolling]
00101   787456 010:3:0095 4/4  1920 140 0
send_rt_message(F8)
send_rt_message(F8)
   . . .

===========================================================================
 Seq24 JACK Behavior
===========================================================================

    Running QjackCtl, Yoshimi with the horse.state file, and a2jmidid.
    Then run seq24.  Here are the behaviors under different settings of
    File / Option / Jack Sync, where we press the Disconnect button, make
    the setting, then press the Connect button.

    1. Jack Transport only [JACK transport slave].

      Live Mode:

       o  Main window
              a. Play button:
                 - QJackCtl resets to 0 if not already at 0.
                 - QJackCtl starts counting.
                 - Seq24 does not show any progress.
              b. Stop button:
                 - QJackCtl stops counting; the count stays at its current value.
       o  Song window: Same as Main window (and no arming).
       o  QJackCtl:
             - All its buttons do their functions.
             - But Seq24 does not follow.

      Song Mode:

          Same, but arming and unarming occur.  No movement.

    2. Jack Transport + Transport Master [JACK transport master].

      Live Mode:

       o  Main window
              a. Play button:
                 - QJackCtl resets to 0 if not already at 0.
                 - QJackCtl starts counting.
                 - Seq24 shows progress.
              b. Stop button:
                 - QJackCtl stops counting; the count stays at its current
                   value.
       o  Song window: Same as Main window (and no arming).
       o  QJackCtl:
             - All its buttons do their functions.
             - Seq24 follows progress.
             - Progress resets at Stop or Pause.
             - Progress in Seq24 resumes where it left off.

      Song Mode:

          -  Same, but arming and unarming occur.
          -  Every time Play is hit, the progress goes back to 0.

===========================================================================
 Seq32 JACK Behavior
===========================================================================

    Running QjackCtl, Yoshimi with the horse.state file, and a2jmidid.
    Then run seq32.  Here are the behaviors under different settings of
    File / Option / Jack Sync. Instead of the Disconnect button, though,
    we have to activate/deactivate the JACK button on the Song Editor window.
    And the "song mode" button on the Main window sets the Live/Song mode.

    1. Jack Transport only [JACK transport slave].

      Live Mode:

       o  Main window
              a. Play button:
                 - QJackCtl does not reset its time counter.
                 - QJackCtl starts counting.
                 - Seq32 shows progress.
                 - Further presses have no effect, playback proceeds.
                 - After a Stop, progress resumes where it left off.
              b. Stop button:
                 - Seq32 stops progress.
                 - Seq32 progress does not reset.
                 - QJackCtl stops counting; the count stays at its current
                   value.
       o  Song window: Same as Main window, but...
          - Song arming/disarming occurs.
       o  QJackCtl:
             - All its buttons do their functions.
             - Seq32 follows progress.
             - Progress resumes at Stop or Pause.
             - Progress in Seq32 resumes where it left off.

      Song Mode:  Behaves as if the Song window controls were used.

    2. Jack Transport + Transport Master [JACK transport master].

      Live Mode:

       o  Main window
              a. Play button:
                 - QJackCtl resets to 0 if not already at 0.
                 - QJackCtl starts counting.
                 - Seq32 shows progress.
                 - Further presses reset the position and playback proceeds.
                 - QJackCtl follows Seq32's position.
              b. Stop button:
                 - Seq32 stops progress.
                 - Seq32 progress resets the position.
                 - QJackCtl stops counting and resets its position.
       o  Song window: Same as Main window, but...
          - Song arming/disarming occurs.
       o  QJackCtl:
             - Only the Play and Pause buttons work.
             - They reset the position when press.

      Song Mode:
          - Behaves as if the Song window controls were used.


===========================================================================
 Notes from Other Sites
===========================================================================

http://shangrislinuxmusic.blogspot.com/2008/08/writing-and-recording-song-using-seq24.html

Start Qjackctl with

qjackctl &

You can then click on the Start button to start jackd. Your linux station
is now set up to play music.

Install Zynaddsubfx, Seq24 and Hydrogen

seq24 --manual_alsa_ports & zynaddsubfx -r 48000 -b 128 & hydrogen -d jack
&

Click on the "Connect" button of QJackctl. Check on the "Audio" tab that
Zynaddsubfx and Hydrogen outputs are connected to ALSA's PCM input.

On the ALSA tab, connect Seq24 first output to Zynaddsubfx's input, and
connect Seq24 second output to Hydrogen's input.

Select an instrument in Zynaddsubfx in the Instrument>Show Instrument Bank
menu. Then set the MIDI channel of Zynaddsubfx to 2 (It currently shows
"1"). Select another instrument for the second midi channel. Repeat the
operation for a third instrument.

Right-click in Seq24's grid and choose new. You will get a sequence
edition window. You can adjust the length of the sequence, which is by
default 1 bar. Let's tell Seq24 we want to play on the Hydrogen rhythmbox :
In the Output Bus menu left to the field that shows "[1] seq24 1" and set
it to "[2] seq24 2". Remember we connected Seq24's second midi output to
Hydrogen.

There's three MIDI buttons in the down left corner of the window. Click on
the first one to tell Seq24 to send midi events to Hydrogen. You can now
edit your pattern by holding right-mouse's button and left-clicking to
paste notes. You can adjust their length with the field next to the
sequence length. You can click on the piano keyboard to ear how each note
sounds. Hydrogen set's runs from C2 to D#3. Press "Play" to listen to your
sequence.

Once you have a Drum sequence, you can repeat theses steps to add our
three Zynaddsufx's instruments. Just select the first Output Bus for the
sequence (we connected the first seq24 output to Zynaddsubfx already). To
select one of the three Zynaddsubfx instruments, click on the button
showing a MIDI plug next to the Output Bus field and select one from 1 to
3.

Once you have some sequences, you can use them to compose the song : on
the main Seq24 windows, there's a 'Song Edition' button in the right down
corner. Click on it. In the new window, you can click the same way that in
the sequence windows to draw song sequences. Click on "Play" to play your
song.

https://help.ubuntu.com/community/HowToSeq24Introduction

http://sourceforge.net/p/seq24/mailman/message/1049880/

I use this setup:

                          +---------------+
                          |    ARDOUR     |
                          |               |
Seq24 --> QSynth -----------> Audio 1     |
  |                       |               |
  +-----> ZynAddSubFx ------> Audio 2     |
  |                       |               |
  +-----> Hydrogen ---------> Audio 3     |
                          |               |
                          +---------------+

And works fine for me. As Seq24 generates all the midi events, there are
no sync problems.

===========================================================================
 Ardour and Seq24
===========================================================================

   http://ooommm.org/sudelwiki/Seq24

   The method uses Ardour as a Time Master and synced application Seq24
   http://www.filter24.org/seq24
   as a source of MIDI Clock signal

   start JACK
   start ARDOUR, set it as Time Master (green button on) and sync source
   (above the button) should be JACK
   -start Seq24, create new blank 1 bar pattern
   -make the following settings in Seq24 (File>Options):

   MIDI Clock tab: use the radio buttons to route the clock signal to your
   MIDI device
   (if it's plugged in, it should be on the list, otherwise choose a port
   and do the routing in Jack Connect)
   Jack Sync tab: tick only Jack Transport box, select Live Mode, click on
   Connect
   that's all

   The tempo is determined by the ARDOUR tempo ruler (therefore can be
   variable!!!!), doesn't matter what BPM is set in Seq24
   I can use both the JACK and ARDOUR transport controls for start/stop

   Explained in Words
   Setting up Ardours timing:

   In the top-right corner in the Ardour Main Window there are some
   buttons - Punch In, Auto Play, Auto Input, Punch Out, Auto Return,
   Click - just left of these six Buttons are the Buttons we are looking
   for a dropdown menu called "Positional Sync Source" that lets us choose
   between:
   Internal
   MTC ( = Midi Time Code) ( NOT!= Midi Clock)
   JACK
   Time Master (Tooltip: "Does Ardour Control the time?")
   ON = Green = Yes, Ardour is the Time Master
   OFF = Grey = No, Ardour is not the Time Master and gets controlled
   from somewhere else
   For our Seq24-Ardour-Sync-Setup we hit it like this:
   Positional Sync Source = JACK
   Time Master = ON/Green

   Setting up JACK-Sync in seq24:

   File -> Options -> Jack Sync
   check Jack Transport & Song Mode, then hit CONNECT
   you can leave the seq24-window now and go back to Ardour or
   JACK/qjackctl

   Controlling seq24 via the Transport-Buttons in Ardour or
   JACK/qjackctl as you like:

   If you hit play in Ardour your seq24-Song will play at the same
   position as your Ardour-Playhead. Yeah!
   The BPM are controlled by the Ardour-Setting, the seq24-BPM-Setter
   is inactive right now.

   Is the MIDI Clock Tab in seq24 necessary for me?

   Note: there is a MIDI Clock Tab too, maybe i should set up that to
   keep tempo Synced between seq24/Ardour.
   I don't know by now. Maybe gonna check out. They were all ON and ON
   POS for all channels.

===========================================================================
 Session Management
===========================================================================

   http://lsn.ponderworthy.com/doku.php/robust_session_management

===========================================================================
 Sample Files of Various Kinds
===========================================================================

   http://hitmuri.net/index.php/Software/TranchesTutorialsDrums

   http://ccmixter.org/files/nickleus/40234

===========================================================================
 More Tutorials
===========================================================================

   http://www.nnc3.com/mags/LM10/Magazine/Archive/2008/88/051-055_music-studios/article.html

   http://penguinpetes.com/b2evo/index.php?p=811

      http://www.penguinpetes.com/pages/Seq24_MP3s/Steely_Dan_Brown.mp3
      http://penguinpetes.com/pages/Seq24_MP3s/greasy_burgers.mp3

===========================================================================
 QJackCtl, Yoshimi, and Sequencer64
===========================================================================

Playing TestBeeps.midi:

    Run qjackctl:

        Sample Rate = 48000
        Frames/Period = 128
        Periods/Buffer = 4
        (Latency = 10.7 ms)

        At this rate, there's is a tiny amount of crackling on playback.
        Reducing the latency makes it worse.  Also makes it harder for
        Yoshimi or Sequencer64 to reliably connect.

        At higher latencies, on my system, the beeps are regular, and
        viewing the jack_capture'd waveform looks basically fine.

        For example, a latency of 21.3 ms is fine.

===========================================================================
 TO DO LIST
===========================================================================

    jack_delay

    jack_demolition:

        http://plugin.org.uk/releases/jack-demolition/jack-demolition.tar.gz

===========================================================================

# vim: sw=4 ts=4 wm=8 et ft=c
