AndroidのAutomateで、以下の要件を持つプログラムを作ってみました。
- Bluethoothイヤホンで音楽を聴いているとき
- 音量+、音量+、音量-、音量-、の順に、それぞれのボタン操作が一定時間内で押されたとき、現在の時間を読み上げる
- 音量+、音量-、音量+、音量-、の順に、それぞれのボタン操作が一定時間内で押されたとき
- 15秒先送りする
- 音量-、音量+、音量-、音量+、の順に、それぞれのボタン操作が一定時間内で押されたとき
- 30秒巻き戻す
- 音量-、音量-、音量+、音量+、の順に、それぞれのボタン操作が一定時間内で押されたとき
- 60秒巻き戻す
また、Automateは無料版の場合、同時実行できるブロック数は30に制限されており、できるだけ少ないブロックで作りたいです
結果として、13ブロックでこの機能を持つプログラムを作ることができました
以下にブロックの詳細とブロックの数を抑えるために工夫した点を書いていきます
- スタート
- ここは特に工夫する点はありません
- 現在のボリュームをbefore_volume変数に入れます
- 現在の時間(Now)をbefore_date変数に入れます
- 2と3はまとめたかったのですが、いい方法が思いつきませんでした
- 音量が変わるまで待機し、変わったらvolume変数に現在のボリュームを入れる
- もしBluethoothイヤホンで音楽を聴いているとき
- 次に進む
- そうでないなら2に戻る
- counter変数に以下を代入する
わかりやすくjavascriptで書くとこうなります
counter = (counter = null || counter = 4) ? ? ++(volume > before_value) : (Now < before_date + 1 ? counter : "") ++ (volume > before_volume)
if (counter === 4 || counter == null) { counter = "" } counter += String(Number(volume > before_value))
- 説明すると、前回よりボリュームが大きくなっていれば"1"を、小さくなっていれば"0"をcounterに入れます
- ブロック数を節約するため、一文で書けるように工夫しています
- if文です #counter = 4 && !!matches(counter, "^(1100|1010|0101|0011)$")
- automateで複雑な処理をさせるとブロック数が多くなりがちなので、正規表現を使い、複雑な処理をさせ、かつブロック数の節約をしています
- trueなら8へ
- falseなら2へ
- 再生中の音楽の現在の位置をcurrent_positionにいれ、音楽の長さをmedia_durationに入れ、音楽のタイトルをmedia_titleに入れる
- if文です counter != "1100"
- counterが"1100"な10へ
- そうでないなら11へ
- オーディオを以下の位置にシークさせる
max(min( current_position + ({ "1010": 15, "0101": -30, "0011": -60 })[counter], media_duration ),0)
- ワンライナーです
- その後2に戻る
- 失敗しても5回まではリトライするブロックです
- 音声合成のプログラムが裏で落ちてることがあるのでその対策です
- 読み上げの音声合成プログラムを実行できるようにします
- dateFormat(Now, "HH:mm")をしゃべらせ、Audio fucusをmedia_titleにラジオがヒットしたら0x2、そうでないなら0x3にします
- ラジオの場合は一時停止してから読み上げ、そうでないなら音楽のボリュームを下げてから読み上げます
- その後、2に戻ります