IoTでマトリョミン(楽器)を作ってみた(1/2)obnizでテルミン編


はじめに

音楽まったくやってない人って楽器ひくことにちょっとしたあこがれないですか?
私はそんな一人です、楽器ひいてみたい。

手軽に弾けそうな楽器は無いかと調べてみたら、マトリョミンという楽器を見つけました。マトリョミンとは、マトリョーシカ型のテルミンだそうです。テルミンとは、手と楽器(テルミン)との距離を調節するだけで音階を変えられる、ちょっと不思議な楽器です。

よくわからんけど、この楽器なら音楽音痴の私でも音を奏でられるのでは?

と、思ったのですが、マトリョミンって価格が5万円オーバー!さすがにこれは買えません。だったら、マトリョミンを自作すればいいんじゃないの?

ということで、マトリョミンを作ることにしました。(正確にはマトリョミン風)

完成デモ

できたマトリョミン(風)はこちら。本記事では、テルミン(音をだす仕組み)の作り方を紹介します。ARマトリョーシカを表示するのは 次回 で紹介しています。

マトリョミンとは?

マトリョミンをもう少し説明します。
マトリョミンとは、マトリョーシカ型のテルミンです。つまり、見た目がマトリョーシカです。

テルミンとは電子楽器です。電波を発するアンテナに手を近づけたり離したりして音を変化させます。イラスト屋にイラストありました(こんなイラストも揃えてるが、すごいなイラスト屋)

"なぜ、テルミンとマトリョーシカが合体したのか?"は、『どちらも起源がロシアだから』が理由みたいです。

マトリョミン(風)の要件決めるぞ

マトリョミン(風)の楽器を作るにあたり、以下2つの要件を満たすことを目標にします。

要件1:手を近づけたり離したりして音(音階)が変化
要件2:見た目はマトリョーシカ

今回は、要件1を満たす仕組みをobnizで作ります。

距離センサーとスピーカーで音を奏でる仕組みを作る

テルミンのように手と楽器の位置関係で、奏でる音がかわるようにします。
具体的には、超音波距離センサーで距離を計測し、スピーカーで計測した距離に応じた音階を出すようにします。超音波距離センサーとスピーカーはobnizで制御します。

イラストにするとこんな感じ

制御スクリプトはこちら

obnizで超音波距離センサーとスピーカーを制御するスクリプトです。

<html lang="en">
<head>
    <meta charset="utf-8" />
    <script src="https://unpkg.com/[email protected]/obniz.js"></script>
</head>
<body>

<div id="dispArea"></div>

<script>
const OBNIZ_ID = 'xxxx-xxxx'; // Obniz ID を設定

const SCALELENGTH = 15;
const STARTCOUNT  = 5;
const scaleArr = new Array();
const dispArr  = new Array();
scaleArr.push(262); dispArr.push("");
scaleArr.push(294); dispArr.push("");
scaleArr.push(330); dispArr.push("");
scaleArr.push(349); dispArr.push("ファ");
scaleArr.push(392); dispArr.push("");
scaleArr.push(440); dispArr.push("");
scaleArr.push(494); dispArr.push("");
scaleArr.push(523); dispArr.push("ド(高)");

const obniz = new Obniz(OBNIZ_ID);
obniz.onconnect = async function() {
    const hcsr04 = obniz.wired("HC-SR04", {gnd:0, echo:1, trigger:2, vcc:3});
    const speaker = obniz.wired("Speaker",{"signal":10, "gnd":11});
    while(true) {
        let avg = 0;
        let count = 0;
        for (let i=0; i<3; i++) { // measure three time. and calculate average
            const val = await hcsr04.measureWait();
            if (val) {
                count++;
                avg += val;
            }
        }
        if (count > 1) {
            avg /= count;
        }
        let scaleNo = Math.floor( avg / SCALELENGTH ) - STARTCOUNT;
        if(scaleNo < 0) scaleNo=0;
        document.getElementById("dispArea").innerHTML = "<h1>"+ scaleNo + " : " + dispArr[scaleNo] + "</h1>"

        if( scaleNo >= scaleArr.length ){
            speaker.stop();
            obniz.display.clear();
            obniz.display.print('' + scaleNo);
        }else{
            speaker.play( scaleArr[scaleNo] );
            obniz.display.clear();
            obniz.display.print(dispArr[scaleNo]);
        }
        await obniz.wait(100);
    }
}
</script>
</body>
</html>

束ねるぞっ

音を奏でる仕組み、つまりテルミン(風)ができました。制作するのはマトリョミン(風)なので、マトリョーシカのフォルムに収まるよう、obnizやセンサーをLEGOでまとめます。

奏でてみる

距離に応じてドレミファソラシドが奏でられました。ここまでは成功です。

まとめ

『マトリョミン(風)の楽器を作る』のテルミン(風)を作るところまでを紹介しました。次はARで見た目をマトリョーシカにするまでを紹介します。
 →IoTでマトリョミン(楽器)を作ってみた(2/2)AR.jsでマトリョーシカ編

余談

テルミンのWikiに、安定した狙った音を出すには奏者の高い技量が要求され、演奏には熟練を要する と書いてました。手を動かすだけなら簡単かなと思ったのは大きな間違いだったようです。