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
Transform3Dparameter to create kaleidoscopic looks with
groups of lights.
- A new
confettieffect which assigns random colors (and optionally
aim points) to groups of lights at intervals.
- A new
pinstripeseffect which can alternate stripes of color
- 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
- 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
- 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
fn?since the latter is too restrictive, and only
truefor functions explicitly created using
That precluded, for example, the idiomatic Clojure approach of using
:xas 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.controllerscan 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.
controllers/IOverlayprotocol 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
doublesince that is what Clojure actually natively uses.
- All other
floatvalues which were created throughout Afterglow
were changed to
doublevalues, since that is what Clojure actually
natively uses, and they were getting promoted when used anyway.