Skip to content

@brunchboy brunchboy released this Apr 3, 2016 · 189 commits to master since this release

This release packs the most new features ever, since it comes after a big effort to prepare for running an all-night Psy Trance show (and everything learned in that process), along with support for the Ableton Push 2, thanks to the newly-available documentation, and the rest of the Novation Launchpad family, thanks to some loaner hardware provided by Novation.


  • The web and Push interfaces now offer a way to save adjusted cue
    variable values, so the next time the cue is launched the saved
    values are used.
  • Show operators can also create "Macros" by selecting a group of
    running cues and choosing an unused cue grid cell. This will create
    a new compound cue in the cell which will re-run all of the cues
    they specified, with the same parameters they had when the macro was
    created, whenever it is run. The compound cue will end all of its
    component cues when you end it, and will end itself if they end
  • You can now right-click on cues in the web interface to bring up a
    menu of actions. The menu so far offers just the ability to delete
    the cue if there is one there (this can clean up macros you no
    longer want, for example).
  • The Ableton Push 2 is now supported as a rich grid control
    interface, taking full advantage of its color graphic display.
  • Support for other members of the Novation Launchpad family of grid
    controllers has been implemented:
    • Launchpad Mini
    • Launchpad S (untested, but the Mini, which works, is based on the S)
    • Launchpad Mk2
  • The identity of grid controllers is verified before binding to them,
    by sending a MIDI Device Inquiry message and inspecting the
  • The auto-bind mechanism has been improved so much that the sample
    show can now simply turn it on to fully automate the process of
    detecting and binding to any compatible grid controllers that appear
    in the MIDI environment, with no user or configuration effort.
  • Direction and aim parameters can now be transformed by a dynamic
    Java3D Transform3D parameter to create kaleidoscopic looks with
    groups of lights.
  • A new confetti effect which assigns random colors (and optionally
    aim points) to groups of lights at intervals.
  • A new pinstripes effect which can alternate stripes of color
    across fixtures.
  • Incoming MIDI System Exclusive messages can now be received and
    delivered to handlers.
  • Cue variables can now be Booleans, to support cues which want to be
    able to adjust the direction of a sawtooth oscillator while running.
  • The dimmer oscillator cues created in the sample show now include
    Min and Max variables so the range over which the dimmer oscillates
    can be adjusted.
  • The Ableton Push mapping now lets you scroll through all variables
    assigned to a cue so you can see and adjust more than the first two.
  • You can now use the touch strip on the Ableton Push to immediately
    jump to any part of the legal value range when adjusting a numeric,
    boolean, or color cue variable, BPM, or the Dimmer Grand Master. The
    LEDs on the touch strip also reflect the current value of the
    variable being adjusted.
  • You can use the keyboard arrow keys to navigate around the cue grid
    when using the web UI, as long as no input element is focused.
  • You can use the space bar to tap tempo when using the web UI, as
    long as no input element is focused.
  • Cues can have visualizer creation functions assigned to them, so
    they can provide animated visualizer displays on the Push 2.


  • Fixtures which had no channels assigned to the fixture itself, but
    only to heads (like Blizzard's Pixellicious pixel grids) could not
    be patched properly to shows, because the code checking for address
    conflicts was not able to figure out the universe assigned to them.
  • Chases containing only scenes would end instantly rather than
    running, because of some assumptions they were making about how the
    effect protocol was implemented, which scenes violated. Chases are
    now more robust.
  • The low-level tempo tap handler was already more useful than I was
    giving it credit for, suitable for both aligning to the current beat
    as well as adjusting the tempo if you hit it three or more times, so
    the shift key can be used to adjust the down beat even on
    unsynchronized shows. This makes it much easier to keep the lights
    in sync manually!
  • The color wheel is only applied when a color has sufficient
    saturation for it to make sense. The threshold can be adjusted by
    setting the show variable :color-wheel-min-saturation.
  • Floating-point cue variables now stay rounded to the specified
    resolution when adjusting them on the Push.
  • Effects with Unicode characters in them were crashing the Ableton
    Push display code, since it only handles single byte ASCII plus a
    handful of special symbols used for drawing interface elements. Now
    unprintable characters are substituted with an ellipsis symbol
    rather than crashing.
  • The entire Push display was being redrawn on each frame of
    user-interface updates, and all text-labeled button states were
    being set, even if they had not changed from the previous frame.
    These redundant messages are no longer sent, and MIDI messages are
    sent to the Push only when text and button states actually need to
  • The slider tooltips for cue variables in the web UI were getting in
    the way of adjusting the sliders because they would appear when the
    mouse was over the tooltip, not just the slider track. They could
    also not be seen on mobile devices. So they have been turned off
    entirely in favor of always-visible value labels.
  • The documentation link in the web interface now takes you to the
    proper version-specific tag of the documentation if it is a release
    build. Snapshot builds take you to master.
  • The nav bar in the show control web page is now compressed to better
    fit mobile devices, since it can be used on the iPad Pro.
  • Extraneous errors were being logged in the browser console because
    we were sometimes returning spurious error responses for cue
    variable updates, saves, and clears.
  • The end effect buttons and cue variable scroll buttons under
    the text area on the Ableton Push were not affecting the proper
    effects when the effect view was scrolled back from the most recent.
  • The effect overflow indicators in the Push text area were not
    properly disappearing when enough effects ended to render them no
    longer needed until the user pressed Shift to try to scroll.
  • Under some circumstances the Push mapping could crash when there was
    no cue associated with an effect.
  • All MIDI event handler functions are now called in a context which
    properly recovers from exceptions at the level of that individual
    handler, so other handlers will not be affected.
  • Everywhere that Afterglow was checking whether an argument was
    callable as a function has been fixed to use the ifn? predicate
    rather than fn? since the latter is too restrictive, and only
    returns true for functions explicitly created using (fn ...).
    That precluded, for example, the idiomatic Clojure approach of using
    :x as a function to extract the x coordinate of a head when
    defining a spatial parameter.


  • You no longer need to specify what kind of grid controller you are
    trying to bind to in advance; the controller manager in
    afterglow.controllers can recognize the supported controllers from
    their responses to the MIDI Device Inquiry message, and instantiate
    the appropriate binding. New controller implementations can register
    themselves when their namespaces are loaded so the controller
    manager will dispatch to them as needed.
  • The code to gracefully shut down active controller bindings, which
    was becoming duplicated with every new controller mapping created,
    has been pulled up into the shared controllers namespace.
  • The code to watch for and automatically bind to a controller when it
    appears in the MIDI environment has similarly been generalized and
    pulled into the shared controllers namespace.
  • The ability to register an interest in all events from a specific
    MIDI device was added, and the controller mapping implementations
    were updated to take advantage of this, so they no longer need to
    receive and filter out all the events from other devices.
  • The sample show is becoming a much more practical example of how to
    layer flexible color and dimmer cues, with good cue variables to add
    even more dimensions.
  • A lot of repetitive code in the examples namespace was consolidated
    using helper functions.
  • The controllers/IOverlay protocol was expanded to include the
    ability for an overlay to handle and absorb pitch-bend messages, in
    preparation for supporting the touch strip on the Ableton Push.
  • The floating-point format for cue variables was changed from float
    to double since that is what Clojure actually natively uses.
  • All other float values which were created throughout Afterglow
    were changed to double values, since that is what Clojure actually
    natively uses, and they were getting promoted when used anyway.
Assets 3
You can’t perform that action at this time.