Releases: fiverecords/SuperTimecodeConverter
Super Timecode Converter v1.5.2
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, andmixermap.jsoninto one portablestc_backup.jsonfile - 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::Imageand 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.FFstring 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 prov...
Super Timecode Converter v1.5.1
Crossfader Auto-Follow (XF-A / XF-B)
New player mode for engines: XF-A and XF-B. Instead of monitoring a fixed player (1-6), the engine automatically follows whichever physical player is assigned to crossfader side A or B on the DJM.
This solves the core problem with show control timecode: software like Resolume can only receive 2 LTC streams simultaneously. With two engines (one set to XF-A, one to XF-B), each outputs the timecode of whichever deck is currently live on that side of the crossfader. When the DJ loads a new track on a different player but assigns it to the same crossfader side, the engine seamlessly switches to follow the new player.
Sticky selection: When multiple players share the same crossfader side, the engine stays on the current player as long as it has the on-air flag. Only when it loses on-air does the engine switch to another player on the same side. This prevents unnecessary switching during brief fader movements.
Status display: In XF mode, the input status shows XF-A P2 CDJ-3000 or XF-B P1 CDJ-3000 so you always know which physical player is being followed. If no player is assigned to the engine's crossfader side, it shows XF-A: NO PLAYER ON SIDE.
Available in the player selector combo alongside PLAYER 1-6.
Track Identification by Artist + Title
The Track Map now identifies tracks by artist + title instead of the CDJ's internal database row ID. The previous approach used the rekordbox USB/SD row ID, which is a sequential number local to each media device -- the same ID could map to completely different tracks on different USB sticks, causing false matches and misfired triggers.
With artist + title as the key, tracks are identified universally regardless of which USB/SD they're loaded from. The Track Map editor no longer shows or asks for a Track ID field. Existing trackmap.json files with trackId-only entries are migrated automatically (entries that had artist+title already work directly; entries with only a trackId generate a "Track #NNN" placeholder title that can be edited).
The CDJ row ID is still used internally for dbserver metadata queries and waveform/artwork cache -- it's just no longer the Track Map lookup key.
Crossfader Assign Badge in PDL View
Each deck in the PDL View now shows a small A or B badge next to the player number when the DJM has that channel assigned to a crossfader side. The badge uses cyan for side A and amber for side B. When the channel is set to THRU (no crossfader routing), no badge is shown.
Shared MIDI Output
MTC output and MIDI triggers/clock/mixer forward now share a single MIDI port when configured on the same device. Previously, each feature opened its own handle to the MIDI device -- on Windows, where exclusive port access is enforced, this meant the second one would silently fail. Now STC detects when both target the same port and automatically shares the connection.
This works transparently in all scenarios:
- MTC already running, trigger enabled on same port: TriggerOutput borrows MTC's handle -- no double-open.
- Trigger already running, MTC enabled on same port: TriggerOutput releases its own handle, MTC opens, then TriggerOutput borrows it.
- MTC disabled while sharing: TriggerOutput re-opens its own handle automatically.
- Different ports for MTC and triggers: Each opens independently, no change from previous behavior.
MIDI Clock, CC forwarding (mixer faders), and Note triggers all route through the shared handle when active.
Art-Net DMX Interface Selector
New ART-NET DMX INTERFACE combo in the Art-Net DMX section. Previously, Art-Net mixer forward and track triggers always broadcast on "All Interfaces" or inherited the timecode output's interface -- there was no way to select a specific NIC for DMX traffic independently.
The combo appears automatically when you enable ARTNET MIXER FWD or ARTNET Trigger, and lists the same network interfaces as the Art-Net output combo. Selection is persisted per-engine in settings.
BPM Multiplier
New per-track BPM scaling for MIDI Clock, Ableton Link, and OSC BPM forwarding. Scale the outgoing BPM independently of the CDJ's actual tempo -- useful when the lighting or video system expects a different tempo range than the DJ is playing (half-time sets, double-time drum & bass, etc.).
5 multiplier values: /4 (quarter), /2 (half), 1x (passthrough), x2 (double), x4 (quad).
Two interaction modes:
- Single click on any multiplier button applies a temporary session override. It stays active until you load a different track or click another value. Great for quick adjustments mid-set.
- Double click saves the multiplier to the Track Map for that track. Next time the track is loaded on any engine, the multiplier is applied automatically. Double click on 1x to clear a saved multiplier.
Visual feedback:
- The active multiplier is highlighted in blue.
- A saved Track Map value is always shown in gold text, even when a temporary override is active on a different value -- so you always know what's saved vs. what's temporary.
- The effective (multiplied) BPM is displayed next to the original BPM in both the engine panel and PDL View:
128.0 BPM -> 256.0 (x2).
Available in both the engine panel (BPM MULT row) and the PDL View (per-deck buttons).
Non-Modal Editor Windows
The Track Map Editor and Mixer Map Editor windows no longer block interaction with the main window. You can now keep them open while adjusting engines, switching tabs, or monitoring playback.
- Both windows remain open when switching between engines -- they are shared resources, not tied to a single engine.
- Windows close automatically when no engine is using Pro DJ Link as its input source.
- The Track Map Editor updates in real time when tracks are loaded, multipliers are saved, or metadata arrives from the CDJ.
Track Map Editor Cleanup
Simplified the Track Map entry form for clarity and reduced clutter.
Track ID removed: The Track ID field has been completely removed from the editor. Tracks are now identified solely by artist + title (see above). The table no longer shows a Track ID column.
Trigger section separated: All trigger-related fields (MIDI, OSC, Art-Net DMX, BPM Multiplier) are now grouped under a "TRIGGERS ON TRACK LOAD" header, visually separated from the track data fields (Artist, Title, Offset, Notes). Makes it immediately clear which fields define what the track is vs. what fires when it loads.
FPS per-track removed: The per-entry FPS selector has been removed. The offset timecode is always interpreted using the engine's output frame rate. Existing frameRate values in saved JSON are silently ignored on load.
MIDI Program Change removed: The PC# trigger field has been removed. Note On and CC cover all real-world show control use cases. Existing PC values in saved JSON are silently ignored on load.
UI Improvements
- MIDI/OSC/Art-Net panel layout: Device/destination selectors (MIDI device combo, OSC IP:Port, Art-Net DMX interface) now appear after the feature toggle buttons, consistent across all three sections. Previously MIDI and OSC had the selector first, which was inconsistent with Art-Net.
- Position source indicator removed: The
[ABS]/[BEAT]tag in the input status text has been removed. It was a diagnostic indicator that never changed during normal operation (CDJ-3000 always shows ABS, NXS2 always shows BEAT).
Bug Fixes
- OSC Mixer Forward not connecting on app restart. The OSC socket was not opened on startup when only OSC Mixer Forward was enabled (without OSC triggers or BPM forward).
- MIDI Mixer Forward not opening device on app restart. Same issue -- the MIDI device was not opened when only MIDI Mixer Forward was enabled.
- Beat indicator flickering back and forth. The beat-in-bar display (1-4) could briefly show the previous beat before snapping to the current one. Caused by status packets (~5Hz) overwriting
beatInBarwith a stale value after a beat packet had already updated it. Fixed by making beat packets (type 0x28) the sole authoritative source. - Stale track data when switching player. Changing the player selector without the new player being online left the previous player's track title, artwork, waveform, and BPM on screen. Now a full cache and UI reset is performed on player change.
- Art-Net DMX track trigger could access out-of-range buffer. The track-change trigger path for Art-Net DMX did not validate the DMX channel before writing to the buffer. Now bounds-checked to [1,512] consistent with the mixer forward path.
- RUNNING/STOPPED indicator not centred. The status dot and label above the timecode counter used fixed pixel offsets instead of measuring the actual text width. Now the dot + text are measured and centred as a unit over the counter.
Super Timecode Converter V1.5
Native Pro DJ Link Integration
v1.5 introduces a native Pro DJ Link implementation, turning STC into a direct bridge between Pioneer DJ hardware and professional show control systems — no additional software required.
Pro DJ Link Input
STC now connects directly to Pioneer CDJ and DJM hardware on the network as a Virtual CDJ.
Tested hardware:
- CDJ-3000 + DJM-900NXS2
Expected compatible (not yet verified):
- CDJ-2000NXS2, XDJ series, and other Pro DJ Link players
- DJM-V10 and other Pro DJ Link mixers
Player features:
- Automatic player discovery via Pro DJ Link keepalive protocol (port 50000)
- Absolute position tracking from CDJ-3000 (30Hz, millisecond precision, type 0x0b)
- Beat-derived position for NXS2 and older models (beatCount × 60000/BPM from status packets)
- Play state detection: Playing, Paused, Cued, Looping, Seeking, End of Track
- BPM, pitch fader, actual playback speed (including motor ramp)
- On-air status from both CDJ flags and DJM channel reports
- Master player detection
- Per-player monitoring: any engine can follow any of 6 players independently
Playhead PLL (Phase-Locked Loop):
- Smooth timecode generation from CDJ data — no frame skipping or jitter
- Driven by actual motor speed (offset 152), which includes acceleration ramps, jog wheel, and pitch fader changes
- Gentle position correction (25% per packet, converges in ~100ms on CDJ-3000)
- Hard reset on seek/hot cue/track load (>500ms position jump)
- dp/dt velocity fallback for NXS2 models that don't report actualSpeed
End of track / Pause handling:
- Pause: actualSpeed ramps to zero naturally over ~4-5s — PLL follows the deceleration, outputs stop smoothly
- End of track: CDJ freezes actualSpeed at last playing value — STC detects playState 0x11 and freezes timecode to prevent flicker
DJM Mixer Integration
STC receives real-time mixer parameter data from DJM hardware on the Pro DJ Link network.
Mixer data (58 parameters):
- Per-channel (CH1-CH4): fader, trim, EQ high/mid/low, color/FX knob, CUE button, input source, crossfader assign
- Master: crossfader, master fader, master CUE, fader curve, crossfader curve, booth level
- Headphones: cue link, mixing knob, level
- Beat FX: selector, level, on/off, assign, frequency band buttons, send/return
- Color FX: selector, parameter knob, assign
- Mic: EQ high, EQ low
VU meters:
- 6-channel peak metering: CH1-CH4 (mono) + Master L/R (stereo)
- 15 segments per channel matching the physical DJM meter strips
- Displayed as segmented VU bars alongside each fader in the PDL View
On-air status:
- Per-channel on-air flags from DJM broadcast and unicast reports
- Combined with CDJ status flags for reliable on-air detection
Mixer Map — Configurable Output Routing
New MixerMap system maps every DJM parameter to OSC, MIDI CC, MIDI Note, and Art-Net DMX independently.
58 parameters mapped:
- 9 per channel × 4 channels = 36 (fader, trim, EQ hi/mid/lo, color, CUE, input source, XF assign)
- 22 global parameters (crossfader, master, booth, headphones, beat FX, color FX, mic EQ)
Output protocols:
- OSC: normalized float 0.0–1.0, configurable address per parameter
- MIDI CC: 0–127, configurable CC number and channel per parameter
- MIDI Note: 0–127 velocity (for grandMA2/MA3 executor faders), configurable note number per parameter
- Art-Net DMX: 0–255 raw value, configurable DMX channel per parameter, configurable universe
Deduplication: values only sent when changed (per-parameter last-sent comparison).
Art-Net DMX timeout compliance: persistent buffer re-sent at 10Hz even when no values change, preventing receiver blackout on nodes with 2-3s DMX timeout.
Editor: table UI with editable OSC addresses, MIDI CC, MIDI Note, and DMX channel per row. Enable/disable toggle per parameter. Reset to defaults. Enable/disable all.
Track Map — Enhanced Triggers
Track change triggers now support independent MIDI Note, MIDI CC, Program Change, OSC, and Art-Net DMX outputs simultaneously per track.
What changed from v1.4:
- The old mutually-exclusive MIDI type selector (None / Note On / PC / CC) is replaced with independent fields — any combination can fire simultaneously on the same track change
- New Art-Net DMX trigger: send a specific value to a specific DMX channel on track change (persistent buffer — values stay until overwritten by another track's trigger)
- Configurable Art-Net trigger universe (separate from mixer universe)
- Existing TrackMap files from v1.4 are automatically migrated to the new trigger format on first load
Per-track trigger options:
- MIDI Note On (+ immediate Note Off): note number + velocity
- MIDI CC: controller number + value
- MIDI Program Change: program number
- OSC: address + typed arguments with variable expansion ({trackId}, {artist}, {title}, {offset})
- Art-Net DMX: channel + value
DbServer Client — Track Metadata
Background TCP client queries CDJ internal databases (port 12523) for track metadata.
- Artist, title, album, genre, key, BPM, duration, rating, date added
- Album artwork (JPEG, cached per artwork ID)
- Color preview waveform: ThreeBand (CDJ-3000) and ColorNxs2 formats
- LRU cache with automatic eviction (64 metadata entries, 32 artwork entries)
- Async request queue with semaphore-based wakeup (no busy-loop)
PDL View — Network Visualization
External window showing the full Pro DJ Link network state at 30Hz.
4-deck display (2×2 grid):
- Album artwork from DbServer cache
- Color waveform with playhead cursor
- Track info: artist, title, key
- BPM, pitch %, play state, position source (ABS / BEAT)
- Raw timecode + TrackMap offset timecode
- Engine assignment indicators
- On-air / master / beat-in-bar indicators
Mixer strip:
- Channel faders CH1-CH4 with per-channel VU meters (segmented, green→yellow→red)
- Crossfader with A/B position indicator
- Master fader with stereo VU (L+R)
- DJM model label
Ableton Link Bridge
BPM from the selected CDJ player is published to an Ableton Link session on the local network.
- Any Link-enabled peer (Resolume, Ableton Live, Traktor, etc.) syncs automatically
- Hysteresis: only commits when BPM changes by ≥0.1 to avoid flooding the session
- Peer count displayed in UI
- Enable/disable per engine
Other Changes
MIDI Clock output: 24ppqn clock driven by CDJ BPM, with fractional accumulator for drift-free timing. Start/Stop messages on enable/disable.
OSC BPM forward: sends current BPM as float to configurable OSC address (default: Resolume's /composition/tempocontroller/tempo). Dedup threshold: 0.05 BPM.
Frame precision fix: wallClockToTimecode epsilon (+1e-9) in both NDF and DF paths prevents floating-point truncation at frame boundaries (e.g. 0.9999 → 0 instead of 1).
Compatibility
- Windows 10/11 (VS2022, x64)
- macOS 12+ (Xcode, arm64/x86_64)
- JUCE 8.0.6, C++17
Tested hardware: CDJ-3000 + DJM-900NXS2. Other Pro DJ Link compatible hardware (CDJ-2000NXS2, XDJ series, DJM-V10, etc.) should work but has not been verified yet. Please report any issues on GitHub.
License
MIT License — © 2026 Fiverecords
Disclaimer
This project is not affiliated with, endorsed by, or associated with AlphaTheta Corporation or Pioneer DJ. PRO DJ LINK™ is a trademark of AlphaTheta Corporation. The Pro DJ Link protocol implementation is based on independent community research, particularly the DJ Link Ecosystem Analysis by Deep Symmetry. Use at your own risk — behaviour may change with future firmware updates or on untested hardware.
Super Timecode Converter V1.3
New Features
23.976 fps support
All inputs and outputs now support 23.976 fps (24000/1001) as a dedicated frame rate, separate from 24 fps. This covers cinema and digital cinema workflows where the distinction matters for sync.
Because the LTC bitstream carries no information that distinguishes 23.976 from 24 fps, the app cannot detect this automatically from an LTC signal. When receiving LTC at either of these rates, select the correct rate manually using the FPS buttons — the app will preserve your choice and suppress auto-detection for that ambiguous pair only, while continuing to auto-detect all other rates normally. The setting persists across restarts.
Output frame rate conversion
A new FPS Convert toggle lets you re-stamp outgoing timecode at a different frame rate from the input. For example, you can receive 25 fps LTC from a PAL source and simultaneously output 29.97 MTC or Art-Net, with the conversion handled automatically. The displayed timecode shows both the input and converted output frame counts side by side. Frame offsets are applied after conversion, in the output frame rate domain.
Bug Fixes
LTC output: biphase encoding error on strict decoders
A spurious signal inversion at LTC frame boundaries caused a double-transition (no-transition) that violated biphase-mark parity. Decoders with strict parity checking — including several professional hardware units — would reject the signal or show intermittent frame drops. Fixed.
LTC output meter: level showing when paused
The output VU meter continued displaying signal activity after the clock was paused. The meter now drops to zero immediately on pause.
VU meter: flickering halo at component edges
A one-pixel fringe around VU meters flickered due to fractional-pixel rounding when the component was set opaque. Fixed by adjusting the paint geometry so the background fill always covers the full component bounds before the inner inset is applied.
FPS Convert button layout: label and button overlap
The "OUTPUT FPS" label and the input FPS buttons overlapped by two pixels in the FPS conversion panel. Recalculated with explicit constants shared between paint() and resized().
Refresh Devices: settings lost on scan
Clicking Refresh Devices cleared the selected MIDI devices and network interfaces even when they were still connected. The app now captures current selections before clearing the combo boxes and restores them by name after the scan. Already-configured devices remain selected; devices that have been disconnected fall back to no selection.
MTC input: 23.976 overwritten by auto-detect
When MTC rate code 0 (24 fps) arrived and the user had manually selected 23.976, auto-detect silently overwrote the selection. Rate code 0 now preserves an existing 23.976 selection, since SMPTE MTC has no dedicated code for 23.976.
Internal Improvements
- Linux font lookup result is now cached after the first call. Previously
getMonoFontName()calledFont::findAllTypefaceNames()— a full system font scan — on every paint cycle. - ArtNet packet parsing uses explicit
uint16_tcasts before bit shifts, removing a potential sign-extension path. - Windows network interface mask calculation guards against undefined behaviour when the prefix length is 0 or ≥ 32.
- Indentation and formatting cleaned up in
TimecodeCore.h;toDisplayString()now uses a singleString::formattedcall instead of concatenating three separate strings.
v1.2
What's New in v1.2
Platform & Compatibility
- JUCE 8 compatible — verified compilation with JUCE 8.0.6 (zero errors, zero warnings)
- Linux support — confirmed build and added prerequisites for Ubuntu/Debian
- CMake build system — added full CMake instructions as an alternative to Projucer
Improved Timecode Engine
- Extracted
NetworkUtils.hfor cleaner cross-platform network enumeration - Added
static_assertchecks for lock-free atomics on the target platform - MTC input now interpolates between quarter-frame messages for smoother display
- MTC and Art-Net outputs use fractional accumulators to eliminate timer drift
- LTC encoder now auto-increments frames internally, preventing repeated frames when the UI thread lags behind the audio clock
- LTC encoder includes correct biphase parity correction (BGF0/BGF2)
- Improved SMPTE drop-frame handling across all timecode paths
Stability & Bug Fixes
- Fixed device conflict detection between LTC Output and Audio Thru
- Fixed shutdown order (outputs before inputs) to prevent stale reads during teardown
- Fixed passthrough ring buffer synchronization when starting Audio Thru while LTC Input is already running
- Added sample rate mismatch warning for Audio Thru (input vs output device)
- Added packet/data validation on all inputs to discard corrupt or out-of-range values
- Art-Net input falls back to all interfaces with a visual
[FALLBACK]indicator if the selected interface fails to bind - Settings save is now debounced (~500ms) to reduce disk writes during rapid UI changes
- Gain values and frame offsets are clamped on load to prevent invalid settings from crashing the app
UI Improvements
- Collapsible panels for input and output sections
- Background audio device scanning — no more UI freeze on startup
- Driver type filter combos (WASAPI, ASIO, CoreAudio, ALSA)
- Sample rate and buffer size preferences
- Cross-platform monospace font selection (Consolas on Windows, Menlo on macOS)
Full Changelog: v1.1...v1.2
Binaries will be uploaded separately. To build from source, see the README.
Super Timecode Converter V1.1
What's New
🎚️ VU Meters
Real-time level metering for all audio paths. Horizontal bar meters with color-coded feedback (green → yellow → red) appear below each gain slider, giving you instant visual monitoring of:
- LTC input signal level
- Audio Thru input level
- LTC output level
- Audio Thru output level
⏱️ Output Frame Offsets
Independent frame offset controls for each timecode output (MTC, Art-Net, LTC). Adjust from -30 to +30 frames per output to compensate for device latency or synchronization differences between destinations. Double-click to reset to zero.
🎨 UI Improvements
- Output toggle indicators now use protocol-specific accent colors instead of generic white
- Timecode display vertically centered in the main area for better readability
- Updated branding with clickable GitHub link in the bottom bar
Files Changed
LevelMeter.h (new), LtcInput.h, LtcOutput.h, AudioThru.h, TimecodeCore.h, AppSettings.h, MainComponent.h, MainComponent.cpp, Main.cpp, CustomLookAndFeel.h, TimecodeDisplay.h
Super Timecode Converter V1.0
Initial Release
MTC (MIDI Time Code) input and output
Art-Net timecode input and output
LTC (Linear Time Code) input (decoder) and output (generator)
System Time as input source
Audio Thru passthrough with independent device routing
Frame rate auto-detection from incoming signals
Support for 24, 25, 29.97 (drop-frame), and 30 fps
Per-channel gain controls for LTC and Audio Thru
Stereo/mono output selection for LTC Out and Audio Thru
Audio driver type filtering (WASAPI, ASIO, DirectSound)
Configurable sample rate and buffer size
ASIO support for professional audio interfaces
Persistent settings (JSON)
Dark theme UI
Device conflict detection
Background audio device scanning