Oscgard

A norns mod that creates virtual grid and arc devices over OSC

Getting started

  1. Install the mod

    • via maiden
      ;install https://github.com/sasha-ilatovskii/oscgard
    • git clone to dust
      cd ~/dust/code && git clone https://github.com/sasha-ilatovskii/oscgard
    • download zip and extract to dust/code
  2. Enable it in SYSTEM > MODS and restart the norns
  3. Get and run a client app

    You need an OSC app that implements the oscgard/serialosc device protocol.
    See compatible clients below.

  4. Discover devices

    Open the oscgard mod menu on norns (SYSTEM > MODS > OSCGARD).
    It will scan your network for OSC devices.

  5. Assign virtual device to a port

    Choose grid or arc, and vport to use (1-4) and pick the discovered device from the list.

  6. Patch your script

    Add the include line at the top of your script to route API calls through oscgard

    • for grid
      local grid = include("oscgard/lib/grid")
    • for arc
      local arc = include("oscgard/lib/arc")

  7. You're good and have the emulated device up and running!
BUILD your own
client app
OR GET
the full-featured
TouchOSC project SVG image

SerialOSC protocol compliant

The mod speaks the standard serialosc OSC protocol — the same protocol real monome devices use.

Any client that implements the serialosc device spec can connect. On top of this, oscgard adds an optimized bulk transfer mode for high-performance updates over WiFi.

Zero-effort connect

Oscgard uses zeroconf (avahi-browse) to find OSC client devices on your network. Discovered devices appear in the mod menu, where you assign them to ports just like plugging in real hardware.

Both GRID and ARC supported

Oscgard emulates two types of monome hardware. Each is a distinct virtual device with its own protocol, API, and port assignment.

Up to 4 virtual devices can be connected simultaneously across both types — for example, 2 grids and 2 arcs, or any other combination.

Virtual device

Grid

The monome grid is a minimalist instrument — a matrix of backlit silicone buttons with no labels, no velocity, just press/release and 16 levels of LED brightness.

Oscgard virtualizes the full spec: key input, LED feedback, all three editions, hardware rotation, and tilt sensors.

  • Editions64 / 128 / 256
  • Device inputButtons + Sensors
  • LED feedback16 brightness levels
  • Rotation0 / 90 / 180 / 270
Virtual device

Arc

The monome arc is a set of high-resolution optical encoders, each ringed by 64 individually addressable LEDs. Designed for continuous control — filters, sequences, waveforms.

Oscgard virtualizes encoder delta input and per-LED ring feedback for both editions.

  • Editions2 / 4 encoders
  • Device inputEncoders + Push-buttons
  • LED feedback64 LEDs per ring
  • Ring modesAll / map / range

How it works

The mod registers as a norns system hook, intercepting OSC traffic. When a client connects, oscgard creates a virtual device that looks exactly like real monome hardware to any norns script.

LED updates from scripts are packed into efficient bulk messages and sent to the client.

Button presses and encoder turns from the client are transformed and delivered to the script’s callbacks.

Your device
OSC client
osc messages
norns mod
OSCgard
grid / arc API
NORNS
Running script

Built for WiFi

One message per refresh. 128x fewer packets than other emulators.
Any rate, no tearing.

Metric Others oscgard
Messages for full refresh up to 128 1
Bytes for full refresh ~2,560 ~140
Atomicity Sequential Atomic
Refresh rate - Adjust to your network

Drop-in API

Oscgard provides drop-in replacements for the norns grid and arc modules. The API is identical to real hardware.

-- Example script for Grid emulation
local grid = include("oscgard/lib/grid")
-- or with hardware fallback
-- local grid = util.file_exists(_path.code.."oscgard") and include("oscgard/lib/grid") or grid
local g = grid.connect()

g.key = function(x, y, z)
  g:led(x, y, z * 15)
  g:refresh()
end
-- Example script for Arc emulation
local arc = include("oscgard/lib/arc")
-- or with hardware fallback
-- local arc = util.file_exists(_path.code.."oscgard") and include("oscgard/lib/arc") or arc
local a = arc.connect()
local pos = {}
a.delta = function(n, d)
  -- light up ring led based on rotation
  if pos[n] == nil then
    pos[n] = 0
  end
  pos[n] = (pos[n] + d) % 64
  a:led(n, pos, 15)
  a:refresh()
end

One more thing...

THE MOST POWERFUL TOUCHOSC PROJECT
FOR EMULATING MONOME CONTROLLERS
Ready to play

TouchOSC template

Polished grid and arc emulator project for TouchOSC.

  • Configurable sizes and layouts
  • Tilt sensors support
  • Optimized performance
  • And the best part — it works out of the box!

Get on Gumroad

Support the project

Oscgard is free and open source.

If it saved you from buying hardware or just made your norns setup more fun, consider saying thanks.

Donate

Buy me a coffee, fund a feature, or just show some love.

Donate

Follow along

Updates, demos, and behind-the-scenes stuff.