micro:bitでSTEM教育:音楽機能を使ってみよう

micro:bitでSTEM教育:音楽機能を使ってみよう

micro:bitは出力端子があり、これをスピーカと接続することで、音を出すことができます。MakeCodeは音楽ブロックがあり、ドレミ音階やメロディが用意されています。この音楽機能で、どのようなものが作れるのか?どうやってプログラムするのか?ということを紹介します。

なにができる?

MakeCodeには音楽機能のブロックがあります。micro:bitにはボタンが2つしかないので、これだけで演奏するのは難しいかもしれませんが、加速度センサや磁気センサの値に応じて、音階が変わるようなプログラムにすれば、オリジナルの楽器が作れます。

音楽機能とは?

MakeCodeの音楽機能は、micro:bitの端子P0から、ドレミ等の音階に相当する周波数の信号を出力します。例えば、「真ん中のド」の場合だと、262Hzの矩形波(PWM信号)を出力します。micro:bitにはスピーカーがないので、このP0端子とGND端子をイヤホンジャックや圧電スピーカ(パッシブブザー)に接続して音を鳴らします。

また、今回のプログラムでは使用しませんが、「メロディ」が用意されており、歓喜の歌・ハッピーバースデー・ウェディングマーチなどをリストから選択するだけで再生できます。

どんな物が作れる?

今回のサンプルでは、micro:bitの傾きを加速度センサで検知して、その傾きに応じて音階が変わるようにしました。音を鳴らす/鳴らさないは、ボタンAを押しているかどうかで判断します。

プログラミング

はじめに、「最初だけ」ループで、変数の初期化を行います。使用する変数は2つ、micro:bitの傾きを格納する「傾き」と、使用する音階真ん中のド~上のドを格納する「list」です。listは配列と呼ばれる変数ので、複数の値を格納することができます。このブロックは、「高度なブロック」の「配列」にあります。変数初期化が完了した印として、最後にスマイルマークを表示するようにしました。

「ずっと」ループでは、ボタンAが押されている場合は音を出し、押されていないときは音を出さないように、論理ブロックで条件分岐します。音を出さない場合は、音楽ブロックの「休符」を使用します。

音を鳴らすのは、「音を鳴らす 高さ(Hz)」ブロックを使用します。鳴らす音は、最初に準備した変数「list」に格納された音です。listには複数の音が格納されているので、何番目の音を鳴らすか選択します。先頭のブロックは0番目です。1番目ではないので注意が必要です。したがって、ここでは0~7番目の値を指定する必要があります。今回は、この値をmicro:bitの傾きと連携させたいので、「傾き」番目の値にします。

micro:bitの傾きは、「加速度Xの絶対値」を使用するのですが、この値は0~1023の範囲をとります。これをそのまま使用すると、配列listの項目数と異なるため、エラーになります。そこで使用するのでが、「変数をマップする」というブロックです。このブロックは「計算」の中にあります。このブロックを使用して、0~1023を0~7の範囲に変換します。

結果の上限を「7」ではなく、「変数listの長さ - 1」としました。「7」でもプログラムは動作しますが、プログラムを改造してlistの要素数が変わったとき、「7」だと思った動作になりません。プログラムを作ったときは、ここの値を変える必要があるのをすぐに気づくことができると思いますが。1ヶ月後、1年後はどうでしょうか?このようなことを防ぐため、「変数listの長さ - 1」としました。変数listの長さは、要素の数なので、今回の場合だと「8」です。そのため、-1をする必要があります。

これをJavascriptで書くと、下記のとおりです。音階が周波数で宣言されているので、スッキリして見えますね。

let 傾き = 0
let list = [262, 294, 330, 349, 392, 440, 494, 523]
basic.showIcon(IconNames.Happy)
basic.forever(function () {
    if (input.buttonIsPressed(Button.A)) {
        傾き = Math.map(Math.abs(input.acceleration(Dimension.X)), 0, 1023, 0, list.length - 1)
        led.plotBarGraph(
        傾き,
        list.length - 1
        )
        music.ringTone(list[傾き])
    } else {
        music.rest(music.beat(BeatFraction.Whole))
        basic.clearScreen()
    }
})

MakeCodeの操作方法がよくわからない場合は、プログラミングのキャプチャ動画を御覧ください。

まとめ

micro:bitで音を出すためには、スピーカを接続する必要があるため、少し敷居を感じたかもしれません。とはいえ、たった2本の線をクリップで接続するだけで、音を鳴らすことができるというのは、とても扱いやすいデバイスと言えます。今回は、ボタンAのみを使用しましたが、ボタンBを押したときに、音程を1オクターブ上げるなど、プログラムの改良余地は色々あると思いますので、オリジナルの楽器を創作してみてください。

microbitカテゴリの最新記事