Releases: Deep-Symmetry/afterglow
Release 0.2.6 preview
This release contains pre-release builds of release 0.2.6 for people who want to use the latest code. (The afterglow.jar
file below will be updated during the development of this release, so download it frequently to get the latest changes. The timestamp and commit associated with the “release” are meaningless.)
For details see the change log.
Release 0.2.5
Some small fixes, many dependency updates, and rebuilt using Java 11 so the jar works without having to include modules when using with Java versions beyond 8.
For details see the change log.
Release 0.2.4
Some small fixes and a new command-line argument to support headless operation.
For details see the change log.
Release 0.2.3
Primarily fixes issues that were found in working with rich grid controllers (the Ableton Push and Novation Launchpad families) under Windows.
For details see the change log.
Release 0.2.2
This release incorporates some nice improvements in underlying libraries, as well as Afterglow itself. It now embeds CoreMidi4J, so if you had previously installed that separately in your /Library/Java/Extensions/
folder, be sure to remove it. From now on, the latest version will always be inside Afterglow itself. Also new is beat-link which is building on our rapidly-expanding knowledge of how to work with Pro DJ Link devices: expect new features in this area soon.
For details see the change log.
Release 0.2.1
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.
Added
- 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
independently. - 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
response. - 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
Java3DTransform3D
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.
Fixed
- 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
change. - 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 tomaster
. - 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 theifn?
predicate
rather thanfn?
since the latter is too restrictive, and only
returnstrue
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.
Changed
- 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
todouble
since that is what Clojure actually natively uses. - All other
float
values which were created throughout Afterglow
were changed todouble
values, since that is what Clojure actually
natively uses, and they were getting promoted when used anyway.
Clojars release 0.2.0
There is a bunch of great new functionality in this release, including the long-planned effect control interface in the embedded web interface, pretty and powerful color adjustment interfaces, and a new rich controller mapping for the Novation Launchpad Pro, but the main reason for bumping the version to 0.2.x is the removal of deprecated functions that had been accumulating in the 0.1.x releases.
Added
- Running effects are now listed on the Show Control page of the Web
UI, in descending priority order, with buttons to end them, and
controls to adjust cue parameters, including colors. - The show's dimmer grand master is now visible and controllable
below the cue grid in the web UI. - A rich grid controller mapping for the
Novation Launchpad Pro. - A rich color picker interface on the Ableton Push for cues with
color variables. - You can now map sliders and encoders on any MIDI controller to
adjust components of a color stored in a show variable (that is,
adjust its red, green, and blue values, or its hue, saturation, and
lightness). - The example global color and strobe cues have been upgraded to take
advantage of the new color cue parameters, so their colors can be
adjusted on the fly using the web or Push interfaces. - The Shift button can be used with Tap Tempo buttons on controllers
and the web UI to set the start of a beat, bar, or phrase, depending
on the synchronization level of the metronome. - Buttons or pads on any MIDI controller can now easily be mapped to
act like the smart Tap Tempo and Shift buttons on the Ableton Push
and Novation Launchpad. - Cues can have animated colors on grid controllers including the web
interface, to help remind operators about the effects they launch,
or reflect the current value of a color variable on which they are
based. - When binding a generic MIDI controller to launch a cue, if that
controller does not have velocity-sensitive pads, you can assign an
explicit velocity to use in the binding, for the purpose of setting
any velocity-sensitive cue variables. - An explanation of how to bind a MIDI controller to a dimmer master
has been added to the mapping documentation. - Animated GIFs in the documentation illustrate how the cue user
interface works.
Fixed
- Using dynamic color variables to as inputs for other dynamic color
parameters could cause crashes when trying to adjust the incoming
color values due to a longstanding subtle bug, which has been fixed. - Ordinary MIDI control surfaces were sometimes being mistakenly
identified as candidate sources of Tratktor beat phase information,
leading to exceptions in the log file. Now only devices sending
clock pulses are considered beat phase candidates. - Cue colors were improved in the web interface and on the Push to
make it easier to see which cues are active, as well as to make the
colors more faithful to the cue's intent. - The text labels on cues in the web interface are now more legible
because they use a contrasting color based on the cell's perceived
brightness. - Incompatible cues are now identified not just from matching effect
keys, but also from their:end-keys
lists, so the web and
controller interfaces provide even more guidance. - Launching cues from the web interface was not setting any value for
cue variables configured to be velocity sensitive, which was
sometimes causing issues. Now the assignment of velocity-adjustable
variables happens in the process of launching any cue from the grid,
and a default velocity of 127 is assumed if none is specified. - The entire frame of a user interface being rendered on a grid
controller or the web interface now uses the same metronome
snapshot, to represent a consistent point in time. - Some testing in a Windows virtual machine revealed issues when
working with standard Java Midi implementations (as opposed to
CoreMidi4J on the Mac). These were addressed.
Changed
- Updated to newly-released Clojure 1.8 for improved performance.
- Deprecated functions were removed:
afterglow.effects.color/find-rgb-heads
(instead useafterglow.channels/find-rgb-heads
)afterglow.effects.color/has-rgb-heads?
(instead useafterglow.channels/has-rgb-heads
)afterglow.effects.oscillators/sawtooth-beat
(instead usesawtooth
)afterglow.effects.oscillators/sawtooth-bar
(instead usesawtooth
with:interval :bar
)afterglow.effects.oscillators/sawtooth-phrase
(instead usesawtooth
with:interval :phrase
)afterglow.effects.oscillators/triangle-beat
(instead usetriangle
)afterglow.effects.oscillators/triangle-bar
(instead usetriangle
with:interval :bar
)afterglow.effects.oscillators/triangle-phrase
(instead usetriangle
with:interval :phrase
)afterglow.effects.oscillators/square-beat
(instead usesquare
)afterglow.effects.oscillators/square-bar
(instead usesquare
with:interval :bar
)afterglow.effects.oscillators/square-phrase
(instead usesquare
with:interval :phrase
)afterglow.effects.oscillators/sine-beat
(instead usesine
)afterglow.effects.oscillators/sine-bar
(instead usesine
with:interval :bar
)afterglow.effects.oscillators/sine-phrase
(instead usesine
with:interval :phrase
)afterglow.effects.params/build-oscillated-param
(instead use
afterglow.effects.oscillators/build-oscillated-param
)afterglow.show/add-midi-control-to-cue-mapping
(instead use
afterglow.effects.cues/add-midi-to-cue-mapping
)afterglow.show/remove-midi-control-to-cue-mapping
(instead use
afterglow.effects.cues/remove-midi-to-cue-mapping
)
- The detailed documentation was updated to use attributes to link to the API
documentation so it could be linked to its release-specific version. - The API documentation was moved into a github-pages branch so
versioned snapshots can be kept around. - A few functions were newly deprecated to improve the consistency of the API:
afterglow.effects.cues/add-midi-control-to-cue-mapping
(instead
use the more accurately namedadd-midi-to-cue-mapping
)afterglow.effects.cues/remove-midi-control-to-cue-mapping
(instead use the more accurately namedremove-midi-to-cue-mapping
)afterglow.show/remove-midi-control-to-var-mapping
,
afterglow.show/remove-midi-control-to-master-mapping
, and
afterglow.show/remove-midi-control-metronome-mapping
(they are
no longer needed, the general-purpose function
afterglow.midi/remove-control-mapping
works instead of each)
Clojars release 0.1.6
This release takes advantage of the new CoreMIDI4J project to finally solve all issues in working with Java on a Mac: you can now connect and disconnect controllers and MIDI clock sources while Afterglow is running without having to restart. It also includes some significant new features based on (or improved by) user suggestions.
Added
- Support for CoreMIDI4J,
to preferentially use MIDI devices returned by this new lightweight
open-source Java MIDI service provider implementation for Mac OS X.
CoreMIDI4J is compatible with current Java and OS versions, and
addresses long-standing defects in the standard Java MIDI
implementation, such as support for System Exclusive messages, and
reconfiguration of the MIDI environment as devices are connected and
disconnected. Afterglow's MIDI implementation now gracefully handles
changes in the MIDI environment, cleaning up bindings, synced
metronomes, grid controllers, and cue feedback functions associated
with devices which no longer exist, and making new devices available
for use. - MIDI device watchers, which can set up bindings whenever a specified
device is connected. These also allow effortless recovery from a
temporary disconnection from a device during a show. - Code cues, making it easy to trigger arbitrary activity from a cue
grid, issue 34. - Links to graphs and expanded discussion in the oscillator API docs.
- Dimmer effects can now work with dimmer function ranges on
multipurpose channels as well as full dedicated dimmer channels. - Dimmer effects can now also create virtual dimmers for RGB-mixing
fixtures that don't have any actual dimmer channels, allowing them
to participate as if they did, by modifying the color effects being
sent to them. - Step parameters can now have interval ratios, like oscillators.
- When building step parameters, you can now use dynamic parameters as
inputs. - When mapping a MIDI control to a show variable, you can now supply a
custom function to transform the incoming value into whatever you
need it to be,
issue 32. - When mapping a midi control to launch a cue, if your controller
supports velocity (and perhaps also aftertouch, or polyphonic key
pressure), you can have those values affect cue variables which have
been defined as velocity sensitive, in the same way that Ableton
Push pads do. - A variation of the sparkle effect which uses dimmer channels,
issue 35. - Some more examples of how to get started working with Afterglow.
- A variety of other documentation improvements.
Changed
- Oscillators have been completely redesigned in order to be more
flexible and easy to create and work with, and to support dynamic
parameters so their configuration can vary over time or location,
issue 9. The old
oscillator and oscillated parameter functions have been deprecated,
and are now stubs wich delegate to the new implementation. They will
be removed in an upcoming release. - The functions
add-midi-control-to-cue-mapping
and
remove-midi-control-to-cue-mapping
have been moved from the
afterglow.show
namespace toafterglow.effects.cues
, to solve a
circular dependency conflict which arose in implementing velocity
and aftertouch support. There are stubs in the old location which
delegate to the new ones, but they are less efficient than calling
them in the new location directly, and are deprecated. The stubs
will be removed in an upcoming release. - The former
IHeadParam
interface has been eliminated, folding its
semantics into theIParam
interface, and simplifying the
implementation of dynamic parameters,
issue 20. - The
:adjust-fn
parameter tobuild-variable-param
has been
renamed:transform-fn
to be consistent with the equivalent
mechanism added for MIDI control mappings in
issue 32. The
documentation has been improved a bit as well. - The maps which track MIDI bindings now use the underlying Java
MidiDevice
object for their keys, which allows for more efficent
lookup than theovertone.midi
:midi-device
map which was
previously used. - The functions which add and remove bindings to MIDI control, note,
and aftertouch messages have been simplified so they no longer
require you to come up with a unique keyword to use when later
removing the binding. Instead, you simply pass the same function
that was used when establishing the binding to remove it. - All functions which allow you to select a MIDI device have been made
consistent, and now allow you to filter devices by a variety of
criteria, not just the name and description. - Various maps used to manage Afterglow state, such as shows, cue
grids, Push controllers and auto-binding watchers, are now tagged
with type metadata to make it easier to recognize them.
Fixed
- Clicking on the BPM slider in the web interface now updates the BPM
(previously you had to actually drag it),
issue 18. - Launching
:held
cues from generic MIDI controllers, the Ableton
Push, and the web interface, would not succeed if the previous
effect created by the cue was still in the process of ending,
issue 33. - Make sure MIDI inputs are connected when
sync-to-midi-clock
is
called,
issue 10. - Also make sure the MIDI inputs are opened when rendering the web UI,
so that the sync button will be able to list available sources of
MIDI clock messages. - Clarified that syncing to Traktor beat phase still requires Traktor
to be configured to send MIDI clock,
issue 37. - Added more detail about how to safely import and configure the
Afterglow Traktor device mapping. - A variety of issues ranging from questionable style through misplaced
documentation, unused or inaccessible code, preconditions that would
not take effect, and actual problems, were identified by Kibit and
Eastwood (after discovering how to work around a crash in Eastwood
caused by the protocol definitions inrhythm.clj
), were cleaned
up.
Clojars release 0.1.5
This release marks the first one that includes input in the form of suggestions and bug fixes raised by users other than myself, which is a lovely development. Thanks, everyone!
Added
- Chases, which support sequences of effects with a variety of timing,
fade, and looping options. - Step parameters, which provide flexible control of chases.
- Pan/Tilt effects, which work at a lower level than direction
effects, but since they are closer to the physical capabilities of
the lights, can be helpful in creating natural and intuitive
movements. They also help avoid issues with geometric singularities
when fading between different directions. - Graphs to visually illustrate the available oscillators and the
parameters that tune their behavior.
Changed
- Fades now delegate their notion of ending to the underlying effects
which are being faded between, and pass end requests along to them. - Stopped embedding
cider-nrepl
because it added too much bloat and
complexity for an unlikely use case. If you want to work with CIDER
for live-coding with Afterglow, launch it from a project, rather
than as an überjar.
Fixed
- Some MIDI controllers (perhaps those which sent messages on channels
other than 0?) were causing Overtone's
midi-clj library to create
message maps withnil
values for the:status
key when sending
control-change or note messages, which was preventing them from
being detected or processed correctly. Afterglow now always looks
for command-like messages via the:command
key instead. - Fading colors in and out from nothing, as represented by a
nil
assignment value, was fading to a desaturated version of black,
which does not lead to the kind of results people generally expect
and want. In this situation, the color is now faded to or from a
darkened version of itself. - The phases of the square-bar and square-phrase oscillators were
flipped from what they should be according to the documentation, and
compared with square-beat. This was discovered and corrected when
graphing them. - Calculation of white LED channel for colors with lightness less than
50 was wrong, leading to slight unintentional desaturation of
colors. - It was a little too hard to see the difference between the "ready"
and "active" states for some colors on the Ableton Push after
introducing full RGB button color support; they are once again more
visually distinct. - Preconditions in channel-creation functions for fixture definitions
were mal-formed, and so were not actually validating the function
arguments. - Parts of the introductory walk-through in
README.md
had become
stale and needed to be updated. - The API documentation for
patch-fixture!
was fleshed out.
Clojars release 0.1.4
A lot of big things have happened since the last release! But the completion
of scenes and fades made this a must.
Added
- Support for inverted dimmers (where lower DMX values are brighter).
- Scenes, which allow multiple effects to be grouped into one.
- A framework for fading between effect elements, with sensible
semantics for colors, aim, directions, and functions, and defaults
when fading in or out of nothing. - Fading between entire effects, including complex effects and scenes,
which do not necessarily affect all the same fixtures and channels. - A new mechanism for extending the rendering loop to support effects
which do not result in DMX values to send to the show universes. - Support for (and examples of) integration with laser shows being run
by Pangolin Beyond software, using the extension mechanism. - New conditional effects and variable-setting effects, using the
extension mechanism. - A composable effect which can transform the colors being created by
other effects to build layered looks. The default transformation
causes the colors to range from fully saturated at the start of each
beat to pure gray by the end of the beat, but it is very easy to
swap in other transformations using oscillated parameters. - Holding down the Shift key while turning the encoder allows the BPM
to be changed more rapidly (in whole beat increments, rather than
tenths) on the Ableton Push. - Fixture definitions for Chauvet LED Techno Strobe, LED Techno Strobe
RGB, ColorStrip, Spot LED 150, Kinta X, Scorpion Storm FX RGB,
Scorpion Storm RGX, Q-Spot 160, Intimidator Scan LED 300, Geyser RGB
fogger, and Hurricane 1800 Flex fogger. - Example effect which desaturates a rainbow over the course of a
beat.
Changed
- Improved readability and parallelism of core rendering loop.
- The default frame rate was raised from 30Hz to 40Hz.
- Ableton Push now uses SysEx message to specify the exact RGB color
to light up a pad, rather than choosing from the limited set
available through MIDI velocity. - Ableton Push now makes sure the pads are put in poly-pressure mode,
and sets the sensitivity level to reduce the chance of stuck pads. - The stability of MIDI clock sync was greatly improved, in order to
facilitate the Beyond integration. - The refresh rates of the Push and web interfaces were reduced to put
less load on the CPU. - The tempo buttons on the Push and web interfaces are now always
flashed at least once per beat, even if the reduced refresh rate
causes the normal "on" window to be missed. - Improved content and format of command-line usage help.
Fixed
- The Ableton Push binding now ends cues when it receives an afertouch
value of 0, since the hardware is not reliably sending a note-end
message, especially when multiple pads are being pressed at once. - Fail gracefully when trying to bind to an Ableton Push when none can
be found. - Some small errors in the documentation were corrected.