Sonic PiにOSC制御のインターフェースがMIDIと一緒に併記されていて、OSCって何のことと思いましたが、Open Sound Controlの略でUDP(速度大事だろうから)で送られる定義された制御インターフェースです
例えばSonic Pi側で以下のように待ち受けしておいて、
live_loop :osc_trigger do
use_real_time
note = sync "/osc:127.0.0.1:8001/trigger/synth"
synth :prophet, note: note[0], release: 1.0
end
Node.jsから以下のようなコードでA~Kのキーを叩いで電文を送信すれば、Sonic Piで一オクターブ(半音なし)の合成をします、値はMIDIに相当する値ですが他のルールに則っても良いらしい
同じパソコンからなのでループバックアドレスになってますが、これは無論ネットワーク次第、ポートの4560は固定になってます
// original https://qiita.com/youtoy/items/a158b847b142f0a134a6
//
const osc = require("osc");
const keypress = require("keypress");
var udpPort = new osc.UDPPort({
localAddress: "0.0.0.0",
localPort: 8001,
remoteAddress: "127.0.0.1",
remotePort: 4560,
metadata: true,
});
udpPort.on("message", function (oscMsg, timeTag, info) {
console.log("An OSC message just arrived!", oscMsg);
console.log("Remote info is: ", info);
});
udpPort.on("ready", function () {
console.log("ready");
keypress(process.stdin);
process.stdin.on("keypress", (ch, key) => {
if ((key && key.ctrl && key.name === "c") || (key && key.name === "q")) {
process.exit();
}
switch (key.name) {
case "a":
sendValue(60, key.name);
break;
case "s":
sendValue(62, key.name);
break;
case "d":
sendValue(64, key.name);
break;
case "f":
sendValue(65, key.name);
break;
case "g":
sendValue(67, key.name);
break;
case "h":
sendValue(69, key.name);
break;
case "j":
sendValue(71, key.name);
break;
case "k":
sendValue(72, key.name);
break;
default:
break;
}
});
process.stdin.setRawMode(true);
process.stdin.resume();
});
function sendValue(inputValue, inputText) {
udpPort.send({
address: "/trigger/synth",
args: [
{
type: "f",
value: inputValue,
},
],
});
console.log(`key.name: ${inputText}`);
}
udpPort.open();
キーボードは演奏家にとって大事だろうから、シンセサイザーとは別に色々なデバイスが選択できるのは良さそうです、MIDIとは共存する立ち位置のようですが
admi