今回の内容は、以下の記事の続きです。
●Sonic Pi による音の出力を Node.js のプログラム(osc.js を利用)から制御: OSC over UDP による通信 - Qiita
https://qiita.com/youtoy/items/a158b847b142f0a134a6
この記事では、Node.js のプログラムでキーの押下を検知し、それに応じた OSC通信と音の出力を行っていました。
今回は「音の高さと音を鳴らすタイミング」をプログラムで発生させた乱数で決めて、音を奏でてみます。
構成
構成は前回の記事の内容と同じで、以下の通りです。
詳細については、これ以降についても前回の記事の内容を参照してください。
- 送信側
- Node.js のプログラム
- ライブラリ: osc.js
- Node.js のプログラム
- 受信側
- Sonic Pi
プログラムの内容
Sonic Pi側
Sonic Pi側のプログラムは、前回の記事で作ったものに、少しだけ手を加えています。
具体的には、同時に受けとる数値を 2つに増やし、その後に鳴らす音を指定する部分も 2つの音が同時に鳴るような形にしています。
live_loop :trigger do
use_real_time
n1, n2 = sync "/osc*/trigger/synth"
play n1
play n2
end
Node.js側
Node.js側のプログラムは以下のとおりです。
const osc = require("osc");
var udpPort = new osc.UDPPort({
localAddress: "0.0.0.0",
remoteAddress: "0.0.0.0",
remotePort: 4560,
metadata: true,
});
udpPort.on("ready", function () {
console.log("ready");
setTimeout(sendValue, 500);
});
function sendValue() {
const note1 = Math.floor(Math.random() * (100-60) + 60);
const note2 = Math.floor(Math.random() * (100-60) + 60);
const time = Math.floor(Math.random() * (800-100) + 100);
udpPort.send({
address: "/trigger/synth",
args: [
{
type: "f",
value: note1,
},
{
type: "f",
value: note2,
},
],
});
console.log(`note: ${note1}, ${note2} / time: ${time}`);
setTimeout(sendValue, time);
}
udpPort.open();
鳴らす音と、音を鳴らすタイミングの部分で乱数を使っています。
前者は「60 から 100」の値をとるようにし、後者については「100から800」の値をとるようにしました。
音が鳴っている様子
今回の内容を試した時の様子は、以下のとおりです。
Sonic Pi と Node.js のプログラムの連携(OSC通信を利用)の続き。
— you (@youtoy) September 23, 2021
今度は、Node.js側で乱数を発生させて、その値を使って鳴らす音・音を鳴らすタイミングを決めるようなことをやってみました。
この話は、さらに手を加えたものを作っていきたい! pic.twitter.com/MAcgF4SFv3
おわりに
今回作った内容について、想定通りの挙動が確認できました。
今後は、Sonic Pi側の音を鳴らす処理を少し複雑なものにしてみたり、Node.js側で発生させる乱数を変えてみたり、またセンサー等で取得した連続値にしてみたり等といったことが試せればと思います。
乱数については、以下のものを試せると良さそうかな、と思っています。
●simplex-noise - npm
https://www.npmjs.com/package/simplex-noise