メトロノームをつくろう②

 micro:bit(マイクロビット)は手のひらサイズの小さなコンピューター。いろいろな機能
(きのう)

(そな)
わっていて、自分でプログラミングをすることができるよ。ブログラミングは「MakeCode(メイクコード) for micro:bit」を使えば、初心者でもかんたんにできるんだ。

 『子供の科学』本誌
(ほんし)
連載
(れんさい)
「micro:bitでレッツプログラミング!」では、micro:bitを使った「探検
(たんけん)
ウォッチ」というツールを使って、その機能をプログラミングでつくったけれど、この連載が「スタプロ」にお引っ越し。Web連載でも、探検ウォッチのいろいろな機能をプログラミングでつくっていくぞ!

 これまでの本誌連載のバックナンバーは、「micro:bitでレッツプログラミング!」旧サイトで公開しているよ。本誌の連載を見たことがないという人は、まずこちらを見てみてね。Web連載は、本誌の連載の続きになっているから、基本的なことがわからなくなったら本誌のバックナンバーを
()
り返ろう。

 前回は、メトロノームの機能をつくるために、探検ウォッチでテンポを
きざ
むプログラムをつくった。今回はテンポを正確にする方法を生かしながら、よりメトロノームらしいプログラムをつくっていくぞ。

1 拍子に合わせて動く振り子のアニメーションをつくる

 前回つくったプログラムは、LED画面の変化でしかテンポがわからなかった。今回はメトロノームのように音と動きを組み合わせるよ。

 前回の「4 時間の誤差
ごさ
調整
ちょうせい
する」でつくったプログラムを参考にしながら、新しくつくっていこう。

① コードがわかりやすくなるように関数でまとめてみよう。「関数」カテゴリーで「1
はく
処理
しょり
」という関数をつくる。

関数「1拍の処理」ブロック

 ただし、振り子が左右に
れる様子を表現するためには、奇数
きすう
拍と偶数
ぐうすう
拍ではLEDディスプレイに表示する絵も
ちが
う。その動作も含めて、関数の中で設定しよう。

振り子が左右に揺れる表現は「LED画面に表示」ブロックを使う。

② まず、振り子の動きが奇数拍なら左、偶数拍なら右となるコードを考えてみよう。ここでは条件
じょうけん分岐
ぶんき
を使うよ。「論理
ろんり
」カテゴリーの「もし“
しん
”なら~でなければ~」ブロックに「LED画面に表示」ブロックを組み込んだものを組み合わせる。“真”の部分が条件になるのだけど、どうすればいいだろうか?

振り子の動きを関数「1拍の処理」内につくる

③ まず、今は何拍目なのかがわかるようにしたいので、拍数をカウントする変数をつくる。「変数」カテゴリーで変数「count」をつくった。
 奇数か偶数かを分けるには、拍数を2で
り算したときのあまりを使う。あまりが1なら奇数、あまりが0なら偶数となる。「計算」カテゴリーの「“0”を“1”で割ったあまり」ブロックを使おう。“0”に変数「count」を、“1”は“2”に変える。
 それを、「論理」カテゴリーの「“0”=“0”」ブロックの左側に入れる。右側の“0”は“1”にして、「もし“真”なら~でなければ~」ブロックの“真”に入れよう。

④ ③でできた関数「1拍の処理」を、「ずっと」ブロックから呼び出してみよう。♩=60の調整前にして、「基本」カテゴリーの「一時停止“100”ミリ秒」ブロックも入れたぞ。“100”は“1000”にした。これで左右に振れるアニメーションができたね。

関数「1拍の処理」をずっと呼び出す

2 振り子の動きに合わせて音を鳴らそう

 次は、振り子の動きに合わせて音を鳴らすコードを考えよう。

① 「入出力端子」カテゴリーの「…その他」にある「音を鳴らす(Hz)“0”長さ(ミリ秒)“0”」ブロックを使う。音の高さは1000Hzにして、長さはなるべく歯切れのよい短い音を鳴らしたいので、5ミリ秒とした。

 このブロックは関数「1拍の処理」に入れるけれど、1でつくった振り子の表示部分の前後どちらに入れるか。ためしに、まずは後ろに入れてみよう。

「音を鳴らす(Hz)“1000”長さ(ミリ秒)“5”」ブロックを振り子の表示の後に入れる

② 何となくLEDディスプレイの振り子の表示と、音のタイミングがずれているように感じたので、振り子の表示部分の前に変えてみた。

「音を鳴らす(Hz)“1000”長さ(ミリ秒)“5”」ブロックを振り子の表示の前に入れる

 こちらのほうが、振り子の表示と音が合っている印象
いんしょう
だ。
 振り子の表示と音のタイミングはそれぞれ感じ方が違うと思うので、シミュレーターで試したり、探検ウォッチに書き込んで実験をして、ちょうどいいと思えるものにしてほしい。

3 一定の拍子ごとにベルを鳴らす

 本物のメトロノームと同じように、一定の拍子ごとにベルのような音が鳴るようにしよう。

① 「音を鳴らす(Hz)“0”長さ(ミリ秒)“0”」ブロックをもう1つ使う。ベルはちょっと高めの音なので、「音を鳴らす(Hz)“2000”長さ(ミリ秒)“5”」に設定する。

② 「変数」カテゴリーで変数「beat」をつくって、「変数“beat”を“0”にする」ブロックを「最初だけ」ブロックと組み合わせる。“0”は“4”にしておこう。

③  1でつくった「もし“count”を“0”で割ったあまり“=” “1”なら~でなければ~」ブロックを複製
ふくせい
する(「LED画面に表示」ブロックも複製されるけど、それは使わないので外してしまおう)。“0”に変数「beat」を入れて、さっきつくった「音を鳴らす(Hz)“2000”長さ(ミリ秒)“5”」ブロック、「音を鳴らす(Hz)“1000”長さ(ミリ秒)“5”」ブロックと組み合わせる。

④ できたブロックは「変数“count”を“1”だけ増やす」ブロックの下に入れる。振り子を左右に振るアニメーションと同じように、変数「count」を変数「beat」で割ったあまりが1のとき、つまり1拍目にこの高い音を鳴らすよ。

一定の拍子ごとに音を鳴らすコード

 これで、メトロノームの基本的な動きはできた。探検ウォッチに書き込んで試してみよう。振り子やベルの音がはっきり鳴らないなと思ったら、音を鳴らす時間を少し長くしてみよう。いまは5ミリ秒だけど、例えば10ミリ秒にしてみたらどうかな。

 ただ、このままでは、テンポや拍子を変える場合にプログラムまで戻る必要があるので大変だ。次回は、テンポや拍子をもっと簡単に設定したり、誤差
ごさ
を修正したりするしくみをプログラミングでつくっていこう。お楽しみに!

(文/倉本大資)

最新号好評発売中!

子供の科学 2020年 12月号

CTR IMG