← PROJECTS
Music Driven Hospitality System

音楽が変わるたび、 今この瞬間の一杯 を差し替える。

DJ の楽曲変化を Pro DJ Link と OSC で受け取り、客側画面・店側画面・注文状態をひとつのランタイムに同期する。DJ Cocktail Engine は、静的メニューではなく、音楽イベントをトリガーにしてその場のカクテルを生成・提示するホスピタリティシステムである。

Category Installation
Tags Installation / DJ / Featured
Runtime Node.js / Express / SQLite / OSC / SSE

4 層をまたいで、DJ の変化を注文体験までつなぐ。

システムは Track Input、Recipe / Order Backend、Presentation、External Notification の 4 層で構成される。役割を分離しながら、現在曲と現在オーダーを単一の runtime state に集約する。

Layer 01

Track Input Layer

DJ 側システムから Pro DJ Link Bridge 経由で OSC を受信し、曲切り替え・補助メタデータ・atmosphere profile を区別して扱う。

  • `/pro-dj-link/trackChanged` はレシピ更新トリガー
  • `/pro-dj-link/currentTrack` は補助更新のみ
  • `/pro-dj-link/trackProfile` は mood の authoritative source
Layer 02

Recipe / Order Backend

Node.js + Express + SQLite の単一プロセスが、トラック状態・レシピ保存・注文進行・外部通知をまとめて管理する。

  • Recipe / Order / Runtime State / Track History を永続化
  • SSE で frontend を同期
  • OSC broadcast で外部システムに通知
Layer 03

Presentation Layer

客側・店側・管理画面の 3 つの Web UI と、URL を切り替えられる iOS wrapper が presentation を担う。

  • `/` は今表示すべき 1 杯だけを見せる guest view
  • `/method.html` はスタッフの調理・提供フロー管理
  • `/admin.html` はレシピ CRUD の管理画面
Layer 04

External Notification Layer

システム外部への連携は OSC broadcast で処理し、新規カクテル生成と注文発生を別イベントとして発火する。

  • `/cocktail/new` で生成・登録を通知
  • `/cocktail/order` で注文作成を通知
  • runtime state と外部通知の責務を分離

曲の変化が、そのまま UI とオーダーの状態遷移になる。

重要なのは、トラックイベントが単なる表示更新ではなく、レシピの差し替えとオーダー進行の起点になっていること。SSE の `state.changed` が、全フロントの同期単位になる。

Flow 01

Track Driven Recipe Update

曲が切り替わった瞬間に、新しい楽曲文脈へレシピを切り替えるための中心フロー。

  1. `trackChanged` を受信し、title / artist / bpm を確定する
  2. 直前の現在曲と比較し、同一曲なら何もしない
  3. 別曲なら、その曲に対応する新規レシピを生成して保存する
  4. `selectedRecipeId` を更新し、`state.changed` を配信する
Flow 02

Track Metadata Update

現在曲名・アーティスト・BPM の補助更新を担当し、レシピ変更は行わない。

  1. `/pro-dj-link/currentTrack` を受信する
  2. 現在曲名 / アーティスト / BPM を補助更新する
  3. レシピは据え置きのまま `state.changed` を配信する
Flow 03

Atmosphere Update

trackProfile の atmosphereSummary を、現在表示中トラックと一致する場合だけ mood として反映する。

  1. `analysis.hasAtmosphere = true` を確認する
  2. `analysis.atmosphere.atmosphereSummary` を取得する
  3. title / artist が一致した場合のみ guest UI の Mood を更新する
Flow 04

Ordering Flow

客側で注文された 1 件を、店側の進行管理と完了通知へ接続する。

  1. 客側画面から注文し、`Order.PENDING` を作る
  2. 店側画面で `IN_PROGRESS` から `DONE` へ進める
  3. 客側画面は完了通知を表示し、初期状態へ戻る

HTTP、SSE、OSC を分けて、責務を明確にする。

フロント同期は SSE、DJ 入力と外部通知は OSC、操作系 API は HTTP に分離している。単一の Node.js runtime がそれらを束ね、今フロントに見せるべき state を確定する。

HTTP

Recipe / Order API

レシピ CRUD、注文作成、進行更新、現在 state 取得に使う。

recipes orders app_state
SSE

Frontend Sync

双方向通信を持たずに、サーバ主導で state.changed を配信する。

event: state.changed target: guest / method / admin
OSC Input

DJ Track Events

DJ システムの曲変化を受ける入口。既定の受信ポートは 29001。

osc.receivePort 29001
OSC Output

External Notification

新規カクテルと注文発生を broadcast で外部システムへ通知する。

osc.broadcastAddress 255.255.255.255:29000

仮置き実装から、本来の設計へ戻すための差分が明確にある。

現状は曲変化で既存レシピをランダム選択しているが、設計上は trackChanged を受けてその曲専用のレシピを生成し、selectedRecipe を差し替えるべきである。

Current

Temporary Behavior

`trackChanged` 時の本来の recipe generation が未接続のため、既存の有効レシピ群からランダム選択する暫定処理が入っている。

random fallback music context is partial recipe identity is unstable
Target

Intended Behavior

trackChanged を受けたら曲情報を正規化し、その曲に対応する新規レシピ生成を実行して保存し、selectedRecipeId を新しい 1 杯へ向ける。

track normalized recipe generated per song runtime state stays canonical

これはメニューではなく、音楽イベント駆動の提示システムである。

Track event は表示更新のトリガーであり、Recipe はその時点の音楽文脈に従って更新される。客画面は「一覧」ではなく「今この瞬間の一杯」を見せ、店側画面は「今作るべきもの」を見せる。

Design Principle

Runtime State Is The Product

selectedRecipe、currentTrack、activeOrder を単一の state として束ねることで、客側・店側・外部通知の全てが同期する。個別画面の装飾より、state の一貫性が体験を決める。

  • 同時注文は 1 件
  • 認証や決済は扱わない
  • 店側操作は明示確認付き
Navigate

Back To Projects

この公開ページはシステム概要に特化している。実装や運用の追加資料が必要な場合は、project listing から関連プロジェクトへ戻って参照する。

Return To Installation Projects