improvements on osc input

This commit is contained in:
2023-12-04 18:23:38 +01:00
parent cc963ac54f
commit e68ac4fcac
8 changed files with 164 additions and 116 deletions

33
ToposServer/OSCtoTopos.js Normal file
View File

@ -0,0 +1,33 @@
const WebSocket = require("ws");
const osc = require("osc");
const cleanIncomingOSC = (oscMsg) => {
let data = oscMsg.args;
// Remove information about type of data
data = data.map((item) => {
return item.value;
})
return {data: data, address: oscMsg.address};
}
// ==============================================
// Receiving and forwarding OSC UDP messages
// Create an osc.js UDP Port listening on port 57121.
console.log("> OSC Input: 127.0.0.1:30000");
const wss = new WebSocket.Server({ port: 3001 });
var udpPort = new osc.UDPPort({
localAddress: "0.0.0.0",
localPort: 30000,
metadata: true
});
udpPort.on("message", function (oscMsg, timeTag, info) {
console.log(`> Incoming OSC to ${oscMsg.address}:`, oscMsg.args.map(
(item) => {return item.value})
);
wss.clients.forEach(client => {
if (client.readyState === WebSocket.OPEN) {
client.send(JSON.stringify(cleanIncomingOSC(oscMsg)));
}
});
});
udpPort.open();

81
ToposServer/ToposToOSC.js Normal file
View File

@ -0,0 +1,81 @@
const WebSocket = require("ws");
const osc = require("osc");
// Listening to WebSocket messages
const wss = new WebSocket.Server({ port: 3000 });
// Setting up for message broadcasting
wss.on("connection", function (ws) {
console.log("> Client connected");
ws.on("message", function (data) {
try {
const message = JSON.parse(data);
sendOscMessage(
formatAndTypeMessage(message),
message.address,
message.port
);
console.log(`> Message sent to ${message.address}:${message.port}: ${JSON.stringify(message.args)}`)
} catch (error) {
console.error("> Error processing message:", error);
}
});
});
wss.on("error", function (error) {
console.error("> Server error:", error);
})
wss.on("close", function () {
// Close the websocket server
wss.close();
console.log("> Closing websocket server")
});
let udpPort = new osc.UDPPort({
localAddress: "0.0.0.0",
localPort: 3000,
metadata: true,
remoteAddress: "0.0.0.0",
remotePort: 57120,
});
udpPort.on("error", function (error) {
console.error("> UDP Port error:", error);
});
udpPort.on("ready", function () {
//console.log(`> UDP Receive: ${udpPort.options.localPort}`);
console.log("> WebSocket server: 127.0.0.1:3000");
});
udpPort.open();
function sendOscMessage(message, address, port) {
try {
udpPort.options.remotePort = port
message.address = address;
udpPort.send(message);
} catch (error) {
console.error("> Error sending OSC message:", error);
}
}
const formatAndTypeMessage = (message) => {
let newMessage = {};
delete message.args['address'];
delete message.args['port'];
newMessage.address = message.address;
newMessage.timestamp = osc.timeTag(message.timetag);
args = [...Object.entries(message.args)].flat().map((arg) => {
if (typeof arg === 'string')
return {type: 's', value: arg};
if (typeof arg === 'number')
return {type: 'f', value: arg};
if (typeof arg === 'boolean')
return value ? {type: 's', value: 1} : {type: 's', value: 0};
})
newMessage.args = args
return newMessage;
}

14
ToposServer/banner.js Normal file
View File

@ -0,0 +1,14 @@
var pjson = require('./package.json');
let banner = `
┏┳┓ ┏┓┏┓┏┓
┃ ┏┓┏┓┏┓┏ ┃┃┗┓┃
┻ ┗┛┣┛┗┛┛ ┗┛┗┛┗┛
${pjson.version}\n`
function greet() {
console.log(banner)
}
module.exports = {
greet: greet
}

View File

@ -1,114 +1,9 @@
const WebSocket = require("ws");
const osc = require("osc");
var pjson = require('./package.json');
let banner = `
┏┳┓ ┏┓┏┓┏┓
┃ ┏┓┏┓┏┓┏ ┃┃┗┓┃
┻ ┗┛┣┛┗┛┛ ┗┛┗┛┗┛
${pjson.version}\n`
require('./banner').greet();
// Topos to OSC
require('./ToposToOSC')
// OSC to Topos
require("./OSCtoTopos")
console.log(banner)
console.log("Listening to: ws://localhost:3000. Open Topos.\n");
// Listening to WebSocket messages
const wss = new WebSocket.Server({ port: 3000 });
// Sending WebSocket messages
const inputWss = new WebSocket.Server({ port: 3001 });
inputWss.on("connection", function (ws) {
inputWss.clients.forEach(function each(client) {
// Send message to all clients except sender
if (client !== ws && client.readyState === WebSocket.OPEN) {
client.send("New client connected");
}
})
});
// Setting up for message broadcasting
wss.on("connection", function (ws) {
console.log("> Client connected");
ws.on("message", function (data) {
try {
const message = JSON.parse(data);
sendOscMessage(
formatAndTypeMessage(message),
message.address,
message.port
);
console.log(`> Message sent to ${message.address}:${message.port}: ${JSON.stringify(message.args)}`)
} catch (error) {
console.error("> Error processing message:", error);
}
});
});
wss.on("error", function (error) {
console.error("> Server error:", error);
})
wss.on("close", function () {
// Close the websocket server
wss.close();
console.log("> Closing websocket server")
});
// Setting up for OSC messages
let udpPort = new osc.UDPPort({
localAddress: "0.0.0.0",
localPort: 3000,
metadata: true,
remoteAddress: "0.0.0.0",
remotePort: 57120,
});
udpPort.on("error", function (error) {
console.error("> UDP Port error:", error);
});
udpPort.on("ready", function () {
console.log(`> UDP Port opened on port ${udpPort.options.localPort}`);
});
udpPort.open();
function sendOscMessage(message, address, port) {
try {
udpPort.options.remotePort = port
message.address = address;
udpPort.send(message);
} catch (error) {
console.error("> Error sending OSC message:", error);
}
}
const formatAndTypeMessage = (message) => {
let newMessage = {};
delete message.args['address'];
delete message.args['port'];
newMessage.address = message.address;
newMessage.timestamp = osc.timeTag(message.timetag);
args = [...Object.entries(message.args)].flat().map((arg) => {
if (typeof arg === 'string')
return {type: 's', value: arg};
if (typeof arg === 'number')
return {type: 'f', value: arg};
if (typeof arg === 'boolean')
return value ? {type: 's', value: 1} : {type: 's', value: 0};
})
newMessage.args = args
return newMessage;
}
// console.log(formatAndTypeMessage({
// address: '/baba',
// port: 2000,
// args: { s: 'fhardkick', dur: 0.5, port: 2000, address: 'baba' },
// timetag: 1701696184583
// }))