micro:bitは出力端子があり、これをスピーカと接続することで、音を出すことができます。MakeCodeは音楽ブロックがあり、ドレミ音階やメロディが用意されています。この音楽機能で、どのようなものが作れるのか？どうやってプログラムするのか？ということを紹介します。
## なにができる？
MakeCodeには音楽機能のブロックがあります。micro:bitにはボタンが２つしかないので、これだけで演奏するのは難しいかもしれませんが、加速度センサや磁気センサの値に応じて、音階が変わるようなプログラムにすれば、オリジナルの楽器が作れます。
## 音楽機能とは？
MakeCodeの音楽機能は、micro:bitの端子P0から、ドレミ等の音階に相当する周波数の信号を出力します。例えば、「真ん中のド」の場合だと、262Hzの矩形波(PWM信号)を出力します。micro:bitにはスピーカーがないので、このP0端子とGND端子をイヤホンジャックや圧電スピーカ（パッシブブザー）に接続して音を鳴らします。
また、今回のプログラムでは使用しませんが、「メロディ」が用意されており、歓喜の歌・ハッピーバースデー・ウェディングマーチなどをリストから選択するだけで再生できます。
## どんな物が作れる？
今回のサンプルでは、micro:bitの傾きを加速度センサで検知して、その傾きに応じて音階が変わるようにしました。音を鳴らす/鳴らさないは、ボタンAを押しているかどうかで判断します。
## プログラミング
はじめに、「最初だけ」ループで、変数の初期化を行います。使用する変数は２つ、micro:bitの傾きを格納する「傾き」と、使用する音階真ん中のド～上のドを格納する「list」です。listは配列と呼ばれる変数ので、複数の値を格納することができます。このブロックは、「高度なブロック」の「配列」にあります。変数初期化が完了した印として、最後にスマイルマークを表示するようにしました。
「ずっと」ループでは、ボタンAが押されている場合は音を出し、押されていないときは音を出さないように、論理ブロックで条件分岐します。音を出さない場合は、音楽ブロックの「休符」を使用します。
音を鳴らすのは、「音を鳴らす 高さ(Hz)」ブロックを使用します。鳴らす音は、最初に準備した変数「list」に格納された音です。listには複数の音が格納されているので、何番目の音を鳴らすか選択します。先頭のブロックは０番目です。１番目ではないので注意が必要です。したがって、ここでは０～７番目の値を指定する必要があります。今回は、この値をmicro:bitの傾きと連携させたいので、「傾き」番目の値にします。
micro:bitの傾きは、「加速度Xの絶対値」を使用するのですが、この値は0～1023の範囲をとります。これをそのまま使用すると、配列listの項目数と異なるため、エラーになります。そこで使用するのでが、「変数をマップする」というブロックです。このブロックは「計算」の中にあります。このブロックを使用して、0～1023を0～7の範囲に変換します。
結果の上限を「７」ではなく、「変数listの長さ － 1」としました。「７」でもプログラムは動作しますが、プログラムを改造してlistの要素数が変わったとき、「７」だと思った動作になりません。プログラムを作ったときは、ここの値を変える必要があるのをすぐに気づくことができると思いますが。１ヶ月後、１年後はどうでしょうか？このようなことを防ぐため、「変数listの長さ － 1」としました。変数listの長さは、要素の数なので、今回の場合だと「８」です。そのため、－１をする必要があります。
これをJavascriptで書くと、下記のとおりです。音階が周波数で宣言されているので、スッキリして見えますね。
MakeCodeの操作方法がよくわからない場合は、プログラミングのキャプチャ動画を御覧ください。
## まとめ
micro:bitで音を出すためには、スピーカを接続する必要があるため、少し敷居を感じたかもしれません。とはいえ、たった2本の線をクリップで接続するだけで、音を鳴らすことができるというのは、とても扱いやすいデバイスと言えます。今回は、ボタンAのみを使用しましたが、ボタンBを押したときに、音程を1オクターブ上げるなど、プログラムの改良余地は色々あると思いますので、オリジナルの楽器を創作してみてください。