マイクロビットで、メロディを鳴らしながら、並行して別の処理も行いたいというケースがあります。
例えば、Aボタンを押したときに、メロディを鳴らしながらLED画面にアイコンを3回点滅させたい場合、以下のようなプログラムでは、メロディが終わってからLED画面の点滅が始まってしまいます。ふたつの処理は並行して実施されません。
これに対し、「鳴らす メロディ XXX」ブロックのオプションで「終わるまで」を「バックグラウンドで一度だけ」に変更すると、所望のとおり、メロディが鳴っている途中に並行してLED画面を点滅させることができます。
さて、「鳴らす メロディ」ブロックにあらかじめ組み込まれているメロディについては、上記の方法で他の処理と並行して鳴らすことができましたが、オリジナルのメロディ(音符をひとつひとつ並べて関数にしたメロディ)についてはこの方法が使えません。
例えば以下のようなプログラムでは、Aボタンを押すと「メロディ1」の演奏が終了してからLED画面の点滅が始まってしまいます。
オリジナルのメロディを鳴らしながら、並行して別の処理を実行することができないか、ChatGPTに聞いてみました。
なかなかまともな回答が得られませんでしたが、何度か質問を繰り返した結果、なんとか所望の処理をさせることができるようになりました。
具体的には、メロディを鳴らすために「高度なブロック」>「制御」にある「バックグラウンドで実行する」ブロックを使います。
この「バックグラウンドで実行する」ブロックは、マイクロビット起動後の1回しか実行されないとのことなので、このブロックの中に無限ループ(「もし 真 ならくりかえし」ブロック)を入れておきます。
無限ループの中で、「フラグ」が「1」の時のみ「メロディ1」関数を呼び出すようにします。
ボタンAが押されたときに「フラグ」を「1」にすることで、バックグラウンドでオリジナルのメロディを鳴らすことができます。
プログラムは以下のとおりです。
あらかじめ組み込まれているメロディなら、ブロックのオプションで「バックグラウンドで一度だけ」を選択するだけで実現できるのに比べると、今回の方法はかなり煩雑な内容になってしまいましたが、ともかく所望の処理を実現することができました。