obnizでテルミンもどき🎶

本稿は Qiita obniz AdventCalendar2019 9 日目の記事です。

これを作りました🎶

obniz.jpg

必要なもの

モジュールたち

スピーカー

ドキュメント

こちらのスピーカーを使用しました。 周波数に対応した音が鳴ります。 (ブザーっぽい音が結構な大きさで鳴るので夜は動かせませんでした笑)

var speaker = obniz.wired("Speaker", {signal:0, gnd:1});
speaker.play("周波数");

🎶ドレミファソラシド🎶

音名 周波数
C4 523.251
D4 587.330
E4 659.255
ファ F4 698.456
G4 783.991
A4 880.000
B4 987.767
C5 1046.502
const obniz = new Obniz("XXXX-XXXX");

const C4 = 523.251;
const D4 = 587.330;
const E4 = 659.255;
const F4 = 698.456;
const G4 = 783.991;
const A4 = 880.000;
const B4 = 987.767;
const C5 = 1046.502;

const music = [C4, D4, E4, F4, G4, A4, B4, C5];

obniz.onconnect = async () => {
const speaker = obniz.wired("Speaker", {signal:10, gnd:11});

for(let m of music) {
speaker.play(m);
await obniz.wait(1000);
}

speaker.stop();
};

距離センサー

ドキュメント

障害物との距離を mm(ミリメートル) で返してくれます。 センサーから 50mm 単位で音階を割り当てて、テルミンっぽい感じで音を鳴らせるようにします。

公式のサンプルを参考にさせていただき、最終的にはこんな感じになります。

const obniz = new Obniz("XXXX-XXXX");

const C4 = 523.251;
const D4 = 587.330;
const E4 = 659.255;
const F4 = 698.456;
const G4 = 783.991;
const A4 = 880.000;
const B4 = 987.767;
const C5 = 1046.502;

obniz.onconnect = async () => {

const hcsr04 = obniz.wired("HC-SR04", {gnd:3, echo:2, trigger:1, vcc:0});
const speaker = obniz.wired("Speaker", {signal:10, gnd:11});

while(true) {
let avg = 0;
let count = 0;
for (let i=0; i<3; i++) {
const val = await hcsr04.measureWait();
if (val) {
count++;
avg += val;
}
}
if (count > 1) {
avg /= count;
}

if (50 < avg && avg < 100) {
speaker.play(C4);
} else if (100 < avg && avg < 150) {
speaker.play(D4);
} else if (150 < avg && avg < 200) {
speaker.play(E4);
} else if (200 < avg && avg < 250) {
speaker.play(F4);
} else if (250 < avg && avg < 300) {
speaker.play(G4);
} else if (300 < avg && avg < 350) {
speaker.play(A4);
} else if (350 < avg && avg < 400) {
speaker.play(B4);
} else if (400 < avg && avg < 450) {
speaker.play(C5);
} else {
speaker.stop();
}
await obniz.wait(400);
}
}

演奏

(クオリティはご勘弁ください🙇‍♂️)

チューリップ

ドレミだけで、かつテンポが一定の曲は演奏しやすいです。

パプリカ

半音を組み合わせると、演奏できる曲がぐっと増えますね! ただテンポが一定でないので、距離センサーの判定タイミングとずれると難しい。


最後に

距離センサーで取得した値を処理していくので、どうしても一定の間隔が必要になり、テルミンの「うゎんうゎん」感を出すことはできませんでした。(頑張ったらできるのかな)

先日参加した養老乃瀧ハッカソンで↓を作ったのですが、そのときに「音×IoT」って面白いな!と思ったので今回テルミンもどきを作ってみました。

obniz は持っていたもののサーボモーターくらいしかまともに使ったことはなかったので、とても楽しかったです! RaspberryPi や M5Stack も好きですが、Javascript でサクッと開発できてしまうこの手軽さは本当にすばらしいと思います。

Thank you, Obniz!! Let's Obniz!!

← Blog