Skip to content

Releases: Deep-Symmetry/beat-link

0.6.0

24 Nov 22:57
96e9a22
Compare
Choose a tag to compare

Added

  • Support for the XDJ-XZ, which reports multiple devices on a single IP address. This broke assumptions in many places in the code, and required a more sophisticated approach to device matching. Thanks to
    patient and detailed reports, experiments, packet captures, and videos from Teo Tormo.

Fixed

  • A race condition which caused CrateDigger to retain incorrect track information when a player was removed from the network while it had a mounted USB, then returned to the network with a different USB, has been resolved. Thanks to @ben-xo for discovering and reporting this!

Changed

  • tempoChanged events are no longer sent to the MasterListener interface when the tempo is meaningless (i.e. the new master has no track loaded).

0.5.5

25 Oct 22:23
ebaa373
Compare
Choose a tag to compare

Improved robustness in the face of players powered on after Beat Link is online, new kinds of data found in rekordbox exports, and a better build process. Supports new releases of beat-link-trigger, beat-carabiner, and the planned open-beat-control.

Fixed

  • CDJs which were powered on after Beat Link was already running would not ever get assigned a valid dbserver port by the ConnectionManager so the MetadataFinder would not be able to perform metadata requests to them without CrateDigger. This seems to have been caused by the players not being quite ready to respond to the port number query right after booting, so we now try again a few times.
  • Some extended cue entries encountered by users were missing the color bytes, which prevented Crate Digger from parsing EXT files and accessing color waveforms. These values are now treated as optional.
  • Eliminated spurious warnings in the log for cue entries with rekordbox color code 0 which also had explicit green color values stored for nxs2 players.
  • Now builds properly under current JDKs, including Amazon Corretto 11 (which is a long-term support release). The minimum JDK for building is now Java 9, but the resulting build is still compatible back to Java 1.6. Building under Java 11 results in much nicer JavaDoc, with search support.

0.5.2

03 Sep 03:15
520a192
Compare
Choose a tag to compare

Adds features based on new discoveries in the protocol and database, and to support the forthcoming release of Beat Link Trigger.

Added

  • CueList entries can now include nxs2-style DJ comments when they are present, along with colors and hot cues beyond C.
  • Helper functions to search CueList entries for the closest cue before or after a specific time in a track.
  • The WaveformPreviewComponent can return its CueList for the convenience of code that wants to add informative tool tips.
  • The WaveformDetailComponent draws labels for hot cues and for any cue or loop that has been assigned a comment.
  • MountListener instances registered with the MetadataFinder will be examined to see if they also implement MediaDetailsListener. If they do, they will be informed when details are available for newly-mounted media.

0.5.1

06 Mar 05:30
f958a2a
Compare
Choose a tag to compare

This is a small release to fix some issues that showed up in 0.5.0 when more people started using it. (What, not everyone tries out the preview releases? 😁)

Fixed

  • The SignatureFinder would crash trying to calculate signatures for tracks without artists.

Added

  • The MenuLoader now supports loading tracks from the Label, Bit Rate, Original Artist, and Remixer menus.
  • Track Metadata now includes bit rate, when applicable.

0.5.0

24 Feb 03:14
364f41d
Compare
Choose a tag to compare

This is a major release which incorporates many new capabilities thanks to an increasing number of contributors and fellow-travelers around the world (as well as a lot of hard work, of course! 😄)

⚠️ These are breaking API changes. Code that used some cache-related and metadata methods will need to be rewritten.

  • The handling of metadata cache files has been moved out of the MetadataFinder into a new class focused on this task. It also implements a new interface that can be used by client objects to offer cached metadata to Beat Link (for example track cue lists that group metadata from multiple different media sources).
  • Track comments and dates added are just plain strings, not searchable items, so the API has been changed to reflect this.
  • WaveformPreviewComponent and WaveformDetailComponent have been generalized to support tracking multiple simultaneous playback positions, so they can be used in the context of a Beat Link Trigger
    show file, where a track can be loaded and even playing on multiple players at once.
  • It is now possible to construct a fully-functional WaveformPreviewComponent or WaveformDetailComponent even if you don’t have access to actual TrackMetadata objects, as long as you pass them the few individual pieces of information they need. Again, this supports the needs of the new Beat Link Trigger show interface.

Added

  • We now can use Crate Digger to reliably obtain metadata even when there are four players on the network, and we are using player number 5.
  • We can now retrieve and display the full-color waveforms used by nxs2 players and rekordbox, and prefer them when available. This can be turned off through a WaveformFinder property.
  • When going online, the VirtualCdj now reports information about the chosen network interface to help with troubleshooting problematic network environments.
  • There is a new interface, TrackPositionBeatListener, that can be registered with the TimeFinder in order to learn about new beats as soon as they happen, along with the actual beat number within the track represented by the beat (which is missing from the raw beat packet available through the BeatFinder).
  • The TimeFinder takes advantage of track metadata, (when it is available) to detect when the DJ has jumped to a cue, or when a track has loaded with auto-cue to a memory point, so it can more accurately infer where the player has stopped.
  • MenuLoader supports loading several more menu types from the dbserver.
  • We can offer track years as part of the metadata when rekordbox is indexing that.
  • When disconnecting from a player’s dbserver, we politely send a teardown message and let it close the connection from its side.
  • A few new methods that can help troubleshoot problematic network topologies are available. Beat Link Trigger uses them to provide better help at startup.

Fixed

  • A mistake in the TimeFinder which could trap the VirtualCdj packet delivery thread in an infinite loop, which would then cause client applications to lose touch with what was happening on the players, with no recourse except going offline and back online (and even this would gradually waste more and more CPU time on each occurrence). Thanks to @Kevinnns for the thread dumps which helped finally find this!
  • The code that was supposed to notice computers running rekordbox and report their media collections as being available on the network had always been broken, but was easy enough to fix. Now Beat Link Trigger can tell players to load tracks from rekordbox and rekordbox mobile.
  • The various metadata finders were supposed to report the loss of associated metadata when a player disappeared from the network, but they were not doing so.
  • At some point (possibly when adding the ability to show multiple player locations in a waveform) the memory point and hot cue markers stopped being displayed in the waveform preview. They have been restored.
  • Cue Lists were not being sorted into the correct order when they were loaded from Crate Digger. Now they are sorted regardless of how we obtain them.
  • The colors used for playback position markers were inconsistent between the waveform preview and waveform detail (one used red when the other used white for playing/stopped). Now they both use the constants defined in the WaveformDetailComponent, which also adds a bit of transparency to the preview markers.
  • It turns out that rekordbox mobile does not report meaningful values for its media name or creation date, so we no longer attempt to parse them.
  • It seems rekordbox sometimes sends mixer status packets with a different subtype structure which was causing us to log warnings about a length mismatch. We now properly recognize this packet subtype.

0.4.1

24 Feb 02:55
8bd2ab8
Compare
Choose a tag to compare

This was actually released on 2018-10-28, but the tag and release record were forgotten about until working on the release of 0.5.0.

Added

  • Metadata caches now store the details of the media from which they were created to more easily and reliably auto-attach them and survive small changes.

Fixed

  • When a Nexus player is reporting that it is pre-loading hot cues, we no longer incorrectly consider it to be playing.
  • When scanning metadata caches to consider them for auto-attachment, we were not closing the ones which failed to match. This was probably eventually being taken care of by the garbage collector and
    finalizers, but there is no guarantee if or when that would actually happen.
  • When handling a Fader Start command, a missing break statement caused the BeatFinder to log warning which incorrectly reported that the command had not been recognized. This no longer happens.

0.4.0

08 Oct 03:07
4b2d034
Compare
Choose a tag to compare

This is a major release which contains a great many new features and fixes that were developed while waiting for other libraries to be ready for a final Java-9+ compatible release of Beat Link Trigger.

Added

  • Metadata can now be retrieved for non-rekordbox tracks, including unanalyzed files in the media slots, and on audio CDs and data discs.
  • The mounting and removal of discs is reported to registered media mount listeners.
  • Details about all mounted media slots can be discovered, including the name assigned in rekordbox, creation date, number of rekordbox tracks and playlists (and whether there is a rekordbox database at all, which is needed to correctly request the root menu for that slot), size, and free space.
  • The number of tracks on a disc can be discovered.
  • The VirtualCdj can send status and beat packets, simulate playing, and become the tempo master.
  • The VirtualCdj has new methods allowing you to tell other devices to turn sync mode on or off, or to become the tempo master.
  • The VirtualCdj has a new method allowing you to tell other players to start or stop playing.
  • The VirtualCdj has a new method allowing you to tell other players to load a particular track from any rekordbox database on the network (in a player's media slot, or on a laptop running rekordbox).
  • The VirtualCdj has a new method allowing you to tell players whether they are on or off the air in the absence of a DJM mixer.
  • The Message.KnownType enum has many new entries describing menu requests we now know how to perform.
  • The Message.MenuItemType enum has new entries for the menus that can appear in the root menu response.
  • A new class, MenuLoader, provides methods for navigating the menu hierarchies served by players.
  • A new Enum which captures all known packet types, to improve the readability and compactness of code that works with them.

Fixed

  • Waveform details are properly loaded for tracks that are found on multiple players on the network. This affected time-remaining calculations too.
  • Now assembles entire dbserver messages into a buffer to write them to the network as a single operation, avoiding the chance of them being split into multiple packets, because Windows rekordbox can't handle when they are.
  • Removed a potential source of crashes in the waveform rendering code.
  • Improved the clarity of an exception thrown when trying to ask for metadata from a player for which we did not find a db server port.
  • Improved protection against problems that can occur when delivering events (status updates, beats, etc.) to registered listeners; previously we were only catching exceptions, but some kinds of problems in the listener classes would lead to other kinds of throwables, which could kill our event delivery loops.
  • The count parameter is now passed in menu render requests in a way that is more consistent with the way CDJs do it, although this has not seemed to cause any problems.

Changed

  • We no longer simply reject packets with unexpected lengths; if they are longer than the minimum value we expect, we try to process them after logging a warning. If they are too short, we just log the warning.
  • More use of ByteBuffers to efficiently assemble and compare packets.
  • The TRACK_LIST_REQ message type has been renamed TRACK_MENU_REQ to fit in with the large number of other menus that have been added.

0.3.7

27 Mar 03:58
Compare
Choose a tag to compare

This is a small release to help address an issue discovered as the audience for Beat Link Trigger has expanded greatly in response to a DJ TechTools article.

Fixed

  • Although the TrackMetadata object received the Album field, and would display it in the toString() method, there was no accessor by which the value could be obtained and used by other code!

0.3.6

01 Dec 04:15
Compare
Choose a tag to compare

This is a small release to help address an issue discovered as the audience for Beat Link Trigger has expanded greatly in response to a DJ TechTools article.

Fixed

  • When looping a track that has audio data that extends well past the
    final beat in the beat grid, players sometimes report playing a beat
    that does not exist in the beat grid. This previously caused an
    exception in the log, and the reported playback position would keep
    growing without bound as long as the loop continued. This situation
    is now handled better by interpolating missing beats at the end of
    the beat grid, so there is no exception and the looping of the
    player is properly reflected by the TimeFinder.

0.3.5

08 Oct 21:57
Compare
Choose a tag to compare

This is a small release to help address an issue discovered as the audience for Beat Link Trigger has expanded greatly in response to a DJ TechTools article.

Fixed

  • Creating a metadata cache would fail if a playlist contained more
    than one copy of the same track, as it would try to create the same
    ZIP file entry more than once. Now redundant copies of the same track
    are skipped.