はじめに

このチュートリアルでは、 シンプルなオーディオフィンガープリンティングiOSアプリを一から構築する方法を説明します。オーディオフィンガープリントは、小さなオーディオサンプルを取り、識別のためにそれをGracenoteに送信します。 iOSデバイスからグレースノートのメタデータにアクセスするためにMobile Clientは多数の方法を提供します。これらのほとんどはSDKのサンプルアプリケーションで実証されています。サンプルアプリをまだダウンロードしていないようでしたら、この機会にダウンロードしてみて下さい。

開発環境のセットアップ

はじめに、開発環境がセットアップされていることを確認して下さい。ここではiOSアプリを開発するので、Xcodeの4.5を使うことになります。AppleのデベロッパーセンターからXcodeをダウンロードすることができます。デバイス上でのテストを予定しているならば、開発用にプロビジョニングされていることを確認する必要があります。アップルは、プロビジョニングプロファイルを構築するための 便利なプロビジョニングツール を提供しています。

プロジェクトの作成

それでは、新しいプロジェクトを作成してみましょう。便宜上、シングルビュー・アプリケーション作ってみます。 すべてが正常に動作するためには、以下のライブラリやフレームワークを追加する必要があります。今までにこれらの作業をやった経験がないようでしたら、 こちら をチェックしてみて下さい。

  • GracenoteMusicID.framework (included in the SDK)
  • libsqlite3
  • libstdc++
  • libxml2
  • CoreMedia.framework
  • QuartzCore.framework
  • MediaPlayer.framework
  • AVFoundation.framework
  • AudioToolbox.framework
  • Security.framework

UIの作成

次に、実際にアプリを開発していきます。プロジェクトナビゲーターで、あなたがプログラミングするデバイスのストーリーボードを選択します。この場合はiPadを使用していますので、MainStoryboard_iPad.storyboardを編集します。このデモでは、ラベルとボタンを1つずつ追加してます。ラベルはアーティストの名前が表示されますので、大きくしてみましょう。ボタンを追加し、ボタンが押されたときに呼び出される関数を作成してみましょう。今は関数を空のままにします。 (このデモ では、ボタンを押すだけでUI要素とトリガー機能を追加する方法を説明します。) ストーリーボードについては以上です。とてもシンプルです。下の画像で、どういうものを作ったのか確認することができます。

 

 

アプリケーションのコーディング

このアプリでは、デバイスを介してオーディオインプットを記録しアーティスト名を表示しようと思います。これを実現する関数はrecognizeMIDStreamFromMicと呼ばれています。GracenoteMusicIDフレームワーク内部のGNOperations.hファイルで他の検索機能を探索することも可能です。(上記画像に矢印でSDKのヘッダファイルを検索する箇所を示しています。)

Gracenoteデータベースを照会するために使用されるすべてのSDK関数は、結果関数と引数としてGNConfigオブジェクトを取ります。結果関数はGNSearchResultReady プロトコルを実装する必要があります。それについては後ほど説明します。 設定オブジェクトは、とても簡単です。クライアントIDとクライアントIDタグを保存するだけです。ViewController.h ファイルには、 I've included the GNConfig.h ヘッダが含まれ、configと名付けられたGNConfig*プロパティを追加しました。ViewController.h fileファイルの全体は、次のとおりです。

#import <UIKit/UIKit.h>
#import <GracenoteMusicID/GNConfig.h>

@interface ViewController : UIViewController
@property (strong, nonatomic) IBOutlet UILabel *artistLabel;
@property (retain, nonatomic) GNConfig *config; 

@end

次にViewController.m内のviewDidLoad関数でGNConfigオブジェクトを初期化します。

- (void)viewDidLoad
{
    [superviewDidLoad];
    self.config = [GNConfig init:@"NNNNNNN-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"]; // <Client ID>-<Client ID Tag>
}

注意: Nの部分は、アカウントプロファイルの "マイアプリ"ページで確認できるあなたのクライアントIDと置き換えて下さい。

次にGNSearchResultReadyプロトコルを実装するクラスを作成する必要があります。このクラスは、フィンガープリント検索を返すときに呼び出されるGNResultReady関数を持っている必要があります。私はFPResponseというクラスでこのプロトコルを実装しました。FPResponseオブジェクトは、UILabelを指すlabelという単一プロトコルを持っています。これには次の2つの機能があります。

  • initWithLabel - ViewControllerがそのUILabelオブジェクトのいずれかへのポインタを使ってオブジェクトを初期化します。
  • GNResultReady - このラベルのテキストを設定します。フィンガープリント検索がマッチした場合、アーティスト名がラベルに書き込まれます。そうでない場合は、ラベルのテキストが "No Match" と設定されます。
//
//  FPResponse.h
//

#import <Foundation/Foundation.h>
#import <GracenoteMusicID/GNSearchResultReady.h>

@interface FPResponse : NSObject <GNSearchResultReady>
{
    
}

@property (strong, nonatomic) UILabel *label;

- (id) initWithLabel: (UILabel *) alabel;
- (void) GNResultReady:(GNSearchResult*) result;

@end
//
//  FPResponse.m
//

#import "FPResponse.h"
#import <GracenoteMusicID/GNSearchResultReady.h>
#import <GracenoteMusicID/GNSearchResponse.h>
#import <GracenoteMusicID/GNSearchResult.h>

@implementation FPResponse

@synthesize label;

- (id) initWithLabel:(UILabel *) alabel
{
    self = [super init];
    if (self)
        self.label = alabel;
    return self;
}

- (void) GNResultReady:(GNSearchResult *) result
{
    GNSearchResponse *best = [result bestResponse];
    if (![result isFailure] && (best.artist!=nil))
        [self.label setText:best.artist];
    else
        [self.label setText:@"No Match"];
}
@end

最後に、ボタンが押されたときにフィンガープリント検索を呼び出す必要があります。ViewController.m ファイルにdidPress という名前の関数を作成しました。

- (IBAction)didPress:(id)sender {
    id resp = [[FPResponse alloc] initWithLabel:self.artistLabel];
    [GNOperations recognizeMIDStreamFromMic:resp config:self.config];
}

まずartistLabelと呼ばれるviewのUILabelへのポインタを使ってFPResponse* オブジェクト、respを作成します。次に実際にマイク入力を記録しGracenoteデータベースで楽曲を検索するオペレーションのrecognizeMIDStreamFromMicを呼び出します。関数が戻るときに、FPResponseは結果オブジェクトを処理し、(うまくいけば)画面にアーティストの名前を出します。アーティスト名以外のものに興味がある場合は、応答を返す可能性があるすべてのメタデータがリストされたGracenoteMusicIDフレームワークでGNSearchResponse.hファイルを見て下さい。

最後に

さて、ここでアプリを試してみましょう。 iPadシミュレータ(コンピュータのマイクを使用して)、またはiPadでデモを実行することができます。デザイン賞を受賞できるような見栄えのいいものではありませんが、ちゃんと動くはずです!

この超簡単なフィンガープリントアプリが、あなたにSDKが提供する他の多くの機能を試してみようというきっかけになることを願っています。

Happy hacking!

コメント

追加するライブラリやフレームワーク等について

記載されているlibstdc++ を追加しましたがうまくビルドが通りませんでした。
サンプルアプリと同じようにlibzなら大丈夫でした。