Something went wrong. Try again.
Monorepo for Aesthetic.Computer aesthetic.computer
Something went wrong. Try again.
JavaScript
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879// AC WebSocket Audio Server for Max for Live// Receives audio samples via WebSocket and outputs to Max
const Max = require("max-api");const WebSocket = require("ws");
const PORT = 9999;let wss = null;let clientConnected = false;
// Start WebSocket serverfunction startServer() { if (wss) { Max.post("Server already running on port " + PORT); return; } wss = new WebSocket.Server({ port: PORT }); Max.post("๐๏ธ AC Audio WebSocket server started on port " + PORT); wss.on("connection", (ws) => { clientConnected = true; Max.post("๐๏ธ Client connected!"); Max.outlet("status", "connected"); ws.on("message", (data) => { try { const msg = JSON.parse(data); if (msg.type === "samples") { // Output samples to Max // Format: left samples, then right samples const numSamples = msg.left.length; Max.outlet("samples", numSamples, ...msg.left, ...msg.right); } else if (msg.type === "ping") { ws.send(JSON.stringify({ type: "pong" })); } } catch (e) { // Binary data or parse error } }); ws.on("close", () => { clientConnected = false; Max.post("๐๏ธ Client disconnected"); Max.outlet("status", "disconnected"); }); ws.on("error", (err) => { Max.post("๐๏ธ WebSocket error: " + err.message); }); }); wss.on("error", (err) => { Max.post("๐๏ธ Server error: " + err.message); if (err.code === "EADDRINUSE") { Max.post("๐๏ธ Port " + PORT + " is already in use!"); } });}
function stopServer() { if (wss) { wss.close(); wss = null; Max.post("๐๏ธ Server stopped"); }}
// Max handlersMax.addHandler("start", startServer);Max.addHandler("stop", stopServer);Max.addHandler("status", () => { Max.outlet("status", clientConnected ? "connected" : "disconnected");});
// Auto-startstartServer();