2
1

More than 1 year has passed since last update.

Node.js で発生させた乱数で自動で音を鳴らす(Sonic Pi に OSC通信でデータを送信して音を出す)

Last updated at Posted at 2021-09-23

今回の内容は、以下の記事の続きです。

●Sonic Pi による音の出力を Node.js のプログラム(osc.js を利用)から制御: OSC over UDP による通信 - Qiita
 https://qiita.com/youtoy/items/a158b847b142f0a134a6

この記事では、Node.js のプログラムでキーの押下を検知し、それに応じた OSC通信と音の出力を行っていました。
今回は「音の高さと音を鳴らすタイミング」をプログラムで発生させた乱数で決めて、音を奏でてみます。

構成

構成は前回の記事の内容と同じで、以下の通りです。
詳細については、これ以降についても前回の記事の内容を参照してください。

  • 送信側
    • Node.js のプログラム
      • ライブラリ: osc.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側で発生させる乱数を変えてみたり、またセンサー等で取得した連続値にしてみたり等といったことが試せればと思います。
乱数については、以下のものを試せると良さそうかな、と思っています。

●simplex-noise - npm
 https://www.npmjs.com/package/simplex-noise

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1