Skip to content

Super Timecode Converter v1.5.2

Choose a tag to compare

@fiverecords fiverecords released this 17 Mar 08:31
· 35 commits to main since this release
077cc34

New Features

DJM-V10 Full Protocol Support

All DJM-V10 mixer parameters have been mapped and confirmed from real Wireshark captures. The V10 uses the same 248-byte mixer packet (type 0x39) and 524-byte VU packet (type 0x58) as the DJM-900NXS2, with global offsets at identical absolute positions.

Per-channel: 5 new parameters in byte positions that are always zero on the 900NXS2:

  • Compressor (+2) -- V10 per-channel compressor knob
  • EQ Low Mid (+5) -- V10 4-band EQ (the existing "Mid" becomes "Hi Mid")
  • Send (+8) -- V10 per-channel send knob for the built-in effects bus
  • CUE B (+10) -- V10 dual-cue headphone system
  • Input Source (+0) -- extended enum: BUILT-IN, EXT1, EXT2, MULTI I/O, COMBO

CH5 and CH6 blocks confirmed at 0x084 and 0x09c.

Global: 20+ new parameters (all V10-only, zero on 900NXS2):

  • Master CUE B (0x0ba)
  • Isolator On/Hi/Mid/Lo (0x0bb-0x0be)
  • Booth EQ Hi/Lo (0x0c0-0x0c1)
  • Headphones B Cue Link/Mixing/Level (0x0c5, 0x0e6-0x0e7)
  • Headphones A Pre EQ (0x0e5)
  • Filter LPF/HPF/Resonance (0x0d8-0x0da)
  • Send Ext1/Ext2 On/Off (0x0dc-0x0dd)
  • Master Mix On/Size/Time/Tone/Level (0x0de-0x0e2)
  • Multi I/O Select/Level (0x0ce-0x0cf)

Repurposed offsets (different meaning on V10 vs 900NXS2):

  • 0x0ca: FX Assign -- V10 uses linear enum (0-5=CH1-CH6, 6=Mic, 7=Master) vs 900NXS2's non-linear enum
  • 0x0c9: Beat FX Select -- same 0-13 range but different effect order (Shimmer replaces Slip Roll)
  • 0x0ce/0x0cf: Multi I/O Select/Level on V10 (was Beat FX Assign mirror / Send Return on 900NXS2)
  • 0x0db: Send Built-IN Select on V10 (was Color FX Select on 900NXS2)
  • 0x0e2: Master Mix Level on V10 (was Color FX Param on 900NXS2)

VU meters (type 0x58, 524 bytes): Master L/R remain at 0x11c/0x158. CH5/CH6 appended at 0x194/0x1d0.

What adapts automatically:

  • PDL View mixer panel: 4 or 6 channel strips, V10-specific controls (compressor "K", 4-band EQ "H/h/l/L", send "S", dual CUE A/B buttons)
  • Beat FX names: V10 effect name table (Shimmer, reordered Helix/Reverb/Filter/Trans/Pitch)
  • MixerMap: 123 entries (V10) vs 76 entries (900NXS2), with DJM model toggle in the editor
  • VU meters: 8-block layout (6 channels + master L/R) on V10, 6-block on 900NXS2

CDJ-3000X Support

The CDJ-3000X uses the same Pro DJ Link protocol as the CDJ-3000. All features -- absolute position tracking, track metadata, waveforms, artwork, play state detection -- work identically. No code changes were needed.

Mixer Map Export / Import

The Mixer Map editor now has Export and Import buttons for saving and loading parameter mappings as JSON files. Useful for sharing configurations between machines, keeping backups, or pre-configuring mappings for different DJM models without having the mixer connected.

The DJM model toggle (DJM-900NXS2 / DJM-V10) controls which parameters are visible. V10-specific parameters are hidden when in 900NXS2 mode. The toggle auto-detects the connected mixer but can be switched manually.

Configuration Backup & Restore

Two new buttons in the title bar -- Backup and Restore -- let you export and import the entire STC configuration as a single JSON file. The backup includes all engine settings, Track Map entries, and Mixer Map mappings. Useful for migrating to a new machine, keeping a safety copy before a show, or sharing a known-good setup between systems.

  • Backup saves the current settings.json, trackmap.json, and mixermap.json into one portable stc_backup.json file
  • Restore loads a backup file, replaces all three config files, reloads settings and mixer maps, and prompts for a restart to fully apply engine and audio device configuration

Platform Notes

macOS: Disable the Firewall for Pro DJ Link

The macOS application firewall inspects every incoming UDP packet before delivering it to the application. With Pro DJ Link's high packet rate (CDJ status, beat data, DJM mixer and VU data -- hundreds of packets per second), the firewall adds enough latency and CPU overhead to cause timecode fluctuation, missed beats, and sluggish waveform updates.

Fix: Go to System Settings > Network > Firewall and either turn it off or click Options... and add Super Timecode Converter to the allowed list. On Windows this is not an issue -- Windows Firewall prompts once on first launch and does not intercept subsequent packets.

macOS: Unsigned Application

STC is open-source software and is not signed with an Apple Developer certificate. On first launch, macOS Gatekeeper will block the application. Right-click the app and select Open, then click Open in the confirmation dialog. Alternatively: System Settings > Privacy & Security > Security > Open Anyway. This is a one-time step.


GPU-Accelerated Rendering (Windows)

On Windows, STC now uses hardware-accelerated rendering via OpenGL. This offloads image compositing from GDI to the GPU, reducing message-thread load from repaint().

On macOS, OpenGL is intentionally disabled. JUCE's OpenGL renderer still performs all painting into software images on the CPU, then uploads them as textures through Apple's deprecated OpenGL-to-Metal translation layer -- adding overhead rather than reducing it. macOS CoreGraphics already uses Metal internally for compositing, so native rendering without OpenGL is faster. The HiDPI deck image cache and waveform image cache minimize per-frame paint work on both platforms.

Requires: The juce_opengl module must be enabled in Projucer (used on Windows builds only).

Waveform Rendering Improvements

Waveform display performance and visual quality significantly improved in both the PDL View and the engine mini-player:

  • Cached waveform image: The waveform bars (1200 entries per track) are rendered once into a juce::Image and only regenerated when the track data changes or the component resizes. Each frame blits the cached image and draws only the lightweight playhead cursor overlay on top.
  • Live cursor in PDL View: The waveform cursor now updates every frame at the full 30Hz timer rate, independent of the deck panel's static content updates.
  • Correct bar width at all sizes: Waveform bars scale proportionally when the window is enlarged or in fullscreen. Previously bars were always 1px wide, leaving visible dark gaps at larger sizes.
  • Native text rendering in PDL View: Deck panels are painted directly into the screen Graphics context, preserving subpixel font hinting and HiDPI scaling.

PDL View Improvements

  • Timecode auto-scale: The timecode font scales to fit both the available height and width (down to 8pt minimum), so the full HH:MM:SS.FF string is never truncated regardless of window size.
  • Empty deck cleanup: Decks without a connected player no longer show a timecode overlay.
  • Crossfader A/B labels repositioned to the left and right edges of the fader bar, vertically centred with the thumb.
  • Stale FPS badge removed: The per-deck FPS indicator showed a hardcoded default and never reflected the engine's actual output frame rate.

Fixes

macOS Timecode Fluctuation (Socket Binding)

Fixed the root cause of timecode fluctuation on macOS, traced to SO_REUSEPORT on the UDP sockets and binding to INADDR_ANY.

Root cause: JUCE's setEnablePortReuse(true) enables SO_REUSEPORT on macOS, which distributes incoming UDP packets among ALL sockets bound to the same port. If a previous STC instance left a zombie socket, or other Pro DJ Link software had a socket on port 50001/50002, the kernel split packets between them -- causing subset delivery and out-of-order stale packets, producing the characteristic forward/backward timecode jumps.

Fix: Removed setEnablePortReuse() from beatSock (50001) and statusSock (50002). Both sockets now bind to the specific interface IP instead of INADDR_ANY. keepaliveSock (50000) retains SO_REUSEPORT for coexistence with other Pro DJ Link software.

Smooth Timecode Interpolation

The CDJ-3000 sends position updates at ~30Hz, but the UI runs at 60Hz. Previously, the display froze for ~33ms between packets then jumped. STC now interpolates between packets using the CDJ's actual playback speed, producing smooth 60Hz timecode movement. Interpolation is clamped to 50ms x speed to prevent overshoot on delayed packets.

Direct CDJ Display

The timecode display and waveform cursor now read directly from the CDJ's absolute playhead instead of the PLL. Wireshark analysis confirmed the raw position data is clean -- monotonically increasing at ~30Hz with zero reversals. The PLL remains active for its original purpose (LTC bit-rate scaling) but is no longer in the display path.

ProDJLink Protocol Cleanup

Aligned STC's protocol behavior with the official Pioneer Bridge based on Wireshark analysis:

  • Removed unicast keepalive to DJM -- the real Bridge only broadcasts; the extra unicast was unnecessary.
  • Subscribe from dedicated port only -- the Bridge sends 0x57 subscribe from a single ephemeral port, not from the beat port.
  • Non-blocking socket reads -- switched from 1ms timeout (which on macOS could block 200-400ms) to instant poll with a single Thread::sleep(1) per loop.
  • Subscribe without sleep -- replaced the 400ms blocking burst with a single subscribe; the 2-second re-subscribe timer handles retries.

Mixer Status Fits Panel Width

The mini DJM mixer display in the engine panel was too wide on Windows (Consolas 9pt renders wider than Menlo on macOS). Fixed by reducing fader bars from 4 to 3 blocks, single spacing between channels, and capping the model name to 7 characters.


Untested Hardware

DJM-A9: Likely shares protocol characteristics with both the 900NXS2 and V10. If you have a DJM-A9 and can provide Wireshark captures, please open an issue on GitHub.


Download

Grab the latest build from the Releases page.