CONNECT · 既存のシステムに繋ぐ

今あるものを、そのまま使う。

SOLUNA Sound は会場の音響を置き換えない。卓から1本もらい、制御卓の cue を聞き、灯体に同じ時計を渡す。ディレイタワーを1台足すのと同じ感覚で。

下の3問に答えると、あなたの現場に当たるカードだけが光る。

音源はどこから?
cue は何から打つ?
灯体・スクリーンは?

音を入れる audio in

01既存PAに足す — 卓の aux を1本

いちばん普通の現場。ディレイタワーに送るのと同じ matrix/aux を、スマホと Pi スピーカーに送る。

卓matrix / aux out
→
USB I/Fオーディオインターフェース
→
FOH ノートPCsource.py --input + server.py
→
出口スマホ / Pi スピーカー(位相そろい)

必要なもの

  • 卓の空き aux か matrix 1系統(モノで十分)
  • USB オーディオインターフェース(入力1ch)
  • FOH の Mac/Linux ノート(サーバ兼)と会場LAN

手順

  1. ノートでサーバを起動、/admin を開く
  2. 入力デバイス名を確認して source.py --input を起動(--lead 0.08)
  3. ステージからの距離で ゾーン を作る(m を入れれば遅延は自動)
  4. クリックを流し、ALIGN の ±ms でフラム(二重打ち)が消えるまで追い込む
  5. Pi スピーカーを置き、スマホは旗の QR から参加
# FOH laptop
SOLUNA_ADMIN=<secret> PORT=8900 python3 server.py
python3 -c "import sounddevice;print(sounddevice.query_devices())"   # find the interface
python3 source.py --input "Scarlett 2i2" --lead 0.08 --server ws://127.0.0.1:8900 --ch festival
遅延の中身: 取り込み+送出 ≈10ms、ネットワーク+lead 80ms、端末の出力遅延 10〜30ms(端末が自己申告して差し引く)。そこにゾーンごとの「距離÷343 + 15ms」が乗る。同期精度は LAN で ±1〜3ms、LTE で ±10〜20ms。

02Dante

Dante の独自プロトコルは受けない(ライセンス品)。代わりに3つの入口がある。多くの Dante 機器(2016年以降)は AES67 モードを持つ。

Dante卓 / ステージボックス
→
3つの入口(a) DVS (b) AVIO USB (c) AES67 モード
→
FOH ノートPC--input / --aes67
→
出口スマホ / Pi スピーカー

必要なもの

  • (a) FOH の Mac に Dante Virtual Soundcard
  • (b) または Dante AVIO USB アダプタ
  • (c) または Dante Controller で送信側の AES67 を有効化できる権限

手順 (c) AES67 モード

  1. Dante Controller: 送信機器で AES67 を ON、送りたい ch(例: Matrix 7/8)の AES67 マルチキャストフローを作る
  2. 同じ LAN のノートで --sap: 流れているストリームが名前付きで一覧に出る
  3. --aes67 auto(1本なら)か名前の一部で選ぶ
  4. 以降は 01 と同じ: ゾーン → ALIGN
# (a) DVS / (b) AVIO — just an input device
python3 source.py --input "Dante Virtual Soundcard" --lead 0.08
# (c) AES67 mode — no Dante license, no Dante software
python3 source.py --sap                          # list announced streams
python3 source.py --aes67 auto --lead 0.08       # or --aes67 "Stagebox" / --aes67 239.69.x.x:5004
注意: AES67 は 48kHz のみ(96kHz フローは拒否)。受信専用(SOLUNA から Dante へは送らない)。PTP は不要(SOLUNA の時計はサーバ自身)。実機の Dante 機器では未検証 — 合成 AES67 送信機で end-to-end 検証済み。

03AES67 / Ravenna

Lawo・Merging・Genelec・Neumann など放送系。SAP で告知されているマルチキャストにそのまま乗る。

AES67RTP マルチキャスト L24/L16 48kHz
→
SAP239.255.255.255:9875
→
FOH ノートPC--aes67 --map
→
出口スマホ / Pi スピーカー

必要なもの

  • ノートが AES67 の VLAN にいること(IGMP が通るスイッチ)
  • 複数 NIC なら受信する NIC の IP(--iface)

手順

  1. --sap で一覧(名前・アドレス・ch数・形式)
  2. アドレス直指定か名前の一部で受信開始
  3. 8ch ストリームなら --map で L/R/C を選ぶ(+ は平均=モノ)
  4. 01 と同じくゾーン → ALIGN
python3 source.py --sap --sap-seconds 6
python3 source.py --aes67 239.69.10.2:5004 --map "L=3,R=4,C=3+4" --iface 192.168.10.5 --lead 0.08
# --aes67-fmt L16 / --aes67-ch 8  when the sender has no SAP
パケット落ち: RTP タイムスタンプで数えるので、抜けた分は正確に無音で埋め、遅着・重複は捨てる。位相は滑らない(10%ロスで検証)。0.5秒超の穴はストリーム再開扱い。

04MADI / AVB / アナログ / AES3 / USB

OS が入力デバイスとして見えるものは全部そのまま。Mac は AVB エンティティを標準で持つ(Thunderbolt/USB-C Ethernet)。

何でもMADI / AVB / アナログ / AES3
→
I/FOS に入力として見える機器
→
FOH ノートPCsource.py --input
→
出口スマホ / Pi スピーカー

必要なもの

  • その規格を受けるインターフェース(MADI カード、AVB 対応 Mac、アナログ I/F…)

手順

  1. デバイス一覧で名前を確認
  2. --input "名前" で起動、8ch 以上なら --map
  3. ゾーン → ALIGN
python3 -c "import sounddevice;print(sounddevice.query_devices())"
python3 source.py --input "RME MADIface" --map "L=1,R=2,C=1+2" --lead 0.08
# playback-only stage? no live feed needed:
python3 source.py --file show.wav          # or pre-distribute as a CUE (no streaming at all)
ファイル再生だけの現場は LIVE を使わず CUE で配る方が強い(帯域ゼロ・途中参加も位相そろい)。/admin でアップロード → PRELOAD → FIRE。

制御をもらう show control in

05照明卓・再生卓から cue を打つ — OSC

QLab / Ableton / grandMA / Eos が UDP で送る OSC を、SOLUNA が聞く。HTTP API と同じ内部処理なので、/admin の FIRE と挙動は同一。

制御卓QLab · grandMA · Eos · Ableton
→
OSC / UDPSOLUNA_OSC_PORT=9000
→
SOLUNA サーバ/soluna/cue /soluna/go …
→
出口スマホ / Pi スピーカー

必要なもの

  • 卓とサーバが同じ制御系 LAN(VLAN)にいること
  • サーバ起動時に SOLUNA_OSC_PORT(既定 OFF)
  • バンドルの timetag で打つなら卓とサーバの NTP

手順

  1. サーバを SOLUNA_OSC_PORT=9000 で起動
  2. 卓の OSC 出力先にサーバ IP:9000 を登録
  3. 開演前ブロックに /soluna/preload、GO に /soluna/cue か /soluna/go
  4. Wi-Fi のスマホがいるなら lead は 2秒以上(有線 Pi だけなら 0.5秒で足りる)
アドレス引数同じ意味の HTTP
/soluna/cueurl:s [lead:f] [gain:f]POST /api/cue
/soluna/preloadurl:sPOST /api/cue {preload}
/soluna/stop—POST /api/cue {stop}
/soluna/go—POST /api/show {next} (セットリスト次へ)
/soluna/show/gotoi:iPOST /api/show {goto}
/soluna/lightpattern:s [c1:s] [c2:s] [bpm:f]POST /api/light
/soluna/light/stop—POST /api/light {stop}
/soluna/alignms:fPOST /api/align
/soluna/zonename:s delay_ms:fPOST /api/zones
/soluna/tc"HH:MM:SS:FF":s [fps:f]POST /api/timecode
# QLab 5: Network cue → OSC, destination <server ip>:9000
/soluna/preload "/assets/open.mp3"
/soluna/cue "/assets/open.mp3" 3.0 1.0
/soluna/light "wave" "#d4af37" "#7fc9a2" 96.0
# grandMA3 macro
SendOSC "/soluna/light" "pulse" "#ff2a00" "#0a0a40" 128
# ETC Eos: Show Control → OSC TX → cue External Links
/soluna/cue "/assets/drop.mp3" 2.0
# another channel: append "ch=stage2"
おすすめの分担: 光は卓が主(SOLUNA は Art-Net で追従、または卓が OSC でスマホ演出を叩く)。OSC に認証は無い=制御系 VLAN 専用。クラウド版では無効。

06タイムコードに乗せる

「今この瞬間の番組 TC は X」を一度教えると、以降の cue とセットリストは tc で発火時刻を書ける。再生卓の空き出力の LTC からでも。

再生卓LTC 出力 / OSC / HTTP
→
アンカーltc.py · /soluna/tc · /api/timecode
→
SOLUNA サーバcue {tc:"01:00:10:00"}
→
出口スマホ / Pi スピーカー

必要なもの

  • LTC なら: 再生卓の LTC 出力 → FOH Mac/Pi の空き音声入力
  • OSC なら: 卓から毎秒 /soluna/tc
  • 対応レート 24 / 25 / 30 / 29.97DF / 59.94DF / 23.976

手順

  1. ltc.py --list で入力を探し、--device N で起動(毎秒アンカーを POST)
  2. GET /api/timecode の推定 TC と卓の表示を目で合わせる
  3. cue / セットリストの各ステップに tc を書く
  4. 入力バッファ分(10〜20ms 一定)を /api/align で一度だけ追い込む
python3 ltc.py --list
python3 ltc.py --device 3 --channel 0 --server http://192.168.1.10:8900 --token "$SOLUNA_ADMIN" --ch festival
# or anchor by hand / from the console
curl -X POST http://192.168.1.10:8900/api/timecode -H "x-soluna-admin: $SOLUNA_ADMIN" -d '{"tc":"01:00:00:00","fps":30}'
curl -X POST http://192.168.1.10:8900/api/cue -H "x-soluna-admin: $SOLUNA_ADMIN" -d '{"url":"/assets/a.mp3","tc":"01:00:10:00"}'
ドロップフレームは SMPTE 12M どおり(毎分2フレーム落とし、10分毎は落とさない)。ltc.py はレベル変化・DC・ノイズに耐え、24/25/30/29.97DF でラウンドトリップ検証済み。実機の LTC 源では未検証。

出口を増やす more outputs

07会場の灯体を同期 — Art-Net / sACN

進行中のライトパターンを 40Hz で DMX に落として灯体へ。灯体 i の位置は会場横断 0..1 — スマホの海と同じ向き・同じ速さで wave が渡る。

SOLUNA サーバパターン + 時計
→
Art-Net / sACNUDP 6454 / 5568
→
ノードDMX ノード / 卓のマージ
→
灯体RGB 連番パッチ

必要なもの

  • Art-Net か sACN の DMX ノード(または対応卓)と同じ LAN
  • RGB 灯体 N 台を連番でパッチ(開始 ch は変更可)

手順

  1. サーバを SOLUNA_ARTNET=<ip>[:universe] か SOLUNA_SACN= 付きで起動
  2. SOLUNA_DMX_FIXTURES(既定 8)と SOLUNA_DMX_START(既定 1)を合わせる
  3. /admin でライトを走らせる → 灯体が追従。停止で消灯1回送って沈黙
SOLUNA_ARTNET=192.168.1.255:0 SOLUNA_DMX_FIXTURES=12 python3 server.py    # broadcast, universe 0
SOLUNA_SACN=239.255.0.1:1 python3 server.py                               # E1.31 multicast, universe 1
卓と同じユニバースを共有するなら: sACN は優先度(SOLUNA は 100)で卓が勝つように、Art-Net はノードの HTP/LTP マージか別ユニバース。audio パターンは端末側解析が要るので DMX では pulse に落ちる。strobe は 3Hz 上限のまま。

08プロジェクター / LED ウォール

MacBook + HDMI が、同じ時計に乗ったステージスクリーンになる。

SOLUNA サーバ映像 cue(url + at)
→
MacBook/screen
→
HDMIプロジェクター / LED プロセッサ

必要なもの

  • HDMI 出力のあるノート1台、会場 LAN
  • 映像は mp4、音は別に mp3(完璧な同期が要る本編は「音=mp3 / 映像=mp4 ミュート」の2ファイル構成)

手順

  1. ノートで http://<server>:8900/screen を開いて1クリック(UI が消え、全画面)
  2. /admin の VIDEO URL に mp4、AUDIO URL に mp3 → PRELOAD → FIRE
  3. ドリフトは時計に対して自動補正(>0.5s はシーク、それ以下は ±6% の再生速度)
実測: 再生ズレ 23ms、ループ途中参加 2ms。音声 cue 併用時は映像側が自動でミュート(音は WebAudio が正)。

09Pi スピーカーを会場 LAN に

FOH のノートがサーバなら、Pi の箱は「見つけたサーバに従う」だけ。有線が最良。

サーバFOH ノート or Pi box
→
LANPoE スイッチ(有線推奨)
→
Pi box ×NSERVER=auto / SERVER=ws://…
→
出口DAC → アンプ → スピーカー(±0.5〜3ms)

必要なもの

  • Raspberry Pi 4 + USB か I2S の DAC + アンプ/スピーカー
  • 小さな PoE スイッチと LAN ケーブル(Wi-Fi でも動くが有線が ±1〜3ms)

手順

  1. tools/pi-flash.sh で SD を焼く(設定不要)、電源を入れる
  2. 自動: サーバを見つけて従う。FOH ノートが必ず親なら SERVER=ws://<ip>:8900 で固定(PINNED)
  3. /admin → NODES で箱にゾーン・L/C/R・ゲインを ASSIGN(箱に保存、再接続で再送)
  4. 箱の細かい設定は http://<箱名>.local:8900/setup
# flash (zero-config; joins whatever server it finds)
tools/pi-flash.sh raspios.img /dev/disk4 HOSTNAME=soluna-box-1
# or install on a running Pi and pin it to the FOH laptop
curl -fsSL https://raw.githubusercontent.com/yukihamada/soluna-surround/master/tools/pi-setup.sh | SERVER=ws://192.168.1.10:8900 ZONE=B bash
サーバの箱が死んだら: 残りの箱が 15〜20秒で引き継ぐ(ゾーン・cue・ライト・セットリスト位置を再配信)。LIVE の PCM だけは送出側(source.py)の再接続が要る(.local 名で起動していれば自動)。

正直な注記 honest note

ここに書いた接続は、コード・テスト・合成信号(AES67 送信機、OSC、LTC 生成、Art-Net 受信ソケット)で end-to-end に検証している。実機の Dante 機器、LTC 源、照明卓、DMX ノード・灯体にはまだ繋いでいない。最初の実機は必ずクリックで ALIGN を追い込み、余裕のある lead で始めること。

詳細: docs/integration.md · docs/show-control.md · docs/pi-box.md · README