マイクロビット用ピアノモジュール

 今回はKitronik製の「micro:bit用ピアノモジュール」を制御してみます。前回のピアノモジュールと違いLEDはなく、形状もグランドピアノになっています。今回もマイクロビットのv1で行っています。

・Kitronikでの製品紹介
https://www.kitronik.co.uk/5631-klef-piano-for-the-bbc-microbit.html
・micro:bit ピアノ - Kitronik :KLEF Piano for the BBC micro:bit(Amazonでの販売)
https://www.amazon.co.jp/micro-bit-Kitronik-KLEF-Piano/dp/B07H4DTB4G

 このピアノモジュールはタッチセンサーがついており、手で鍵盤を押せば音がなります。もちろん、プログラムから制御することもできます。
 ピアノモジュールはモジュール側にも電源を供給しないと音がでません。マイクロビット側でプログラムを書き換える場合にはマイクロビット側にも電源を供給します。つまり、プログラムを作成する場合にはマイクロビットとピアノモジュールの両方に電源を接続するということです。プログラムが完成した場合はピアノモジュールだけに電源を供給すれば動作します。
 このピアノモジュールは結構音が大きいのですが、音量を調整することはできないようです。(音量調整用のブロックがありません)

 ピアノモジュールの詳細については公式サイトで以下のページにPDFとして用意されています。

kitronik公式サイトにある製品仕様書
https://www.kitronik.co.uk/pdf/5631-klef-microbit-piano-datasheet.pdf

ピアノモジュールの機能を追加

 ピアノモジュールは、そのままではブロックエディタで使うことができません。ピアノモジュールを使うためには拡張機能としてブロックを追加する必要があります。
 以下の手順に従って機能を追加します。なお、旧ブロックエディタでも同じように機能を追加できます。

  • 「高度なブロック」のカテゴリをクリックします

    「高度なブロック」のカテゴリをクリックします

  • 「拡張機能」のカテゴリをクリックします

    「拡張機能」のカテゴリをクリックします

  • ピアノモジュールはキーワードを入れないと出てきません

    ピアノモジュールはキーワードを入れないと出てきません

  • 入力欄に「piano」と入力したら虫眼鏡ボタン(検索ボタン)をクリックします

    入力欄に「piano」と入力したら虫眼鏡ボタン(検索ボタン)をクリックします。「piano」のキーワードで出てこない場合は「kitronik」のキーワードを入れてください

  • kitronik-klef-pianoをクリックします

    kitronik-klef-pianoをクリックします

  • しばらくするとプログラムが読み込まれ「:KLEF Piano」のカテゴリが追加されます

    しばらくするとプログラムが読み込まれ「:KLEF Piano」のカテゴリが追加されます

 これでミニピアノモジュールを使う準備ができました。

鍵盤をタッチしたら音を鳴らす

 まず、鍵盤をタッチしたら音が鳴るようにしてみましょう。「:KLEF Piano」のカテゴリをクリックします。すると図のようなブロックが表示されます。

  • 「…More」の項目をクリックします

    「…More」の項目をクリックします

  • 「set note length to 500 ms」のブロックを「最初だけ」のブロックに入れます。次に「setup full piano」のブロックを「ずっと」のブロックに入れます

    「set note length to 500 ms」のブロックを「最初だけ」のブロックに入れます。次に「setup full piano」のブロックを「ずっと」のブロックに入れます

  • 図のようにブロックを組み上げればできあがりです

    図のようにブロックを組み上げればできあがりです

 JavaScriptコードでは以下のようになります。

Kitronik_Piano.setNoteLength(500)
basic.forever(function () {
    Kitronik_Piano.fullPianoPlay()

 これでプログラムはできあがりです。簡単にできるのはタッチしたら演奏するためのブロックがあらかじめ用意されているからです。あとは、作成したプログラムをダウンロードしマイクロビットに転送して演奏できるか確認してみましょう。
なお、このピアノモジュールは3オクターブの範囲の音を鳴らすことが出来ます。オクターブを変えるにはピアノの鍵盤の左側にある▲▼をタッチします。

音楽を演奏する

 それでは次にプログラムから音を鳴らしてみましょう。このピアノモジュールはスピーカーとして使うこともできます。つまり「音楽」のブロックをそのまま使う事ができます。
 以下のようにすると「歓喜の歌」が一度だけ演奏されます。

 JavaScriptコードでは以下のようになります。basic.forever〜のブロックは実際には不要ですが、ブロック内には何も書く必要がない、という意味合いで載せてあります。

music.beginMelody(music.builtInMelody(Melodies.Ode), MelodyOptions.Once)
basic.forever(function () {

})

鍵盤を押したら音を鳴らす

 次に鍵盤を押したら音を鳴らしてみましょう。鍵盤が押されたかどうかは「key [K0] is pressed」ブロックを使います。

このブロック内で指定できるK0〜K14と鍵盤は以下のように対応しています。

 鍵盤のうち白鍵の「ドレミファソラシド」をタッチしたら対応した音を鳴らすには図のようにブロックを組み上げます。

 JavaScriptコードでは以下のようになります。(なお、2019/3/19時点でコード入力後、ブロックエディタに切り替えると一部期待通りにブロックが反映されない部分があります)

basic.forever(function () {
    if (Kitronik_Piano.keyIsPressed(Kitronik_Piano.PianoKeyAddresses.PIANO_ID_KEY_K9)) {
        music.playTone(262, music.beat(BeatFraction.Whole))
    }
    if (Kitronik_Piano.keyIsPressed(Kitronik_Piano.PianoKeyAddresses.PIANO_ID_KEY_K10)) {
        music.playTone(294, music.beat(BeatFraction.Whole))
    }
    if (Kitronik_Piano.keyIsPressed(Kitronik_Piano.PianoKeyAddresses.PIANO_ID_KEY_K11)) {
        music.playTone(330, music.beat(BeatFraction.Whole))
    }
    if (Kitronik_Piano.keyIsPressed(Kitronik_Piano.PianoKeyAddresses.PIANO_ID_KEY_K12)) {
        music.playTone(349, music.beat(BeatFraction.Whole))
    }
    if (Kitronik_Piano.keyIsPressed(Kitronik_Piano.PianoKeyAddresses.PIANO_ID_KEY_K13)) {
        music.playTone(392, music.beat(BeatFraction.Whole))
    }
    if (Kitronik_Piano.keyIsPressed(Kitronik_Piano.PianoKeyAddresses.PIANO_ID_KEY_K14)) {
        music.playTone(440, music.beat(BeatFraction.Whole))
    }
    if (Kitronik_Piano.keyIsPressed(Kitronik_Piano.PianoKeyAddresses.PIANO_ID_KEY_K6)) {
        music.playTone(494, music.beat(BeatFraction.Whole))
    }
    if (Kitronik_Piano.keyIsPressed(Kitronik_Piano.PianoKeyAddresses.PIANO_ID_KEY_K7)) {
        music.playTone(523, music.beat(BeatFraction.Whole))
    }
})

プログラムをマイクロビットに転送して動作を確認してみましょう。白鍵を押すと音が鳴りますが、黒鍵では音は鳴りません。
鍵盤を押して音がなるだけでは面白くないので鍵盤を押したらマイクロビットのLEDに数字を表示してみましょう。もちろん、数字でなく文字やアイコンでも構いません。

押した鍵盤に対応する数値を表示するプログラムは以下のようになります。

 JavaScriptコードでは以下のようになります。(なお、2019/3/19時点でコード入力後、ブロックエディタに切り替えると一部期待通りにブロックが反映されない部分があります)

basic.forever(function () {
    if (Kitronik_Piano.keyIsPressed(Kitronik_Piano.PianoKeyAddresses.PIANO_ID_KEY_K9)) {
        music.playTone(262, music.beat(BeatFraction.Whole))
        basic.showNumber(1)
    }
    if (Kitronik_Piano.keyIsPressed(Kitronik_Piano.PianoKeyAddresses.PIANO_ID_KEY_K10)) {
        music.playTone(294, music.beat(BeatFraction.Whole))
        basic.showNumber(2)
    }
    if (Kitronik_Piano.keyIsPressed(Kitronik_Piano.PianoKeyAddresses.PIANO_ID_KEY_K11)) {
        music.playTone(330, music.beat(BeatFraction.Whole))
        basic.showNumber(3)
    }
    if (Kitronik_Piano.keyIsPressed(Kitronik_Piano.PianoKeyAddresses.PIANO_ID_KEY_K12)) {
        music.playTone(349, music.beat(BeatFraction.Whole))
        basic.showNumber(4)
    }
    if (Kitronik_Piano.keyIsPressed(Kitronik_Piano.PianoKeyAddresses.PIANO_ID_KEY_K13)) {
        music.playTone(392, music.beat(BeatFraction.Whole))
        basic.showNumber(5)
    }
    if (Kitronik_Piano.keyIsPressed(Kitronik_Piano.PianoKeyAddresses.PIANO_ID_KEY_K14)) {
        music.playTone(440, music.beat(BeatFraction.Whole))
        basic.showNumber(6)
    }
    if (Kitronik_Piano.keyIsPressed(Kitronik_Piano.PianoKeyAddresses.PIANO_ID_KEY_K6)) {
        basic.showNumber(7)
        music.playTone(494, music.beat(BeatFraction.Whole))
    }
    if (Kitronik_Piano.keyIsPressed(Kitronik_Piano.PianoKeyAddresses.PIANO_ID_KEY_K7)) {
        music.playTone(523, music.beat(BeatFraction.Whole))
        basic.showNumber(8)
    }
})

鍵盤を押したら音を鳴らすのではなく鍵盤ごとに曲を演奏させてみるのもよいでしょう。
本家のサイトでも映像で紹介されていますが、コントローラー(制御スイッチ)としても使うことができます。アイデア次第で音楽を演奏する以外にも利用できるということになります。
また、このピアノモジュールはマイクロビットのすべての端子への接続が用意されていますので、いろいろ応用範囲は広いでしょう。

著者 古籏一浩
プログラミングをベースにして面白そうなものはとりあえずやってみるというスタンス。複雑なものよりシンプルで楽しめるものが好み。最近は30年前に移植したゲーム(mz-700版 SPACE HARRIER)の話などを書いたりしています。
著者サイト:http://www.openspc2.org/