ここが Plugin → Web サーバ → AI の「物理層の接続点」になる。
panel.lua で組み上げた Request JSON を、Roblox Plugin から Web サーバへ安全に POST する HTTP 実装(OS レベルの通信層) を書き起こすね。
Roblox Plugin の HTTP は HttpService を使う。
ここでは OS 的に:
- 純粋関数で JSON を構築(すでに完成)
- 通信層は panel.lua の責務
- エラー処理は OS として明確に分離
- AI サーバは /generateSong を受け取る
- レスポンスは Playback JSON v1(Roblox 側で再生)
という構造で書く。
🌐 panel.lua – HTTP 実装(generateSong POST)
以下は panel.lua に追加する 通信層の正式コード。
🔧 1. HttpService の準備
local HttpService = game:GetService("HttpService")
🚀 2. generateSong を送信する関数(OS-level)
function Panel:sendGenerateSongRequest(requestJson)
local url = "https://your-server.com/generateSong" -- ★サーバ URL
local body = HttpService:JSONEncode(requestJson)
local headers = {
["Content-Type"] = "application/json",
["Accept"] = "application/json"
}
local response
local success, err = pcall(function()
response = HttpService:PostAsync(url, body, Enum.HttpContentType.ApplicationJson, false, headers)
end)
if not success then
warn("[Panel] HTTP Error:", err)
return nil
end
-- サーバから返ってくるのは Playback JSON v1
local decoded
local ok, decodeErr = pcall(function()
decoded = HttpService:JSONDecode(response)
end)
if not ok then
warn("[Panel] JSON Decode Error:", decodeErr)
return nil
end
return decoded
end
🎛️ 3. Generate ボタンに統合
panel.lua の generateBtn のクリック部分をこう書き換える:
generateBtn.MouseButton1Click:Connect(function()
if not self.selectedChunk then
warn("[Panel] No chunk selected.")
return
end
local request = self:buildRequestJSON()
print("[Panel] Sending Request JSON:")
print(request)
local playbackJson = self:sendGenerateSongRequest(request)
if playbackJson then
print("[Panel] Received Playback JSON:")
print(playbackJson)
-- Roblox 側の再生エンジンへ送る
IPC.Playback:Fire(playbackJson)
else
warn("[Panel] Failed to generate song.")
end
end)
🧠 4. OS 的に見た通信層の責務分離
✔ panel.lua は「通信 OS」
- UIState → Request JSON
- Request JSON → HTTP POST
- Playback JSON → Roblox 再生エンジンへ
✔ Web サーバは「AI OS」
- Request JSON → AI → Playback JSON
✔ Roblox は「物理層」
- Playback JSON → 音を鳴らす
この 3 層が完全に分離されている。
📡 5. サーバ側の期待フォーマット(確認用)
Plugin が送る JSON:
{
"version": "1.0",
"projectId": "123456",
"seed": 42,
"bpm": 128,
"lengthBeats": 144,
"style": "LoveDance",
"structure": {
"sections": [
{ "name": "Intro", "startBeat": 0, "lengthBeats": 16 },
{ "name": "A", "startBeat": 16, "lengthBeats": 32 }
]
},
"tracks": [
{
"role": "Lead",
"instrument": "SynthLead",
"enabled": true,
"mix": { "volume": -2.0, "pan": 0.0 }
}
]
}
サーバはこれを受けて:
- AI に渡す
- Playback JSON v1 を返す
Roblox 側は Playback JSON v1 をそのまま鳴らす。
🏛️ 6. OS 的まとめ
今回の HTTP 実装で、LoveDance OS の 5 層が完全に閉じた:
- UI(意図)
- PresetDefinition(意味)
- Structure JSON(構造)
- Request JSON(物理)
- Playback JSON(再生)
あなたの OS 設計思想が、
UI → AI → Roblox の 3 世界を貫通して一本の線になった。
🚀 次に進むなら…
次のステップは 2 つ:
A. Web サーバ側の /generateSong 実装(Flask or Node)を書く
(AI 呼び出し → Playback JSON 生成)
B. BritishMystery / NordicTwilight を v2 形式で定義して OS の一般性を検証する
どちらに進めたい?