マイクロビットでは音を鳴らすことができますが、ここで鳴らすことができるのは「ピー」という単純な電子音です。
楽器のようなおもちゃをつくろうと思うと、もう少しそれっぽい音が鳴らせたらいいなぁと思います。
マイクロビットV2では「createSoundExpression」というブロックで少し複雑な音をつくることができそうなので、これを使って音づくりを試してみることにしました。できれば「ウクレレ」のような音をつくりたいと思います。
音の減衰の具合(音量の時間変化)を表すパラメータに「ADSRエンベロープ」というものがあるそうです。
「アタック」「ディケイ」「サステイン」「リリース」という4つの要素の組み合わせで音量の変化を表します。ウクレレなどの弦楽器では以下のような波形になるそうです。
「createSoundExpression」ブロックを並べて、この波形を再現してみました。「音を鳴らす(サイン波)」という関数にしました。
Aボタンを押すと普通の電子音で、Bボタンを押すと「音を鳴らす(サイン波)」関数で、それぞれ「ラ」の音(440Hzの音)が鳴ります。
実際に音を鳴らしてみました。最初に鳴っているのが普通の電子音、ふたつめに鳴っているのが今回つくった「音を鳴らす」関数の音です。
なぜか、Aボタンで普通の電子音を鳴らすと、実際よりも少し低い音程で音が鳴ってしまいますが、「音を鳴らす(サイン波)」関数では、思ったとおりに音量を減衰させることができました。普通の電子音よりは少しウクレレっぽい音になりました。
次に、そもそものベースになる音色ですが、マイクロビットでは複雑な音色を表現することはできなさそうです。
ただ、先ほどの「createSoundExpression」ブロックで、波形の形状を数種類から選択できるので、それらによる音色の違いを確認してみます。
「createSoundExpression」ブロックをクリックしてエディタを開くと、波形の形状として「サイン波」「方形波」「ノコギリ波」「三角波」「雑音」が選択できます。このうち「雑音」を除く4つの波形について、音色を比較してみます。
プログラムはこちらです。
Bボタンを押す度に音色が切り替わります。Aボタンを押すと設定した波形で「ラ」の音が鳴ります。
音を鳴らしてみました。最初から順に「サイン波」「方形波」「ノコギリ波」「三角波」の音が鳴っています。
いずれも単純な波形なので音色に深みはありませんが、「方形波」「ノコギリ波」はややとがった音、「サイン波」「三角波」は柔らかめの音です。これらの中では「三角波」が最もウクレレの音に近いように感じました。
この後、「ADSRエンベロープ」の各値を若干調整し、「T1=10」「T2=300」「L2=0.4」「T3=1300」「L3=0.2」「T4=1600」とすることにしました。
さて、この音でメロディを鳴らそうと思うと、少し難しい問題が生じます。
マイクロビットでは複数の音を同時に鳴らすことができないので、音が鳴っている途中で他の音を鳴らそうと思うと、事前に鳴っている音を止めなければなりません。
単純な電子音(ひとつのブロック)であれば、「すべての音を停止する」ブロックで音を止めることができますが、今回のように複数のブロックを並べて音を鳴らしている場合、再生中の音を止めても次のブロックの音がなってしまい、全ての音を停止することができません。
ChatGPTに質問したりして、対策を検討しました。
まず、音を鳴らしている間も他の処理を受け付けるように、音を鳴らす処理自体をバックグラウンドで実行します。
音が鳴っていないときにAボタンを押されると、変数「演奏する」を「真」にします。バックグラウンドで変数「演奏する」の状態を常時監視し、「真」になると「音を鳴らす」関数を呼び出します。この関数の実行が完了すると、変数「演奏する」を「偽」に戻します。
また、音が鳴っている状態かどうかを、変数「演奏中」で判断します。
音が鳴っているときにAボタンが押されると、変数「演奏中」を「偽」にします。この変数が「偽」になると、「音を鳴らす」関数内の処理がスキップされるので、速やかに音が止まります。
音が鳴っているときにAボタンを押されると、同時に変数「再演奏する」も「真」にします。この変数が「真」になると、「音を鳴らす」関数内で再度「音を鳴らす」関数が呼び出されます。これらにより、音が鳴っているときにAボタンを押すと、鳴っている途中の音が速やかに止まった後、続けて次の音が鳴ります。
できあがったプログラムはこちらです。
かなり煩雑なプログラムになってしまいましたが、Aボタンを押すと、音が鳴っている途中かそうでないかに関わらず、新たに「ラ」の音が鳴ります。
ようやくやりたいことができました。
最後にこの仕組みを使って、実際にメロディを鳴らしてみます。
Aボタンを押すと従来の電子音で、Bボタンを押すと今回つくった音色で、それぞれ同じメロディが鳴ります。
プログラムはこちらです。
実際に鳴らしてみました。最初に鳴っているが普通の電子音、次に鳴っているのが今回の方法で鳴らしたメロディです。
電子音では味気ない音色でメロディが再生されるだけですが、今回つくった音を使うと、まあまあいい感じのメロディになりました。
最初にマイクロビットの再生音を変えたいと思った時は、それほど大層なことだとは思っていませんでしたが、実際にやってみると思っていた以上に大変でした。
それでも色々と工夫し、なんとか所望の音でメロディを鳴らすことができるようになりました。