Swift Playgroundsで学ぶiOSプログラミング 第57回
2点間をリピート再生可能
ABリピートも可能なレベルメーター付きオーディオプレーヤーを作る
2017年10月24日 17時00分更新
前々回から、AVFoundationのAVAudioPlayerを使ったオーディオプレーヤーを作成しています。前回は、その前に作った単純なオーディオプレーヤーに、再生の進行状況を刻々と表示するスライダー追加し、ユーザーがそのスライダーを操作することで、任意の場所からの再生を可能にするところまで作り込みました。
今回はそこにさらに手を加えて、音楽ファイルの再生時間軸上の2点、A点とB点を設定し、その間でリピート再生する、いわゆるABリピートの機能を付け加えてみることにします。そのための機能が特にフレームワークに用意されているわけではありません。ただし、前回わかったように、音楽ファイルの任意の位置から再生するのは比較的簡単です。今回は、その機能だけを使ってABリピートを実現します。
さらに、再生音のレベルを左右のチャンネル別々に棒グラフ状にアニメーション表示するメーターも付け加えます。こちらは、再生位置のレベルを取得する機能がAPIとして用意されているので、それを利用します。表示には元来は処理の進行状況などを表示するためのプログレスバーを使うことにしましょう。
こうした機能の追加によって、さらにオーディオプレーヤーらしいプログラムになるはずです。
A点B点を設定するボタンを追加する
すでに述べたように、特にABリピートを実現するためのAPIがあるわけでもないので、自由に設計することにします。また、プレイグランドという不自由な環境でもあるため、UIはできるだけシンプルなものにしたいところです。というわけで、すでに稼働している時間スライダーを利用してA点B点を設定するものを考えました。
UIとしては、A点とB点それぞれに、ボタン(UIButton)とラベル(UILabel)を用意し、A点のボタンをタップしたときの再生時間のスライダーの位置をA点とします。その値はA点のラベルに表示し、同時にA点の位置として変数にも記憶します。B点についてもまったく同じことを実行します。そして、A点が0でないか、B点が音楽ファイルの長さに一致していない場合、要するにA点かB点のどちらかでも動かされている場合には、リピートモードだと判断することにします。その状態も変数に記憶しておいて、あとで再生中にその状態に応じた処理を実行します。
ここまでを実現するプログラムを見ておきましょう。なお今回も、前回の最後の状態のプログラムに手を加えていきます。まず、A点、B点用のボタン(posAButton/posBButton)とラベル(posALabel/posBLabel)をビューコントローラーのプロパティとして用意します。またA点とB点の位置(秒)を記憶する変数として、positionAとpositionBを用意し、それぞれ0.0に初期化しておきます。さらにリピートモードかどうかを記憶する真偽値の変数repPlayも用意します。
ボタンは、viewDidLoadメソッドの中で初期化しておきます。ボタンのタイトルは、それぞれ「A Position」と「B Position」とし、ボタンの背景色は茶色にしてみました。また、ユーザーがボタンをタップした際のターゲットとして、それぞれposAButtonTappedとposBButtonTappedというメソッドが呼ばれるように設定します。A点の実際の時間は0.0に、B点は音楽ファイルの長さに初期化しておきます。またラベルも、それぞれの値を表示するように設定します。ボタンとラベルは、いずれもビューコントローラーのビューに張り付けておくことを忘れないようにしましょう。
A点、B点のボタンとラベルは、例によってviewWillLayoutSubviewsメソッドの中で配置を決めておきます。ここでは、Aボタン、Aラベル、Bボタン、Bラベルが、すべて横一列に同じY軸位置に並ぶようにしてみました。A点のセットは、画面の左端から10ポイント右の位置から、B点のセットは画面の左右方向の中央から10ポイントだけ右の位置から、それぞれ右方向に向かって配置しています。
この連載の記事
- 第100回 SceneKitの物理現象シミュレーションとアニメーションをARKitに持ち込む
- 第99回 「物理学体」と「物理学場」を設定して物理現象をシミュレーション
- 第98回 SceneKitのノードに動きを加えるプログラム
- 第97回 いろいろな形のノードをシーンの中に配置する
- 第96回 SceneKitの基礎シーンビュー、シーン、ノードを理解する
- 第95回 現実世界の床にボールや自動車のモデルを配置する
- 第94回 ARKitを使って非現実世界との融合に備える
- 第93回 ARKitが使えるiPadを識別するプログラム
- 第92回 Swift Playgrounds 2.1での問題点をまとめて解消する
- 第91回 iPadの内蔵カメラで撮影した写真を認識するプログラム
- この連載の一覧へ