Releases: Deep-Symmetry/beat-link
Releases · Deep-Symmetry/beat-link
v8.0.0-SNAPSHOT preview
🚧 This is pre-release code for people who want to help test what is going into the next release.
Don’t download this if you aren’t comfortable testing code while it is under active development! Instead, look at the latest release.
The API docs for the latest preview release can be viewed here.
v7.4.0
Fixed
- It turns out there is a bug in Java under Windows that can sometimes return
null
values in the list of network addresses associated with an interface. Beat Link now has defensive code to protect itself against this and avoid crashing.
Changed
- Replaced the dependency on ConcurrentLinkedHashMap with a much-simplified in-project implementation based on some suggestions kindly shared by Ben Manes, the author of that library, so that Beat Link Trigger can work as a pre-compiled GraalVM native-image, while retaining its backwards compatibility with Java 6 environments (like afterglow-max). Thanks to Noah Zoschke for the pull request that led to this change in direction.
- Upgraded to version 0.2.0 of Crate Digger, which had a couple of backwards-incompatible changes to accommodate a new linter in the latest release of the Kaitai Struct Compiler which identified places where field names were not following the style guide. It also supports creating metadata archives for use with the Opus Quad, which won’t be taken advantage of until Beat Link 8.0.
7.3.0
Added
- Precise position packets sent by CDJ-3000s are processed and used to keep track of the exact playback position of these players with much higher fidelity than is possible for other players, even when they are not currently playing.
- Recognition of dynamic loop information sent by CDJ-3000s, including display of such loops in the
WaveformDetailComoponent
. This means that even loops which do not exist within the track metadata can be displayed on CDJ-3000s, and for such players inactive loops can be drawn in gray rather than the usual orange. - A new utility function to calculate a raw pitch integer value given a human-oriented pitch percentage value, because the new precise position packets sent by the CDJ-3000 use the humane approach.
- A convenience method on
TrackPositionUpdate
which returns the beat within bar represented by that track position. - We can now recognize loaded menu items that represent a track title plus musical key.
Fixed
- We now send startup and keep-alive packets in a way that is compatible even with CDJ-3000s that are using player numbers 5 and 6 (they no longer display a warning dialog nor drop off the network).
- The calculation of pitch percentages from pitch values found in CDJ status packets was slightly inaccurate because of two transposed digits in a calculation.
- The code that detects pre-nexus CDJs was confused by the CDJ-3000.
- Sometimes beat packets can come after a status packet at the very beginning of a new beat, and this used to cause the beat number to jump up and back down.
- The clipping region was not being set correctly when painting phrase information at the bottom of the waveform detail component, which could cause the fill dots to extend beyond the edge of the component in certain circumstances.
- The code to clear out the device name buffer when setting a new device name for the
VirtualCdj
was using the wrong value fortoIndex
(I had thought the argument was a length instead), so long names were not being properly cleared out.
Changed
- The
TrackPositionUpdate
class has a new field,precise
, which reports whether we are receiving precise position updates from the player. - When determining the item type of a menu item response message, we now mask the menu item type (field 7) with
0xffff
, because CDJ-3000s seem to send additional (as yet unknown) information in the higher-order bytes.
7.2.0
Added
- The
WaveformPreviewComponent
andWaveformDetailComponent
now have accessors allowing callers to obtain the underlying waveform information that is driving their display.
Fixed
- The
WaveformPreviewComponent
andWaveformDetailComponent
were not correctly updating the color of their playback indicators ifsetPlaybackState
was called with a change in nothing but theplaying
boolean. - Trying to request track analysis file tags using DB Server queries (when using a real player number) was not working because the file extension was being passed without stripping off the leading "." as required by the protocol.
Changed
- The
BeatGrid
reports requests for out-of-range beats at debug level now, rather than warning, since they were quite noisy and meaningless in the log file. - The
getBarNumber()
method inBeatGrid
now follows the Rekordbox convention of reporting a value of-1
in any partial bar at the start of a track, and bar1
always begins with the first downbeat. - The method
requestSongStructureFrom()
in theAnalysisTagFinder
was an anachronism, and has been corrected torequestAnalysisTagFrom()
.
7.1.0
Added
- The
ArtFinder
now tries to find high-resolution album art when it
is available (240x240 pixels rather than the original 80x80 pixels).
This can be turned off by callingsetRequestHighResolutionArt(false)
. - Some additional details of the upcoming beat/bar values in the
Beat
object were clarified.
7.0.1
Changed
- The
BeatGrid
class no longer throws an exception when it is asked
for the offset of a nonexistent beat. Instead it logs a warning, and
returns the offset of the nearest beat.
7.0.0
Added
- Support for channels 5 and 6 in the DJM-V10 channels-on-air messages, #47 for receiving, and #46 for sending.
- Support for obtaining song structure (phrase analysis) information from players, now that rekordbox 6 and later export it.
- Ability to display analyzed phrases on track waveforms.
- Support for obtaining any new type of track analysis which we can create definitions for in Crate Digger and obtain using the general track-analysis section
dbserver
request. - The BeatGrid can now tell you the bar number associated with a beat number, accounting for the possibility of a partial bar at the start of the track.
- Information about the timing of upcoming beats and bars present within beat packets is now made available.
Removed
- The ability to create and use metadata caches has not been useful for a couple of years now, since we figured out how to use Crate Digger to reliably obtain track metadata even when there are a full set of real players on the network. So the complicated code which supported it has been removed, rather than trying to update it to keep up with new features like phrase analysis.
Changed
- The versioning numbering scheme has been made more reasonable. This is now version 7.0.0 instead of 0.7.0, to reflect the fact that there have been many releases in active production use.
- We now ensure that if the TimeFinder is running, it is informed about new beats received before any other registered beat listeners, so they can rely on it to provide the actual current beat number.
0.6.3
Added
- The ability to set a player's My Settings configuration by sending a newly-discovered packet.
- The ability to set a background color for the
WaveformDetailComponent
andWaveformPreviewComponent
, for use by the OBS overlay server in Beat Link Trigger. You can also now change the colors used to draw the playback position indicator and tick and beat marks to go with your overall look.
0.6.2
Fixed
- The interpretation of colors for memory points and loops (as opposed to hot cues) has been fixed, thanks to a contribution by @ehendrikd.
- It turns out that nxs2 cue list entries are not always complete, they are sometimes missing color information or even the comment information that precedes it. We no longer crash when we encounter
such partial cues. - Fixes to the Beat Link and Crate Digger libraries allow them to work properly with new formats for data that rekordbox 6 sends. We may find more problems in the future, because testing with this new version has been limited, but it is already working much better than it did at first.
- An update to Crate Digger avoids crashes when trying to parse track analysis files created with mal-formed vestigial waveform preview tags.
- The interpretation of byte
0x37
in the CDJ status packet has been updated, which forced fixes of theisDiscSlotEmpty()
andgetDiscTrackCount()
methods inCdjStatus
. - Links in the JavaDoc now directly take you to the relevant sections of the new Antora documentation site that replaced the old PDF protocol analysis document.
- Track Load packets now need to have an extra value to tell the recipient on which deck the track should be loaded, because the XDJ-XZ has two decks but only one network address on which to receive these commands. (Sadly for us, it refuses to load tracks from other players even when this byte is sent correctly, it only loads tracks from a rekordbox collection when rekordbox tells it to.)
Added
- Another bit has been explained in the main
CdjStatus
flags byte: we can now tell when a DJ has forced a player into degraded BPM-only sync mode (by nudging the jog wheel of a synced player). - We now know that beat grid entries also report the tempo of the track at that beat, so this is properly exposed in the API.
- We now fully support the device number assignment phase of the Pro DJ Link protocol, so when Beat Link is connected to an ethernet port on a mixer that is assigned a dedicated channel number, it will use that device number, and we defend our device number once we have successully claimed it.
Deprecated
- The classes and methods relating to creating and using metadata caches are no longer needed because we can reliably obtain metadata no matter how many CDJs are on the network.
- The
getName
andgetNumber
methods inDeviceAnnouncement
were inconsistent with thegetDeviceName
andgetDeviceNumber
naming convention used in the entire device update packet hierarchy.
0.6.1
Fixed
- The
TimeFinder
is no longer tricked by beat packets from pre-nexus players into thinking that it might know where in the track that player is. Track position detection is only possible with nexus and later hardware, because only they report beat numbers. - When the
VirtualCdj
is forced to shut down because of apparent network changes, it now also flushes theDeviceFinder
’s list of known DJ Link devices, because they are probably no longer reachable. This will allow for immediate recovery attempts by telling theVirtualCdj
to restart itself (without this change, restarting it within ten seconds or so would fail because it would complain about being unable to communicate with the ghost devices on a no-longer reachable network, until they disappeared due to lack of recent packets). - The
crate-digger
library was updated to fix a misunderstanding of the structure of cue list entries which could crash the parser. - Our own parsing of cue list entries fetched using the
dbserver
protocol is now robust against missing color bytes, which also seems to happen in the wild.
Added
- Error messages reported when parsing an ANLZ or EXT file fails now include the path to the file in the source media, to help find it for forensic analysis. This enabled the
crate-digger
fix mentioned above. - A flag on the DeviceUpdate class that indicates whether it seems to have been sent by a pre-nexus player (CDJ-900 or CDJ-2000).
Changed
- No longer log a stack trace for the expected situation of a color waveform (or waveform preview) being unavailable. Also handle the case where it is reported available, but has zero size.
- Because the XDJ-1000 seems to calculate the payload size value for its status packets incorrectly (subtracting the header size twice) we now only report that one time, to stop flooding the logs with warnings for each status packet received.