OtoMotion Manual
Version 1.4 (2026-10-01) / Applies to: OtoMotion 1.x, Ross XPression 12.5
1. What OtoMotion is
The official name is DBT OtoMotion.
OtoMotion measures the loudness of a line-level audio input to broadcast standards (ITU-R BS.1770-4 / EBU R128 / ARIB TR-B32) and sends the values to XPression DataLinq up to 60 times per second. Design the numbers and bars in XPression and you have a loudness meter on the venue screen. At the same time, a monitoring screen opens in a browser on the measuring PC, so the audio mixer can watch the values there.
What it can do
- Measure up to 8 stereo groups at the same time (for example, "Main" and "Venue PA")
- Calculate Momentary / Short-term / Integrated / LRA / True Peak to the standards
- Send each group's values and bar lengths (0–1) to XPression DataLinq. No calculation is needed on the XPression side
- Save and recall settings per venue as presets
- A "Set as reference" button that automatically sets the input trim from a test tone
- Japanese / English interface
2. Terms
| Term | Meaning | Where it's used |
|---|---|---|
| Momentary (M) | Average loudness over the last 0.4 seconds | The loudness "right now". Drives the bar movement |
| Short-term (S) | Average loudness over the last 3 seconds | A steadier value. Also the basis for trim calibration |
| Integrated (I) | Average since measurement started. Silence and very quiet passages are excluded automatically (gating) | Checking that the whole programme is on target |
| LRA (Loudness Range) | The spread of loudness: the difference between quiet and loud passages (LU) | An indication of dynamics. Larger means bigger swings |
| True Peak (TP) | The real peak, including between samples (dBTP) | Clipping warning. Exceeding the limit (default −1 dBTP) shows "TP Over" |
| LKFS / LUFS | Units of loudness. They are the same thing (LKFS is the ITU / ARIB name, LUFS the EBU name) | The target is −24 LKFS in Japanese broadcasting (ARIB TR-B32), −23 LUFS under EBU R128, and −24 LKFS under ATSC A/85 |
| LU | Unit of loudness difference. 1 LU = 1 dB | "+2.0 LU above target" and so on |
| dBFS | Level relative to digital full scale (0) | Scale of the peak bars |
| Target | The loudness you are aiming for. Default −24 LKFS (ARIB TR-B32, same as ATSC A/85). EBU R128 uses −23 LUFS | The white vertical line on the M / S bars of the meter. The reference for the difference (diff) |
| Group | One stereo input pair. Give each a name, such as "Main" or "Venue PA", and list them side by side | For each group you choose which audio interface channels to use |
| DataLinq | XPression's mechanism for feeding in external data. DataLinq Server receives the data and XPression binds it to objects | OtoMotion sends JSON over TCP |
3. Installation
Windows
- Before extracting, right-click the downloaded zip → Properties, tick Unblock under Security at the bottom and press OK. This stops the Windows warnings for files from the internet (if you already extracted it, delete the extracted folder, unblock the zip and extract it again)
- Right-click the downloaded zip → Extract All, then put the
OtoMotionfolder inside it (containingOtoMotion.exeand the start .bat file) anywhere on the PC (for exampleC:\OtoMotion). The app does not start from inside the zip - Double-click
OtoMotion を起動する.bat(the file name is Japanese for "Start OtoMotion"). After about 10 seconds the monitoring screen opens in an app-style Edge window - On first launch the license screen appears. Save the
license.jsonattached to our email to the Desktop or Downloads, and it appears in the list: press Load next to it (see section 17, License) - If you skipped the first step (Unblock), Windows asks first: "The publisher could not be verified" → Run; "Windows protected your PC" → More info → Run anyway
- Settings, logs and presets are saved in
%APPDATA%\OtoMotion(C:\Users\<user name>\AppData\Roaming\OtoMotion). Your settings stay even if you move the distribution folder
Mac
- Open the zip we send you and put
OtoMotion.appanywhere you like, such as Applications (Apple Silicon only. It does not run on Intel Macs. Requires macOS 14 or later) - Double-click to start. If Chrome is installed, the monitoring screen opens in an app-style window; otherwise it opens in the default browser
- On first launch, macOS asks for permission several times in a row: access to the Desktop, Downloads, removable volumes (USB), and the microphone. Click "OK" / "Allow" every time. If you click "Don't Allow", a license saved on the Desktop or in Downloads won't appear as a candidate, or there will be no sound (fix it later: System Settings › Privacy & Security › Files and Folders / Microphone, turn OtoMotion on, then restart OtoMotion)
- On first launch the license screen appears. Save the
license.jsonattached to our email to the Desktop or Downloads, and it appears in the list: press Load next to it (see section 17, License) - When you choose a device and click Apply and save (or, once a device is set, when the app starts), macOS asks for microphone access: Allow it. Right after the very first start (no device chosen yet) you are not asked. If you deny it, the meters stay silent (−∞) and no error is shown. To change it later: System Settings → Privacy & Security → Microphone. On macOS 27 the prompt reads “Allow "OtoMotion" to access the microphone?”. After replacing the app with a new version, the monitor does not open until you answer this prompt (if nothing opens, check whether the prompt is hidden behind other windows)
- A .app downloaded or received via AirDrop may say it can't be opened the first time. If so, go to System Settings → Privacy & Security → "Open Anyway". Or, in Terminal, run
xattr -dr com.apple.quarantine OtoMotion.app - Settings, logs and presets are in
~/Library/Application Support/OtoMotion
Tested on: MacBook Pro (Apple M1, 8 GB) with macOS 26.5.2 (2026-09-27). Chrome opens the monitor with a profile dedicated to OtoMotion (~/Library/Application Support/OtoMotion/browser), so your usual Chrome settings and extensions are left alone.
http://127.0.0.1:8830/ in Chrome (bookmarking it is recommended).Getting audio at the venue (recommended)
In stadiums and arenas, we recommend a small audio interface dedicated to OtoMotion, fed with two channels from the audio team (the venue's main mix, or a mix of the crowd mics).
| How the audio comes | What to use | With OtoMotion |
|---|---|---|
| Line outputs from the console (analog, AES, etc.) | A USB audio interface with two or more inputs | Works as is |
| A Dante network | A Dante USB adapter (for example, Audinate Dante AVIO USB) | Windows sees it as an ordinary USB audio device, so it works as is |
| Dante Virtual Soundcard or a multichannel card | Depends on the driver settings | Works if it appears in Windows Sound > Input. Not usable when it runs in ASIO-only mode |
Why a dedicated interface: it is never fought over by other software (XPression, streaming software and so on). It is also easy to ask the audio team for "two channels for OtoMotion", and changes to other equipment during the show do not affect it.
How to ask: "Could we have the venue's main mix (or the crowd-mic mix) as two line-level channels? A send whose level does not change during the show (a matrix or a fixed aux send) would be ideal." If the level moves during the show, the hype number moves with it.
4. Reading the screen
The monitoring screen is switched with the four tabs in the header: TOP (the screen shown at startup), Live (what you watch during the show), Settings (section 6) and Presets (section 8). At startup (whenever the screen is opened in a new window) the TOP tab opens. If you reload the same window, you stay on the tab you had open. Switching tabs does not stop measuring or sending, and values you are editing in the Settings tab are kept.
4.1 TOP

This is the first screen you see after starting the app. The waves in the background, the bars along the bottom and the pictures inside the cards move with the incoming audio (the level of group 1 and the BPM).
- Three cards (Loudness meter / Audio-reactive graphics / BPM sync): what you can do with OtoMotion. Start here → on any card simply moves to the Live tab; it does not change any settings.
- Status strip: from the left, Input (device name and sample rate; green = audio is arriving, red = no signal, yellow = test signal), XPression (green = connected, destination and rate per second; red = not connected), Groups (the number of groups and how many of them are band-limited) and Preset (the preset you last loaded or saved; Change opens the Presets tab). The › at the right of each item opens the matching settings page (Input and Groups: "Device and groups"; XPression: "Send to XPression"; Preset: the Presets tab).
- Footer: How to use opens this manual. The DekoBokoTech website link only works when the PC is online.
Keep the Live tab open during the show (the background is only drawn while TOP is shown, so the Live tab carries no extra load).

4.2 Header

| Display | Meaning |
|---|---|
| TOP / Live / Settings / Presets | The tabs. The selected tab is highlighted. When the Settings tab has unsaved changes, a small yellow dot appears next to "Settings" (section 6) |
| Help | Opens this manual in a panel inside the app (Esc closes it) |
| Input: (device name) 48kHz | The audio interface is open and audio is arriving. Green |
| Input: Test signal (sine 997 Hz) | A test signal is playing instead of the device. Yellow. A yellow banner also appears below the header (6.2; always turn it off before the show) |
| Input: no signal | The device can't be opened, or no audio has arrived for 0.5 seconds or more. Red. The device is reopened automatically every 2 seconds |
| Input: (device name) (not found) | The chosen device has disappeared from the computer's device list (it was unplugged). Red. Capture stops until it is plugged back in (reconnect is tried automatically every 2 seconds) |
| XPression: connected | Connected to DataLinq Server over TCP. Green |
| XPression: not connected | Not connected. Red. Reconnection is attempted every second. Measurement does not stop |
| Send: actual 60 / set 60 per s | How many messages per second are actually being sent, and the rate you set. While not connected, actual is 0 |
| 00:12:34 | Measurement time (accumulated time since Start; it stops while measurement is stopped). The same value as the large clock on the right rail |
| EN / JA | Switches the interface language (see buttons) |
A red banner below the header is a warning (for example "Cannot open input device" or "No input for group(s) 5, 6, 7, 8 (this device has 4 ch; …)"). The banner is always one line; long text is cut off with "…" (hover over the banner to see all of it). See Troubleshooting. While a test signal is playing, a yellow banner "Test signal is playing" appears below it. Both banners are visible on every tab.
4.3 Live tab: group cards
Each group has one card, laid out in two columns (a single group fills the full width).

| Part | Meaning |
|---|---|
| Name | Top left of the card. The group name (changed in the Settings tab; the default name while blank) |
| Band badge | Right of the name. Full range is a grey badge; a group whose band is filtered shows "Low 20–250 Hz", "High 4k–20k Hz" and so on in a brighter navy badge (its values are for visual effects, not standards-compliant loudness) |
| L / R badge | The audio interface inputs the group uses (for example L1 / R2), from the saved settings |
| Set as reference | Top right of the card. Automatically sets the input trim to match the audio playing now (see buttons) |
| M bar and value | Momentary. Orange bar; the value on the right is in LUFS |
| S bar and value | Short-term. Light orange bar |
| White vertical line (M and S rows) | The target (default −24) |
| L / R bars | Sample peak of the left and right channels (dBFS). Yellow. The thick white line on the R row is the peak hold (holds the most recent maximum for 1.5 seconds) |
| Value to the right of R | True Peak (dBTP) |
| INTEGRATED | Average since measurement started. The small figure to its right is the difference from the target (for example +0.6 means 0.6 LU above target) |
| LRA | Loudness range (LU) |
| TP max | Maximum True Peak during measurement. Cleared by Reset |
| TP Over (red badge) | True Peak exceeded the limit (default −1 dBTP). Shown for 3 seconds. Nothing is shown while it is below the limit |
A group with no input is shown faded (for example when its L ch / R ch are above the device's channel count; the red banner below the header lists the group numbers).
With 5 or more groups, the cards switch to a compact layout (thinner bars, slightly smaller numbers). On a 1280×800 screen, 8 groups fit without scrolling. On a smaller screen, only the card area scrolls; the right rail (Start, Stop, BPM) always stays in view.

4.4 Live tab: right rail
On the right of the screen, from the top: Integrated measurement, BPM, and Venue presets.

| Part | Meaning |
|---|---|
| Large clock | Measurement time (same as the header clock) |
| Start / Stop / Reset | Control Integrated measurement. The button shown in orange is the current state (while measuring, "Stop" is orange). See All buttons for details |
| Target −24.0 LKFS · TP limit −1.0 dBTP | The saved target and TP limit (the "Target & TP" page of the Settings tab) |
Below it, the BPM card shows the tempo and beat, with TAP, Sync and so on. See section 16.

The Venue presets card shows the name of the preset you last loaded (or saved), or "—" if there is none yet. Open presets takes you to the Presets tab (section 8). To exit the app, press Quit in the row of tabs at the top of the screen (right of Help). It works from any tab.
5. First-time setup (5 minutes)
- Connect the audio interface to the PC and start OtoMotion
- Open the Settings tab in the header and choose Device on the rail on the left. Choose the audio interface under Device (for example
Komplete Audio 2 (2ch)) - Set the Number of groups. For a single stereo feed, 1. To measure Main and Venue PA separately, 2
- In the groups table, enter each group's Name, L ch and R ch (which audio interface inputs to use). By default Group 1 is 1/2, Group 2 is 3/4, and so on
- Press Apply and save at the bottom of the screen. The header changes to "Input: (device name)", and in the Live tab the bars move when audio is present
- Send a test tone from the desk (for example 1 kHz at −20 dBFS) and press Set as reference on the group's card in the Live tab. M / S become −24.0 and sit on the white vertical line (the target) (a trim is applied automatically to match the desk's reference)
- Once XPression has been prepared (section 9), the header shows "XPression: connected"
- Save these settings under a name in the Presets tab; next time, just load the preset
6. All settings
Open the Settings tab in the header and the rail on the left lists seven items. Choose an item to show its page on the right (the page you last opened is shown again next time).

| Rail item (page title) | Contents | Takes effect |
|---|---|---|
| Device (Device and groups; the number on the right is the number of groups) | Audio interface, number of groups, groups table (6.1) | On save |
| Test signal | Play a signal generated inside the app (6.2) | At once |
| Target & TP (Target and true peak) | Target, TP limit, start measuring at launch (6.3) | On save |
| Bars (Bar motion) | Range and speed of the bars (6.4) | On save |
| BPM | Detection group, beat length, beat_hit decay (6.5) | At once |
| XPression (Send to XPression; the dot on the right is the connection: green = connected, red = not connected) | Target IP, port, rate, delimiters (6.6) | On save |
| Display (Display and language) | Screen language, silence text, light mode (6.7) | On save (the language switches at once; light mode takes effect and is saved at once) |
Items marked "On save" are applied and saved only when you press Apply and save at the bottom of the screen (nothing changes until then). When you change a value, the save button turns yellow and reads "Unsaved changes — Apply and save", "● Unsaved changes" appears to its right, and a yellow dot appears on the "Settings" tab in the header. Values you are editing are kept even if you move to another tab. Revert puts the saved values back (6.8). No restart is needed after saving, and the app starts with these settings next time.
The Test signal page, the three fields on the BPM page, Light mode on the Display and language page, and the time signature and Auto follow on the Live tab's BPM card take effect and are saved as soon as you change them. Changing them does not mark the settings as unsaved.
6.1 Device and groups
Choose the device and the number of groups on the upper card, and set up each group in the groups table on the lower card (Figure 9). The table columns are # (group number), Name, L ch, R ch, Trim dB, Band (for Custom, Low / High Hz fields appear to its right) and Set as reference. The table's Set as reference works the same as the button on the Live tab's card. It can't be pressed on rows you added by raising the number of groups until you save ("Save the settings first").
Device (dropdown)
- Meaning
- The audio interface to capture audio from. The input devices the PC recognises are listed as "name (N ch)". Only WASAPI devices on Windows and Core Audio devices on the Mac are listed (devices with ASIO-only drivers are not; see Getting audio at the venue)
- Options
- Choose a device: nothing selected yet (right after first launch). Each device: the number in brackets is that device's input channel count. For example "(4ch)" lets you set L ch / R ch to 1–4. NDI or webcam microphones may also appear
- Default
- None (not selected)
- When changed
- The device is reopened. Integrated, LRA, TP max and measurement time are reset
- Note
- A device you unplugged and replugged, or plugged in later, appears when you reopen the list (the list is refreshed while no stream is open). If it doesn't appear, select a different device in Settings and then switch back, or restart the app
Number of groups (dropdown 1–8)
- Meaning
- The number of stereo groups measured simultaneously. That many rows appear in the groups table, and after saving the Live tab shows the same number of cards
- Default
- 1
- When changed
- Added groups start measuring from scratch (Integrated of existing groups is kept). Settings of removed groups are not deleted; they come back if you raise the number again. XPression always receives keys for all 8 groups; unused groups have
gN › onset to0
Group row: Name
- Meaning
- The group's display name. It appears as the card name on the Live tab and in XPression's
gN › name. Non-ASCII text (such as Japanese) is fine. While the field is blank, the default name is shown faintly in it and that default is used - Default
- Blank. While blank, English mode uses Main / Group N (Group 1 is "Main", groups 2 and above are "Group 2", "Group 3" …) and Japanese mode uses 「メイン」/「系統 N」.
gN › namefollows the language saved in the settings (Japanese if the language is left on automatic). A name you type is used as-is in every language - When changed
- Only the display changes. Measurement is not reset
Group row: L ch / R ch
- Meaning
- Which audio interface inputs are used as left / right (counting from 1). The same input may be used by several groups
- Default
- Group N uses 2N−1 / 2N (1/2, 3/4, 5/6 …)
- Range
- 1–64. If you enter a number above the device's channel count, a warning is shown and the group runs on 1/2 (the app does not crash)
- When changed
- Only that group's input assignment is swapped. Integrated is kept
Group row: Trim dB
- Meaning
- Gain (dB) applied to that group's input. It absorbs differences in audio interface input level or desk reference level, so that the desk meters and OtoMotion agree. It affects every measured value (M/S/I/LRA/TP/bars)
- Default
- 0.0
- Range
- −40 to +40
- How to set
- Rather than typing it in, it is more reliable to play a test tone and press Set as reference (the value is calculated and entered in this field automatically)
- When changed
- That group's values change immediately. Integrated is kept (it continues with the trimmed values)
Group row: Band (dropdown)
- Meaning
- Filters that group's input to a frequency band (for visual effects). Use it to build bars on the venue screen that thump with the bass or sparkle with the highs. The meter (M/S/I/LRA), True Peak and bars are all calculated on the filtered signal
- Options
- Full range: no filtering; standards-compliant loudness measurement. Low 20–250 Hz: kick and bass; for a bar that reacts to the low end. Mid 250–4k Hz: the core of voices and instruments. High 4k–20k Hz: cymbals and crowd sparkle; for a bar that reacts to the highs. Custom: shows Low Hz / High Hz fields so you can set the band yourself (10–24000, low < high; invalid values revert to 20 / 20000)
- Default
- Full range
- When changed
- Only that group's filter is replaced, and that group's Integrated, LRA, TP max and measurement time are reset (the meaning of the measurement changes). Other groups are untouched. A badge such as "Low 20–250 Hz" appears next to the card name on the Live tab, and XPression receives it as
gN › band(full/low/mid/high/custom) - Note
- A filtered group is not a standards-compliant loudness reading. Use a full-range group to judge −24 (comparison with the target). Pressing "Set as reference" on a filtered group sets the trim so that band's level matches the target. The filter is a 4th-order Butterworth band-pass (the upper edge is limited to 95% of half the sample rate)
6.2 Test signal

So that you can check the band filters, BPM detection and the XPression scene even without a desk or cables, OtoMotion can play a signal it generates itself in place of the audio interface. While it is on, every group measures the same stereo signal (the groups' L ch / R ch settings are ignored and treated as 1/2, so no "channel 3/4 not available" warning appears; Trim dB and Band still apply). Nothing is played through the speakers.
This page takes effect and is saved as soon as you change it (no need to press Apply and save, and pressing it does not change the test signal). While it is on, the input status in the header turns yellow and reads, for example, "Input: Test signal (sine 997 Hz)", and a yellow "Test signal is playing" banner appears just below the header. The banner is visible on every tab: Live, Settings and Presets.
Use test signal (checkbox)
- Meaning
- On: plays the test signal instead of the device. Off: goes back to the device in Settings
- Default
- Off (always off at launch)
- When changed
- The input is reopened, so Integrated, LRA, TP max and elapsed time are reset and BPM detection starts over
Type (dropdown)
- Meaning
- What kind of sound to play
- Choices
- Sine: a steady tone (997 Hz by default). For checking that the readings match the level, and for checking bars and numbers in XPression. At 997 Hz and −23 dBFS, M / S / I read −23.0 LUFS. Sweep: a tone that rises logarithmically from 20 Hz to 20 kHz over "Sweep s", repeating. For checking that each band-limited group gets louder in its own band. Kick (for BPM detection): a short (60 ms) decaying 60 Hz burst every "Kick BPM" beat, with quiet pink noise (−40 dBFS) in between. For checking BPM detection and the low-band bars. Pink noise: noise with equal energy per octave across the whole range. For balancing the lengths of per-band bars. Silence: an empty signal (to check that everything reads −∞ and how XPression looks at 0)
- Default
- Sine
Frequency Hz (sine only)
- Range
- 20–20000
- Default
- 997 (the same as the EBU conformance tests; avoids exactly 1 kHz)
Level dBFS
- Meaning
- For sine, sweep and kick, the amplitude (peak); for pink noise, the RMS level. Not shown for Silence
- Range
- −60–0
- Default
- −23.0
Sweep s (sweep only)
- Meaning
- How long it takes to rise from 20 Hz to 20 kHz. At the top it jumps back to 20 Hz and repeats
- Range
- 1–60
- Default
- 10
Kick BPM (kick only)
- Meaning
- The kick interval (beats per minute). The first kick sounds the moment you turn it on
- Range
- 30–300
- Default
- 120
6.3 Target and true peak

Target LKFS
- Meaning
- The loudness you are aiming for. This value is used for the white vertical line on the cards, the difference to the right of Integrated, the "Target −24.0 LKFS" line on the right rail, XPression's
target/gN › diff_i/gN › diff_s, and the level "Set as reference" calibrates to - Default
- −24.0 (ARIB TR-B32, Japanese broadcasting; also the ATSC A/85 value. EBU R128 uses −23 LUFS)
- Common values
- −23.0 (EBU R128, Europe), −24.0 (ATSC A/85, USA). For streaming, −14 to −16 is sometimes used
- Range
- −40 to 0
TP limit dBTP
- Meaning
- When True Peak exceeds this value, the "TP Over" warning is shown and XPression's
gN › tpoverbecomes 1 - Default
- −1.0 (the ARIB / EBU limit)
- Range
- −20 to +3
- Notes
- The warning is triggered by the instantaneous TP and shown for 3 seconds (it appears even when measurement hasn't been started). The "TP max" value is updated only while measuring
Start measuring at launch (checkbox)
- Meaning
- When on, Integrated measurement starts the moment the app launches (as if Start had been pressed)
- Default
- Off (the app starts stopped. M / S / TP are always live)
- When to use
- When you're worried about forgetting to press Start on air. However, if you reset at the top of the show, leaving this off and pressing Start just before air gives a cleaner Integrated reading
6.4 Bar motion

OtoMotion normalises bar lengths to 0–1 before sending them to XPression. The range and motion set here apply identically to the monitoring screen and to the XPression bars.
Loudness min / max
- Meaning
- The scale range of the M / S bars (LUFS). At min the bar is 0; at max the bar is full
- Default
- −60 / 0
- Example
- To magnify the area around the target, use −36 / −12. If min ≥ max, the defaults are restored
Peak min / max
- Meaning
- The scale range of the L / R peak bars and the peak hold (dBFS)
- Default
- −60 / 0
Smoothing ms
- Meaning
- Time constant (milliseconds) of a first-order lag that smooths the M / S bar motion. Larger values follow more slowly. It applies to both rise and fall (only to rise if "Fall time ms" is set)
- Default
- 100
- Range
- 0–5000. 0 means no smoothing
Fall time ms
- Meaning
- Time constant used only when the M / S bars are falling. Use it when you want the bars to linger instead of dropping immediately after the sound stops. It does not affect the values
- Default
- 0 (same behaviour as Smoothing ms)
- Example
- 1000 makes the bars fall over about 1 second. If the motion looks too busy on the venue screen, try somewhere around 500–1500
Peak fall dB/s
- Meaning
- How fast the peak bars (L / R) fall. They rise instantly and fall at this constant rate (PPM-like behaviour)
- Default
- 20
- Range
- 1–200. Smaller is slower
Peak hold s
- Meaning
- How long the peak hold (the white line on the R row, XPression's
gN › pkhold) holds the most recent maximum. After the hold, it falls at the "Peak fall dB/s" rate - Default
- 1.5
- Range
- 0–30
6.5 BPM

The three fields are Detect from group, beat length ms and beat_hit decay ms. Each takes effect and is saved as soon as you choose (or enter) it, and does not mark the settings as unsaved. See 16.3 for what they mean. The BPM itself, the time signature and Auto follow are on the Live tab's BPM card.
6.6 Send to XPression

Target IP
- Meaning
- IP address of the PC running DataLinq Server
- Default
127.0.0.1(when DataLinq Server runs on the same PC as OtoMotion)- Another PC
- That PC's IP (for example
192.168.1.20). Host names can't be used (IP only; an invalid value reverts to 127.0.0.1). See Sending to another PC
Port
- Meaning
- The TCP Port configured in DataLinq Server's XML/JSON TCP source
- Default
- 7327 (same as XPression's default)
- Range
- 1–65535
Rate /s
- Meaning
- How many JSON messages to send per second. XPression renders at about 60 frames per second, so 60 updates every frame
- Default
- 60
- Range
- 10–60. Changes take effect immediately, even while sending
- Guide
- At 10 the bars look jerky. 20 is nearly smooth. Tested on real XPression 12.5 hardware: 60 per second runs without dropped messages. If the XPression PC is heavily loaded, lower it to 30
Start of Message (dropdown)
- Meaning
- Control character placed before each JSON message. Choose the same one as XPression's "Start of Message"
- Options
- None: nothing added (matches XPression's default
<none>). STX: 0x02 (Start of Text). SOH: 0x01 (Start of Header) - Default
- None
End of Message (dropdown)
- Meaning
- Control character placed at the end of each JSON message. XPression splits the stream here and reads one message at a time. Choose the same one as XPression's "End of Message"
- Options
- NULL: 0x00 (XPression's default). ETX: 0x03 (End of Text). LF: line feed 0x0A. CR: carriage return 0x0D. CRLF: 0x0D 0x0A. EOT: 0x04 (End of Transmission)
- Default
- NULL
- Note
- If this doesn't match XPression, values either never update or stay stuck on old values. If in doubt, leave both at their defaults (None / NULL)
The JSON sent to XPression is always nested (a tree): under root there is a folder per group (g1–g8), one for the beat (beat) and one for the MIDI slots (midi), e.g. g1 › mbar, beat › bpm, midi › s1. The values and their meaning are unchanged; only the key placement is a tree. There are 181 keys in total (chapter 11). This tree has been verified in XPression 12.5's Browse DataLinq (2026-09-26; the midi branch is checked in the hardware test of chapter 18).
6.7 Display and language

Language (dropdown)
- Meaning
- The screen language (日本語 / English). Works the same as EN / JA in the header and switches as soon as you choose
- Saving
- When you press Apply and save, it is also saved in the settings, so the app opens in that language next time even if the browser forgets it
Silence text
- Meaning
- The text shown instead of a number below −70 LUFS (silence). Used on both the monitoring screen and in XPression
- Default
-∞- Example
- If your XPression font has no "∞" glyph, use
---or leave it empty. When empty, the text on the XPression side disappears
Light mode (for low-power PCs) (checkbox)
- Meaning
- Makes the monitoring screen lighter to draw. Only the screen changes: what is sent to XPression, and how often, is not affected. When it is on:
- The meters and the rest of the screen are redrawn 15 times a second instead of 30 (the values are still received as before)
- The TOP background stops moving and becomes a still picture (the pictures inside the cards still move with the sound)
- The glow (shadows) on the cards and buttons is turned off
- A "Lite" mark appears to the left of the clock in the header
- Default
- Off
- When to use
- When the browser's CPU use looks high in Task Manager, or when you run OtoMotion on the same PC as XPression (to leave CPU for XPression)
- Saving
- Takes effect and is saved as soon as you tick or untick it (no need to press Apply and save; unsaved changes in other fields are not saved with it). It is a per-PC setting, so it is not stored in venue presets and loading a preset does not change it
6.8 Apply and save / Revert (save bar)

The save bar at the bottom of the Settings tab has two buttons.
- Apply and save: applies the "On save" items (Device and groups, Target and true peak, Bar motion, Send to XPression, Display and language) to the app and saves them to
state.json. Pressing Enter in a field does the same. If you close the screen without pressing it, your changes are discarded - Revert: discards unsaved changes and puts the saved values back (the screen language stays as it is)
7. All buttons
Start, Stop and Reset are in "Integrated measurement" on the Live tab's right rail; Quit is in the row of tabs at the top of the screen (right of Help).
| Button | What happens | When to use |
|---|---|---|
| Live / Settings / Presets (tabs) | Switches the tab shown. Measuring, sending and settings you are editing are unaffected | — |
| Start | Starts accumulating Integrated, LRA, TP max and measurement time. Starting after Stop continues where it left off (values are not reset). M / S / TP / bars are always live, even without Start | Top of the show, top of a segment |
| Stop | Pauses accumulation. Values are held | When you don't want commercials or breaks included in Integrated |
| Reset | Resets Integrated, LRA, TP max and measurement time to zero. If measuring, it keeps measuring; if stopped, it stays stopped. M / S / TP are unaffected | Programme changeover |
| Quit | Exits the app. Before disconnecting, it sends XPression one final message with "status = offline, bars at 0" (so the venue screen isn't left with stretched bars). A confirmation dialog appears | Strike / pack-down |
| Set as reference (per group) | Calculates and saves "Trim dB" so that the group's Short-term (last 3 seconds) equals the target (current trim + (target − S)). It is at the top right of each card on the Live tab and on each row of the groups table in the Settings tab; both work the same. For 3 seconds after pressing, it shows the result, such as "Trim −4.0 dB", and that group's buttons (on the card and in the table) can't be pressed. With no signal it shows "No signal" and does nothing. The table button can't be pressed on rows you added by raising the number of groups until you save | Before the show, while the desk is sending a test tone. Pressing it repeatedly on the same tone settles on the same value |
| EN / JA | Switches the interface language. Remembered by the browser, so the next session opens in the same language. What is sent to XPression does not change | — |
| Help | Opens this manual in a panel inside the app | — |
| Apply and save | Applies and saves the changes in the Settings tab (6.8). Yellow while there are unsaved changes | After changing settings |
| Revert | Discards unsaved settings changes and puts the saved values back | When you want to undo your edits |
| Open presets (right rail) | Moves to the Presets tab | — |
| Save preset (presets) | Saves the current settings under a name | Per venue |
| Load (presets) | Makes the selected preset the current settings (applies and saves them too) | On arrival at the venue |
| Delete (presets) | Deletes the selected preset | — |
| TAP / Sync / ÷2 / ×2 / Set / Adopt (BPM) | Set the BPM and the beat position (16.2) | Per song |
Each setting is explained in "6. All settings" of this manual. The Help button in the header opens this manual in a panel inside the app, and the "Open in a new window" link at the top of that panel opens it as an ordinary page in a separate tab.


8. Venue presets
Use the Presets tab in the header (or Open presets on the Live tab's right rail).

A preset is a snapshot of everything in the Settings tab (device, groups, target, bars, target IP …), except light mode, which is a per-PC setting.
- Get the settings right in the Settings tab and press Apply and save
- In the Presets tab, type the venue name into "Preset name" (for example
XYZ Arena show) and press Save preset - Next time, pick it from the list and press Load. Loading takes effect and is saved at once. If a device with the same name is found, measurement starts right away
- To remove a preset you no longer need, pick it from the list and press Delete
The name of the preset you last loaded (or saved) is shown in "Venue presets" on the Live tab's right rail (Figure 8), so you can see which venue's settings are in use (the name is remembered by this browser; a deleted preset is removed from the display).
presets\ folder. To take them to another PC, copy the whole folder. Saving with an existing name overwrites it.9. Preparing XPression
You only need to do this once per XPression machine.
9.1 Add a source in DataLinq Server
- Start XPression DataLinq Server (Start menu → XPression → XPression DataLinq Server)
- Add New → choose XML/JSON TCP DataLinq Source → OK
- Configure the next screen as follows

| Field | Setting | Explanation |
|---|---|---|
| Network Settings | TCP Server | DataLinq Server listens and OtoMotion connects to it. TCP Client / UDP are not used |
| TCP Port | 7327 (default) | Use the same number as OtoMotion's "Port" |
| IP Address | Empty | Only used for TCP Client |
| Start of Message | <none> (default) | Matches OtoMotion's Start of Message "None" |
| End of Message | NULL (default) | Matches OtoMotion's End of Message "NULL" |
| Use Table Presets / Wrap Indices / Enable Command Parsing / Enable Logging / Save Last Message | All off | With Save Last Message on, the last values are restored after DataLinq Server restarts, but stale bars would appear, so it is not recommended |
| Format | JSON ← the only change | OtoMotion sends JSON |
| Encoding / XSLT File | Leave as is | Only relevant for XML |
Press OK to add the source. Give it an obvious name such as "OtoMotion".
9.2 Connect XPression to DataLinq Server
- In XPression, open Project → DataLinq Manager and click Add
- Enter
localhostas Host Address (when DataLinq Server is on the same PC as XPression) and 8888 as Port (DataLinq Server's default), then OK - If the source you created in 9.1 appears under Available DataLinq Sources, you're done
9.3 Check that values are arriving
Once OtoMotion is running and shows "XPression: connected", open a text object's Data Source → DataLinq → Browse in XPression to see the tree of folders g1–g8 and beat under root. Open g1 and pick name to see "メイン" (or "Main" in English mode); open g2 and pick m to see "-∞", and so on.

root, and g1–g8 and beat appear as folders (here g1 and beat are expanded)10. Building the scene
OtoMotion does all the calculation before sending, so on the XPression side you only need to "display the value" and "use it as a bar length".
10.1 Show a value in a text object
- Place a text object, choose DataLinq on the Data Source tab of the Object Inspector, and click Set
- In Set DataLinq Properties, turn Enabled on, choose the OtoMotion source under DataLinq, and click Browse...
- In Select DataLinq Field, expand the
g1folder, pickm, and click OK. Column becomesg1(the folder) and Row becomesm(the key). You can also type them in (for a beat value, Columnbeatand Rowbpm, and so on). For the common keys directly underroot(elapsed,status, and so on), leave Column empty and put the key name in Row - Always turn Live Update on (the value does not update without it)

g1 and pick m; the Selection area at the top shows Column: g1 / Row: m
g1, Row is m, Live Update is onFrequently used keys: g1 › m (Momentary), g1 › s (Short-term), g1 › i (Integrated), g1 › lra, g1 › tp (True Peak), g1 › tpmax, g1 › diff_i (difference from target, in the form +0.6), elapsed (measurement time; a common key, so it sits directly under root). They arrive as strings with one decimal place, so they can be displayed as they are.
10.2 Drive a bar (script)
Bar length arrives as g1 › mbar (0–1). Receive it in a text object (it can be hidden) and use a script to put it into a quad's scaleX. Write the script in the OnSetText event of that text object's Script Editor (it runs every time a value arrives).
' Script on the text object that receives g1 › mbar
dim bar as xpBaseObject
dim v as Double
Scene.GetObjectByName("Bar1", bar)
v = text / 1 ' convert the string to a number
bar.scaleX = v ' use 0–1 directly as the horizontal scale
bar.Visible = (v > 0) ' hide at 0 (so no thin sliver remains)

- Set the quad's origin (Pivot) to its left edge and make its width the length of a full bar. Then scaleX = 1 is full and 0.5 is half
- For the peak bar use
g1 › pkbar, org1 › pk_l/g1 › pk_rfor separate L / R. The peak hold position isg1 › pkhold(0–1 on the same range, so set a thin quad'spositionXto "maximum bar width × value") - For a target line, place it at a fixed position: the target −24 divided by the bar range (default −60 to 0) = 0.6. If you change the bar range, move it accordingly

10.3 Showing and hiding groups
gN › on is 1 if the group is enabled and 0 if unused. Use it to toggle Visible on group 2's group (its full set of text and bars), and the same scene works whether the venue has one group or two.
' Script on the text object that receives g2 › on
dim grp as xpBaseObject
Scene.GetObjectByName("Group2", grp)
grp.Visible = (text / 1 > 0)
10.4 TP Over warning
While g1 › tpover is 1 (for 3 seconds after the overshoot), show a red indicator. As above, just feed it into Visible.
10.5 Building per-band bars
Use the same input in several groups and give each group a different band to get bars that move separately for "overall", "bass" and "highs".
- Set Number of groups to 3
- Give all three groups the same L ch / R ch (for example 1 / 2)
- Set names and bands: Group 1 = "Overall", Full range; Group 2 = "Bass", Low; Group 3 = "Highs", High. Then press Apply and save
- In XPression, feed
g1 › mbar,g2 › mbarandg3 › mbarinto their own bars (same script as in 10.2). The bass bar jumps with the kick and bass; the highs bar with cymbals and crowd noise
- Filtering lowers the level itself, so the low and high bars tend to be shorter than the full-range bar. Narrow Loudness min / max (the bar range) or raise that group's Trim dB to balance the look (the trim also affects the numbers)
- For snappier movement lower Smoothing ms (e.g. 30); for a longer tail raise Fall time ms (e.g. 500). Bar settings are shared by all groups
- Always judge broadcast loudness (−24) with the full-range group (Group 1 in this example). Groups whose
gN › bandis notfullare for visual effects only
Checking with the test signal's kick: even without sound from the desk, you can check how the per-band bars move with the 6.2 Test signal. After setting up the three groups above, set the test signal Type to Kick (for BPM detection), the Level to −12 dBFS, and turn on "Use test signal" (the test signal feeds the same sound to every group, so L ch / R ch don't matter). If the "Overall" and "Bass" bars jump with each kick while the "Highs" bar hardly moves, the bands are split correctly. Then switch the Type to Sweep: as the tone rises from low to high, the "Bass" bar and then the "Highs" bar extends. You can watch the XPression scene with the same signal. Always turn it off again when you are done.
10.6 Other useful keys
| Key | Use |
|---|---|
status | ok = normal, nosignal = no input device, offline = OtoMotion has quit. Hiding the whole meter whenever it isn't ok avoids showing a broken display |
seq | Sequence number of each message. If it stops increasing, OtoMotion has crashed (DataLinq Server keeps holding the last values, so the bars freeze extended). Operationally, handle this with "if OtoMotion crashes, take the scene out" |
running | 1 while Integrated is being measured. Use it for a "REC"-style indicator |
target | The target (a number). For showing text such as "Target −24" |
10.7 Sample scene (a complete kit)
A sample that combines a loudness meter, band-limited bars and beat dots. The background, guide, textures and scripts are bundled, so you can build the same scene in XPression.

The quickest way: open the project
- Save OtoMotion_sample_scene.xpp (an XPression package) on the XPression PC
- Double-click the saved
.xpp. XPression (12.5 or later) starts and walks you through unpacking the package; follow its prompts. The background image is inside the package; the text uses Arial, which comes with Windows - In Project → DataLinq Manager, check that the server (default
localhost, port 8888) and the DataLinqDataLinq1point to the OtoMotion source you created in 9.1. If DataLinq Server runs on another PC, change the Host Address - Set OtoMotion to 4 groups with bands Low / Mid / High (see "5. OtoMotion settings" below) and press Start on the monitor
To build it yourself or to see how it works, follow the steps and scripts below.
Bundled files (open them from here)
- OtoMotion_sample_scene.xpp — the XPression 12.5 package (open it as above)
- otomotion_scene_bg.png — background (1920×1080) with frames, bar tracks, the scale and the target line (−24)
- otomotion_scene_guide.png — the same image with each frame's name and center coordinates (a placement guide)
- otomotion_scene_preview.png — what the finished scene looks like
- textures/ — bar gradients (bar_M / bar_S / bar_PK / bar_BAND / tpover) and a glowing dot (dot_on, transparent)
- otomotion_scene_scripts.txt — every binding and script below, for copying
The idea: display text and "drivers"
Values appear in a text object just by binding it. Bars and dots (quads) cannot receive DataLinq, so place a hidden text object (a driver) that receives the value and moves the quad from its OnSetText script (the same mechanism as 10.2). Hide drivers with Alpha 0 (turning Visible off may stop updates).

1. Display text (bind only)
| Object | Column | Row | Shows |
|---|---|---|---|
| g1_name | g1 | name | Group name |
| g1_m / g1_s | g1 | m / s | Momentary / Short-term |
| g1_tp | g1 | tp | True Peak (now) |
| g1_i / g1_diff_i | g1 | i / diff_i | Integrated and difference from target (after Start) |
| g1_lra / g1_tpmax | g1 | lra / tpmax | LRA / maximum True Peak (after Start) |
| g1_s_big | g1 | s | Short-term, large |
| bpm | beat | bpm | BPM |
| elapsed | (empty) | elapsed | Measurement time (common keys leave Column empty) |
2. Drivers and the quads they move
| Driver | Column | Row | Moves | Quad pivot |
|---|---|---|---|---|
| g1_mbar / g1_sbar | g1 | mbar / sbar | M / S (horizontal) | Left edge |
| g1_pk_l / g1_pk_r | g1 | pk_l / pk_r | PK_L / PK_R (horizontal) | Left edge |
| g1_tpover | g1 | tpover | TP OVER (show / hide) | — |
| g2_mbar / g3_mbar / g4_mbar | g2 / g3 / g4 | mbar | LOW / MID / HIGH (vertical) | Bottom edge |
| beat_count | beat | beat_count | dot_1–dot_4 (only the current beat shows) | — |
Make horizontal bars as wide as their track and vertical bars as tall as theirs, so a value of 1 fills the track and 0.5 fills half.
3. Scripts (OnSetText of each driver)
Horizontal bar (g1_mbar; for the others change "M" to "S", "PK_L" or "PK_R"):
dim bar as xpBaseObject
dim v as Double
Scene.GetObjectByName("M", bar)
v = text / 1
bar.scaleX = v
bar.Visible = (v > 0)
Vertical bar (g2_mbar): the same, with "M" changed to "LOW" ("MID" for g3, "HIGH" for g4) and scaleX changed to scaleY.
TP OVER (g1_tpover):
dim box as xpBaseObject
Scene.GetObjectByName("TP OVER", box)
box.Visible = (text = "1")
Beat dots (beat_count). Only the current beat's dot is shown; the dark rings drawn in the background show for the others:
dim d1 as xpBaseObject
dim d2 as xpBaseObject
dim d3 as xpBaseObject
dim d4 as xpBaseObject
Scene.GetObjectByName("dot_1", d1)
Scene.GetObjectByName("dot_2", d2)
Scene.GetObjectByName("dot_3", d3)
Scene.GetObjectByName("dot_4", d4)
d1.Visible = (text = "1")
d2.Visible = (text = "2")
d3.Visible = (text = "3")
d4.Visible = (text = "4")
4. Colors (to match the OtoMotion screen)
M #F24028, S #FF8A70, PK #FFD23F, LOW / MID / HIGH #B04DFF, TP OVER #D9202A, beat dots #F24028. For gradients, use the bundled textures as material textures (they shrink with the bar, matching the preview).
5. OtoMotion settings
Set the number of groups to 4, give groups 2–4 the same input channels (L ch / R ch) as group 1, and set their bands to Low, Mid and High (6.1). With one mono mic, set every group to L1 / R1 so PK L and PK R move together. Integrated, LRA, TP MAX and the difference from target appear after you press Start on the monitor.
If something does not move
- Check the Row spelling: Row is OtoMotion's key name, not the object name (e.g.
mbar). One wrong letter means no value arrives and the script never runs. When a quad stays in its original shape, suspect this first - Temporarily set the driver's Alpha to 100 and see whether the number changes. If not, the binding (Column / Row, Live Update) is wrong; if it does, the script is
- Write the script in OnSetText and confirm "Compiled successfully." in Messages
- The name in
GetObjectByNamemust match the quad's name exactly (case and spaces) - A bar grows from the center or shrinks the wrong way → the quad's pivot is not at the left edge (bottom edge for vertical bars)
- If you changed the gain after starting a measurement, press Reset → Start to measure again (earlier values stay in Integrated and TP MAX)
10.8 CROWD POWER (crowd meter for venues)
The sample package OtoMotion_sample_scene.xpp (XPression 12.5) now includes, alongside the existing loudness sample scene, four "CROWD POWER" scenes for a venue's big screen.
- A: vertical gauge — 24 segments stack up from the bottom, with the tier word switching through GOOD 40 / GREAT 60 / AMAZING 80 / MAX!! 95. A dotted line marks BEST
- B: dial — a needle points at one of 30 ticks. The tier word appears under the dial
- Side-by-side — A on the left, B on the right, in one scene
- C: LED equalizer wall — 24 bars (8 LOW in blue, 8 MID in purple, 8 HIGH in red) with a big number in the centre




How the crowd-power value works
Crowd power is group 1's bar value (g1 › mbar) × 100. It rises with a bigger cheer.
- BEST: keeps the highest value seen so far; it stays on screen even after the crowd quiets down
- NEW RECORD!: shown for 3 seconds when the crowd drops at least 20 below the current record and then beats a record of 60 or more (so it only fires when a fresh cheer clearly tops the previous one, after a lull)
- The screen flashes at 95 and above
- Pressing Reset in OtoMotion sets BEST back to 0
OtoMotion settings: Bar motion
On the Settings tab → Bar motion (6.4), set these values for a venue crowd:
| Setting | Value |
|---|---|
| Loudness min | −35 |
| Loudness max | −3 |
| Smoothing ms | 100 |
| Fall time ms | 800 |
Tuning: aim for about 20–30 when the crowd is quiet, and about 85–95 for the biggest cheer. If it sticks at 100, raise the max (e.g. −3 → 0). If it never gets high, lower the max. Leave group 1's Trim dB at 0 unless it's clearly off.
Scene C needs 4 groups
Scene C moves band-colour-coded bars, so it uses 4 groups (Settings tab → Device and groups).
| Group | Band | Used for |
|---|---|---|
| Group 1 | Full range | The crowd-power value, the central number |
| Group 2 | Low | The LOW (blue) bars |
| Group 3 | Mid | The MID (purple) bars |
| Group 4 | High | The HIGH (red) bars |
Crowd noise has little high-frequency energy, so the HIGH bars often read lower than the others. If one colour is clearly shorter than the rest, raise that group's Trim dB (try around +6 dB for HIGH).
DataLinq bindings
In all four scenes, the driver text objects are bound to the DataLinq source named "OtoMotion" that you set up in section 9 (an XML/JSON TCP source, TCP Server, port 7327). Name your DataLinq Server source OtoMotion, or, if it's named differently, re-select your source in each driver's DataLinq properties. The main drivers are drv_level (g1 › mbar) and drv_elapsed (elapsed); scene C also has drv_low (g2 › mbar), drv_mid (g3 › mbar) and drv_high (g4 › mbar).
Font
The numbers use the free font Teko (Bold and SemiBold, SIL Open Font License 1.1). Install Teko-Bold.ttf and Teko-SemiBold.ttf on the XPression PC before opening the scenes (licence: OFL_Teko.txt). The background images already contain the title and labels, so no other font is needed.
Hidden text objects and scripts
The hidden text objects var_best, var_rec, var_frame, var_armed and var_elapsed hold the record and timers. Don't delete them, and keep them empty (nothing needs to be typed into them). The scripts are also provided as text files: crowd_power_scripts.txt (for A / B / side-by-side) and crowd_power_c_scripts.txt (for C, including the three band scripts). The XPression scripts are VB.NET and find objects by name (seg_01…, tick_01…, bar_01…, needle, best_marker_b, tierA_*, tierB_*, flash, new_record, num_a / num_b / num_c, best_a / best_b / best_c_num, and so on).
11. JSON key reference (181 keys)
OtoMotion always sends the same 181 keys (for all 8 groups regardless of the number of groups, and all 16 MIDI slots even when nothing is assigned). So XPression bindings don't break when you change venue. Types are fixed: "display values are strings; bars and flags are numbers". The JSON is always nested (a tree): under root there is a folder per group, one for the beat and one for the MIDI slots, as shown below.
root
├ seq, time, status, running, elapsed, target (common keys; names unchanged)
├ g1 … g8 each: on, name, m, s, i, lra, tp, tpmax, diff_i, diff_s, mbar, sbar, pkbar, pkhold, pk_l, pk_r, tpover, band
├ beat : bpm, beats_per_bar, beat, beat_phase, beat_tri, beat_sine, beat_hit, beat_square, beat_count, downbeat, bar_phase, half_phase, double_phase, bpm_detected, bpm_confidence
└ midi : s1 … s16 (raw values from a MIDI controller; added 2026-09-30; chapter 18)
Common (6, directly under root)
To bind one in XPression, leave Column empty and put the key name in Row (for example, Row elapsed).
| Key | Type | Example | Content |
|---|---|---|---|
seq | Number | 12345 | Message sequence number |
time | String | 12:34:56.789 | Time sent |
status | String | ok | ok / nosignal / offline |
running | Number | 1 | 1 while measuring, 0 while stopped |
elapsed | String | 00:12:34 | Measurement time |
target | Number | -24.0 | Target |
Per group (g1–g8 folders, 18 keys × 8; N is 1–8)
| Key | Type | Example | Content |
|---|---|---|---|
gN › on | Number | 1 | 1 if the group is enabled. 0 if unused (the keys below are then empty strings and 0) |
gN › name | String | Main | Group name |
gN › m / gN › s / gN › i | String | -23.4 | Momentary / Short-term / Integrated (one decimal place). Silence shows the Silence text |
gN › lra | String | 6.2 | LRA (LU) |
gN › tp / gN › tpmax | String | -3.1 / +0.5 | True Peak and its maximum during measurement (dBTP). Values of 0 and above have a + sign |
gN › diff_i / gN › diff_s | String | +0.6 / -1.2 | Difference of Integrated / Short-term from the target. Signed. Empty if the source value is silence |
gN › mbar / gN › sbar | Number | 0.62 | M / S bar length (0–1) |
gN › pkbar / gN › pkhold | Number | 0.71 | Combined L/R peak bar, and peak hold position (0–1) |
gN › pk_l / gN › pk_r | Number | 0.65 | Separate L / R peak bars (0–1) |
gN › tpover | Number | 1 | TP Over warning (held for 3 seconds) |
gN › band | String | low | Band (full / low / mid / high / custom). Anything other than full is a visual-effects value. Empty for unused groups |
Beat (beat folder, 15 keys)
All numbers. Beat values are calculated from the PC clock each time a message is sent, so they keep running without sound. In the final message on quit, beat › bpm and beat › beats_per_bar are the set values and the rest are 0.
| Key | Type | Example | Content |
|---|---|---|---|
beat › bpm | Number | 128 | Current BPM (30–300) |
beat › beats_per_bar | Number | 4 | Time signature (beats per bar: 2 / 3 / 4 / 6; the key name beats_per_bar is unchanged) |
beat › beat | Number | 1 | 1 for the "beat length" (default 100 ms) after each beat, otherwise 0 |
beat › beat_phase | Number | 0.25 | Position within the beat. Sawtooth from 0 on the beat to just under 1 before the next beat |
beat › beat_tri | Number | 0.5 | 0 → 1 → 0 within the beat (triangle; 1 at the middle of the beat) |
beat › beat_sine | Number | 0.5 | 0 → 1 → 0 within the beat (smooth sine; 1 at the middle of the beat) |
beat › beat_hit | Number | 0.72 | 1 on the beat, then falls toward 0 with the "beat_hit decay" time constant (default 300 ms) |
beat › beat_square | Number | 1 | 1 in the first half of the beat, 0 in the second half |
beat › beat_count | Number | 3 | Which beat of the bar (1 to beats per bar) |
beat › downbeat | Number | 0 | beat › beat for the top of the bar only (1 only on beat 1) |
beat › bar_phase | Number | 0.625 | Position within the bar (0 → 1) |
beat › half_phase | Number | 0.125 | 0 → 1 over 2 beats |
beat › double_phase | Number | 0.5 | 0 → 1 over half a beat |
beat › bpm_detected | Number | 127.9 | BPM estimated from the audio. 0 until there is an estimate |
beat › bpm_confidence | Number | 0.8 | How certain the estimate is (0–1). Auto follow works at 0.5 and above |
MIDI slots (midi folder, 16 keys)
Values of MIDI controller knobs and buttons, sent to XPression as they are, independent of the measurement (chapter 18). Unassigned slots, the final frame at shutdown, and PCs where the MIDI library cannot be loaded send 0.
| Key | Type | Example | Meaning |
|---|---|---|---|
midi › s1 – midi › s16 | number | 0.625 | 0–1 (3 decimals). A knob gives the value mapped into the assignment's range (within 0–1); a button gives 0 or 1 (1 while held in "Momentary" mode) |
beat › beat_phase etc.) are rounded to 4 decimal places, beat › bpm to 2, beat › bpm_detected to 1 and beat › bpm_confidence to 3. Each message is about 2.0 KB (about 2.4 KB with 8 groups). At 60 per second that is about 140 KB/s.12. Show-day workflow
Preparation (day before to show day)
- Confirm that DataLinq Server has been set up (section 9)
- Start OtoMotion → load the venue preset in the Presets tab (for a new venue, set it up as in section 5 and save)
- With the desk's test tone, press Set as reference → confirm M / S sit at −24.0 (the target)
- Confirm the header shows "Input: (device name)", "XPression: connected" and "Send: actual 60"
- Put the XPression scene into preview and confirm the bars and values move. Also confirm they show −∞ with silence
- Confirm there is no yellow banner (test signal) below the header and no yellow dot (unsaved changes) on the "Settings" tab, and leave the Live tab showing
On air
- At the top of the programme, press Reset → Start (if "Start measuring at launch" is on, just Reset)
- Run the show while watching Integrated and its difference from the target (the small figure to the right of Integrated). If TP Over appears often, check the desk limiter
- To exclude commercials or breaks, press Stop, then Start to resume
Strike
- Take the meter scene out of XPression
- Press Quit in OtoMotion (it sends one final message with bars at 0 before exiting)
13. Sending to another PC
- Find the XPression PC's IP address (
ipconfigin Command Prompt) - On the XPression PC, allow inbound TCP 7327 in Windows Firewall (in the prompt that appears the first time DataLinq Server starts, tick both "Private networks" and "Public networks" and allow; venue networks are often treated as public by Windows, and allowing private only is not enough)
- In OtoMotion's Settings tab → "Send to XPression", enter that IP in "Target IP" and press Apply and save
- When the header shows "XPression: connected", you're done. If it doesn't, check ping, then the port, then the firewall
14. Troubleshooting
| Symptom | Cause and fix |
|---|---|
| "Input: no signal", red bar "Cannot open input device" | The device is unplugged, another application has it open exclusively, or the device name in Settings is wrong. Once replugged, the automatic reconnect every 2 seconds brings it back. If it doesn't, reselect the device on the "Device and groups" page of the Settings tab |
| Red banner "Input device (…) not found. It will reconnect automatically when plugged back in", and the header shows "Input: (device name) (not found)" | The chosen audio interface was unplugged (check the cable and the USB hub's power). Capture stops, the meters show −∞ and status in XPression becomes nosignal. Plug it back in and it recovers automatically within a few seconds. If it doesn't, reselect the device on the "Device and groups" page of the Settings tab. If two devices with the same name are connected, unplugging one of them is not detected (devices are matched by name). The device field in the Settings tab keeps showing "(not found) device name", so saving other settings does not change the input |
| Red banner "No input for group(s) 5, 6, 7, 8 (this device has 4 ch; set each group's L/R within that range)", and those groups' cards are faded | The listed groups' L ch / R ch exceed the device's channel count. Those groups are running on 1/2. Fix them in the groups table on the "Device and groups" page of the Settings tab, or reduce the Number of groups |
| "XPression: not connected" | DataLinq Server isn't running, the source isn't set to TCP Server / 7327, the Target IP is wrong, or the firewall is blocking it. Start DataLinq Server and the connection is made automatically within 1 second |
| "XPression: connected", but no values appear in XPression | Check that no other source (or another app) is listening on the target port, and that the port of the DataLinq Server source matches OtoMotion's target port. One port can be used by only one source. If two OtoMotions send to the same source, their values get mixed. The DataLinq Server source must be TCP Server (not Client). "The port is open" is not the same as "the right receiver is listening" |
| Values reach XPression but don't update | Live Update is off on the text object. Or Start / End of Message doesn't match OtoMotion |
| An XPression bar leaves a thin sliver at 0 | Add bar.Visible = (v > 0) to the script (see 10.2) |
| Values don't match the desk meters | Press Set as reference with a test tone. If they still don't match, check the desk's reference (−20 dBFS = 0 VU, etc.) |
| The bars move although no sound is playing (nothing is connected to the desk or interface). The header's input status is a yellow "Input: Test signal (…)" | The test signal is on (a yellow "Test signal is playing" banner is also shown below the header). Untick "Use test signal" on the Test signal page of the Settings tab to go back to the device (it is also turned off automatically when OtoMotion restarts) |
| Red banner "No audio signal (device may be disconnected). Attempting to reconnect" although nothing was unplugged | On Mac, the microphone permission may have been dropped. Replacing or rebuilding OtoMotion.app invalidates the earlier permission. Run tccutil reset Microphone com.dekobokotech.otomotion in Terminal, relaunch OtoMotion and allow microphone access (you can also check System Settings → Privacy & Security → Microphone) |
| Everything stays at −∞ | The input is silent. The channel settings (L ch / R ch) point at unused inputs. On the Mac, microphone access was denied |
| Bars look jerky | Rate /s is set to 10 → change to 60. If the XPression PC is heavily loaded, 30. If the motion looks too busy on the venue screen, set "Fall time ms" to 500–1500 |
| Started the app but no screen appears | It's already running (you only closed the screen). Run the .bat again and the running screen opens. On the Mac, open http://127.0.0.1:8830/ in Chrome |
| "Already running" message (shown in Japanese: "OtoMotion はすでに起動しています。") | A second instance can't be started. Use the screen that is already running |
| "Cannot start (check the log)" (shown in Japanese: "起動できません。ログを確認してください") | Open today's log in %APPDATA%\OtoMotion\logs\ (on the Mac, ~/Library/Application Support/OtoMotion/logs/) and check the last few lines. If the settings file was corrupted, the app automatically falls back to default settings and keeps the corrupted file as state.json.broken |
| OtoMotion crashed and the XPression bars stay extended | Take the scene out → restart OtoMotion. DataLinq Server is designed to keep holding the last values |
| Only the license screen appears at startup ("No license was found", "The license has expired (valid until …)", "The license file is not valid") | There is no usable license. OtoMotion neither measures nor sends to XPression. Follow the steps in 17.1 to load one: a renewal file (the email attachment) if expired, or the license.json we emailed you if none was found |
| A yellow "License: N days left" appears in the header | This is a warning starting 30 days before expiry. If a renewal file has arrived, load it as in 17.2. Once it reads "License: last day", restarting after midnight makes the app unusable (it keeps running if you don't restart) |
| Yellow banner "This PC's date may be wrong" | The PC's date is earlier than the license's issue date or the date it was last used. The app still works, but check the date and time on Windows / macOS. If "The license has expired (valid until …)" appears after fixing the clock, send the license ID to support@dekobokotech.com (a renewal file will be sent) |
| CROWD POWER: NEW RECORD! never appears / BEST follows the current value | Check that the five hidden text objects var_best, var_rec, var_frame, var_armed and var_elapsed exist and are empty. If the first cheer already reaches close to 100, there's no room to set a new record — raise the max on the Bar motion page |
15. Measurement specifications
| Item | Details |
|---|---|
| Standards | ITU-R BS.1770-4 (K-weighting filter, gated Integrated, True Peak), EBU Tech 3342 (LRA), ARIB TR-B32 (target −24 LKFS; EBU R128 specifies −23 LUFS and ATSC A/85 −24 LKFS) |
| Processing unit | 10 ms blocks. Sample rate follows the device (verified at 44.1 / 48 / 96 kHz) |
| Momentary / Short-term | 400 ms / 3 s moving average. Updated every 10 ms |
| Integrated | 400 ms blocks, 75 % overlap. Absolute gate −70 LUFS, relative gate −10 LU. Implemented so processing time does not grow over long sessions (histogram) |
| LRA | Width between the 10th and 95th percentiles of the Short-term distribution. Absolute gate −70, relative gate −20 LU. Updated every second |
| True Peak | 4× oversampling (2× at 96 kHz and above). Maximum of L / R |
| Verified accuracy | With the EBU Tech 3341 / 3342 compliance test signals: M / S / I ±0.1 LU, LRA ±1 LU, True Peak +0.2 / −0.4 dB |
| Silence handling | Below −70 LUFS is shown as −∞ (text configurable). Bars are 0 |
| Sending | TCP client. JSON (UTF-8) + delimiter. 10–60 per second. Reconnects every second when disconnected. Sends one status=offline message on quit |
| Monitoring screen | 127.0.0.1 only (not visible from other PCs). Port 8830 (8831 … if in use). It does not clash with DokoDoko, KoeBattle or DBTCODER running on the same PC |
16. BPM (moving to the beat)
To make visuals on the venue screen move with the beat of the music, OtoMotion also sends the BPM (tempo) and the beat position to XPression. The beat position is calculated from the PC clock, so it keeps running at a steady tempo even with no sound and even when the device isn't open. There are three ways to set the BPM.

- Type it in: enter a number and press Set (for songs whose BPM you know from the set list)
- TAP: press TAP in time with the beat (or the T key)
- Automatic detection: press Adopt to use the value estimated from the audio, or turn on "Auto follow" to adopt it automatically
16.1 Reading the BPM card
It is on the Live tab's right rail, just below "Integrated measurement". The dropdown to the right of the large number is the time signature.
| Part | Meaning |
|---|---|
| Large number | The current BPM (the same as beat › bpm sent to XPression) |
| Dots (one per beat of the bar) | The current beat lights up. Beat 1 (top of the bar) is dark orange with a glow, the others light orange. Bright on the beat, fading toward the next beat (the same motion as beat › beat_hit) |
| Detected 127.9 · conf 0.8 | The BPM estimated from the audio and how certain it is (confidence, 0–1). Shows "Detected —" until there is an estimate. While the confidence is below 0.5 it is shown dimmed and Adopt can't be pressed |
16.2 Buttons and keys
| Button | What happens |
|---|---|
| TAP (T key) | Press about 4 times in time with the beat. The BPM is set from the 2nd press, using the median of up to the last 8 intervals, so one mistimed press doesn't throw it off. A gap of 2 seconds or more starts counting again. A tempo set by TAP takes over while keeping the current beat position (to line up the top of the beat, use Sync) |
| Sync (S key) | Makes the moment you press it beat 1 (the top of the bar). Press it at the top of a song or a bar |
| ÷2 / ×2 | Halves / doubles the BPM (does nothing if the result would leave 30–300). Use it to fix a detection or TAP that came out at half or double |
| Set | Sets the BPM typed in the field to its left (30–300). Pressing Enter in the field does the same |
| Adopt | Makes the "Detected" value the BPM (once; it doesn't keep following). Only available while the confidence is 0.5 or more |
16.3 Settings
These items take effect and are saved as soon as you change them (no need to press Apply and save, and they do not mark the settings as unsaved). Time signature and Auto follow are on the Live tab's BPM card; Detect from group, beat length and beat_hit decay are on the "BPM" page of the Settings tab (6.5). Auto follow can be switched on and off live during a show.
Only time signature, detection group, beat length and beat_hit decay are stored in venue presets. The BPM and auto follow are not (loading a preset keeps the current tempo and auto-follow state).
Time signature
- Meaning
- Beats per bar.
beat › beat_countcounts from 1 up to this number, and it sets wherebeat › downbeatandbeat › bar_phasewrap - Choices
- 2/4 (2 beats), 3/4 (3 beats), 4/4 (4 beats), 6/8 (6 beats)
- Default
- 4/4
Auto follow
- Meaning
- When on, every 0.5 seconds, if the detection confidence is 0.5 or more, the detected value becomes the BPM and the beat position is pulled toward the beats in the audio (gradually if it is off by up to 1/4 beat, in one step if it is off by more)
- Default
- Off
- Note
- While it is on, a BPM set by TAP or typed in is overwritten by the next detection. For a show with a known set list, turning it off and using TAP or typed values is the most reliable
Detect from group
- Meaning
- Which group's audio the BPM is estimated from. It uses the audio before the band filter (that group's L / R mixed together). Choosing a group beyond the enabled ones stops detection
- Default
- Group 1
- Example
- A group where the kick and bass are clear (such as a band stem) is steadier than the main mix
beat length ms
- Meaning
- How long
beat › beat(andbeat › downbeat) stay at 1 after each beat. At high BPM it is limited to half a beat (so it never sticks at 1) - Range
- 40–500
- Default
- 100
- Note
- XPression is only guaranteed to receive the 1 if this length is at least "1000 ÷ rate per second + one frame" (about 50 ms at 60 per second, 100 ms or more at 10–20 per second). If it is shorter, some beats never deliver a 1 and blinks are missed
beat_hit decay ms
- Meaning
- How fast
beat › beat_hitfalls from 1 at the beat (time constant). It drops to about 0.37 after this time - Range
- 20–2000
- Default
- 300
16.4 How detection works, and its limits
From the chosen group's audio, OtoMotion picks out the moments where the sound suddenly gets louder, weighting the low end (20–150 Hz: kick and bass) most, and estimates the BPM from how those moments repeat over the last 6 seconds. The estimate is updated every 0.5 seconds.
- It takes 4–8 seconds to lock: right after launch, after changing the group, or after the device is reopened, it shows "Detected —" until 6 seconds of audio have been collected. After a song changes, it also takes a few seconds to settle on the new tempo
- It goes wrong during talk, crowd noise, or songs with a weak beat: auto follow does nothing while the confidence is below 0.5, so during MC it keeps running at the previous tempo
- It can mistake half or double the tempo: for example, a 70 BPM song with strong off-beat hi-hats can come out as 140. Because values near the previous estimate are preferred, it rarely jumps to double mid-song, but if it starts at double, fix it with ÷2 / ×2 or use TAP
- It does not detect the time signature (which beat is the top of the bar). To line up the top of the bar, press Sync on beat 1
- MIDI / OSC clock and sync with external devices are not supported
Checking with the test signal's kick: even without a music source, you can see detection work with the 6.2 Test signal. Set the Type to Kick (for BPM detection), Kick BPM to, say, 128, the Level to −23 dBFS or higher (−12 dBFS is safest), and turn on "Use test signal". The test signal feeds the same sound to every group, so any detection group works. Within 6–8 seconds you'll see something like "Detected 127.7 · conf 0.8"; press Adopt or turn on Auto follow and check that the BPM matches (detection can be about 0.1 BPM off). If you change Kick BPM, the input is reopened and detection follows the new tempo a few seconds later. Slow tempos such as 60–90 BPM rarely reach a confidence of 0.5, so try 100–180. Always turn it off again when you are done.
16.5 Using it in XPression
All beat keys are numbers and are sent 60 times per second ("Beat (beat folder, 15 keys)" in chapter 11). Receive a key in a text object (it can be hidden) and drive other objects from its script, in the same way as 10.2.
Blink on every beat (beat › beat → Visible)
' Script of the text object receiving beat › beat
dim lamp as xpBaseObject
Scene.GetObjectByName("BeatLamp", lamp)
lamp.Visible = (text / 1 > 0) ' shown only for the "beat length" after each beat
Spin with the beat (beat › beat_phase → rotation)
' Script of the text object receiving beat › beat_phase (0→1, repeating every beat)
dim star as xpBaseObject
Scene.GetObjectByName("Star", star)
star.rotationZ = (text / 1) * 360 ' one turn per beat (use beat › bar_phase for one turn per bar)
Pulse on the beat (beat › beat_hit → scale)
' Script of the text object receiving beat › beat_hit (1 on the beat, falling toward 0)
dim logo as xpBaseObject
dim v as Double
Scene.GetObjectByName("Logo", logo)
v = 1 + 0.2 * (text / 1) ' 1.2× on the beat, back to normal size
logo.scaleX = v
logo.scaleY = v
Change colour on each beat (beat › beat_count → colour)
' Script of the text object receiving beat › beat_count (1 to beats per bar)
' Stack objects Color1–Color4 in different colours and show only the one for the current beat
dim obj as xpBaseObject
dim n as Integer
dim i as Integer
n = text / 1
for i = 1 to 4
Scene.GetObjectByName("Color" & i, obj)
obj.Visible = (i = n)
next
scaleX and Visible have been confirmed on real hardware (XPression 12.5). Check the property names for rotation (rotationZ) and scaleY with the Script Editor's auto-complete in your version.| Key | Good for |
|---|---|
beat › beat / beat › downbeat | Blinks and flashes (beat › downbeat for the top of the bar only) |
beat › beat_hit | A kick on the beat with a tail (scale, brightness) |
beat › beat_sine / beat › beat_tri | Smooth breathing back-and-forth with the beat (0→1→0) |
beat › beat_phase / beat › half_phase / beat › double_phase / beat › bar_phase | Motion at a constant speed such as rotation or scrolling (one cycle per beat, 2 beats, half a beat, one bar) |
beat › beat_square | Switching between the first and second half of the beat (swinging left and right, etc.) |
beat › beat_count | Showing something different on each beat (colour changes, lighting in sequence) |
17. License
OtoMotion runs on a term license. Without a valid license file (license.json), the app still launches but only the license screen appears; it neither measures nor sends to XPression. Licensing does not tie the app to one PC and does not need an internet connection. A loaded license file is kept in the same folder as the settings (%APPDATA%\OtoMotion; on the Mac, ~/Library/Application Support/OtoMotion) and survives replacing the app.
17.1 Loading a license
- Save the emailed attachment
license.json(license.txtalso works) to the Desktop or Downloads - Start OtoMotion. If there is no license, the license screen appears, listing any files found with their location, addressee and expiry
- Press Load next to the one you want. Once loaded, the app moves on to the TOP screen
- If the file is not found in the list, press Search again (after saving the file again), or use Choose a file to load to pick it directly
17.2 Expiry and renewal
Starting 30 days before expiry, a yellow "License: N days left" appears in the header (click it to open Settings › License). The license works through the end of its last day; starting the app on or after the next day shows the license screen. Once running, the app does not stop even if the license expires while it's open.
- Save the renewal file (the emailed attachment
license.json) to the Desktop - Open the Settings tab › License and press Load next to it (if the app started with an expired license, do the same thing on the license screen shown first)
- Once "Remaining" shows the new value, you're done. No restart is needed
Settings › License shows the addressee, license ID, plan (term or perpetual), period and days left. Quote the license ID when contacting support.
17.3 Restoring the previous license
If you load the wrong file by mistake, Restore the previous license in Settings › License goes back one generation (only the file loaded just before the current one is kept). You can't restore to one older than the license currently in use.
17.4 Troubleshooting
| Symptom | Fix |
|---|---|
| The file is not found in the list | Check that the file is named license…json / license…txt and is at the top level of the Desktop, Downloads or a USB drive. Choose a file to load works regardless of location |
| "A license for another product (DokoDoko, for example)" | It only found the file on another product's USB drive plugged into the same PC. You can leave that drive plugged in. Choose the OtoMotion license and load it |
| "Issued for a different customer, or modified" / "The character encoding has changed (it looks like it was re-saved in a text editor)" | Opening the file in Notepad or another editor and saving it again breaks the signature, even if it looks unchanged — it has been re-saved in a text editor. Save the emailed attachment again without opening it |
| Yellow banner "This PC's date may be wrong" | Check the PC's date and time (its clock). This never makes the app unusable |
| Shows as expired after fixing the clock, even though the license isn't actually due yet | The app was used while the date was set in the future, so the record of the last day used has moved ahead. Send the license ID to support@dekobokotech.com; loading a renewal file fixes it |
| Restarting after midnight on the last day of the license makes the app unusable | The license works through the end of its last day, but starting the app after the date has changed shows it as expired. Load the renewal file before the day of the show |
| The venue PC is offline and can't receive the renewal file | Receive the email on a phone, save the attachment, and carry it over on a USB drive or by AirDrop (Mac). Placed at the top level of a USB drive, it appears in the list |
| Mac: the license doesn't appear in the list / no sound after first launch | You likely clicked "Don't Allow" on one of the permission prompts shown at first launch (Desktop, Downloads, USB, microphone). Go to System Settings › Privacy & Security › Files and Folders (and Microphone if there's no sound), turn OtoMotion on, then restart OtoMotion |
18. Operate with MIDI · OSC (MIDI controller)
With a USB MIDI controller (knobs, faders, buttons) you can move OtoMotion's parameters, press its buttons and drive XPression graphics directly during the show. No specific model is required: as in Resolume, anything can be assigned with MIDI Learn. Assignments are saved in midi.json (in the same folder as the settings) and are not part of venue presets. OSC apps (TouchOSC, Companion, Vertex and others) use the same mechanism (chapter 19).
18.1 Assigning
Open Settings tab › MIDI · OSC to see the list of parameters you can assign (18.2). To assign one from its row:
- Press Assign on the row you want. It turns yellow, the button reads "Move a control", and a blue banner appears at the top of the screen
- Move a knob or press a button on the controller. The assignment is made and saved at once; the row shows a green "Assigned", a label such as
CC 21 · ch1and the device name - Done: that knob or button now moves the parameter. Below the label, Remove removes assignments one at a time
CC 21 · ch1, CC is the number a knob, fader or some buttons send (0–127), and ch is the MIDI channel (1–16). In Note 41 · ch1, Note means a pad or key; letting go of it is called a "note off". PB · ch1 is pitch bend (a wheel or lever), with fine steps — 16384 of them.Buttons on the Live screen (Start, Stop, TAP, …) and the settings fields can also be assigned: press MIDI in the header, then click the item (assignable items light up blue; clicking one does not perform its normal action — pressing the button, editing the field). Tabs and the settings list on the left still switch normally. Pressing Esc cancels only the current wait if one is running, or leaves the mode if nothing is waiting. One knob may be assigned to several parameters (one fader for the trim of groups 1 and 2, for example).
Once a wait starts, a blue "MIDI assignment" banner appears at the top (it stays visible on any tab). Its current step is one of these three:
| Step | Text |
|---|---|
| ① Before an item is picked | ① Click an item |
| ② After picking an item, waiting | ② Move the controller (MIDI · OSC) — waiting for <parameter name>. Stop any OSC source that streams continuously |
| ③ Just assigned (shown for about 3 seconds) | ③ Assigned: CC 21 · ch1 → <parameter name> |
③ normally shows the control and the parameter name, as in the example above. It stays on the plain heading "③ Assigned" only when that information is missing. The right side of the banner shows Esc to cancel. Only when the wait was started from the header's MIDI mode (assigning a Live screen button or a settings field) does it read Esc to cancel / Esc again to leave, and a second Esc leaves the mode entirely.
Once a row has an assignment, its Assign button disappears. To switch it to a different knob or button, press Remove first, then assign again. Clicking a row opens an editor below it (a knob's Min / Max and Invert, and the Mode of a switch target — 18.5), but only for rows that already have an assignment. Switching the list's "Assigned only" filter on the top left shows just the rows that have an assignment (it is remembered even after reopening the page).
18.2 Parameters you can assign
The list is ordered: Level → Bars → Target & TP → BPM & beat → Measurement & presets → Test signal → Values sent to XPression. There is one group row per group in use, and one preset row per saved preset.
| Group | Parameter | Behaviour | Value |
|---|---|---|---|
| Level | Trim of each group (e.g. "Main trim", "Group 2 trim") | Knob | Live only (18.4) |
| Level | Band of each group (Full → Low → Mid → High) | Switch (18.5) | Live only. Only that group's Integrated, LRA and TP max are reset; the audio is not interrupted |
| Bars | Bar minimum / maximum, smoothing, fall time, peak minimum / maximum, peak fall, peak hold | Knob | Live only |
| Target & TP | Target loudness, TP limit, TP Over hold time | Knob | Live only (the bar marker on the Live screen and the "Target / TP" line on the rail follow the moved value) |
| BPM & beat | BPM value; TAP, Sync, ×2, ÷2, Adopt | Knob / button | Saved like TAP (chapter 16) |
| BPM & beat | Auto follow, time signature (2→3→4→6), group used for detection (1→2→…) | Switch | Saved like the on-screen controls (once, about 1 second after the last change) |
| BPM & beat | beat length, beat_hit decay | Knob | Live only |
| Measurement & presets | Start, Stop, Reset; "Set as reference" of a group; loading a venue preset | Button | Same as the on-screen buttons |
| Measurement & presets | Start measuring at launch | Switch | Saved when pressed |
| Test signal | On / off | Switch | Saved, like the checkbox (18.5) |
| Test signal | Type (sine → sweep → kick → pink noise → silence), test signal level, test signal frequency, test signal kick BPM | Switch / knob | Live only. The audio is not interrupted |
| Values sent to XPression | s1–s16 | Knob or button | 18.6 |
Parameter names never include a unit. The small text under a name shows "Button" for a button, "Switch" for a switch, the slot's behaviour (0–1, 0 / 1, and so on) for a value sent to XPression, or the range and unit for a knob. For a knob, that range is the mapping's own Min–Max when exactly one mapping exists, otherwise the default range (for example, trim defaults to −20 to +20 dB). In the value column, a + appears on dB-type values (trim, bar/peak maximum, TP limit) when they are positive (e.g. +3.1 dB). Target loudness and the test signal level can only ever be zero or negative, so they never show a plus sign.
Rows that cannot be used (a group not in use, a preset that no longer exists, frequency or kick BPM with a type that does not use them) are greyed out with the reason, but the assignment is kept — you can still remove it with Remove. The input device, channels, number of groups, the XPression address, language and license cannot be controlled by MIDI (changing them interrupts the audio or the connection).
18.3 Last signal
The bar at the top of Settings › MIDI · OSC shows the last message received, e.g. "device knob CC 16 (ch1) value 92 → Bar maximum (loudness): −1.2 dB" (it fades after 3 seconds). When one knob or button is assigned to several parameters, the first one is followed by "(+1 more)" and so on for the rest. A message that is not assigned shows "not assigned to anything yet"; when the value was not applied, the reason is shown (locked, group not in use, preset missing, not used with the current type, used for the assignment). The row of the parameter that moved lights up yellow for 1.5 seconds.
Releasing a button (a note off, for example) does not overwrite this line (except s1–s16 assigned as Momentary) — the moment it was pressed stays shown. An s1–s16 slot assigned as Momentary is the exception: releasing it updates the line to show a value of 0.
18.4 Values set by MIDI (live only)
Trim, bar ranges and the like moved by MIDI are not saved. The fields on the Settings tab keep showing the saved values, and a badge such as MIDI −12.0 appears next to the field (choices such as the band or the test signal type show text, e.g. "MIDI Low"). The "Current value" column of the list is shown in yellow too. Click the badge, or use the row buttons, to choose:
| Button | What happens |
|---|---|
| Save this value | Takes the MIDI value into the saved settings, saves, and removes the badge (the field changes too) |
| Clear | Discards the MIDI value and returns to the saved value |
MIDI values are also cleared when a venue preset is loaded and when OtoMotion restarts (back to the saved values). Apply and save does not clear them (fixing the target address during a show does not undo what you set with the knobs). If you edit and save a field that has a badge, the saved value changes but the MIDI value stays in effect (press Clear to use the field's value).
18.5 Switches, the test signal and the band
Band, time signature, auto follow, detection group, start at launch, and the test signal's on/off and type are "switches". An assignment has one of two modes (change it in the row editor).
| Mode | Behaviour |
|---|---|
| Next on each press (default for note and CC — including a knob sending CC) | Each press goes to the next option (after the last, the first; on/off flips) |
| Select with knob (pitch bend has no other mode) | The knob position is divided evenly among the options (on/off: on from the middle up) |
- The test signal's type, level, frequency and kick BPM and a group's band change without a gap in the audio during the show (they take effect from the next block; the input is not reopened). The frequency knob is logarithmic (the middle is about 630 Hz)
- Frequency only applies when the type is sine, kick BPM only when it is kick. While the current type does not match, the row is greyed out and turning the knob does nothing (a value set earlier is kept and applies again once the type matches)
- The test signal's on/off switches the input (audio interface ⇔ test signal), so it is saved like the checkbox. The device audio stops the moment it is turned on. The switch can take a few seconds (especially on Mac). At the next launch it is always off, as before
18.6 Values sent to XPression (midi › s1–s16)
Sixteen values that send MIDI values to XPression as they are, independent of the measurement. A knob gives 0–1 (the range can be narrowed within 0–1 and inverted); a button gives 0 or 1 (1 while held in Momentary mode). They have no names (their use in XPression differs from project to project). In XPression, bind them through DataLinq with Column = midi and Row = s1–s16, like any other key (chapter 10). The current values are shown as bars at the end of the list on Settings › MIDI · OSC.
18.7 Connected devices
The bottom of Settings › MIDI · OSC lists the MIDI inputs found. A device seen for the first time is set to Listen. Untick devices you don't use; their messages are then ignored (and stay off next time). The dot lights up when a message arrives.
| Status | Meaning |
|---|---|
| Listening (green) | Messages from this device are received |
| Not listening (tick to listen) | Listen is turned off |
| Not connected | A device seen before is not present now. After plugging it back in, open Settings › MIDI · OSC again (this version does not reconnect automatically) |
| In use by another app | On Windows only one app can open a MIDI input. Close the DAW or other app, then open Settings › MIDI · OSC again |
nanoKONTROL2 1) is ignored, so assignments keep working even if another device is plugged in first. Right after turning Listen back on (about 0.2 s) the first message may be lost.18.8 Notes
- A 7-bit CC gives BPM steps of about 1 over 60–180; assign a pitch bend wheel for finer control
- To receive MIDI from a DAW on the same PC you need a virtual MIDI cable (Windows: loopMIDI, Mac: the IAC driver). Following MIDI clock for BPM comes in the next version
- On Mac, USB and IAC MIDI need no permission dialog. Bluetooth MIDI is not supported
- On a PC where the MIDI library cannot be loaded, Settings › MIDI · OSC shows the reason. Everything else works, and
midi › s1–s16are sent as 0. OSC receiving and assigning still work, and the MIDI button can still be pressed (clicking an item then waits for OSC; 19.8) - Without a license (locked), MIDI has no effect on anything. The MIDI button and Settings › MIDI · OSC are also hidden. Assignments are kept, and they work again once a valid license is loaded
19. OSC (send and receive)
OSC (Open Sound Control) is the UDP message format that video, lighting and control apps exchange over a LAN. OtoMotion can send (the same values it sends to XPression, to Resolume, TouchDesigner, lighting consoles, Ross Vertex and others) and receive (be controlled from TouchOSC, Bitfocus Companion, Vertex and others). Settings live in osc.json (same folder as the settings) and are not part of venue presets. It is a separate output from XPression; neither affects the other.
/otomotion/g1/mbar; an argument is the value (a number or text) sent with it; a port is the number (1–65535) that tells apps apart on the same IP. OSC rides on UDP, which has no acknowledgement. "Sending" on screen means packets leave this PC; it does not mean the other side received them. "Nothing is listening there" only appears in some cases, such as when the receiving app is not running on a PC in the same LAN.19.1 Sending: add a destination
- In Settings › Send OSC, press + Add destination (up to 16)
- Enter the IP (IPv4 digits only; host names are not accepted) and port (Resolume's default is 7000). Click the heading to rename it (empty shows IP:port)
- Choose per second (1–60, default 30). 15–30 is recommended for an iPad (TouchOSC) on Wi-Fi
- Tick Send to the left of the name to start sending. Every change is saved at once. A newly added destination has "Send everything" on by default, so if you only want "Added addresses" (for example sending to a lighting console), untick it
Each destination can use "Send everything" (fixed names, everything; 19.2) and "Added addresses" (any value to any address and range; 19.3). Broadcast (a special IP that reaches every device on one subnet at once, e.g. 192.168.1.255 reaches everything on 192.168.1.*) also works. On a PC with several interfaces (wired, Wi-Fi, virtual adapters) 255.255.255.255 only leaves one of them, so use the subnet broadcast. If two OtoMotion PCs send to the same device, give each a different address prefix (/otomotion_a, /otomotion_b).
19.2 Addresses and values of "Send everything"
Addresses follow the XPression tree (chapter 11): under the prefix (default /otomotion) come groups g1–g8, the beat beat, the MIDI slots midi, and the common keys (time, status, running, elapsed, target). seq is not sent (180 addresses). Values that go to XPression as text (M, S, I, LRA, TP) go over OSC as numbers.
| Address | Type | Range / meaning |
|---|---|---|
/otomotion/g1/mbar and the other 5 bars | Float | 0–1 |
/otomotion/g1/m, s, i | Float | LUFS. −120 = silence (−∞) |
/otomotion/g1/tp, tpmax | Float | dBTP. −120 = silence |
/otomotion/g1/lra | Float | LU |
/otomotion/g1/diff_i, diff_s | Float | Difference from target (LU). −120 when I/S is silent |
/otomotion/g1/on, tpover, /otomotion/running | Integer | 0 / 1 |
/otomotion/g1/name, band, /otomotion/status, time, elapsed | Text | Text (use OSC In DAT in TouchDesigner) |
/otomotion/beat/bpm and the other 14 beat keys | Float / Integer | As in chapter 16. beat, beat_square, downbeat, beat_count, beats_per_bar are integers |
/otomotion/midi/s1–s16 | Float | 0–1 (18.6) |
/otomotion/target | Float | Target LUFS (effective value) |
Values are sent on change (a difference under about one-millionth counts as unchanged), and in addition every key is re-sent gradually over one second, so a receiver started later has everything within about a second. Unused groups send only /gN/on (0); when you reduce the number of groups, that group's values (bars 0, levels −120, empty text) are sent once. One value per message (OtoMotion does not use "bundles", OSC's way of grouping several messages into one packet). On exit, only destinations that have both Send and Send everything on, with a host set, receive once: /otomotion/status "offline", running 0, the 6 bars at 0, M, S and TP at −120, tpover 0, the 4 beat keys at 0 and the 16 slots at 0 (gN/on, BPM, I, LRA, TP max, name, band, target and added addresses are not sent; nothing at all is sent while locked).
The bottom of the page lists every address "Send everything" sends, each with a Copy button, for wiring up XPression or another app.
19.3 Added addresses: any value to any address
Add rows to the table in the destination card (up to 64). Choose the value (numeric keys only, shown with the source range, e.g. "Main › M bar (0–1)"), the address (anything starting with /), the range (min and max, e.g. 0–1, 0–100, 0–255; min > max reverses the direction; min and max cannot be equal — both fields turn red and nothing is saved), the type and when to send. Values outside the source range are clamped before mapping.
| Type | Sent as |
|---|---|
| Float | float (OSC's decimal type) |
| Integer | int (OSC's whole-number type; rounded; the range's min and max must be within −2147483648 to 2147483647) |
| Number as text | text with two decimals (for Companion's /custom-variable/…/value when it only accepts text) |
| Fixed text | the text in the field, as is (grandMA3 /gma3/cmd with Go+ Sequence 1; trigger only) |
| No value | a message with no argument (Eos /eos/key/go_0 means "press and release"; trigger only) |
Examples: for the opacity of a Resolume layer, value "Main › M bar", address /composition/layers/1/video/opacity, range 0–1, Float, on change. For an Eos submaster, /eos/sub/1, range 0–1, Float (for UDP on Eos enable String RX/TX in Setup › Show › Show Control and UDP Strings & OSC in the ECU; ports 8000/8001 or 4703–4727 are recommended). For a grandMA3 fader, /gma3/Page1/Fader201, range 0–100, integer. For a Companion variable, point the destination at Companion's IP:12321 and use /custom-variable/bpm/value (use "Number as text" to show it on a button; Float also works, but OSC floats are 32-bit, so 0.3561 shows up as 0.3560999929904938). Vertex registers addresses in an OSC Receiver Device and reads decimal values (turn off "Send everything" for Vertex; see 19.9).
When: "On change" (default) sends only when the mapped value differs from the last one sent, with no one-second re-send (so OtoMotion does not fight a fader the operator moved on the console). A receiver started later therefore gets nothing until the value changes (e.g. g1/on, BPM). "Every time" sends at the destination's rate. "Trigger" is 19.4. Do not point a destination at your own receiver (this PC's IP:8831); the values would come back to you.
Entering a value of the wrong shape turns that field red and nothing is saved; a line below names the destination, row and column, e.g. "The request was malformed (Added address row 2 › Address)". A destination's own fields (IP, port and so on) turn red the same way.
19.4 Trigger (fire a clip on the beat)
Sends only at the moment the chosen value rises from below 0.5 to 0.5 or more (beat, downbeat, tpover and so on). The edge is checked 60 times a second regardless of the destination's rate, so a rate of 10 or less does not miss beats.
The Trigger shape column only exists when the type is Float or Integer, and there are two choices:
| Trigger shape | Behaviour | Suits |
|---|---|---|
| 1 then 0 (default) | Sends the maximum at the edge and the minimum on the next tick (about 17 ms later) | Resolume …/clips/1/connect (1 then 0 acts as mouse-up), grandMA3 keys |
| 1 only | Sends only the maximum | Receivers that reset themselves |
Fixed text and No value are not trigger shapes — they are type choices (19.3), and a row using either shows "—" in the Trigger shape column. Both behave the same way: at the rising edge, OtoMotion sends that one message (the fixed text, or a message with no argument) and nothing afterwards — no 0 follows — which suits a "press and release" receiver such as Eos's /eos/key/go_0.
19.5 Destination status
| Shown | Meaning |
|---|---|
| Not sending (grey) | The checkbox is off |
| Sending N /s · M msg/s (green) | Packets leave this PC. "/s" is the number of send ticks (close to the configured rate; rates that do not divide 60, such as 7, wobble a little), "msg/s" the number of messages actually sent |
| Cannot send (nothing is listening there) (red) | For example the receiving app is not running on a PC in the same LAN. OtoMotion keeps sending, so the values arrive as soon as the app starts |
| Cannot send (reason) (red) | Socket error, broadcast not permitted and so on. The socket is recreated after one second |
While locked, the screen shows only the license page: OSC does not send, and received messages are not applied (only the fixed /otomotion/clear/… addresses still work while locked; see 19.7). Settings and assignments are kept, and everything works again once a license is loaded (the same as 18.8).
On a Mac (macOS 15 and later), sending to the LAN needs the "Local Network" permission. Allow it in the dialog shown the first time; if denied, the status reads "Cannot send (nothing is listening there) Allow OtoMotion in System Settings › Privacy & Security › Local Network".
19.6 Receiving: port and IP
In Settings › MIDI · OSC, tick Receive in the "Receive OSC" card. The default port is 8831 (it cannot be the monitor page's port; if the monitor page uses 8831, the first default becomes 8832). In the app, enter "This PC's IP" and the port (when several IPs are listed, pick the one on the same network as the device; a virtual adapter's IP may appear).
| Shown | Meaning |
|---|---|
| Not receiving (tick to receive) | Receive is off |
| Receiving (port N) | Listening on that port |
| Port N is in use by another app | That port is already used by another app; change the number. Once that app is closed and the port is free, untick and re-tick Receive to try the same port again (it is not retried automatically) |
| Cannot open the receiver (reason) | Any other error |
- On Windows, the first time you turn it on a firewall dialog appears. Tick both "Private networks" and "Public networks" and choose Allow. Venue networks are often treated as public by Windows; if only private is allowed, nothing arrives from an iPad or another PC (Companion on the same PC still gets through, so this is easy to miss). If you cancel, packets are silently dropped from then on. If nothing arrives, check the current network type (private or public) in Settings › Network & internet, and tick both boxes for OtoMotion in Windows Security › Firewall & network protection › Allow an app through firewall
- Accept only from (comma-separated IPv4) drops everything from other senders. Recommended during a show (OSC has no authentication). Add
127.0.0.1for Companion on the same PC - Do not point Resolume's or TouchDesigner's OSC output at this port (thousands of messages per second delay MIDI too; anything beyond 2048 queued messages is dropped and counted)
- "Last sender" shows the IP and seconds ago; use it to check whether anything arrives
- When any of them is non-zero, a count appears next to the status, e.g. "filtered 2 · dropped at limit 0 · malformed 1". Filtered is how many were rejected by "Accept only from", dropped at limit is how many were discarded past the 2048-message queue, and malformed is how many packets could not be read as an OSC message at all
While locked, the screen shows only the license page: OSC does not send, and received messages are not applied (only the fixed /otomotion/clear/… addresses still work while locked; see 19.7). Settings and assignments are kept, and everything works again once a license is loaded (the same as 18.8).
Only the first argument is used. Numbers, text and button presses from ordinary apps are read as expected (uncommon types are ignored). A "bundle" (several OSC messages sent together as one packet) is unpacked, and each message inside it is handled on its own. Addresses must match exactly, including case (patterns such as /otomotion/bpm/* are not expanded).
19.7 Fixed addresses (work without assigning)
While receiving is on, every row in Settings › MIDI · OSC shows its address (Copy copies it). Enter that address in the app and it works without assigning.
| Address | Argument | Action |
|---|---|---|
/otomotion/control/start, stop, reset | button | Start, stop, reset measuring |
/otomotion/bpm/tap, sync, double, half, adopt | button | TAP, sync, ×2, ÷2, adopt |
/otomotion/bpm | number 30–300 | BPM value (saved after one second) |
/otomotion/bpm/auto | 1 / 0 | Auto follow |
/otomotion/bpm/bpb | 2, 3, 4, 6 | Time signature |
/otomotion/bpm/source | 1 to the number of groups | Group used for detection |
/otomotion/set/g1/gain (g1–g8) | dB −40 to +40 | Group trim (live only; 18.4) |
/otomotion/set/g1/band | full, low, mid, high, or 1–4 | Band (live only). Vertex cannot send text, so use the number |
/otomotion/set/bars/lufs_lo and the other 7 | in its unit | Bar behaviour (live only) |
/otomotion/set/meter/target_lufs, tp_limit_dbtp, tpover_hold_s | in its unit | Target and TP (live only) |
/otomotion/set/beat/beat_pulse_ms, hit_decay_ms | ms | Beat length and decay (live only) |
/otomotion/set/test/kind, level_dbfs, freq_hz, kick_bpm | kind: sine, sweep, kick, pink, silence or 1–5; others in their unit | Test signal (live only) |
/otomotion/save/g1/gain etc. (same items as set/) | button | [Save this value]. "No live value to save or clear" if nothing is overridden |
/otomotion/clear/g1/gain etc. | button | [Clear] (works while locked too) |
/otomotion/calibrate/1 (1–8) | button | "Set as reference". Keep the sound steady for about 3 s first. Silence gives "No signal" |
/otomotion/preset | preset name (text, exact) | Load a venue preset (reopens the audio input; take care during a show) |
/otomotion/preset/number | number from 1 | The Nth preset in the list (numbers shift when presets are added or deleted) |
/otomotion/test/enabled | 1 / 0 | Test signal on/off (saved; reopens the audio input) |
/otomotion/auto_start | 1 / 0 | Start measuring at launch (saved) |
/otomotion/slot/1 (1–16) | 0–1 | Values sent to XPression as midi › s1–s16 |
Buttons count one press for no argument or a number of 0.5 or more (the 0 a TouchOSC button sends on release does nothing). 1 / 0 means on for 0.5 or more, off below (not a toggle). Numbers outside the range do nothing and "Last signal" shows the reason, e.g. "Out of range (30–300)". Sending text instead of a number, or a value that cannot be read as a number at all (such as a malformed decimal value), also shows "wrong argument type". Integer addresses accept decimal values such as 4.0. Text must match exactly (Low is not accepted). The effect is the same as moving the parameter by a MIDI assignment, including "Last signal" and the highlighted row.
19.8 Assigning (the same [Assign] as MIDI)
To use an app control of your own choosing (TouchOSC's /1/fader1 and so on) instead of a fixed address, assign it as in 18.1: press Assign on the row, move the control in the app, and the first address that arrives is assigned; the row gets a purple badge "OSC /1/fader1".
- The edit panel (click the row) gains an Input range (default 0–1; set it to 0–100 for senders like Vertex; the default stays 0–1 even if the Learn value was outside it; min and max cannot be equal — both fields turn red and nothing is saved) and a Source (any source / only this IP)
- Numbers are continuous (faders), no argument means "pressed", and numbers crossing 0.5 act as buttons. Text is used as a choice name only on band, test-signal type and time-signature rows
- A sender that streams continuously (TouchDesigner's OSC Out, Resolume feedback) will be the first address to arrive while waiting. Stop it or restrict "Accept only from"
/otomotion/…addresses are never assigned (they act as fixed addresses and the wait continues)
19.9 Examples
These combinations were checked with OtoMotion and the other app running on the same Windows 11 PC (October 2026; the app version is in brackets in each heading). If the apps run on different PCs, replace 127.0.0.1 with the IP of the other app's PC (when OtoMotion sends) or of the OtoMotion PC (when the other app sends).
Resolume (Arena 7.28): drive a layer's opacity with the level
- Resolume: in Arena › Preferences › OSC, turn on OSC Input and set Incoming Port to 7000
- OtoMotion: in Settings › Send OSC, add destination
127.0.0.1, port 7000, and tick Send - Add one row under Added addresses: value "(group name) › M bar", address
/composition/layers/1/video/opacity, range 0–1, type Float, send On change
Layer 1's Opacity follows the sound. To find a Resolume address, choose Shortcuts › Edit OSC and click the parameter; the address appears in the Shortcuts panel at the bottom right. Resolume's own Learn (remember the incoming address) is unreliable while "Send everything" streams 180 addresses, so sending straight to Resolume's address from OtoMotion, as above, is the recommended way. Preferences › OSC › Monitor shows the addresses and values that arrive.
Resolume: trigger a clip on the beat
Add one more row to the same destination: value "Beat › Beat", address /composition/layers/2/clips/1/connect, range 0–1, type Integer, send Trigger, trigger shape "1 then 0". The first clip of Layer 2 restarts on every beat (19.4). Check first that the BPM matches the music (chapter 16).
TouchDesigner: receive the values as channels
- OtoMotion: add destination
127.0.0.1, port 7000, and tick Send everything and Send. If you also need the text values, add a second destination on port 7001 - TouchDesigner: add an OSC In CHOP with Network Port 7000
- For the text values, add an OSC In DAT with Network Port 7001
The OSC In CHOP lists the numeric values (otomotion/g1/mbar, otomotion/beat/beat_phase and so on) as channels; pick what you need with a Select CHOP (Strip Name Prefix removes /otomotion). The text values (time, status, elapsed, group names, bands) are silently dropped by the OSC In CHOP (they do not become 0 or an error), so read them with the OSC In DAT. One port can be received by only one operator, so give the CHOP and the DAT different ports.
Bitfocus Companion (v5.0.7): show the BPM on a button
- Companion: in Settings › Protocols, turn on OSC Listener (port 12321). In Variables › Custom Variables, create a variable
bpm - OtoMotion: add destination
127.0.0.1, port 12321, untick Send everything and tick Send - Add one row under Added addresses: value "Beat › BPM", address
/custom-variable/bpm/value, range 30–300, type Number as text, send On change
The BPM goes into the Companion variable $(custom:bpm), which you can use in button text. If the range stays at the default 0–1, the BPM range 30–300 is scaled to 0–1 (to send the BPM as it is, set the range to the original 30–300). Float also works, but OSC floats are 32-bit and show extra digits.
Bitfocus Companion (v5.0.7): control OtoMotion from buttons
- OtoMotion: in Settings › MIDI · OSC › Receive OSC, tick Receive (port 8831). If you use "Accept only from", include
127.0.0.1 - Companion: in Connections, add Generic: OSC with Target Hostname or IP
127.0.0.1, Target Port 8831, Protocol UDP - Add actions like these to a button's Press actions
| Companion action | OSC Path | Value | What OtoMotion does |
|---|---|---|---|
| Send message without arguments | /otomotion/bpm/tap | — | TAP (press at a steady pace to change the BPM) |
| Send integer | /otomotion/bpm/bpb | 3 | Time signature 3/4 |
| Send string | /otomotion/set/g1/band | low | Group 1 band set to Low (live only) |
| Send message without arguments | /otomotion/control/start | — | Start measuring |
To check what arrived, look at "Last signal" at the top of Settings › MIDI · OSC (for example OSC 127.0.0.1 /otomotion/bpm/bpb 3 → Time signature: 3/4) and "Last sender" under Receive OSC. All addresses are listed in 19.7.
Ross Vertex (Trial 2026.02.23): drive a clip's opacity with the level
- Vertex: check that System1 under Project Explorer › Systems is connected (while it shows Disconnected, OSC devices neither receive nor send; connect it before use)
- Vertex: in Library › Devices, search for "OSC" and add an OSC Receiver Device. In the Inspector set IP Port to 8000 and enter
/vertex/opacityas the Address of Values › Osc Address 1 - OtoMotion: add a destination with the Vertex PC's IP and port 8000, untick Send everything and tick Send
- OtoMotion: add one row under Added addresses: value "(group name) › M bar", address
/vertex/opacity, range 0–1, type Float, send On change. When values arrive, they show in Received Value of Osc Address 1 in Vertex - Vertex: right-click the clip on the timeline › Pin to new Inspector › Clip to open an Inspector for that clip (it may open at the edge of the screen)
- Drag Opacity from that clip Inspector onto the Source field (the checkered field) of Osc Address 1 of the device
The clip's opacity now follows the sound. Note:
- Turn off "Send everything" for Vertex. Streaming everything (180 addresses, over 1,000 messages per second) to Vertex makes its receiver stop within a few seconds (Reset Connection brings it back, but it stops again). Send only the values you use, as added addresses
- One OSC Receiver Device holds 16 addresses (Osc Address 1–16). Add more devices for more
- What goes into Source is the property you want to drive (such as the clip's Opacity). Dropping the image file from Content only offers file information. While the blue pin (lock) of the Inspector is on, selecting the clip does not switch the Inspector to it
- The M bar (0.4 s) suits visuals; the S bar is a 3-second average and looks slow. If the movement is small, widen the range of the added address in OtoMotion, for example 0–2 (Vertex's Opacity tops out at 1). Small flicker settles with the clip's Opacity Damping at about 0.1–0.2
- Quiet sound keeps the bars at 0: below the range in Settings › Bars (default −35 to −3 LUFS) the bar is 0. Feed a proper level from the venue desk
Ross Vertex (Trial 2026.02.23): switch OtoMotion from Vertex
- OtoMotion: in Settings › MIDI · OSC, tick Receive (port 8831)
- Vertex: in Library › Devices, add an OSC Sender Device. In the Inspector enter the OtoMotion PC's IP as IP Address and 8831 as IP Port. Turn Use Message Prefix off (when on, text is added before the address and OtoMotion rejects it)
- In Project Explorer, right-click the Sender › Add Float Property, then enter
/otomotion/set/g1/bandas Address and2as Value
Group 1's band in OtoMotion switches to Low (1 = full range, 2 = low, 3 = mid, 4 = high). Vertex cannot send text, so use the numeric addresses for band, test signal type and presets (19.7). Put the value on the timeline or in a cue, and OtoMotion's measurement changes together with Vertex's show cues.
Other apps: setup guide
- TouchOSC: Connections › OSC, Host = this PC's IP, Send Port = 8831. To get values back, set a Receive Port and add "iPad IP:that port" as a destination in OtoMotion. Faders default to a decimal range of 0–1; buttons send 1 on press and 0 on release
- Lighting consoles: see the examples in 19.3 (an Eos submaster, a grandMA3 fader) and triggers in 19.4
19.10 What to expect during a show, and notes
- When measuring stops,
runningis 0 while M, S, bars and the beat keep flowing and I and LRA stop (as with XPression). Test-signal values are sent as they are - XPression and OSC are independent. If XPression disconnects, OSC keeps going (and vice versa)
osc.jsonis not part of venue presets. Values set throughset/are live overrides and are cleared when a preset is loaded (as with MIDI)- Around a save or at shutdown, a rare "Could not save" or "Shutting down" message can appear; wait a moment and try again
- IPv6, host names, TCP, sending bundles and OSCQuery are not supported
OtoMotion — dekobokotech.com