Cartwall

A soundboard-style grid for instant audio triggering. Assign audio files to buttons and fire them with a click, keyboard, OSC, or DMX.

🌐 Web UI

Cartwall Overview

The cartwall displays a grid of cart buttons. Each cart can hold one audio file and has its own trigger behavior.

Assigning Audio to a Cart

  1. Click an empty cart slot (or right-click to replace)
  2. Select an audio file from your library
  3. Configure cart settings:
    • Name — Display name on the button
    • Color — Button color for organization
    • Trigger Mode — Play, Toggle, or Hold

Trigger Modes

ModeBehavior
PlayClick starts playback. Click again restarts from beginning.
ToggleClick plays, click again stops.
HoldPlays while held, stops on release.
One-ShotPlays to completion, ignores clicks during playback.

Keyboard Shortcuts

Carts can be triggered via keyboard. Assign keys in cart settings:

  • Number keys 1-9, 0
  • Letter keys A-Z
  • Function keys F1-F12

Pages

Organize carts into pages. Switch pages with tabs at the top or via API/OSC.

⌨️ CLI

List Carts

bpsoundscape cart list

Trigger a Cart

# By position (page 1, slot 5)
bpsoundscape cart trigger --page 1 --slot 5

# By ID
bpsoundscape cart trigger --id cart_abc123

Assign Audio to Cart

bpsoundscape cart assign --page 1 --slot 5 --file "thunder.wav" --mode toggle

Options

OptionDescription
--pagePage number (1-based)
--slotSlot number (1-based)
--idCart ID
--fileAudio file path or library ID
--modeplay, toggle, hold, oneshot
--colorButton color (hex or name)

Stop a Cart

bpsoundscape cart stop --page 1 --slot 5

Stop All Carts

bpsoundscape cart stopall

🔌 HTTP API

Endpoints

MethodEndpointDescription
GET/api/v1/cartsList all carts
GET/api/v1/carts/:idGet cart details
POST/api/v1/carts/:id/triggerTrigger a cart
POST/api/v1/carts/:id/stopStop a cart
POST/api/v1/carts/stopallStop all carts
PUT/api/v1/carts/:idUpdate cart settings

Trigger by Position

curl -X POST "http://localhost:8513/api/v1/carts/trigger?page=1&slot=5"

Trigger by ID

curl -X POST http://localhost:8513/api/v1/carts/cart_abc123/trigger

Assign Audio

curl -X PUT http://localhost:8513/api/v1/carts/cart_abc123 \
  -H "Content-Type: application/json" \
  -d '{
    "audioFileId": "file_xyz789",
    "name": "Thunder",
    "mode": "toggle",
    "color": "#f59e0b"
  }'

Get Cart Status

curl http://localhost:8513/api/v1/carts/cart_abc123

Response:

{
  "id": "cart_abc123",
  "name": "Thunder",
  "page": 1,
  "slot": 5,
  "mode": "toggle",
  "state": "playing",
  "position": 1.5,
  "duration": 8.2,
  "color": "#f59e0b"
}

📡 OSC

Default OSC port: 8514

Trigger Controls

AddressArgsDescription
/bpsoundscape/cart/{page}/{slot}/triggernoneTrigger cart
/bpsoundscape/cart/{page}/{slot}/stopnoneStop cart
/bpsoundscape/cart/{page}/{slot}/volumefloat (0-1)Set volume
/bpsoundscape/carts/stopallnoneStop all carts
/bpsoundscape/pageintSwitch page

Examples

# Trigger cart at page 1, slot 5
oscsend localhost 8514 /bpsoundscape/cart/1/5/trigger

# Stop that cart
oscsend localhost 8514 /bpsoundscape/cart/1/5/stop

# Set cart volume to 50%
oscsend localhost 8514 /bpsoundscape/cart/1/5/volume f 0.5

# Stop all carts (panic button!)
oscsend localhost 8514 /bpsoundscape/carts/stopall

# Switch to page 2
oscsend localhost 8514 /bpsoundscape/page i 2

QLab Integration

Create Network cues in QLab to trigger carts:

Destination: [BPSoundscape IP]:8514
Message Type: OSC

Thunder:       /bpsoundscape/cart/1/5/trigger
Rain Loop:     /bpsoundscape/cart/1/6/trigger
Stop All:      /bpsoundscape/carts/stopall

Companion Button

In Bitfocus Companion, add an OSC action:

  • Instance: Generic OSC
  • Path: /bpsoundscape/cart/1/5/trigger
  • Args: (none)