Skip to content

Releases: Deep-Symmetry/beat-link

v8.0.0-SNAPSHOT preview

06 Dec 04:04
db7c302
Compare
Choose a tag to compare
Pre-release

🚧 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

05 May 04:35
2dec6cd
Compare
Choose a tag to compare

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

24 Nov 20:10
167f73b
Compare
Choose a tag to compare

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 for toIndex (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

13 Aug 23:48
056dee5
Compare
Choose a tag to compare

Added

  • The WaveformPreviewComponent and WaveformDetailComponent now have accessors allowing callers to obtain the underlying waveform information that is driving their display.

Fixed

  • The WaveformPreviewComponent and WaveformDetailComponent were not correctly updating the color of their playback indicators if setPlaybackState was called with a change in nothing but the playing 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 in BeatGrid now follows the Rekordbox convention of reporting a value of -1 in any partial bar at the start of a track, and bar 1 always begins with the first downbeat.
  • The method requestSongStructureFrom() in the AnalysisTagFinder was an anachronism, and has been corrected to requestAnalysisTagFrom().

7.1.0

17 Apr 00:56
2f2a300
Compare
Choose a tag to compare

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 calling setRequestHighResolutionArt(false).
  • Some additional details of the upcoming beat/bar values in the Beat
    object were clarified.

7.0.1

30 May 23:50
2d250ea
Compare
Choose a tag to compare

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

07 Mar 21:13
aeb4e8c
Compare
Choose a tag to compare

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

28 Dec 21:21
c7604f0
Compare
Choose a tag to compare

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 and WaveformPreviewComponent, 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

10 May 21:42
4f45ff1
Compare
Choose a tag to compare

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 the isDiscSlotEmpty() and getDiscTrackCount() methods in CdjStatus.
  • 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 and getNumber methods in DeviceAnnouncement were inconsistent with the getDeviceName and getDeviceNumber naming convention used in the entire device update packet hierarchy.

0.6.1

09 Feb 20:06
42845cc
Compare
Choose a tag to compare

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 the DeviceFinder’s list of known DJ Link devices, because they are probably no longer reachable. This will allow for immediate recovery attempts by telling the VirtualCdj 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.