BPM2OSC Manual

BPM2OSC is a real-time BPM detector that streams tempo data over OSC. It captures audio from any input device — including system loopback — and sends /bpm, /beat, /beat/bar, /bpm2osc/confidence, and /resync messages to lighting consoles, VJ software, and show-control systems.

Quick Start

  1. Download and run the Windows installer from the download page.
  2. Launch BPM2OSC.
  3. Click to open Settings.
  4. Select your audio input device (or a loopback device to capture system output).
  5. Add an OSC target: set the IP and port of your destination software.
  6. Click Save.
  7. Click ▶ START. The BPM display will update as soon as the engine detects a stable tempo.
  8. Select a genre preset from the preset bar if the detected BPM looks wrong.
Tip: enable Auto-start on launch in Settings so BPM2OSC starts listening immediately every time you open it.

Installation

Windows installer (recommended)

Download BPM2OSC Setup and run it. The installer includes all required dependencies (sounddevice, NumPy, SciPy, python-osc, soundcard, pystray). No Python installation needed.

Windows SmartScreen warning — BPM2OSC is free software distributed without a commercial code-signing certificate. Windows may display a "Windows protected your PC" dialog when you run the installer. This is expected. To proceed:
  1. Click More info in the SmartScreen dialog.
  2. Click Run anyway.
The software contains no telemetry, no ads, and no malware.

User Interface

BPM2OSC main window showing 124.32 BPM, VU meter, beat-wheel, bar indicator, preset bar, and the Engine (AlgoMonitor) panel

The main window is divided into these areas from top to bottom:

AreaDescription
Top bar☰ (Settings), ? (Manual / online help), ℹ (About), ⛶ (open the mini window), a transient status message, the CLICK icon, RESYNC, and START/STOP.
VU meterPer-channel RMS bars with peak hold. Expands automatically for stereo and multi-channel devices.
BPM displayLarge numeric BPM readout, BPM unit label, and beat-wheel animation (click to toggle between pie and dot mode).
Bar indicatorBeat counter (1–4) and four coloured segments showing position within the bar.
BPM controlsLOCK, TAP, ÷2, ×2 buttons.
Preset barOne button per configured preset. The active preset is highlighted.
Engine panelAlgoMonitor diagnostic widgets (ODF, BPM history, ACF curve, confidence, stability).
Targets panelOne indicator dot per OSC target. Flashes on every OSC send.

Every area except the top bar can be hidden independently from Settings → Interface to save space on cramped multi-monitor or show-control setups — see Settings Reference.

System tray

Minimizing the window sends BPM2OSC to the system tray (Windows, requires pystray). Right-click the tray icon for Start/Stop, Resync, and Quit. The tray tooltip shows the current BPM in real time.

Mini window

Click in the top bar to switch to a small, freely resizable BPM-only window — useful when the full window doesn't fit alongside other show-control software on the same screen.

BPM2OSC mini window showing 126.06 BPM and the 'Click on BPM to TAP tempo' hint
  • The BPM digits scale dynamically to whatever size you resize the window to.
  • Click the BPM digits to TAP tempo directly from the mini window.
  • A thin drag strip replaces the OS title bar and doubles as a drag handle; a button on it returns to the main window.
  • Enable Tiny window always on top in Settings to keep it pinned above other windows.

Audio Input

Open Settings → Audio Input to select the audio source. BPM2OSC supports two capture modes:

Microphone / audio interface

Any device recognized by PortAudio (via sounddevice) appears in the device list. This includes USB audio interfaces, line-in inputs, built-in microphones, and virtual audio cables. Use a line-in connection from a mixer or DJ controller for the most stable results.

System loopback (Windows only)

Loopback devices appear in the list prefixed with . Selecting one captures whatever is playing through that output — no cable needed. Internally this uses the SoundCard WASAPI loopback API.

Loopback tip: if you use DJ software such as Serato or Rekordbox, set BPM2OSC to capture the master output loopback device so it picks up the DJ's headphone-cued mix rather than the room microphone.

Buffer size and latency

BufferLatency @44100 HzBest for
128~3 msImmediate VU monitoring; BPM less stable on sparse signals
256~6 msDJ sets with fast tempo changes
512~12 msLive events with a stable BPM ✓ recommended default
1024~23 msMaximum BPM stability; barely perceptible lag
2048~46 msVery irregular or sparse signals

Smoothing

Controls the depth of the BPM median filter (number of frames kept in history). Higher values produce a steadier readout but react more slowly to genuine tempo changes. The default of 5 is a good balance for most live situations.

BPM Controls

÷2 and ×2

Halve or double the BPM reported by the engine. Useful when the genre's rhythmic pattern causes the engine to lock to a subdivision (double tempo) or a macro-beat (half tempo).

When active, the ÷2 / ×2 buttons light up in the accent colour. If a multiplier override timeout is configured (Settings → BPM Override), the buttons blink during the last 3 seconds before expiry. Setting the timeout to 0 makes the multiplier permanent until manually reset.

The multiplier stacks symmetrically in both directions. Each ×2 press doubles the current factor (maximum ×4); each ÷2 press halves it (minimum ÷4). Starting from ×1: pressing ÷2 gives half tempo (÷2), pressing again gives quarter tempo (÷4). Pressing ×2 from ÷2 returns to ×1.

TAP tempo

Click TAP repeatedly in time with the beat to set the BPM manually. BPM2OSC averages the intervals between the last 8 taps. If more than 2.5 seconds pass between taps, the history is reset and you start a new sequence.

The TAP override expires after the configured TAP override secs (default: 0 = permanent). Setting it to 0 keeps the TAP tempo indefinitely until you tap again or press RESYNC.

Prior override

When you tap, BPM2OSC does more than snap the BPM display — it also permanently overrides the ACF Gaussian prior to the tapped value. The prior is the "gravity centre" of the detection algorithm: shifting it to the tapped BPM makes the engine converge faster and stay anchored near that tempo even under noisy conditions.

The override is shown in the AlgoMonitor → PRIOR BPM row as 130 (Override) in amber. A button next to the label clears the override and restores the preset's original prior. The override is also cleared automatically when you switch preset. While the override is active, the automatic prior self-anchoring (Adaptive mode) is suppressed — the tap value takes full priority.

TAP guide window

When a TAP prior override is active, BPM2OSC can optionally narrow the ACF search range to a window of ± N % around the tapped BPM, excluding tempos that are too far away from the target. This reduces false peaks from noise or harmonics.

Configure the window in Settings → BPM Override → TAP guide window ± % (default: 10 %). Set to 0 to disable the constraint and keep the full preset BPM range. Typical values: 5 % for tight lock on a known tempo, 10–15 % to allow a few BPM of natural variation.

Combined use: TAP the beat, then press LOCK immediately to hold the tapped BPM permanently, even after the TAP timeout would have expired. For maximum stability: TAP → LOCK, then set the TAP guide window to 5 %.

LOCK and AUTO

LOCK freezes the current BPM, preventing the engine from updating the display and OSC output. The button shows a closed padlock icon 🔒 LOCK while active. Click it again to unlock.

AUTO-LOCK is a confidence-based automatic freeze. When enabled (Settings → BPM Override → Auto-lock below confidence %), the engine monitors its own confidence score and freezes the BPM whenever it falls below the threshold. The button shows 🔒 AUTO (with a coloured label) while the auto-lock is active. The status bar shows the current confidence percentage.

When to use auto-lock: during DJ transitions, breakdowns, or long a-cappella passages where the engine has no rhythmic signal. Values between 40% and 65% work well. Above 70% may freeze too eagerly on sparse percussion.
Manual LOCK takes priority. When you press LOCK, auto-lock is suspended — the BPM stays frozen regardless of confidence until you unlock manually.

RESYNC

Forces the internal metronome to realign its phase to the next engine-detected beat. Use this when the bar indicator has drifted out of sync with the music. RESYNC also sends a /resync 1 OSC message to all enabled targets.

Under normal conditions you should rarely need to press RESYNC — the engine continuously corrects the metronome phase using complex DFT beat-phase estimation.

Engine Presets

A preset is a named set of five engine parameters: BPM search range (min and max), Gaussian prior centre (prior), and the octave-correction gates (×2 gate and ÷2 gate).

Click any preset button in the preset bar to apply it live — no restart needed. The active preset is highlighted. You can also edit the five numeric values individually in Settings without changing the preset name.

Presetmin BPMmax BPMprior×2 gate÷2 gateTypical use
Auto6020012015590Default — most genres
Rock / Live6515510012895Rock, pop, live events
Ballad / Slow501057210560Slow songs, folk, cinematic
Dance / House11514512615580House, nu-disco, French touch
Hip-Hop / R&B701159011580Hip-hop, trap, R&B
Techno / D&B13018515818590Techno, drum & bass, hardstyle
Latin8512510012890Salsa, reggaeton, cumbia

What each parameter does

  • min / max BPM — defines the search range for the ACF peak. Values outside this range are ignored even if the ACF scores them highly.
  • prior — centre of a gentle Gaussian bias added to ACF scores. Slightly favours the expected tempo without overriding the data. Effect is small (±15% weight).
  • ×2 gate — BPM threshold above which the ×2 octave correction is allowed. If the detected BPM exceeds this gate, the engine checks whether the half-tempo lag scores ≥ 75% as high and, if so, halves the result.
  • ÷2 gate — BPM threshold below which the ÷2 correction is allowed. If the detected BPM falls below this gate, the engine checks the double-tempo lag similarly.

Creating and editing presets

In Settings → Engine Presets you can add new presets, rename existing ones, edit their five parameters, or delete them. Factory presets (built-in) can be reset to their defaults with the ⟳ button. Custom presets are stored in the config file.

AlgoMonitor

The Engine panel contains four real-time diagnostic widgets that expose the internal state of the detection algorithm. Updated at ~50 fps.

AlgoMonitor Engine panel with ODF waveform, BPM history, ACF score curve and 100% confidence bar

ODF waveform (top row)

ElementColourMeaning
Filled polygonDark greenArea under the Superflux ODF signal
sig lineBright greenPer-frame ODF value (spectral flux)
thr lineAmberAdaptive threshold: avg + 1.5 × σ over the last 43 frames
beat tickRedDetected onset — labeled "beat" in the on-canvas legend

Right panel

WidgetMeaning
CONFIDENCE barACF confidence from 0% (red) to 100% (green). Below ~40%: engine uncertain. Above ~70%: strong signal.
OCTAVE badgeOctave correction last applied: ×2, ÷2, 4:3, or (none). Badge background turns red when active.
STABILITY ±valueStandard deviation of the last 20 BPM estimates (2 decimal places). Green <0.1 BPM, amber <0.5 BPM, red ≥ 0.5 BPM.
PRECISION badgeActive precision state: SYNC (amber, beat-grid calibrating), NORM (dim, Kalman only), HIGH (green, beat-grid regression contributing to output).
PRIOR BPM The ACF prior (gravity centre of the detection). Three states:
  • 100 (Preset) — dim: using the preset's default prior.
  • 125 (Adaptive) — green: prior has self-anchored to a high-confidence detection.
  • 130 (Override) — amber: overridden by Tap Tempo. A button clears the override and restores the preset prior.

BPM history graph (middle row)

Green filled chart of BPM estimates over the last ~40 seconds. The Y-axis auto-scales to the observed range ± 2 BPM. A green dot at the right edge marks the current BPM. Use this to spot drifts, jumps, or oscillations between two tempos.

ACF score curve (bottom row)

Purple curve showing the full ACF harmonic-sum scores across the BPM search range. The X-axis spans from min BPM to max BPM; vertical grid lines mark every 20 BPM. A green dashed vertical line marks the detected peak BPM with a numeric label.

A sharp, isolated peak means the engine is confident. A broad or multi-modal curve means the signal is ambiguous — consider enabling auto-lock.

Diagnostics in practice: if the ODF sig line rarely crosses thr, the audio level is too low — check gain. If CONFIDENCE is chronically low but beats are clearly audible, switch preset. If OCTAVE shows ÷2 constantly, you're in the wrong preset range — try one with a higher prior. PRECISION HIGH means the beat-grid is locked and sub-0.01 BPM accuracy is active.

OSC Targets

BPM2OSC can send to any number of OSC destinations simultaneously. Each target is configured independently. Open Settings → OSC Targets and click + Add target to create a new one.

FieldDefaultNotes
NameDisplay label shown in the target dot and Settings list.
IP127.0.0.1Destination IP address or hostname.
Port8000UDP or TCP port on the destination.
ProtocolUDPUDP (fire-and-forget) or TCP (reliable, auto-reconnect every 15 s).
BPM path/bpmOSC address for the BPM float message.
Beat path/beatOSC address for the beat trigger (int 1).
Bar path/beat/barOSC address for the bar-beat position (int 1–4).
Conf path/bpm2osc/confidenceOSC address for the confidence float (0.0–1.0).
Resync path/resyncOSC address for the resync trigger (int 1).
Send BPMonEnable/disable BPM messages for this target independently.
Send BeatonEnable/disable beat messages for this target.
Send BaronEnable/disable bar-beat messages for this target.
Send ConfoffEnable/disable confidence messages. Off by default — high send rate (~43 Hz).
Send ResynconEnable/disable resync messages for this target.
Normalize BPMoffMap BPM to a 0.0–1.0 float before sending.
Norm min / max20 / 500BPM range for the normalization mapping.
OSC target edit dialog for Resolume showing IP, port, OSC paths and BPM normalization

OSC target edit dialog — Resolume example with BPM normalization enabled

Target dot indicators

Each target has a coloured dot in the main window Targets panel:

  • Dark blue — idle (no recent send)
  • Yellow flash — UDP send in progress
  • Green flash — TCP send in progress
  • Grey with red X — TCP connection error (reconnecting automatically every 15 s)

OSC Messages

/bpm float Current BPM value (e.g. 126.00). Sent on every change ≥ 0.05 BPM and every 10 s as a keepalive.
/beat int 1 Fires on every beat tick of the internal metronome. Phase-locked to the detected beat.
/beat/bar int 1–4 Bar position: 1 on the downbeat, 2, 3, 4 on subsequent beats. Resets to 1 after RESYNC. Path is configurable per target.
/bpm2osc/confidence float 0–1 Detection confidence on every ACF frame (~43 Hz). 1.0 = strong clear beat; below 0.5 = breakdown or weak signal. Disabled by default — enable per target. Path is configurable.
/resync int 1 Fires when the operator presses the RESYNC button.

Normalized BPM

When Normalize BPM is enabled on a target, the BPM float is mapped linearly to the range [0.0, 1.0] using:

value = (bpm - norm_min) / (norm_max - norm_min)
value = clamp(value, 0.0, 1.0)

With defaults (min=20, max=500): 120 BPM → 0.21, 200 BPM → 0.38. Adjust min and max to match your software's expected range.

Web UI

BPM2OSC includes a built-in web server that runs automatically at launch and serves a real-time remote control page at http://<host>:5000. You can open it from any browser on the same local network — PC, tablet, or phone — without installing anything.

What you see

PanelDescription
BPM displayLarge real-time BPM value and animated beat-wheel (pie clock).
ControlsSTART/STOP, RESYNC, TAP, LOCK, ÷2, ×2 buttons — fully functional.
Bar indicatorBeat counter (1–4) and four coloured segments — matches the desktop.
VU meterPer-channel RMS level bars with green / yellow / red zones.
Engine monitorLive ODF flux graph, confidence bar, and octave-correction badge.
PresetsOne button per preset; the active one is highlighted. Tap to switch.

Accessing the page

  1. Launch BPM2OSC — the web server starts immediately.
  2. Open http://127.0.0.1:5000 on the same machine, or http://<LAN-IP>:5000 from another device.
  3. The connection dot in the top-right corner turns green when the live stream is active.
Tip: find your LAN IP in Windows with ipconfig. For a stable tablet setup, pin the URL to your home screen or bookmark it in a kiosk browser.

Web Server settings

Open Settings → Web Server to configure:

ParameterDefaultNotes
Enable web serveronUncheck to disable the web server entirely.
Port5000TCP port the server listens on. Change if 5000 conflicts with another service.

Changes to Web Server settings take effect on the next launch of BPM2OSC.

REST API

Every control is also available as an HTTP POST endpoint, making the web server suitable for integration with Bitfocus Companion, home-automation systems, or custom scripts:

EndpointAction
POST /api/startStart the BPM engine
POST /api/stopStop the BPM engine
POST /api/resyncResync beat phase
POST /api/lockToggle BPM lock
POST /api/div2Apply ÷2 factor
POST /api/mul2Apply ×2 factor
POST /api/tapTap tempo
POST /api/preset/<name>Activate a named preset (URL-encoded)
GET /api/stateFull JSON snapshot of current state
GET /api/streamSSE stream — JSON state pushed every 50 ms

Example from the command line:

curl -X POST http://127.0.0.1:5000/api/start
curl -X POST http://127.0.0.1:5000/api/preset/Rock%20%2F%20Live

Settings Reference

BPM2OSC Settings window showing Audio Input, Engine Presets, BPM Override and OSC Targets sections

Audio Input

ParameterDefaultNotes
APISystem defaultShown only when more than one host API is available (Windows: MME, DirectSound, WASAPI, WDM-KS, Loopback). Picking one filters the Device list to that API only.
DeviceSystem defaultAll input devices + loopback (Windows). Loopback devices use the Loopback (WASAPI) API and are listed with their channel count, e.g. "OUT 1-2 (BEHRINGER UMC 404HD 192k), 2".
Ch:Read-only field mirroring the input channel count of the currently selected device.
Buffer size512Audio processing block size in samples. Larger = more stable BPM, higher latency.
Smoothing5Depth of the BPM median filter (number of estimates kept in history).
Auto-start on launchoffIf enabled, detection starts automatically when BPM2OSC launches.

Click

Configures the audible metronome click triggered by the CLICK button next to RESYNC. It is independent from the Audio Input device — you can monitor via loopback while the click plays out to your speakers or a separate output.

ParameterDefaultNotes
APISystem defaultOutput host API for the click device, shown only when more than one is available.
DeviceSystem defaultOutput device that plays the click.
Volume0.5Click loudness, independent of the input gain.
If the selected click output is the same physical device you're monitoring via Loopback, turning the click on is blocked with a warning — otherwise the click would feed straight back into the analysis. The two devices are compared by their actual Windows endpoint id, not by name, so this is detected reliably even across different host APIs.

Web Server

ParameterDefaultNotes
Enable web serveronServes the Web UI and REST API. Disable if not needed or to free the port.
Port5000TCP port. Must not be in use by another service. Change takes effect on next launch.

BPM Override

ParameterDefaultNotes
Multiplier override secs0How long ÷2/×2 stays active (seconds). 0 = permanent until manually reset.
TAP override secs0How long a TAP override stays active. 0 = permanent until next TAP or RESYNC.
TAP guide window ± %10When a TAP prior override is active, narrows the ACF search to ± N % around the tapped BPM. 0 = disabled (full preset range). Typical: 5 % for tight lock, 10–15 % for natural variation.
LOCK override secs0How long a manual LOCK stays active. 0 = permanent until unlocked.
Auto-lock confidence %0Confidence threshold for auto-lock (0–100). 0 = disabled. Values 40–65 are typical.
No-beat holdoffWhen enabled, the metronome and OSC beat continue at the last detected BPM even when no beat is detected. When off, the metronome stops and the display shows --- after ~5 s of low confidence.

Interface

Independently hide parts of the main window to save vertical space on cramped multi-monitor or show-control setups. The window resizes to fit whatever's left visible.

ParameterDefaultNotes
Show VU meteronPer-channel input level bars.
Show beat indicatoronBPM pie/dot beat-wheel animation.
Show Engine monitoronThe AlgoMonitor diagnostic panel (ODF, BPM history, ACF curve).
Show metronomeonThe bar-position indicator (beat counter and four coloured segments) — not the same as the CLICK icon below.
Show click icononThe audio click on/off button. Hiding it while the click is playing stops the click first.
Show presetsonThe preset button bar.
Show Targets panelonThe OSC target indicator dots.
Tiny window always on topoffKeeps the ⛶ mini window pinned above other windows.

Config File

Settings are saved automatically to:

  • %APPDATA%\BPM2OSC\bpm2osc.json

The file is updated every time you click Save in Settings and on every clean shutdown. You can edit it manually with any text editor. Invalid values are silently ignored and replaced with defaults on the next launch.

{
  "audio_device_name": "Focusrite USB Audio",
  "audio_hostapi_name": "Windows WASAPI",
  "audio_loopback": false,
  "click_hostapi_name": "Windows WASAPI",
  "click_device_name": "Speakers",
  "click_volume": 0.5,
  "buffer_size": 512,
  "smoothing": 5,
  "autostart": false,
  "auto_lock_confidence": 0.53,
  "multiplier_override_secs": 0.0,
  "tap_override_secs": 4.0,
  "tap_guide_pct": 10.0,
  "lock_override_secs": 0.0,
  "metro_hold_on_nobeat": false,
  "web_enabled": true,
  "web_port": 5000,
  "preset": "Rock / Live",
  "min_bpm": 65,
  "max_bpm": 155,
  "prior_bpm": 100,
  "mul2_gate": 128,
  "div2_gate": 95,
  "targets": [
    {
      "name": "MagicQ",
      "ip": "192.168.1.100",
      "port": 8000,
      "protocol": "udp",
      "bpm_path": "/bpm",
      "beat_path": "/beat",
      "bar_path": "/beat/bar",
      "conf_path": "/bpm2osc/confidence",
      "resync_path": "/resync",
      "send_bpm": true,
      "send_beat": true,
      "send_bar": true,
      "send_conf": false,
      "send_resync": true,
      "enabled": true,
      "bpm_normalize": false,
      "bpm_norm_min": 20.0,
      "bpm_norm_max": 500.0
    }
  ]
}

Integrations

Bitfocus Companion

BPM2OSC integrates with Bitfocus Companion (the software that drives Elgato Stream Deck and other button controllers) at two levels:

  • Commands — Companion sends HTTP POST requests to BPM2OSC's REST API to trigger actions (start, stop, tap, preset, etc.)
  • Feedback — BPM2OSC pushes live state to Companion so Stream Deck buttons reflect current status (BPM on button label, running = green, locked = red, etc.)

Option A — Native Companion Module (recommended)

A dedicated companion-module-bpm2osc module is available on GitHub. It provides ready-made actions, feedbacks, variables, and Stream Deck button presets.

Temporary installation procedure — the module has been submitted to Bitfocus for approval and is currently pending review. Once approved, it will be available directly from the Companion built-in module marketplace with one-click installation. Until then, use the manual steps below.

Installation (temporary — until marketplace approval):

  1. Download FBLab.it-BPM2OSC-v1.0.0.tgz from GitHub.
  2. Extract the archive to a permanent local folder (e.g. C:\companion-modules\BPM2OSC).
  3. In Companion, open Settings → Developer extras → Developer modules path and point it to that folder.
  4. Restart Companion.
  5. Create a new connection of type BPM2OSC and set host/port to match your BPM2OSC machine.

Available actions:

ActionDescription
Start EngineStart BPM detection
Stop EngineStop BPM detection
Toggle Start / StopToggle between running and stopped
Resync BeatReset beat phase
Toggle Lock BPMEngage or release manual BPM lock
BPM ÷2Apply half-tempo factor
BPM ×2Apply double-tempo factor
Tap TempoTap tempo input
Apply PresetSwitch to a named engine preset

Available feedbacks (button visual states):

FeedbackTriggers when…Default style
Engine RunningDetection is activeGreen background
Engine StoppedDetection is not activeDark red background
BPM Locked (manual)Operator has locked BPM manuallyRed background
BPM Auto-LockedAuto-lock engaged by confidenceDark blue / accent text
BPM Factor Active÷2 or ×2 is appliedOrange background
Specific Preset ActiveNamed preset is selectedTeal text on dark blue
Confidence Above ThresholdConfidence % exceeds a set valueDark green background

Available variables (use in button labels):

VariableExample value
$(bpm2osc:bpm)126.0
$(bpm2osc:running)true
$(bpm2osc:locked)false
$(bpm2osc:confidence)87%
$(bpm2osc:preset)Rock / Live
$(bpm2osc:factor)1 / ÷2 / ×2
$(bpm2osc:bar_beat)14
The module connects to BPM2OSC's SSE stream (/api/stream) for real-time updates — variables and feedbacks refresh within ~50 ms of any state change, with no polling overhead. If the connection drops, the module auto-reconnects after 3 s.

Option B — Generic HTTP module (no module install)

Without the BPM2OSC module, you can still send commands from Companion using the built-in Generic HTTP module:

  1. In Companion, add a connection of type Generic HTTP.
  2. Set Base URL to http://<BPM2OSC-IP>:5000.
  3. Create buttons with actions POST to paths like /api/start, /api/tap, etc.

Feedback (button color/label updates) is not available in this mode — use the native module for full integration.

ChamSys MagicQ

MagicQ does not accept BPM values via OSC. The correct approach is to map the /beat OSC message to a Speed Master Tap function via the Automation window. This makes MagicQ tap-tempo its Speed Master on every beat, keeping chase speeds locked to the music.

OSC target edit dialog for ChamSys MagicQ showing IP 127.0.0.1, port 8000, UDP, Beat path /beat with Send enabled and all other messages disabled

OSC target edit dialog — ChamSys MagicQ example: only Beat is sent

On the MagicQ side — one-time setup:

  1. Setup → Network → OSC → enable OSC RX, port 8000
  2. Open Macro → View Autom
  3. Add a new row (press the Insert soft-button or Add)
  4. Set Type = OSC
  5. Set P1 = /beat (the OSC address BPM2OSC sends)
  6. Set Function = Speed Master Tap
  7. Set P2 = 1 (Speed Master ID — SP1; change if you use a different Speed Master)
  8. In each Cue Stack that should follow the beat, set Speed Master = SP1

From this point on, every /beat message from BPM2OSC will tap the Speed Master, and all cue stacks assigned to SP1 will chase in sync with the music.

In BPM2OSC:

  • IP: MagicQ machine's IP address (or 127.0.0.1 if on the same machine)
  • Port: 8000
  • Protocol: UDP
  • Send BPM: off — Send Beat: on
  • Beat path: /beat
MagicQ supports up to 100 Speed Masters (SP1–SP100). If you need different cue stacks to run at different speeds, assign them to different Speed Masters and add one Autom row per Speed Master, each listening on a different OSC address.

Resolume Arena / Avenue

OSC target edit dialog for Resolume showing IP, port, OSC paths and BPM normalization

In BPM2OSC — OSC target settings:

  • IP: Resolume machine's IP address
  • Port: 7000 (Resolume default OSC input port)
  • Protocol: UDP
  • BPM path: /composition/tempocontroller/tempo — Send ✓
  • Beat path: /beat — Send off (Resolume handles its own beat grid)
  • Resync path: /composition/tempocontroller/resync — Send ✓
  • Enable Normalize BPM (0–1), min: 20.0, max: 500.0

On the Resolume side:

  1. Preferences → OSC → enable OSC input on port 7000
  2. The tempo controller path /composition/tempocontroller/tempo is built-in — no mapping needed
  3. Resolume expects a normalized 0–1 value for tempo, hence the BPM normalization above
Resync in Resolume: sending /composition/tempocontroller/resync triggers Resolume's internal beat-grid reset, keeping its visuals phase-locked to the music when the operator presses RESYNC in BPM2OSC.

Generic OSC (Bitfocus Companion, QLab, etc.)

Any software that can receive OSC over UDP or TCP will work. Point BPM2OSC at the destination IP and port, configure the OSC paths to match what the target software expects, and enable or disable individual message types (BPM, beat, resync) as needed.

Common use cases:

  • Bitfocus Companion: see the dedicated Companion section for the native module with full feedback and variables support
  • QLab: use /bpm to feed tempo to a click track or time-based cue
  • TouchDesigner / vvvv: use /bpm and /beat to drive generative visuals
  • MIDI-to-OSC bridges: convert /beat to a MIDI clock pulse
Localhost testing: set IP to 127.0.0.1 and open any OSC monitor (e.g. Protokol) on the same port to verify messages before connecting real hardware.

Troubleshooting

BPM display shows wrong value

  • Try a different genre preset. Most detection errors are octave mistakes fixed by the right preset.
  • Check the AlgoMonitor ACF curve: if the peak is at a different position than expected, the prior may be pulling it. Adjust the preset's prior BPM.
  • Lower the buffer size if the display lags noticeably behind the music.
  • Increase the buffer size if the display oscillates between two values.
  • Use TAP to override temporarily while adjusting settings.

CONF bar stays low (red / yellow)

  • The audio level may be too low. Check the VU meter — the bars should reach the green zone on the beat.
  • Sparse percussion (breakbeats, half-time) is harder to detect. Try the Hip-Hop preset and enable auto-lock at ~50%.
  • During breakdowns or DJ transitions low confidence is expected — enable auto-lock to prevent the display from drifting.

No audio devices visible

  • Make sure your audio interface or microphone is plugged in before starting BPM2OSC.
  • On Windows, check that the device is not set to exclusive mode by another application.
  • Loopback devices require the output device to be active (playing audio).

OSC not received by the destination

  • Check IP address and port. On a single machine use 127.0.0.1; for network targets use the machine's LAN IP.
  • Check that no firewall is blocking UDP/TCP on the destination port.
  • Use an OSC monitor (e.g. Protokol) on the same machine as the destination to confirm packets arrive.
  • TCP targets show a connection error (grey dot with X) if they can't connect — verify the destination is listening before starting BPM2OSC.

Application doesn't start

  • Reinstalling BPM2OSC usually fixes startup issues — download the installer again from the website.
  • Check that %APPDATA%\BPM2OSC\bpm2osc.json is not corrupted. Delete it to reset to defaults.
Still stuck? Write to info@fblab.it with a description of the problem and, if possible, a screenshot of the AlgoMonitor panel.

What's New

v2.10.1f — 8 July 2026 (feature release)

  • Mini window — small, freely resizable BPM-only readout (⛶ button): tap tempo from the BPM digits, draggable borderless mode, optional always-on-top. See Mini window.
  • Hover tooltips on top-bar buttons, BPM controls, beat indicator and AlgoMonitor readouts, reviewed for clarity and accuracy.
  • Show/hide UI panels — independently hide the VU meter, beat indicator, AlgoMonitor, metronome bar, click icon, presets or Targets panel; the window resizes to fit. See Settings Reference → Interface.
  • Click icon redesigned as a compact metronome-style icon; removed the bottom donate line (still in the About dialog).
  • Bug fixes — ODF graph no longer leaves a blank gap on wide panels; "hide metronome" toggle no longer affects the click icon (now separate toggles); RESYNC no longer causes the click to double-fire; top-bar icon sizing made consistent.

v2.8.1f — 6 July 2026 (feature release)

  • Audio click — new CLICK button plays an audible, phase-locked click on every beat, with downbeat accent, independent output device/API/volume settings, and loopback feedback protection. Latency is self-calibrated per device for accurate sync.
  • Settings — API selector to de-duplicate audio devices listed once per host API (MME/DirectSound/WASAPI/WDM-KS); device channel count now shown.
  • Bug fixes — sample-clock drift correction for both standard input and Loopback capture (was reading a slightly wrong BPM); fixed WASAPI "Unanticipated host error" via automatic host-API retry; fixed VU meter always showing 1 channel; fixed app freeze and occasional double/triple click firing on click-enable; fixed status text overlapping the CLICK button and the window resizing itself unexpectedly.

v2.7.8 — 30 June 2026 (feature release)

  • Tap Tempo prior override — TAP now permanently overrides the ACF prior BPM until the preset changes or it's manually cleared, shown in the Engine monitor as PRIOR BPM (Preset/Adaptive/Override); the guide window around the tapped BPM is now configurable in Settings.
  • Bug fixes — ACF lag search no longer truncates the minimum reachable BPM at preset boundaries; reduced DFT refinement overshoot chasing false harmonic peaks; fixed overlapping Settings fields and overdrawn ACF grid labels.

v2.6.5 — 30 June 2026 (bugfix release)

  • Bug fixes — metronome no longer chases live phase estimates while the BPM is locked; fixed octave-correction instability that caused the BPM to oscillate between octaves on tracks with a strong eighth-note pulse.

v2.6.3 — 28 June 2026 (feature release)

  • Precision engine upgrade — DFT frequency refinement (±0.1 → ±0.002 BPM), beat-grid regression blended with the Kalman estimate, adaptive Kalman precision mode after sustained high confidence, and output resolution raised to 0.01 BPM.
  • AlgoMonitor — new PRECISION row (SYNC/NORM/HIGH); STABILITY now shown to 0.01 BPM.

v2.5.0 — 27 June 2026 (feature release)

  • Web UI & Bitfocus Companion integration — built-in web server with a browser remote-control page (BPM, beat wheel, VU meter, engine monitor, presets) and a REST API Companion can drive via its Generic HTTP module.
  • Higher BPM precision & stability — harmonic sum extended to k=16, confidence via median noise floor, adaptive Kalman noise scaling, and a dead-band filter for a stable displayed BPM.
  • No-beat hold option — keep the last BPM instead of stopping when confidence drops.
  • Bug fixes — octave correction now actually commits (gate-driven multipath hypothesis); metronome/OSC properly stop and restart on no-beat with auto-lock hysteresis and a large-jump guard; fewer false fast-adapt snaps during track changes; preset changes reset the Kalman filter; fixed beat-wheel glitch and hold-BPM display bug.

v2.0.1a — 25 June 2026 (bugfix release)

  • Breakdown hold (Gate 3) — low-confidence frames are discarded once the Kalman filter is initialised, preventing hi-hat/pad periodicities from drifting the BPM during breakdowns or DJ transitions.
  • Tempo inertia hardening and auto-preset smart gate narrowing reduce the need for manual preset selection and wrong large BPM jumps.
  • Per-target OSC Confidence/Bar-beat paths, each independently configurable and opt-in.

v2.0.0 — 25 June 2026 (major release)

  • scipy.fft + high-pass filter for cleaner onset detection; multi-scale ACF (4 s / 12 s windows) with fast-adapt track-change detection.
  • Multipath EMA hypothesis system for octave correction (BASE, ÷2, ×2, 4:3), eliminating single-frame octave flips.
  • Adaptive prior that self-anchors after sustained high confidence; TAP injects prior for instant convergence.
  • New OSC outputs/bpm2osc/confidence and /beat/bar, fully configurable per target.