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

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

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

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

 これまでの本誌連載のバックナンバーは、micro:bit特設サイトで公開しているよ(コカネットの無料会員登録が必要)。本誌の連載を見たことがないという人は、まずこちらを見てみてね。Web連載は、本誌の連載の続きになっているから、基本的なことがわからなくなったら本誌のバックナンバーを
り返ろう。

 前回は、メトロノームの基本的なプログラムをつくった。でも、前回のプログラムでは、テンポや拍子
ひょうし
を変えたいときに、MakeCodeまで戻る必要がある。それは手間がかかるので、もっと簡単
かんたん
にできるようにしよう。ここでは、micro:bitにあるボタンを使うよ。

1 拍子を変えてみよう

 それでは、MakeCodeで前回つくったメトロノームのプログラムを開いてね。まず、拍子の変更
へんこう
をしてみよう。すでに変数
へんすう
「beat」をつくっているので、ここに入る値を変えていこう。

 「メトロノームをつくろう①」で紹介
しょうかい
した実物のメトロノームは、拍子を打つベルの設定
せってい
が2、3、4、8、0で切り替えできるものだったね。今回つくるものも0から8まで変わることにしてみよう。

 ボタンBを
して拍子を設定した後、LEDディスプレイに何拍子になったか、数を表示するようにした。

「変数」カテゴリーで、新しく変数「adjusting」をつくる。この変数は調整中
ちょうせいちゅう
かどうかを示すフラグとして機能するぞ。「変数“adjusting”を“0”にする」ブロックを“1”にして、「入力」カテゴリーの「ボタン“B”が押されたとき」ブロックと組み合わせる。

 「論理
ろんり
」カテゴリーの「“0”<“0”」ブロックを取り出し、左側の“0”に変数「beat」ブロックを組み込む。右側の“0”は“8”にする。それを「もし“真”なら~でなければ~」ブロックの“真”に組み込もう。

「変数」カテゴリーの「変数“beat” を”1“だけ増やす」ブロックを、「もし“beat”<“0”なら」の下に入れる。

「変数」カテゴリーの「変数“beat”を“0”にする」ブロックを「でなければ」の下に入れる。できたブロックは「変数“adjusting”を“1”にする」ブロックの下に入れる。

 「高度
こうど
なブロック」をクリックして表示される「文字列」カテゴリーから「文字列をつなげる」ブロックを取り出して、1番目の
らん
には“beat”と入力し、2番目の欄には変数「beat」を入れる。そのブロックを、「基本」カテゴリーの「文字列を表示」ブロックと組み合わせよう。できたブロックは④の下に入れるよ。

 「変数」カテゴリーの「変数“adjusting”を“0”にする」ブロックを⑤の下に入れる。

 完成
かんせい
したプログラムは、「入力」カテゴリーの「ボタン“B”が押されたとき」ブロックと組み合わせる。

 ここで変数「adjusting」は、ボタンBが押されて調整中になると、“1”になることがわかるかな?

拍子を変えるプログラム

すでにつくっている「最初
さいしょ
だけ」ブロックのプログラムに「変数“adjusting”を“0”にする」ブロックを入れる。通常
つうじょう
は調整中ではないからね。

最初だけ」ブロックのプログラムに「変数“agjusting”を“0”にする」ブロックを入れる

 「ずっと」ブロックのプログラムも変えるよ。「論理」カテゴリーの「“ ”ではない」ブロックに変数「adjusting」を組み込む。それと「もし“真”なら」ブロックに組み合わせる。「“ ”ではない」ブロックは与えられた値が真なら
を返すので、変数「adjusting」が真(調整中)のときに偽になることで、調整中のメトロノームの動作をさせないようにしているんだ。そのブロックの中に、「呼び出し 1拍の処理
しょり
」ブロックと「一時停止(ミリ秒)」ブロックを入れる。

 できたプログラムを探検ウォッチに書き込んでテストしてみよう。ボタンBを押すと、「beat」という文字の後に数字が表示されて、ベルの音が鳴るタイミングが変わったかな。

2 テンポを変えてみる

 次に、テンポを変えてみよう。

2.1 時間の誤差を調整できるようにする

 そのために「ずっと」ブロックのプログラムにある「一時停止(ミリ秒)」ブロックで設定している、1000ミリ秒を変数にすることにした。「変数」カテゴリーで新しく変数「wait」をつくり、「一時停止(ミリ秒)」ブロックに組み込む。

変数「wait」をつくり、「一時停止(ミリ秒)」ブロックに組み込む

 変数「wait」は「メトロノームをつくろう①」で紹介した「4 時間の誤差
ごさ
を調整する」と同じようなことをするための変数だ。ただ、今回はLEDディスプレイの振り子の表示だけでなく、音も出るし、拍子を変えることもあるので、計算の式は次のようになる。

wait=60000(1分間)÷拍子-調整する時間

 「調整する時間」はさらに後で計算するとして、今は変数「adj」として進めていくよ。「最初だけ」ブロックのプログラムを次のように変えよう。

 変数「temp」を新しくつくって、「変数“tempo”を“0”にする」ブロックを「変数“beat”を“4”にする」ブロックの下に入れる。“0”は“60”にする。変数「tempo」はテンポの設定をする変数だ。60回と設定しているよ。

 変数「adj」を新しくつくって、「変数“adj”を“0”にする」ブロックを①の下に入れる。変数「adj」は、音を出したり、拍子を変える処理にかかる時間で、実際に計測
けいそく
しないとわからないので、ここでは0にしている。

③ 「計算」カテゴリーにある「“0”÷“0”」ブロックを取り出す。右側に“60000”、左側に変数「tempo」を入れる。60000は60秒のことだよ。

 「計算」カテゴリーの「“0”-“0”」ブロックを取り出して、左側に③でつくったブロック、右側に変数「adj」を入れる。

 「変数」カテゴリーの「変数“wait”を“0”にする」ブロックの“0”に、④のブロックを入れて、③の下に入れる。

「最初だけ」ブロックのプログラムの変更

2.2 ボタンAでテンポを変える

 テンポを変えるためのプログラムをつくろう。その前に、2.1でつくった「変数“wait”を“60000”÷“tempo”-“adj”にする」ブロックをここでも使うので、「関数
かんすう
」カテゴリーで「関数“waitを求める”」ブロックをつくって、関数にしてしまおう。

 「最初だけ」ブロックのプログラムは、代わりに「呼び出し waitを求める」ブロックを入れるよ。

 テンポは、ボタンAを押して変えるようにしよう。「メトロノームをつくろう①」で紹介したメトロノームは、振り子の目盛りが40~220とあったので、同じようにしてみよう。10ずつ変えるようにしたよ。

 「変数」カテゴリーから「変数“adjusting”を“0”にする」ブロックを取り出す。“0”は“1”にする。

 「論理」カテゴリーから「“0”<“0”」ブロックを取り出す。右側に変数「temp」を入れ、左側は“220”と入力する。それを「もし“真”なら~でなければ~」ブロックの“真”に入れる。

 「変数」カテゴリーの「変数“temp”を“1”だけ増やす」ブロックを②に入れる。“1”は“10”にする。

 「変数“tempo”を“0”にする」ブロックを②の「でなければ」の下に入れる。“0”は“40”にする。できたブロックは①と組み合わせる。

 「関数」カテゴリーの「呼び出し waitを求める」ブロックを④の下に入れる。

 「基本」カテゴリーの「アイコンを表示」ブロックを⑤の下に入れる。アイコンは「4分音符」にした。

 「基本」カテゴリーの「文字列を表示」ブロックに、変数「tempo」を組み込んで、⑥の下に入れる。

 「変数」カテゴリーの「変数“adjusting”を“0”にする」ブロックを⑦の下に入れる。

 完成したプログラムを「入力」カテゴリーの「ボタン“A”が押されたとき」ブロックと組み合わせる。

 このプログラムは、調整の時間(変数「adj」)は0のままで、特に考えていないけど、テンポの設定、拍子の設定が変更できるようになったぞ。探検ウォッチに書き込んで、ボタンAを押したら、テンポが変わったかな。

2.3 時間の誤差をボタンで調整できるようにする

 最後に、残っている調整の時間(変数「adj」)を計算するプログラムをつくろう。ボタンAとBを同時に押したら、10拍カウントして計算上の数値との誤差を計算して、変数「adj」の値を求めて、時間の誤差を調整できるようにするよ。

 プログラムは次のようになる。

 「変数」カテゴリーから「変数“adjusting”を“0”にする」ブロックを取りだす。“0”は“1”にする。

 「計算」カテゴリーから「“0”÷“0”」ブロックを取り出す。右側は“60000”、左側に変数「tempo」を入れる。

「変数」カテゴリーで新しく変数「calctime」をつくる。これは計算上の1拍の長さを表す変数だ。「変数“calctime”を“0”にする」ブロックを取り出して、“0”に②を組み込んで、①の下に入れる。

 「変数」カテゴリーで新しく変数「counttime」をつくって、「変数“counttime”を“0”にする」ブロックを取り出す。変数「counttime」は、変数「calctime」と比較するため、実際に計測した時間を入れる変数だ。「“0”には「入力」カテゴリーの「その他」にある「稼働
かどう
時間(ミリ秒)」ブロックを入れる。この時点では、誤差の修正に必要な、計測開始直前のmicro:bitの稼働時間を記録しているよ。

 「ループ」カテゴリーから「くりかえし“4”回」ブロックを取り出す。ここには、「関数」カテゴリーの「呼び出し 1拍の処理」ブロックと、「基本」カテゴリーの「一時停止(ミリ秒)」ブロックに変数「calctime」を組み込んだものを組み合わせる。できたブロックは④の下に入れるよ。

 「計算」カテゴリーから「“0”-“0”」ブロックを取り出し、右側に「稼働時間(ミリ秒)」ブロック、左側に変数「counttime」を入れる。これを「変数“counttime”を“0”にする」ブロックの“0”に組み込むよ。④で記録したのは10拍カウント直前の稼働時間だから、10拍カウントした後の稼働時間から④の値を引くことで、変数「counttime」には10拍の、実際に計測された時間が入ることになる。

 「計算」カテゴリーの「“0”ד0”」ブロックを取り出し、右側に関数「calctime」、左側に“10”を入れる。

 「“0”-“0”」ブロックを取り出して、右側に変数「counttime」、左側に⑦を入れる。

 「“0”÷“0”」ブロックを取り出して、右側に⑧、左側に“10”を入れる。

 「変数」カテゴリーの「変数“adj”を“0”にする」ブロックを取り出して、“0”に⑨を入れて、⑥の下に入れよう。これで、調整する時間が計算できるんだ。

 「基本」カテゴリーの「数を表示」ブロックに変数「counttime」を組み合わせて、⑩の下に入れる。

「関数」カテゴリーの「呼び出し waitを求める」ブロックを⑪の下に入れる。これによって、時間の誤差が調整されるんだ。

 「変数」カテゴリーの「変数“adjusting”を“0”にする」ブロックを⑫の下に入れる。

 完成したプログラムを「入力」カテゴリーの「ボタン“A+B”が押されたとき」ブロックと組み合わせる。

 これでメトロノームのプログラムは完成したぞ。探検ウォッチに書き込んで、試してみよう。

 今回のプログラムはけっこう難しかったかな。変数もたくさん使ったし、関数も使っている。でも1回目につくったメトロノームのプログラムよりは、ずっと本物に近い動きになったんじゃないかな。ぜひ楽器の演奏で試してみてね。

 それでも、まだ工夫できるところはあるので、いろいろなアイディアをためしてみてね!

(文/倉本大資)

プログラミング教材 micro:bit

KoKa micro:bit探検ウォッチキット

¥7,700- (税込)

KoKa Shop!で購入する

最新号好評発売中!

子供の科学 2024年 5月号

CTR IMG