マイクロビットでは、内蔵スピーカー(V2)や外付けスピーカー(V1)を使って音を鳴らすことができます。
ただ、マイクロビットで音楽(メロディー)を鳴らそうとすると、もともと用意されているメロディーを使うか、そうでなければ音符や休符をひとつひとつ入力してメロディーをつくる必要があり、この音符を入力していく作業が結構面倒です。
例えば、以前入力したあるメロディーはこのような感じでした。たった8小節のメロディーで、これだけのブロックを並べなければいけません。
今回は、もっと簡単にメロディーを入力する方法を考えてみたいと思います。
メロディーを配列に入力
音を鳴らすときには「play tone」というブロックを使います。
「play tone」では「真ん中のド」などの「音程」と、「1拍」などの「拍」を指定しますが、これらの値は実際にはいずれも数値です(「音程」の単位は「ヘルツ」、「拍」の単位は「ミリ秒」)。
この「音程」と「拍」のデータをあらかじめ配列に準備しておき、その情報を使ってメロディーを鳴らしてみたいと思います。
休符のときには「音程」を「0」にすることとします。
プログラムはこのようになります。
「音程」「拍」というふたつの配列を準備し、そこに8個の音のデータを入力しておきます。
この配列の内容をループで読み取り、「play tone」や「rest for」をつかってメロディーを鳴らします。
音符や休符の情報を、ひとつひとつ配列に入力していかなければいけないので、作業が面倒なのは相変わらずですが、少なくとも「play tone」や「rest for」はひとつずつしか使わずにメロディーを鳴らすことができました。
後は、この配列に簡単にメロディーを入力する方法を考えればよいことになります。
加速度センサとボタンを使ってメロディーを入力
以前、マイクロビットで「楽器」をつくったことがあります(記事は こちら)。
マイクロビットの傾きで「音程」を決定し、Aボタンを押している間だけその音を鳴らすというものです。
マイクロビットの傾きを変えながらAボタンを押すことで、メロディーを演奏することができます。
この仕組みをつかって、先ほど準備した配列にメロディーを入力していきたいと思います。
プログラムはこちらです。
Bボタンを押すと録音開始、もう一度押すと録音終了です。
Aボタンを押した瞬間に、それまでの時間を測定して、配列に「休符」を追加します。また、その時のマイクロビットの傾きから「音の高さ」を決定します。
Aボタンを離した瞬間に、それまでの時間を測定して、配列に「音符」を追加します。先ほど決定した「音の高さ」を使います。
なお、マイクロビットのLEDを使う場合、ひとつのLEDを点灯・消灯させるだけなら数msで処理できますが、アイコンなどを表示させるには数百msの時間がかかります。
リアルタイムでメロディーを録音するのに、途中で数百msも処理が中断されるのでは演奏に影響するので、録音中はLEDを1個だけ点灯させることにしました。
A+Bボタンを押すと、録音されたメロディーが再生されます。
マイクロビットの傾きで音程を決めているので音程はデタラメですが、マイクロビットでメロディーを演奏し、同時にそれを録音、後から再生することができました。
外付けスイッチを使ってメロディーを入力
ここまでできるようになると、次は外付けの鍵盤のようなものを使ってメロディーを録音したくなります。
そこで今回は、ブレッドボードにタクトスイッチを並べ、それでメロディーを演奏することにします。
スイッチは6個用意し、それぞれに「ド」〜「ラ」の音程を割り当てます。
プログラムはこちらです。
プログラムが大変長くなってしまいましたが、6個のスイッチそれぞれについて押した時、離した時の処理を書いているため長くなっているだけで、内容は先ほどのプログラムから大きくは変わっていません。
各スイッチを押した瞬間、離した瞬間に配列に休符や音符を追加しています。
A+Bボタンを押すと、録音されたメロディーが再生されます。
外付け部品を使って鍵盤をつくり、それでマイクロビットにメロディーを入力することができました。
これで、マイクロビットへのメロディーの入力がとても簡単になりました。
ただしもちろん、マイクロビットの電源を切ると、入力したメロディーも消えてしまうので、その点は注意が必要です。