Alexa Presentation Language for Audio (APLA)にてビートを作る

# 前提
以下の前提となります。

- 読者はAPL or APLA の概要を何となく理解している。(ドキュメント部分とデータソース部分に分かれている、くらいの内容)
- APLおよびAPLAをスキルのコードに組み込む部分はこの記事では記載しない。

なお、今回のサンプルコードはAPLAのシミュレータに貼り付ければそのまま使えますので、参考にしてみてもらえればと思います。

# やったこと

Alexa Presentation Language for Audio(以下APLA)にて、リズムに合わせて効果音を鳴らし、ビートを作ってみます。ここでは8拍分としました。
音素材は自作するといいと思いますが、今回は [Alexa Skill Kitサウンドライブラリ](https://developer.amazon.com/ja-JP/docs/alexa/custom-skills/ask-soundlibrary.html) から使えそうなものを引っ張ってきて使います。
いい感じのドラムビート音源とかあれば良かったのですが、見つからなかったので、メトロノームみたいなビートになっちゃいました…ご了承ください。

# ドキュメント部
ビート部分と音素材部分にわけて、重ねています。

## ソース

以下のような感じにしました。

``` document.json
{
    "type": "APLA",
    "version": "0.9",
    "description": "Data部のbeatUnitの値に合わせて音を鳴らします。",
    "resources": [],
    "compositions": {
        "Beat": {
            "parameters": [
                {
                    "name": "source",
                    "type": "string"
                },
                {
                    "name": "length",
                    "type": "number"
                },
                {
                    "name": "delay",
                    "type": "number"
                }
            ],
            "items": [
                {
                    "type": "Audio",
                    "filter": [
                        {
                            "type": "Trim",
                            "start": "${delay}",
                            "end": "${delay + length}"
                        }
                    ],
                    "source": "${source}"
                }
            ]
        }
    },
    "mainTemplate": {
        "parameters": [
            "aplaData"
        ],
        "item": {
            "type": "Sequencer",
            "items": [
                {
                    "type": "Speech",
                    "contentType": "SSML",
                    "content": "ミュージック、<break time='100ms'/><prosody pitch='+20%'>スタート</prosody>！！！"
                },
                {
                    "type": "Mixer",
                    "description": "Mixerは、要素を同時再生する。",
                    "items": [
                        {
                            "type": "Sequencer",
                            "description": "こっちはビート部分",
                            "items": [
                                {
                                    "type": "Beat",
                                    "source": "${aplaData.mainBeat.url}",
                                    "length": "${aplaData.beatUnit}",
                                    "delay": "${aplaData.mainBeat.delay}"
                                },
                                {
                                    "type": "Beat",
                                    "source": "${aplaData.mainBeat.url}",
                                    "length": "${aplaData.beatUnit}",
                                    "delay": "${aplaData.mainBeat.delay}"
                                },
                                {
                                    "type": "Beat",
                                    "source": "${aplaData.mainBeat.url}",
                                    "length": "${aplaData.beatUnit}",
                                    "delay": "${aplaData.mainBeat.delay}"
                                },
                                {
                                    "type": "Beat",
                                    "source": "${aplaData.mainBeat.url}",
                                    "length": "${aplaData.beatUnit}",
                                    "delay": "${aplaData.mainBeat.delay}"
                                },
                                {
                                    "type": "Beat",
                                    "source": "${aplaData.mainBeat.url}",
                                    "length": "${aplaData.beatUnit}",
                                    "delay": "${aplaData.mainBeat.delay}"
                                },
                                {
                                    "type": "Beat",
                                    "source": "${aplaData.mainBeat.url}",
                                    "length": "${aplaData.beatUnit}",
                                    "delay": "${aplaData.mainBeat.delay}"
                                },
                                {
                                    "type": "Beat",
                                    "source": "${aplaData.mainBeat.url}",
                                    "length": "${aplaData.beatUnit}",
                                    "delay": "${aplaData.mainBeat.delay}"
                                },
                                {
                                    "type": "Beat",
                                    "source": "${aplaData.mainBeat.url}",
                                    "length": "${aplaData.beatUnit}",
                                    "delay": "${aplaData.mainBeat.delay}"
                                }
                            ]
                        },
                        {
                            "type": "Sequencer",
                            "description": "こっちは音素材をリズムに合わせて連発させている部分",
                            "items": [
                                {
                                    "type": "Beat",
                                    "source": "${aplaData.trumpet.url}",
                                    "length": "${aplaData.beatUnit}",
                                    "delay": "${aplaData.trumpet.delay}"
                                },
                                {
                                    "type": "Beat",
                                    "source": "${aplaData.trumpet.url}",
                                    "length": "${aplaData.beatUnit}",
                                    "delay": "${aplaData.trumpet.delay}"
                                },
                                {
                                    "type": "Beat",
                                    "source": "${aplaData.blast.url}",
                                    "length": "${aplaData.beatUnit}",
                                    "delay": "${aplaData.blast.delay}"
                                },
                                {
                                    "type": "Silence",
                                    "duration": "${aplaData.beatUnit}"
                                },
                                {
                                    "type": "Beat",
                                    "source": "${aplaData.trumpet.url}",
                                    "length": "${aplaData.beatUnit * 2}",
                                    "delay": "${aplaData.trumpet.delay}"
                                },
                                {
                                    "type": "Beat",
                                    "source": "${aplaData.blast.url}",
                                    "length": "${aplaData.beatUnit}",
                                    "delay": "${aplaData.blast.delay}"
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    }
}
```
## 解説

- "compositions"は独自の要素を定義することができます。APLで言うところの"Layouts"ですね。
- "Beat"というものを定義していて、その中に"delay"と"length"というプロパティを定義しています。これで音源の再生開始位置と再生時間を調整しています。
- "Mixer"を使うと複数の音源を同時に再生することができます。ここでビート部分と音源部分に分けて記載しています。
- ビート部分ではリソース部分に定義したmainBeatを連発することでメトロノームのような音を鳴らしています。
- 音源部分では様々な音源を様々なタイミングで鳴らしています。
- 音源部分の無音部分は、"Silence"を使って時間の調整をしています。

# リソース部
これまでデータソース部って呼んでたんですが、公式ドキュメントではリソース部っていうんですね。
→[リソース（APL for Audio）](https://developer.amazon.com/ja-JP/docs/alexa/alexa-presentation-language/apla-resources.html)
こちらでは、再生速度と音素材のような変数的な要素を定義しています。

## ソース
リソース部のソースは以下のような感じです。

``` datasource.json
{
    "aplaData": {
        "beatUnit": 500,
        "mainBeat": {
            "url": "soundbank://soundlibrary/clocks/ticks/ticks_04",
            "delay": 0
        },
        "trumpet":{
            "url": "soundbank://soundlibrary/musical/amzn_sfx_trumpet_bugle_04",
            "delay":20
        },
        "blast": {
            "url": "soundbank://soundlibrary/magic/amzn_sfx_magic_blast_1x_01",
            "delay": 0
        }
    }
}
```
## 解説
ざっくり説明すると、以下のような感じです。

- beatUnitは、一拍の長さの定義となります。ここでは500にしています。500msを一拍として使う感じです。
- サウンドライブラリの音源を使う場合は、上記の通り"soundbank:~"以降の部分を記載すればOKです。

# 注意点
以下あたりに注意が必要です。

- 音素材の再生時間が短い場合、音がなるタイミングがずれてしまうのでで、うまいこと調整が必要

# まとめ、所感
音素材を繋ぎ合わせて音楽を作ることってDAWソフトとか使えば簡単にできると思います。
なので、決まった音楽を作るためにこの方法を使うのはナンセンスだと思います。
どちらかというと、Alexaスキルの中で動的に音源を鳴らし分けたいとかそういう時に有効かなと思います。
ものすごいがんばったら音素材を使ったシーケンサーとかAlexaスキルで作れるかもしれません。

# 参考リンク
[APL for Audioリファレンス](https://developer.amazon.com/ja-JP/docs/alexa/alexa-presentation-language/apl-for-audio-reference.html)
[Alexa Skill Kitサウンドライブラリ](https://developer.amazon.com/ja-JP/docs/alexa/custom-skills/ask-soundlibrary.html)