日曜日, 2月 08, 2015

iOS開発再入門 2 サウンドファイルを鳴らす

ボタンを押すと音が鳴るサンプルを作る

まずはシンプルなところから始めることにする。新規にプロジェクトを作成し、iOS Applicationから「Single View Application」を選択する。Languageを「Swift」にしDevicesは「Universal」にする。Use Core Dataのチェックは外す。

Main.storyboardを選択状態にし、UtilitiesからButtonをドラッグし、Storyboard上のView Controllerにドロップ。

controlキーを押しながらボタンをクリックし、上(か下)に少し動かして離すとレイアウト用の設定ウィンドウがポップアップする。

Center Horizontally Container
を選ぶと、水平方向にセンタリングされる。同様に右(か左)に少し動かして離し、
Center Vertically Container
を選んで垂直方向のセンタリングを設定する。これで画面の中央にボタンが置かれる。このように設定した内容は「Constraints」としてViewに紐付いたレイアウトのルールになる。

Assistant editorを開く(Xcode右上の丸が2つ重なったアイコンをクリックする)と、ViewController.swiftが表示されるので、controlキーを押しながら先ほど追加したボタンをクリックし、ViewController.swift上にドラッグすると「Insert Outlet, Action, or Outlet Collection」と出る。Connectionを「Action」、NameをplaySound、Typeを「UIButton」、Storageを「Weak」にして「Connect」をクリックすると、このボタンを押した時に実行されるメソッドが作成される。

最終的なViewController.swiftは以下。

import UIKit
import AVFoundation

class ViewController: UIViewController {
    
    var audioPlayer: AVAudioPlayer!

    override func viewDidLoad() {
        super.viewDidLoad()

        var error: NSError?
        let fileURL: NSURL? = NSBundle.mainBundle().URLForResource("BassC1", withExtension: "caf")!
        audioPlayer = AVAudioPlayer(contentsOfURL: fileURL!, error: &error)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    @IBAction func playSound(sender: UIButton) {
        audioPlayer.stop()
        audioPlayer.play()
    }

}

AVFoundationフレームワークを利用して音声ファイルを鳴らすため、ViewController.swiftの冒頭でimportする。AVAudioPlayerのインスタンスを保持する変数audioPlayerを宣言。「!」はImplicitly Unwrapped Optional型であり、ImplicitlyUnwrappedOptional<T>の簡略化した書き方(シンタックスシュガー)である。Optional型の「?」も同様にOptional<T>のシンタックスシュガー。Tには任意の型名が入る。

Optional型から元の型を取り出すのに「!」をつけてアンラップするのだが、Implicitly Unwrapped Optional型にはその必要がない。

Viewが読み込まれた後に実行される

viewDidLoad()
の内部でAVAudioPlayerオブジェクトを作り、先ほど作った
playSound(sender: UIButton)
の内部で音を鳴らす処理を書く。音声ファイルはXcodeのSupporting Filesの中に置いておく。ファイルのパスはファイル名と拡張子を指定するだけで、どこに置いていてもうまく処理してくれるので、分かりやすいようにしておけばよい。

ビルドするとシミュレータが起動し、ボタンが画面の中央に配置され、クリックすると音が鳴る。単純に考えると、この作業を30回繰り返せばほぼできてしまいそうな感じだが、設計として美しくない(同じような処理をするメソッドが複数できてしまう)し、問題は他にもある。

おそらくAVAudioPlayerは長めの音声ファイルを再生するために作られており、Dropophoneのように短い音声ファイルを遅延なしで再生するのには向いていないかも知れないということ。複数の音を同時に鳴らすことができるかも不安だし、音量がクリップしてしまう可能性もある。

これらの問題については次回以降で考えるが、とにかくUdacityのコースが素晴らしい。Xcodeの各パネルの名称や使い方、フレームワークの構成、ヘルプやドキュメントの読み方、プログラムを組み立てるための問題の切り分け方、Googleでの検索方法やStack Overflowの読み方、Objective-CやSwiftのコードから処理を推測する方法など、実際の開発作業で必要な内容を一通り体験できる。英語も平易で聞き取りやすい。

0 件のコメント: