Playableなメロディーを宣言して鳴らす

# 一般的な音楽プログラム

micro:bitでは、音を鳴らすことができ、一般的に `音を鳴らす` ブロックを使います。

https://makecode.microbit.org/reference/music/ring-tone

[**micro:bitのプログラムで童謡を聴こう♪（マイクロビット不要）**](https://qiita.com/tmdoi/items/1660c61c0059a5eb978f) の記事では、 `音を鳴らす` ブロックをつなぎ合わせた音楽プログラムが季節別の童謡リストとして紹介されています。

**雪やこんこん の音楽プログラム(SnowComeCome)**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/28b9220b-56e0-30a3-4a03-a2876b578c4d.png)

https://qiita.com/tmdoi/items/1660c61c0059a5eb978f

# Playableなメロディーとは

 `音を鳴らす` ブロックをつなぎ合わせた場合、途中でメロディーを止めるためには、止める処理をコーディングする必要があります。
公式リファレンスの [**Making melodies**](https://makecode.microbit.org/reference/music/making-melodies#musical-notes) では、 **文字列の配列** を使ったメロディー(`Musical notes`)が紹介されており、 `全ての音を停止する` ブロックを使えば、このメロディーを途中で止めることができます。

**文字列の配列**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/0cd74f3f-46ea-0a3a-ed34-9a400f5f8b69.png)

https://makecode.microbit.org/reference/music/making-melodies#musical-notes

しかし、文字列の配列を使ったメロディー(`Musical notes`)では、そのコーディングが少し煩雑です。次の記事の[**「ブロックでメロディーを組み立てる」**](https://qiita.com/jp-96/items/d23539bee827fb56500d#%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%81%A7%E3%83%A1%E3%83%AD%E3%83%87%E3%82%A3%E3%83%BC%E3%82%92%E7%B5%84%E3%81%BF%E7%AB%8B%E3%81%A6%E3%82%8B) で紹介されているように [ユーザー定義の拡張機能(pxt-melody-playable)](https://github.com/jp-rad/pxt-melody-playable) を使えば、 `音を鳴らす` ブロックのようなコーディングが可能です。

https://qiita.com/jp-96/items/d23539bee827fb56500d#%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%81%A7%E3%83%A1%E3%83%AD%E3%83%87%E3%82%A3%E3%83%BC%E3%82%92%E7%B5%84%E3%81%BF%E7%AB%8B%E3%81%A6%E3%82%8B

# サンプル・プログラム

[**micro:bitのプログラムで童謡を聴こう♪（マイクロビット不要）**](https://qiita.com/tmdoi/items/1660c61c0059a5eb978f) の記事で紹介されている次の２つのプログラムを元に **Playableなメロディー** として宣言して鳴らしてみました。

- [ジングルベル の音楽プログラム](https://makecode.microbit.org/_cK179ATdafVK)
- [雪やこんこん の音楽プログラム](https://makecode.microbit.org/17319-29092-95678-23349)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/43503a34-5bfd-8e25-ed37-95c5d821276e.png)

https://makecode.microbit.org/_UCLa1Kdb44AM

**Aボタン** を押下すると **「ジングルベル」** のメロディーが **繰り返し鳴り**、 **Bボタン** を押下すると **「雪やこんこん」** のメロディーが **１回だけ鳴ります。**
**AボタンとBボタン**とを同時に押下するとメロディーが **止まります。**

## ブロックの説明

ユーザー定義の拡張機能を追加し、次のブロックを使ってコーディングしています。

<table>
<tr><th>ブロック</th><th>関数名</th><th>説明</th><th>備考</th></tr>
<tr><td>

![g6666.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/ded929cb-c440-ec08-1794-d938b4f65ff9.png)

</td><td>
melody.melodyPlayable
</td><td>
melody.declareMelodyブロックで宣言したメロディーを鳴らす。
</td><td>
メロディーのidを指定する。
</td></tr>
<tr><td>

![g7461.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/ade85d7b-3c35-ebbf-403c-bf89c3e4abd4.png)

</td><td>
melody.declareMelody
</td><td>
メロディーを宣言する。
</td><td>
メロディーにidを付与する。
</td></tr>
<tr><td>

![g6700.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/f9b18c78-bcee-b0db-550b-a6227a7bc293.png)

</td><td>
melody.scale
</td><td>
音階(scale)を追加する。
</td><td>
内部の配列に追加する。
</td></tr>
<tr><td>

![g6728.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/de7ae550-3d4f-b4fe-c3db-40c10c3c2770.png)

</td><td>
melody.rest
</td><td>
休符を追加する。
</td><td>
内部の配列に追加する。
</td></tr>
</table>

# おわりに

micro:bitで音を鳴らしてみました。

- 季節別の童謡で、一般的な音楽プログラムを確認しました。
- 途中でメロディーを止めることのできるPlayableなメロディーを紹介しました。
- [ユーザー定義の拡張機能(pxt-melody-playable)](https://github.com/jp-rad/pxt-melody-playable) を使ってPlayableなメロディーを宣言して鳴らしてみました。

https://github.com/jp-rad/pxt-melody-playable