iOS18用のスマートなスリープタイマー
はじめに
まさしく寝る時のためにスリープタイマーをかけて音楽を再生しているのだけど、スリープタイマーが切れるまで眠れないときもあったりして。
そうすると突然曲がブツっと止まって、逆に目が覚めてしまったり。
というかそもそも、曲の頭で音が大きかったりするとそこでも目覚めたり。
ということで、曲の終わりで止まってくれるスリープタイマーがほしい。
おまけ:iOS18にアップデートしていない人向け
今まではiOSのショートカット作成機能にある「”次に再生”を消去」を使っていた。
1曲ループ再生にしていようが、「”次に再生”を消去」が実行されると再生中の曲が終わり次第再生が止まっていたので、これで問題なかった。
あとは適当に数字を入力させて60を掛けて待機していたのだけど。
これがiOS18になって突然機能しなくなった。
何が原因か測りかねていたのだけど、おそらく「次に再生」が割り込み用のリストとして独立したんじゃないかと思う。
なので、普通にアルバムを再生しているだけでは「次に再生」のリストが元々空なので何も起きなかった…ということなんじゃないだろうか。
ということでiOS18にアップデートしていない人は「”次に再生”を消去」を使用すれば大丈夫です。
実装方法
従来の「”次に再生”を消去」で再生リストを全て削除して停止させる方法が使えなくなったので、別の方法を考えることにする。
とりあえずここは無難に「曲の終わりになったら一時停止する」でいこうと思う。
ソースコード
コード解説
ショートカットの詳しい使い方とかは別のサイトを参考にしていただいて。
1.再生している曲の総再生時間を取得する
「現在の曲を取得」で再生中の曲を取得し、「ミュージックの詳細を取得」で「継続時間を現在の曲から取得」に設定する。
わかりやすいように「変数に追加」で「継続時間を総再生時間に追加」にする。「総再生時間」は変数名なので適当でいい。
どうやら曲全体の再生時間を「継続時間」と表現するらしい。ふざけるな。
2.現在の再生位置から残り時間を計算する
「現在の曲を取得」で今度は「現在の再生時間を取得」に設定する。
そうしたら「計算」で「総再生時間 - 現在の再生時間」に設定する。
わかりやすいように「変数に追加」で「計算結果を残り時間に追加」にする。「残り時間」は変数名なので適当でいい。
3.曲の頭が再生されないようにする
このままだと一時停止のタイミングがピッタリすぎて曲の頭だけ一瞬再生されかねないので、曲の末尾を削ることにする。
またも「計算」で「残り時間 - 1」に設定する。
わかりやすいように「変数に追加」で「計算結果を末尾カットに追加」にする。「末尾カット」は変数名なので適当でいい。
これで最後の1秒は再生されなくなる。
が、どんな曲でも最後の1秒が再生されなくなるので、あまり賢い方法とは言えない。もっと賢い方のご意見、お待ちしております。
4.待機して曲を止める
「待機」を使い「末尾カット待機」に設定する。
「再生 / 一時停止」で「iPadで一時停止」にしたら晴れて実装終了。
お疲れ様でした。
その他
汎用性
Nintendo Musicにも使えるかな?と思ったが、計算結果がマイナスになってしまい正しく機能していなかった。
まぁApple謹製のアプリじゃないので仕方ない。
誤動作?
が、そもそもiOSのミュージックアプリでも時々正しく動いていないことがあるような気がする。
昨日作ってまだ一晩しかテストしていないので、詳しいことが分かり次第追記する…と思う。たぶん。
四捨五入
「端数を処理」で四捨五入ではなく切り捨てができるらしいので、小数点以下を切り捨てればもっとギリギリまで曲を再生できるのではないだろうか?
まだ試していないので、変更して気が向いたら追記する。
有識者のご意見、お待ちしております。