Я знаю, что я иду на это довольно поздно, и это выглядит, как вы нашли другую библиотеку, которая работает для вас, но я подумал, что ответ может быть полезен для тех, кто сталкивается с этой проблемой. Я разработчик osc.js, оригинальной библиотеки, которую вы пытались использовать.
Во-первых, в качестве справочной информации, osc.js раскладывается на два разных слоя:
- с низким уровнем API, который обеспечивает функции для чтения и записи OSC сообщений и пакетов в/из типизированных массивов.
- Чем выше уровень, на основе события порта API, который предоставляет набор транспортных объектов для конкретных платформ, которые предлагают простой способ сделать двунаправленную связь по протоколам UDP, как, веб-сокеты и т.д.
В случае вашего примера кода вы пытались отправить сообщение OSC на свой объект UDPPort
до его готовности. Когда вы open()
a Port
, возможно, потребуется выполнить асинхронные операции, такие как открытие сокета и т. Д. В результате он запускает событие (точно названное ready
), когда порт настроен для использования. До ready
пожаров вы не сможете отправлять или получать пакеты OSC.
Таким образом, в случае исходного кода, он выглядит, как вы были в предположении, что эта линия была синхронной, и что вы могли бы назвать send()
сразу после этого:
oscUDP.open();
Вместо этого, вы просто нужно слушать для ready
перед попыткой отправить сообщение на Port
. Пример:
oscUDP.on("ready", function() {
oscUDP.send({
address: "/carrier/frequency",
args: 440
});
});
osc.js Node.js example иллюстрирует этот шаблон. Но когда я увидел ваш вопрос, я понял, что пример кода в osc.js README был немного неоднозначным в этом отношении. У меня есть improved the event documentation и the inline README sample code, чтобы быть более ясными в этом отношении. Извините за путаницу.
Есть случаи, возможно, такие как ваши, где API более высокого уровня не совсем то, что вам нужно. osc.js также предоставляет функции для легкого кодирования пакета OSC как Uint8Array
, которые могут быть преобразованы в буферы Node.js. Таким образом, вы могли бы сделать что-то похожее на свое решение, просто используя функцию osc.js 'osc.writeMessage()
. К счастью, он всегда был хорошо документирован. Вот ваш пример, модифицированный для использования низкоуровневого API osc.js':
const dgram = require('dgram');
const client = dgram.createSocket('udp4');
const osc = require('osc');
const HOST = '192.168.1.5';
const PORT = 8004;
process.on('SIGINT', function() {
client.close();
});
let oscNoteMessage = function(note, value) {
var message = osc.writeMessage({
address: '/note/' + note,
args: [
{
type: 'i',
value: value
}
]
});
return Buffer.from(message);
}
let noteOn = function(note) {
return oscNoteMessage(note, 1);
}
let noteOff = function(note) {
return oscNoteMessage(note, 0);
}
let send = function(message) {
client.send(message, PORT, HOST, function(err, bytes) {
if(err) throw new Error(err);
})
}
send(noteOn('c'));
setTimeout(function() {
send(noteOff('c'));
}, 1000);
Во всяком случае, я рад, что вы были в состоянии придумать решение, которое работает для вашего проекта, и я надеюсь, что этот ответ поможет другим пользователям, которые могут столкнуться с подобными проблемами. И, конечно, не стесняйтесь задавать вопросы или проблемы с файлом на osc.js issue tracker.
С уважением, и извинения за возникшую у вас проблемы с использованием библиотеки!