「iPhoneアプリが奏でる音楽の未来」リンク集

最近発売された雑誌「アルテス VOL.02」に佐藤薫さんとの対談「iPhoneアプリが奏でる音楽の未来」が掲載されています。とてもディープでマニアックな内容ですが、これまで表立って書いたことがない事柄にも触れていますので、ぜひお読みになってください。

ところで、この対談の註釈に入れたURLのいくつがが省略されていますが、逐一URLを掲載しても煩雑なので、この編集方針は妥当かと思います。そこで、WEB検索の手間を省くためにも、以下にリンクされた註釈項目を入れました。誌面を読みながら気になった事柄があれば、クリックしていただければ幸いです。

1 Oscillator | Chaotic Audio Oscillator for iPhone, 2008
2 Palm
3 PDA
4 App Store
5 ギーク
6 Treo
7 Visor
8 ザウルス
9 Snappy
10 ライフログ
11 DSPBox
12 あけおめバルス
13 AR
14 セカイカメラ
15 脱獄
16 GIS
17 API
18 UDID
19 FingerPiano
20 MiniPiano
21 PocketGuitar
22 Ocarina
23 Core Audio
24 Android
25 iOS 5
26 米本電音研究所
27 下村音響
28 Echochops
29 Frippertronics
30 Discreet Music
31 Echoplex
32 Gangsa
33 MINI-COMPOSER | 小さな作曲家の物語
34 Sync for Japan
35 Okeanos Okeanos Buoys
36 iOSの教科書
37 この演奏の…
38 iDonation
39 ハッキング
40 ベンディング
41 OSC
42 Max
43 SuperCollider
44 XYパッド
45 LFO
46 ノード
47 GPS
48 Biophilia
49 プロモーション・アプリ
50 DAW
51 OOPS
52 Xcode
53 ファイヤー・サイド

以上、紙雑誌とWEBのハイブリッドでした。

iOS 3.1.3をサポートする方法

iOS SDKは年々進化を続けているのはイイんだけど、後方互換性は一部犠牲になっている。他のプラットフォームに比べると数倍マシだとは思うけどね。ともあれ、最新OS最新モデルに対応しつつも、以前のOSや機種を切り捨てられない場合も少なくない。しかも初期のSDKで作成したプロジェクトをアップデートし続けるのもスッキリしないので、最新SDKから新しいプロジェクトを作ったりすると、それなりに問題が発生する。

そこでiOS SDK 5.1 (Xcode 4.3.2)で作ったプロジェクトを初代iPhoneの最終OSであるバージョン3.1.3に対応させる方法を書いておくね。ここではテンプレートとしてUtility Applicationを用い、iPhone/iPad両用のユニバーサル・アプリを作ることにします。もちろん、ARCはオフ、Storyboardも使えませんよ。

まず、何はともあれDeploymentを3.1に設定する。

■ プロジェクトのiOS Deployment Targetを 3.1 に設定。

次いで、初代iPhone、iPhone 3G、iPod touch(第1世代と第2世代)のCPUであるarmv6でも動作するように指定する。

■ プロジェクトのBuild SettingsのArchitecturesのArchitecturesに armv6 を追加。

■ プロジェクトのBuild SettingsのArchitecturesのBuild Active Architecture Onlyを NO に設定。

■ ウィンドウの下部にあるValidate Settingsをクリックし、Perform Changesを実行。

■ Info.plistにある Required device capabilities を削除。

Blocksを使う場合には以下の設定も必要。

■ プロジェクトのBuild SettingsのLinkingのOther Linker Flagsに -weak-lSystem を追加。

次に、テンプレートが生成するコードはiOS 3では存在しないクラスやメソッドを使っているので、iOS 3でも動作するように変更する。

まず、テンプレートはiPad用にUIPopoverControllerを使っているので、UIKitのリンクを弱める。

■ ターゲットのBuild PhasesのLink Binary With LibrariesにあるUIKit.frameworkを Optional に設定。

また、デバイスの判断にuserInterfaceIdiomメソッドもiOS 3では使えない。そこで汎用的に利用できるマクロを用意して、ソースコードを書き換える。

■ 〜-Prefix.pchに以下のマクロを定義。

#define UI_USER_INTERFACE_IDIOM() ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? [[UIDevice currentDevice] userInterfaceIdiom] : UIUserInterfaceIdiomPhone)

■ ソースコードの該当箇所を書き換える。AppDedegateに1ヵ所、MainViewControllerに3ヵ所、FlipsideViewControllerに1ヵ所あるはず。

[[UIDevice currentDevice] userInterfaceIdiom]

UI_USER_INTERFACE_IDIOM()

に置き換える。

また、UIWindowのrootViewControllerプロパティもiOS 3では使えない。

■ AppDedegate の application:didFinishLaunchingWithOptions: の、

self.window.rootViewController = self.mainViewController;

if([self.window respondsToSelector:@selector(rootViewController)])
    self.window.rootViewController = self.mainViewController;
else
    [self.window addSubview:self.mainViewController.view];

に置き換える。

同じく、UIViewControllerのcontentSizeForViewInPopoverプロパティもiOS 3では使えない。

■ FlipsodeViewController.m の initWithNibName:bundle: の、

self.contentSizeForViewInPopover = CGSizeMake(320.0, 480.0);

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
	self.contentSizeForViewInPopover = CGSizeMake(320.0, 480.0);

に置き換える。

以上の作業でiOS 3.1.3からiOS 5.1までのすべてのデバイスで動作するユニバーサル・アプリになったハズ。お疲れさまでした。

このようにして作ったテスト用のプロジェクト一式も入れておきますね。
Download RunOnOS3Test.zip

【追記】最後のcontentSizeForViewInPopoverプロパティの説明を追加しました。併せてテスト用プロジェクトも更新しました。

3/24は渋谷で演奏

3/24はNxPC.LIVE vol.12なるイベントでThe Breadboard Bandのメンバーとして演奏します。The Breadboard Bandは2005年に結成した4人組で、ブレッドボードに組んだ電子回路で演奏します。とは言え、7年後の今日としての演奏は意味として音楽としても、また違ったものになると思います。

このイベントは間もなく消滅するIAMASのDSPコース出身のアーティストを中心とした多彩な面々の演奏&映像が満載ですので、ご都合がつきましたら、ぜひお越し下さい。The Breadboad Bandはトップを飾って21:30過ぎに登場の予定です。

NxPC.LIVE vol.12 IAMAS WAREHOUSE PARTY
日時:2012年3月24日(土)21:00〜
会場:SECO(東京都渋谷区)
料金:2,000円(1ドリンク付)

iSuperColliderのビルド方法

先日のワークショップでiOS用のSuperColliderを紹介したことで、その入手方法の問い合わせが何度かあったので、ビルド方法のメモを書いておきます。ただし、これは2012年3月7日時点のレポジトリでの作業方法です。その後にソースコードが変更されることもあるでしょうから、同じように作業してもビルドできるとは限らないです。従って、質問されてもお答えできないってことでご了承願います。

How to build SuperCollider for iOS (March 7th, 2012)

Don’t ask me any questions ;-)

Getting source codes

(1) Open Terminal

git clone git://supercollider.git.sourceforge.net/gitroot/supercollider/supercollider isc
cd isc
git checkout 3.5
git submodule init && git submodule update

Building SuperCollider.app (Language)

(1) Open isc/platform/iphone/iPhone_Language.xcodeproj

(2) Set Scheme to ‘SuperCollider > iOS Device’

(3) Set Build Configuration to ‘Release’

(4) Click iPhone_Language in the navigator area
Click SuperCollider in TARGETS
Click Build Settings
Scroll down to Search Paths and open Header Search Paths
Change ../../external_libraries/yaml-cpp-0.2.6/include to ../../external_libraries/yaml-cpp-0.3.0/include

(5) Open externals/yaml group of iPhone_Language in the navigator area
Remove src group
Add isc/external_libraries/yaml-cpp-0.3.0/src into externals/yaml group

(6) Click iPhone_Language in the navigator area
Click SuperCollider in TARGETS
Click Build Phases
Remove libsndfile_iphone.a from Link Binary With Libraries
Add isc/platform/iphone/lib/ libsndfile_iphone.a to Link Binary With Libraries

(7) Connect your iOS device and run

Building iscsynth.app (Synth)

(1) Open isc/platform/iphone/iPhone_Language.xcodeproj

(2) Set Scheme to ‘iscsynth > iOS Device’

(3) Set Build Configuration to ‘Release’

(4) Open Resources group in iPhone_Synth.xcodeproj in the navigator area
Click iscsynth_MainWindow.xib
Remove Dir Browser View Controller from Tab Bar Controller in Objects

(5) Click iPhone_Language in the navigator area
Click iscsynth in TARGETS
Click Build Phases
Remove scUBlibsndfile.a from Link Binary With Libraries
Add isc/platform/iphone/lib/ libsndfile_iphone.a to Link Binary With Libraries

(6) Connect your iOS device and run


以上です。

なお、このビルド作業ではFredrik Olofsson氏にヘルプしていただきました。感謝!(でも彼にも迷惑をかけないようにお願いしますね〜)

また、ワークショップで使用したiSuperColliderは、スリープを自動禁止にしたり、スピーカー選択のコードを修正したり、といった変更を少々加えています。

【追記】本記事初出時には2012年1月末時点のレポジトリでのビルド方法を記載しましたが、2012年3月7日に再度手順を検証して記事を書き換えました。

2/29は渋谷でワークショップ

2月29日はSuperCollider for iOSのワークショップを渋谷のWOMB LOUNGEで行わせていただきます。本日!なのですが、すでにワークショップは満員御礼とのことなので、事前の告知を控えさせていただいていました。受講される方はよろしくお願いします。

SuperCollider Workshop at WOMB LOUNGE
第4回「愛のSuperCollider」
 日時:2012年2月29日(水) 19:00〜22:00
 会場:WOMB LOUNGE(渋谷)

なお、3/3に開催される受講者の方々による作品発表会は当日参加可能とのことなので、ご興味のある方にお勧めします。

SuperCollider Workshop at WOMB LOUNGE 発表会
 日時:2012年3月3日(土) 19:00~22:00
 出演:SuperCollider Workshop at WOMB LOUNGE受講者のみなさま
ゲスト:Craftwife+Kaseo+
参加料:2,000円(1ドリンクつき)
 会場: WOMBLOUNGE(渋谷)

Dashcodeでアプリ・アイコン効果

iOSが自動的に付加するアプリ・アイコンの角丸グロッシー効果、もちろん画像編集ソフトでできるんだろうけど、ここでは以前にTwitterで教えていただいたDashcodeでの手法をご紹介。DashcodeはXcodeの一部として提供されているAppleの無料ツールね。

(1) Dashcodeで新規プロジェクトを作成。
一番シンプルなSafariのカスタムのテンプレートが最適。

(2) ライブラリから四角形をキャンバスにドラッグ&ドロップ。

(3) インスペクタでサイズを設定。
使用するアイコン画像のサイズに一致させる。ここでは512×512ピクセルとする。

(4) インスペクタで塗りつぶしをイメージに設定し、画像ファイルを選択。

(5) インスペクタで角の丸さを設定。
アイコン画像が512×512ピクセルの場合は100ピクセルくらいになる。

(6) エフェクトのガラスを有効にし、パラメータを設定。
  シャイン:50%
   トーン:80%
    水平:50%
    湾曲:-20%

iOSでの効果とは微妙に違う気がしないでもないけど、まぁ、そこそこ雰囲気は出てるんじゃないでしょうか。

1/28は名古屋で演奏

1月28日に名古屋のパルルで演奏、iPhoneをン十台(?)並べて、小さな音を鳴らします。会場は大きくないので、おそらくアンプラグド・ノーPAで大丈夫じゃないかな。よろしければお越しくださいませ。

Deep Acoustics Live Act vol.47 「unformated」
日時:2012年1月28日 (土)
   19:30 open 20:00 start
会場:parlwr (名古屋、新栄)
出演:石川泰昭+中川丘
   赤松正行(iOS Devices)
   Shoko Nagai(piano/electronics)
   平尾義之(turntable,etc)
料金:1,800円

ニューヨークから即興・ジャズ・映画音楽などさまざまなジャンルで活動するNagai氏を迎えてのマルチフォーマットな演奏会。音響プログラミング言語MAX/MSPの第一人者として有名な赤松氏は近年主として取り組んでいるiPhoneを用いてのパフォーマンス。ノイジシャンの平尾は改造ターンテーブルのパフォーマンス。愛知県芸音楽科の若い才能によるパフォーマンスも注目。

MoMu-STKでシンセシス処理

先に紹介したMoMuでのオーディオ処理は、基本的な入出力を肩代わりしてくれるものの、それ以上のことは自前でやらなくてはいけない。実際にもMoMuオーディオは内部的にRemoteIOを呼び出しているだけ。自前でデジタル信号処理を書くのは、お勉強にはイイけど、面倒で難解であることも確か。

一方、MoMuを使うメリットは、同時に用意されたThe Synthesizer Toolkit (STK)を簡単に利用できること。STKはCCARMAを中心に開発されている音響合成ライブラリで、そのクラス・リストを見れば分かるように、基本的なオシレータやフィルタ、エフェクタはもちろんのこと、フィジカル・モデリング系の音源が充実している。Maxな人にはPeRColateという移植ライブラリで有名かもね。

と言う訳で例によってナンチャッテ路線で、MoMu-STKを使ってみよう。まずは「MoMuでオーディオ処理」に示した手順で爆音が出るようにしておく。そして、The Synthesis Toolkit (STK): MoMu ReleaseのサイトからMoMu-STKをダウンロード。その上での手順は以下の通り。ここではTubeBellクラスを用いて、鐘(チューブラー・ベル)を鳴らす。

(1) プロジェクトにMoMu-STK-1.0.0フォルダを追加。

(2) ソースコード(例えば〜ViewController.mm)で、ヘッダをインポートし、定数と鐘のオブジェクトを定義。

#import "mo_audio.h"
#import "TubeBell.h"

#define SRATE         44100
#define FRAMESIZE     128
#define NUMCHANNELS   2

stk::TubeBell	*myBell;

(3) 適切なメソッド(例えばviewDidLoad)でMoMuのオーディオ処理の初期化と開始の後、鐘のインスタンスを生成し、鳴らす。

MoAudio::init(SRATE, FRAMESIZE, NUMCHANNELS );
MoAudio::start(audioCallback, nil);

myBell = new stk::TubeBell();
myBell->keyOn();

(4) コールバック関数では、tick()メソッドによって返される値でバッファを満たす。

Float32 *data = buffer;
for (int i=0; i<framesize; i++)
{
	Float32 value = 0;
	if (myBell != nil)
		value = myBell->tick();

	*data++ = value;
	*data++ = value;
}

このようにしてアプリを起動すると鐘が鳴り響くハズ。シミュレータでも実機でもOK。はい、おしまい。

というのも味気ないので、もう少しシンセシスらしいことをしておこう。

まずボタンを作り、Touch DownでplayBell:メソッドを呼び出すようにアクションを定義する。

- (IBAction)playBell:(UIButton *)sender
{
	myBell->keyOn();
}

同じくスライダーを作り、Value ChangedでmodulationChanged:メソッドを呼び出すようにアクションを定義する。

- (IBAction)modulationChanged:(UISlider *)sender
{
	myBell->controlChange(2, sender.value * 127.0);
}

これで、ボタンをタップすると鐘が鳴り、スライダーを動かすと鐘の音色が変わる。シンプルながら、これだけでもサンプリング音の再生では難しい音響合成ですね。他にもパラメータは沢山あるので、いろいろとイヂってみてください。

はい、おしまい。