iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
Objective-Cベースのフレームワークであるという事から察せられるとおり、最上位層のAPIということになると思う。iOS 4からAVAssetと呼ばれる、複数の動画や音声データをひとかたまりのグループとして扱える機能が追加され、 iMovieのような編集ソフトがより簡単に作る事が出来るようになった思われる。ループペダル・アプリケーションでの利用という観点からも、複数の音声データを同期して再生するのに利用できるのではと期待できる。
追加するフレームワークは、『AVFoundation.framework』。インポートするヘッダ・ファイルは『AVFoundation/AVFoundation.h』だ。
デモ・アプリケーションでは、基本的な動作の確認という観点から、AVAssetを使用しない例と鳴っている。
まず、コントローラとなるクラスがデリゲートになるよう、(形式)プロトコルを設定する。
@interface AVFoundationViewController : UIViewController
<AVAudioPlayerDelegate, AVAudioRecorderDelegate, AVAudioSessionDelegate>
:
@end
4秒間、録音するコードは、以下のとおり。
NSArray *filePaths = NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentDir = [filePaths objectAtIndex:0];
NSString *path = [documentDir stringByAppendingPathComponent:@"demoaudio.caf"];
NSURL *recordingURL = [NSURL fileURLWithPath:path];
:
NSError *error = nil;
AVAudioRecorder *recorder = [[AVAudioRecorder alloc] initWithURL:recordingURL
settings:nil error:&error];
:
recorder.delegate = self;
[recorder recordForDuration:4.0];
:
録音したデータの保存先となるdemoaudio.cafのパスからNSURL変数を生成し、AVAudioRecorderクラスの生成時に渡して、- (BOOL)recordForDuration:を呼べば、録音が開始される。
再生も同様だ。
NSError *error = nil;
AVAudioPlayer *player = [[AVAudioPlayer alloc]
initWithContentsOfURL:recordingURL error:&error];
:
player.delegate = self;
[player play];
:
サンプル・コードでは、AVAudioPlayerクラスの初期化時にNSURL変数を渡しているが、NSData変数を渡す方法もある。ファイル経由だと再生の頭に遅延が発生する事が懸念されるので、楽器であるループペダルという観点から、気になるところだ。そして、- (BOOL)playメソッドを呼べば再生が開始する。
AVFoundationを使用した方法は、今後のiOSのフレームワークの方向性を考えると、ループペダルの実装方法の候補としては有力だ。
ただし、気になるのは録音先がファイルであること。そして、録音と再生の同期。
上手く説明が出来ないが、もっと、そもそものループペダルの仕組みに物理的に近い(ソフトなのに変な表現だが)方式が、いいのではないかと思っている。