SuperColliderでセル・オートマトン (Cellular automaton)

Posted in complex system on 1月 31st, 2010 by Norihisa Nagano – Be the first to comment

前回に引き続き、SuperColliderでやってみました。
asBinaryStringが使えるので、結果表示付きにできました。

(
r=90;g=1<<16;n=32;
r.do{
    m = 0;
    for(0,n,
        {|i|
            b = 0;
            b = g >> (i - 1) & 1 | b;
            b = g >> (i + 1) & 1 << 2 | b;
            b = g >> i & 1 << 1 | b;
            m = r >> b & 1 << i | m;
        }
    );
    (g=m).asBinaryString(n).postln
}
)

00000000000000101000000000000000
00000000000001000100000000000000
00000000000010101010000000000000
00000000000100000001000000000000
00000000001010000010100000000000
00000000010001000100010000000000
00000000101010101010101000000000
00000001000000000000000100000000
00000010100000000000001010000000
00000100010000000000010001000000
00001010101000000000101010100000
00010000000100000001000000010000
00101000001010000010100000101000
01000100010001000100010001000100
10101010101010101010101010101010
00000000000000000000000000000001
10000000000000000000000000000010
01000000000000000000000000000101
00100000000000000000000000001000
01010000000000000000000000010100
10001000000000000000000000100010
01010100000000000000000001010101
00000010000000000000000010000000
00000101000000000000000101000000
00001000100000000000001000100000
00010101010000000000010101010000
00100000001000000000100000001000
01010000010100000001010000010100
10001000100010000010001000100010
01010101010101000101010101010101
00000000000000101000000000000000
00000000000001000100000000000000
00000000000010101010000000000000
00000000000100000001000000000000
00000000001010000010100000000000
00000000010001000100010000000000
00000000101010101010101000000000
00000001000000000000000100000000
00000010100000000000001010000000
00000100010000000000010001000000
00001010101000000000101010100000
00010000000100000001000000010000
00101000001010000010100000101000
01000100010001000100010001000100
10101010101010101010101010101010

133文字版

r=90;g=1<<16;n=32;45.do{m=0;
for(0,n,{|i|b=0;m=r>>(g>>i&1<<1|(g>>(i+1)&1<<2)
|(g>>(i-1)&1|b))&1<<i|m;});(g=m).asBinaryString(n).postln}

ちなみに、SuperColliderのコード140文字でpieceを作る、というのが流行っていたようです。
sc140

言語仕様から解説しているサイトを見かけないし
勘違いされているのじゃないかと心配になりますが
SuperColliderは、ちゃんとしたプログラミング言語です。
(たぶん)マルチバイトが処理できなかったりしますが
Ruby、Pythonなんかに近い、オブジェクト指向でインタプリタ方式の言語です。
なので、↑みたいなことは当然できます。

.arとか.krとかSynthDefからやるのもいいけど、ちゃんと学ぶなら
言語としての理解から始めないといかんのではないかな、と思います。

以前書いた、音がまったく鳴らないSuperColliderの言語仕様解説
022. Objective-CプログラマーのためのSC言語入門(1) ざっくり言語仕様
023. Objective-CプログラマーのためのSC言語入門(2) またりさまClassを実装

C言語でセル・オートマトン (Cellular automaton)

Posted in complex system on 1月 26th, 2010 by Norihisa Nagano – 1 Comment

よく「セルオートマトン C言語」
で検索してくる人が居るので気になっていて
Twitterに投稿しようと思って140文字以内を目指したら書けたので貼っておきます。
たぶん合ってると思うのですが、ざざっと書いたので間違ってるかもしれません。

#include <stdio.h>
int main (int argc, const char * argv[]) {
    unsigned char rule = 90,
    gen = 109, nextgen = 0, bit = 0;
    for(int i = 0; i < 8; i++){
        bit = 0;
        bit |= ((gen >> i + 1) & 1) << 2;
        bit |= ((gen >> i + 0) & 1) << 1;
        bit |= ((gen >> i - 1) & 1);
        nextgen |= (rule >> bit & 1) << i;
    }
    printf("%d", nextgen);
    return 0;
}

検算

rule 90
0   1   0   1   1   0   1   0
111 110 101 100 011 010 001 000

109 => 0110 1101
7: 001  1  1
6: 011  3  1
5: 110  6  1
4: 101  5  0
3: 011  3  1
2: 110  6  1
1: 101  5  0
0: 010  2  0

1110 1100 => 236

130文字版

unsigned char r=90,n=109,m=0,b;
for(int i=0; i<8;i++)
{b=0;b|=(n>>i+1&1)<<2;b|=(n>>i&1)<<1;b|=(n>>i-1&1);m|=(r>>b&1)<<i;}
printf("%d",m);

2009 -> 2010

Posted in Codex on 12月 29th, 2009 by Norihisa Nagano – Be the first to comment

2009年総括

今年は本の年でした。
おかげさまでというか、なんというか、一年で3冊の本に関わらせてもらいました。
2007年にIAMASに入るまで、(人に読んでもらう)文章らしい文章を書いたことが無かったので、予想だにしなかった展開でした。
プログラマーなのに、プログラミングコードじゃなくてテキストを打っている時間の方が長かった。

2月「iPhone x Music」(共著)
9月「iPhone SDK アプリケーション開発ガイド」(寄稿)
11月「iPhone Core Audioプログラミング」(単著)

並べてみると、全部prefixが全部「iPhone」です。
つまりは、今年は(少なくとも僕にとって)iPhoneバブルでした。
iPhone出版バブル、と言うべきかもしれません。

「iPhone x Music」

IAMASの修士論文と平行して書いたので、実は一番大変だったのですが、共著だったのでなんとかなりました。こういう本を書く機会はおそらくもう無いと思いますが(いやあるか)、最初の本ということで大変貴重な経験をさせていただきました。編集者の小西さん、ありがとうございました。

「iPhone SDK アプリケーション開発ガイド」

おそらくAudio Unitを扱った世界初の記事となりました。念願のO’Reillyデビューということで、少ないページながら、このとき執筆(予定で下調べ)してたCore Audio本からエッセンスを抽出してコンパクトにまとめてみました。
編集者の宮川さん、ありがとうございました。色々お話いただいたのに寄稿1個だけですみません。

「iPhone Core Audioプログラミング」

そして、2004年にCore Audioを始めて以来の念願だったCore Audio本がついに出せました。
どちらかといえば難解なiPhoneのCore Audioを体系的にまとめ、かつ、順番に読み進められるように、という、「僕にそんなことできるんかいな?」な課題設定な上、調べてコード書いても動かない、などなど暗中模索で、なかなかしんどい時期が続きました。しかし、結果、(少なくとも僕にとって)Core Audioの世界がすっと開けた瞬間はこれまでに無い感動がありました。こういうのは本を書かないと体験できないんでしょうね。
辛抱強くおつきあいいただいた、平山編集長、ありがとうございました。

そんなわけで、常に原稿をかかえてる状態で、しかも(結果、辞めましたが、共同で)起業もしたので、自分のソフトウェアを書く時間がこれまでのプログラマ歴の中で最も少なく、オトカメラぐらいしか作れませんでした。
選択肢としては、本を書かないというのもあったのですが、おそらく2009年を逃したら、本を書く機会は無いだろうな、という判断でした。それにしても3冊はやりすぎたな、とも思うのですが、結果3冊を目の前にすると、やってよかったなと思っています。もうこういう年は来ないだろーなー。

私生活の方では、2009年1月に結婚しました。(もう1年か、早いな)
あと、2004年以来、フリーランスをやっていましたが
今年最後の方でMac/iPhone系の開発会社であるHMDT(株)に就職しました。
毎日仕事が楽しいので、満足してしまって、自分の活動が少なめになりがちな今日この頃ですが
今までの調子でいろいろアウトプットしていくつもりです。
あと、本の依頼がいくつか来ているので、1冊ぐらいは何か出すと思います。

2010

これまでは、いわゆるメディア・アート系に分類されるような活動が多かったのですが
2010年からは別のミッションに進みます。
といってもこれまで音楽を対象に考えてきたことの応用ですが。
こういうジャンル横断はプログラマーの特権ですね。
ある人の言葉

「プログラマーは何にでもなれる」

ソフトウェアが解決すべき問題はこれからもどんどん増えるでしょう。

Mac OS XとRuby on Rails(もしくはPHP)から
iPhoneとGoogle App Engineへ!

2010年も、本Blogをよろしくお願いします。

iPhone関連本 * 2

Posted in iPhone on 12月 27th, 2009 by Norihisa Nagano – 1 Comment


iPhone関連の特定フレームワーク、ジャンルに特化した本が二つ出ました(出ます)。

横江 宗太さんの「OpenGLで作るiPhone SDKゲームプログラミング
所 友太さんの「iPhoneプログラミングUIKit詳解リファレンス」

です。

「OpenGLで作るiPhone SDKゲームプログラミング」

iPhoneでOpenGLな本出ないかなぁ、と思っていたら出ました。

感想としてはともかく明解。OpenGL、ゲーム開発ってこんなに簡単に説明できるの?というぐらい明解。
第1章で以降の章で使うグラフィック・ライブラリを自作し、2章以降で実際に使ってゲームを作る、という進行になっています。
で、このグラフィック・ライブラリの自作(とゲームの制作過程)が面白い。
ちょっと進めたらリファクタリング、また進めたらリファクタリングと、どんどん読みやすくコンパクトなコードに直しながら進めていきます。
このプロセスのおかげで、次この機能追加するよーというときにサクっとできてしまいます。

僕は過去にOpenGLがっつりなものを作ったことがあるので、OpenGLがはじめてな人が理解できるのかは判断できませんが、他の本でiPhoneアプリケーションを作ったことがある人なら大丈夫でしょう。
というか、入門本やってCore Audio本やって、さてグラフィックどうしよう、という人に一番に勧めたい本です。
コードも全部載っているし、読みやすく構成されているしで、100点。

はえたたきゲーム(2D)とレーシングゲーム(2D -> 3D)を作るのですが、どちらも面白くてかっこよい。すげぇ。

ちなみにiPhoneでは現在、OpenGL ES 1.1とOpenGL ES 2.0、二つの系統のOpenGLが機種によって使えるのですが
この本はOpenGL ES 1.1に絞った内容となっております。

「iPhoneプログラミングUIKit詳解リファレンス」

発売日は2010/1/12となっているのですが、新宿紀伊国屋本店でフライング販売していたので買ってきました。

もう一つ。入門本、Core Audio本、OpenGL本とくれば、あとはUIKitを詳細に扱った本が欲しいところですが、はい、ずばりが出ました。UIKitのみに特化したリファレンス本です。
UIKitの全てのクラスが載っています。
Interface Builderを使わないで全部コードで説明してあります。

たとえば、UIImageなんかを重ねて描画するときにブレンドモードで結果が変わるって知ってますか?
UIImageの拡大縮小時の挙動をいろいろ変更できるって知ってますか?
この辺の細かいことがじゃんじゃん載ってます。

しかも色が関係するところはカラーです。素晴らしい。

頻繁に使うUIViewControllerなんかは、こういう構造になっているよーとしっかり図解してあります。
UIKitはかなり使っているので、ほとんど知ってるかな、と思っていたのですが、知らないことがいっぱい書いてありました。
僕的には、自分で調べたらこの本に追記して自分リファレンスにする形で使っていこうと思っています。

しかし、Core Audio本を皮切りに(なのか?)フレームワーク、ジャンルに特化した本が続々登場しています。
かつて、他のプラットフォームでこういうことってあったんでしょうか。
今、iPhoneの開発環境を整えると、いろんなことに挑戦できるようになってきている気がします。

というわけで、二冊ともめちゃオススメです。
Core Audio本も買ってください。

ちなみに、Twitterで
「@7gano iPhone関連本は、Core UIKit ! みたいなガチなUIKit大全があれば、僕は他はいらんな。きっと誰か書いてるだろう」
と書いたら所さんから
「@tokorom ちょうど執筆終えました『iPhoneプログラミング UIKit 詳解リファレンス』& CoreAudio本購入させていただきました」
とreplyが来てUIKit本の存在を知りました。

「 @7gano: パンカクさんのOpenGL本、神だなぁ。こんなに面白く書けるもんなのか。とBlog見ると、Core Audio本読んでもらっているようでうれしい」
と書いたら横江さんから
「@sugarcape なんと、iPhone Core Audio プログラミングの著者の方が僕の本を読んでくれたみたいです。」
とreplyが来て時代は変わったなぁ、と思いました。

「iPhone Core Audioプログラミング」(書籍) 発売中

Posted in iPhone Core Audio on 11月 17th, 2009 by Norihisa Nagano – 5 Comments

「iPhone Core Audioプログラミング」が発売になりました。

BlogやTwitterを見る限り、ご好評いただいているようで一安心しています。

「これでショートカットできる」、「本当に網羅している」や
「基礎的トピックもしっかり書いてあってよい」という反応をいただきました。

「入門」とはタイトルに入っていないのですが
「Core Audioを始めた当時(2004年)の自分が欲しかった本」
を目指して書いたので、大変うれしく思っています。

さて、実際に購入いただいた方のレビューをご紹介。

O-Planning ゲーム制作のちょっといい話: iPhone Core Audioのバイブル的書籍「iPhone Core Audioプログラミング」発売!!

この書籍のもっとも注目すべきところは、他の書籍では「これくらいなら当たり前の知識だから、他の書籍を見るか、ググってね」とするところを、なんと懇切丁寧に解説していることです。

iPhone Core Audio プログラミング – 丸井綜研

564ページにわたる熱い/厚い解説。まだ熟読したわけではありませんが、読みやすく仕上がっています。iPhoneプログラマでなく、ただMac OS XのCore Audio開発をしたい僕のような人間にも役だってくれそうです。こういう本は後々入手不可能になる可能性がありますので、興味のある人は今のうちに購入しておくべきでしょう。

書籍紹介「iPhone Core Audio プログラミング」 | POPINO BLOG ( ポピノ ブログ )

実際の信号処理のアルゴリズムとかは奥深いので、まだまだ大丈夫だと思いますが、この本で商売あがったりだよーって思ってる人も、多少はいるんじゃないかと思うくらい充実してるお勧めの一冊です。

Objective-Audioさんにもご推薦いただきました。
iPhone Core Audio プログラミング – Objective-Audio

値段は4,200円と、他の入門書と比べてやや高いですが、それだけの価値はあると思います。僕はオーディオメインでプログラミングを勉強してますが、やっぱりその中でも興味があるところに偏って調べていたりするので、読んでみるといろいろ知らないところがたくさんあります。今後iPhoneのオーディオで、忘れていたり、何か新たに調べたくなったときに、役立ってくれる事は確実です。

都内書店を巡ってみましたが、しっかり並んでました。
新宿のジュンク堂書店にOpenGL ES 2.0本を買いに寄ったら、プログラミングコーナーの特集棚(なのかな?)にどどーんと置いていただいていました!

hgei

やっとCore Audioは把握できたので、あとはヴィジュアル面を、というところで、ちょうどOpenGL ES 2.0本が出ていたので買ってきてちょこちょこやってます。
Xcodeのデフォルトのプロジェクトをちょいといじっただけのコードですが、こういうBloomみたいなオーロラっぽいものが高フレームレートで描画できて感動。
Quartzだとこういうのが無理です。

しばらくはQuartz禁止でがんばろうかと。
OpenGL ESがちゃんと理解できるまでどれだけかかることやら・・。

「今の自分」がよいと思える、OpenGLの本がないので、これから数年はOpenGLの攻略を目指そうかな。3D数学をしっかりやらないとですが。

「iPhone Core Audioプログラミング」(書籍) 発売

Posted in iPhone Core Audio on 11月 12th, 2009 by Norihisa Nagano – 3 Comments

iPhoneCoreAudio
11/11か12、(一部書店ではその前の土日ぐらいに)本が出ます。
ずばり、iPhoneのCore Audioのみを解説した本を書きました!

総ページ数564ページと、iPhoneアプリ開発本の中でもおそらくトップクラスのページ数、そのすべてがiPhoneのCore Audioの解説という前代未聞(?)、世界初の本です。
iPhone Core Audioのすべてのフレームワーク、サービスを解説しています。
#読みやすさ、分かりやすさを考慮してiPhoneのCore Audioに絞って書きましたが、Mac OS XのCore Audioにも応用可能だと思います。

内容としては、Getting Started With Audio UnitIntroduction to Audio Unit DevelopmentiPhone Core Audio Programming、3つの本Blogの連載を下地に、ともかくiPhone Core Audioのすべてを網羅しています。

各フレームワーク、サービスと章の関係は次のようになってます。

Audio Toolboxフレームワーク

・System Sound Services (第1章)
主に警告音の用途に使うサウンドファイルの再生

・Audio Queue Services (第5・6章)
サウンドファイルの再生と録音、オフラインレンダリング

・Audio File Services(第3章)
サウンドファイルのデータの読み書き(変換機能無し)

・Audio Session Services(第4・7章)
iPhoneのオーディオの挙動の管理

・Audio Converter Services(第10章)
オーディオデータの変換

・Audio Format Services(第10章)
オーディオデータフォーマットを扱う

・Extended Audio File Services(第11章)
サウンドファイルの読み書き(変換機能有り)

・Audio Unit Processing Graph Services(第12章)
Audio Unitを複数接続する

・Audio File Stream Services(第13章)
オーディオデータパケットの解析

Audio Unitフレームワーク

・Audio Component Services(第9章)
Audio Component(Audio Unitのプラグイン形式)の管理

・Output Audio Unit Services(第9章)
Audio Unitの処理を開始・停止する

AVFoudationフレームワーク

・AVAudioPlayer(第2章)
サウンドファイルの再生

・AVAudioRecorder(第8章)
サウンドファイルの録音

・AVAudioSession(第8章)
Audio Sessionの管理

Core Audioフレームワーク

Core Audio共通の構造体、定数の定義など

MediaPlayerフレームワーク

ムービー、サウンドファイルの再生。iPodライブラリアクセス(第14章)

OpenALフレームワーク

サウンドファイルの再生・録音、3次元定位(のための計算)

OpenALは オーディオ再生・録音が行えるクロスプラットフォームなAPIであり、iPhoneでも使用できる。iPhoneのOpenALは内蔵Audio Unitである「3D Mixer Unit」の上に実装されており、本書ではこのAudio Unitを直接使う例を解説するため、OpenALについては扱っていない。3D Mixer UnitはAudio Unit Processing Graph Servicesの章(第12章 )で扱う。
(以上、本から抜粋)

これらを(今数えたら)93個のサンプルコードとともに解説してあります。
サンプルコードは、実現したい処理を行うために必要なコードは何か、をつかんでいただくために極力シンプルな記述を心がけてあります。なのでサンプルコードは一つの処理のみを行うのものが大半です。グラフィック的な飾りもほとんどありません。
このような「粒度の小さい動くサンプルコード」を実際に試しながら、各APIの働きを理解していけるような作りを目指して書きました。

対象読者

本書はC言語、Objective-C、Cocoa Touchフレームワーク(UIKit)の基礎を習得しているオーディオアプリケーションを開発したいプログラマを対象としている。

C言語、Objective-C、Cocoa Touchフレームワークに関しては、分かりやすい入門書が既に多数刊行されているため先に参照いただきたい。本書ではCore Audioに紙面を割くために、Cocoa Touchフレームワークの使用は最小限のものにしてある。ただし、使用するAPIについては、詳しい解説を加えてある。
(本から抜粋)

となっています。

各章では、扱うフレームワーク、サービスに関連するオーディオ処理の基礎的な事項の解説も加えてあります。サウンドファイルのフォーマット、リニアPCMとはなんぞや、デシベル、パンニング、音階、サイン波、音の合成、FMシンセ、FFT、など。
数式満載のデジタル信号処理の高度なトピックは扱っていませんが、今後、その世界に飛び込んでばりばりやるための基礎は習得できると思います。

実践編、応用

実際のアプリケーション開発は複数の機能を組み合わせて使うことになるので、「実践編」を設け、それまでに使用したコードを組み合わせ、実際の開発に使えるサンプルを目指してあります。
具体的には、オトカメラのライト版「オトカメライト」、FMシンセを使ったシンセサイズできるドラムマシン「FMDrum」、環境音に反応して音を生成(合成)するアプリケーション「Whiteout」を作ります。

最終的にこれらぐらいのアプリケーションが作れるようになるはずです。
(ちなみに実践編以外の章にも、ちょいとこの機能を使って遊んでみよう、てなサンプルがあります)

また、iPhone Core Audioのシステム全体(オーディオの入出力、サウンドファイルの入出力、ハードウェアの制御)が分かるようになるので、いかようにでも応用できるようになると思います(全部読んでもらえればおそらく)。

よくある(であろう)質問と解答

Q. Core Audioってどうなってんの?いろいろありすぎでしょ
A. Core Audioの世界を散策できるように全部解説してあります。じっくり読んでください。

Q. Core Audioって難しいですか?
A. Objective-Cを使うUIKitに比べて、基本的にC言語の関数を使うので、どちらかと言えばとっつきにくいかもしれません。あと、Core Audio特有の作法に慣れるまで少し分かりづらいかもしれません。しかし、この辺のことについては筆者も当初、随分苦労したので、それを考慮した解説を心がけました。ひとまず第一章をじっくりやってみてください。

Q. Cを覚えたばかりなんだけど、理解できるかな?
A. iPhoneのプログラミングを解説する都合上、どうしてもCocoa Touch(UIKit)フレームワークとObjective-Cの知識が必要になります。一番好みの入門書を買って先に読んでください。ただし、特に難しいことはやらないので、UIViewController, UIButton, UISlider, UISwitchあたりが使えれば大丈夫だと思います。僕的には「基礎からのiPhone SDK」がオススメです。

Q. 音鳴らすの簡単ですか?
A. どういう再生を行うかにもよりますが、簡単だと思います。Core Audioで選択できるすべての再生方法を解説してありますので、その中から望む処理を実現できる方法を選択してください。

Q. Audio Queue、AVAudioPlayerを使わないでMP3を再生したいんだけど
A. Audio Converterを使ってリアルタイムにデコードしながらAudio Unitで再生なんてどうでしょう?リニアPCMに変換しながら再生するので、ボリューム、パンニングとかなんでもできますよ。Audio Queue/AVAudioPlayerだとMP3はパンニングできないでしょ。Ext Audioを使ってもいいし、Audio Queueのオフラインレンダリングで事前にリニアPCMに変換しておく、という手もあります。いろいろ選択肢があるのでお好みの方法を使ってください。

Q. Audio Unitが入ってるらしいけどどうやるの?
A. AUGraphを使って、全部のAudio Unitの使用例を書いてます。たとえばiPodにイコライザーが付いていますよね?あれを自分のアプリでも使えますよ。あとは3D Mixerを使えばOpenALと同じことがAudio Unitでできちゃいますけど、どうですか?

Q. サウンドファイルをAACに変換したいんだけど
A. Ext Audioを使えば簡単にできちゃいますよー。ただしAACに変換できるのはiPhone 3GS/iPod touch 2Gだけです。この辺の変換処理も全ての方法を書いていますので、その中から選択してください。

Q. シンセサイズしたいんだけど
A. Audio Unitを使って最もローレベルなレイヤーでもっとも高速な(レーテンシーの少ない)シンセサイズを解説してます。FMDrumのレスポンスはむちゃくちゃ速いですよ!

Q. よし、オーディオ処理は分かった。で、何作ればいいかな?
A.もしアイディアに困ったら、拙著「iPhone x Music」を読んで、オーディオ・アプリケーションを研究してみてください!

謝辞

サンプルコード内のサウンドファイル(loopと付く名前のファイル)は徳井直生氏に提供いただきました。
氏には原稿チェックもしてもらいました。多謝。
Objective-Audioさんには実際に読んでもらって、いくつか指摘いただいています。
正誤表を用意しますのでお待ちください。

レビュー、推薦のお言葉など、紹介いただいたサイト

O-Planning ゲーム制作のちょっといい話: iPhone Core Audioのバイブル的書籍「iPhone Core Audioプログラミング」発売!!

iPhone Core Audio プログラミング – soundscape out

iPhone Core Audioプログラミング の本が発売になります。|松本昭彦 (Akihiko Matsumoto) Blog Algorithmic Computer Music

ちゃ~り~田中チャンネル – iPhoneCoreAudioプログラミング

iPhone Core Audio プログラミング – 丸井綜研

564ページにわたる熱い/厚い解説。まだ熟読したわけではありませんが、読みやすく仕上がっています。iPhoneプログラマでなく、ただMac OS XのCore Audio開発をしたい僕のような人間にも役だってくれそうです。こういう本は後々入手不可能になる可能性がありますので、興味のある人は今のうちに購入しておくべきでしょう。

書籍紹介「iPhone Core Audio プログラミング」 | POPINO BLOG ( ポピノ ブログ )

実際の信号処理のアルゴリズムとかは奥深いので、まだまだ大丈夫だと思いますが、この本で商売あがったりだよーって思ってる人も、多少はいるんじゃないかと思うくらい充実してるお勧めの一冊です。

記録

紀伊国屋新宿本店 先行発売(2009/11/06)
IMG_6007

出版時期が「iPhone x Music」でもインタビューさせてもらっている津田大介さんのTwitter本と同時期だったため、津田さんの本屋巡り記録に本書も写ってました。以下、拝借。

紀伊国屋南口店 先行発売(2009/11/06)
(画像参照元 http://twitpic.com/olnob)
hoge

池袋ジュンク堂6F 先行発売(2009/11/07)
iPhoneCoreAudio
(画像参照元 http://twitpic.com/olhby)

「iPhone Core Audioプログラミング」(書籍) 先行発売

Posted in iPhone Core Audio on 11月 6th, 2009 by Norihisa Nagano – Be the first to comment

iPhoneCoreAudio

iPhone Core Audio プログラミング」が都内の一部大型書店で先行発売されているようです。
僕の手元にもまだ届いてないのですが、編集長さんから新宿紀伊国屋本店で売ってる、との情報を得て
行ってみたところ、たしかに売ってました。

IMG_6007

電車で読みたかったので思わず自分で買ってしまいました。

書店にお立ちよりの際に見かけたらお手に取ってみてください。

iPhone Core Audio Programming 第4回 Audio Sessionその1

Posted in iPhone Core Audio Programming on 10月 10th, 2009 by Norihisa Nagano – 1 Comment

ちょいと間が開きましたがiPhone Core Audio Programming 第4回目。

今回から数回Audio Sessionをやります。

そもそもAudio Sessionとはなんですか

という話は「iPhone SDK アプリケーション開発ガイド」に書いたのでそちらを買っていただくとして(なかなか好評なようです。Core Audioが載っててうれしいという声がちらほら。ありがたいことです)、ここではデバイスの情報取得・設定について解説していきましょう。

OS X Core AudioではHAL(Hardware Abstract Layer)というハードウェアレーヤーにアクセスできて、いろいろごにょごにょできるのですが、iPhoneではこのレーヤーに直接アクセスできません。
これはたぶん、iPhoneにオーディオデバイスが1個しかないからですね。OS Xだとオーディオインターフェイスを複数持てるのでこのレーヤーにアクセスできないと困るでしょ、という話です。

とは言っても、iPhoneでもデフォルトのデバイス、つまりマイクとスピーカーとヘッドフォンアウト( +マイク入力)があるわけで、これらハードウェアの情報取得・設定ができないと困ります。
例えば、ハードウェアのサンプリングレートを変更したり、フレームバッファサイズ(一度に処理するバッファサイズ)が設定できないと困ります。
そこでiPhone Core AudioではAudio Sessionがこの役目を担当しております。
ということで、つまりはAudio SessionはiPhoneでそこそこのオーディオアプリケーションを作るのに必須のサービスです。

カテゴリ

が、いきなりハードウェア設定をやってもAudio Sessionの重要性が伝わるとも思えないし、少々前置きが必要なので、まずはAudio SessionのHello world!であるところの、カテゴリの設定をやります。

ともかく音を再生したいので、AVAudioPlayerを使います。これはAVFoundationというiPhoneのみに存在するフレームワークが持つクラスです。しかもCore Audio史上初のObjective-Cのインターフェイスを持ちます。

特に解説が必要ないぐらい簡単に使えます。こういうコードでhoge.aiffがループ再生できます。

AVFoundation.frameworkをプロジェクトに追加する。

#import "AVPlayerViewController.h"
#import <AVFoundation/AVFoundation.h>

@implementation AVPlayerViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    NSString* path
       = [[NSBundle mainBundle] pathForResource:@"hoge" ofType:@"aiff"];
    NSURL* url = [NSURL fileURLWithPath:path];
    AVAudioPlayer* player
       = [[AVAudioPlayer alloc]initWithContentsOfURL:url error:nil];
    player.numberOfLoops = -1;
    [player play];
}

@end

この状態で、iPhoneのサイレントスイッチをオン/オフすると、音が鳴る/鳴らないと切り替わるし、スリープボタンを押すと画面が暗くなって音も消えます。通常この動作をするアプリケーションが多いです。たぶん。

しかし、次の呪文を追加すると、サイレントスイッチもスリープボタンも無視されます。

AudioToolbox.frameworkをプロジェクトに追加。

#import <AudioToolbox/AudioToolbox.h> //これを追加

- (void)viewDidLoad {
    [super viewDidLoad];

    //以下追加
    AudioSessionInitialize(NULL, NULL, NULL, NULL);
    UInt32 category = kAudioSessionCategory_MediaPlayback;
    AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,
                            sizeof(UInt32),
                            &category);
    AudioSessionSetActive(YES);
    //以下同じ
    ...

ここでやっているのはkAudioSessionCategory_MediaPlaybackというカテゴリをAudio Sessionに設定する処理です。これで分かるのは、カテゴリというものはオーディオをどういう扱いにするか、を決定するものだ、ということです。

App Store初期にラジオ系のアプリケーションで「スリープモードでも再生され続けてほしい」とレビューで要望が書かれていたり、なんか音が鳴るアプリケーションで開発者側から「サイレントモードでは音が出ません」と説明が書かれていたりしました。
この二つは以上の呪文であっさり解決できてしまいます。

しかし、なんでもかんでもこのカテゴリ(MediaPlayback)にしとけばいいというわけではありません。サイレントモード無視、スリープも無視という、ともかく音を出したくてしょうがない感じのこの「オーディオの挙動」が一体正しいのか?と考えるべきです。

最初の例のラジオ・アプリケーションの場合はおそらく正しいですが、サイレントモードを無視するのは時にまずい場合があるでしょう。サイレントモードが選択されているという状態から分かるのは、「ユーザーは音を出したくない状況にある」ということです。そこで音を鳴らされたら、ホームボタンを押されて、その後アプリの削除、そして☆一個・・・かもしれません。が、サイレントモードに従うことにしたとしても、ユーザーがサイレントモードにしているのを忘れているだけだったら、「音が出ません!」と騒がれることになるかもしれません。
もし楽器系のアプリケーションだとすれば、アプリケーションを起動したらそれは「音を鳴らしたいと思っている」と判断してサイレントモード無視が正解という判断もありでしょう。ゲームの場合は、音が鳴らなくても、まぁ必要な部分は動きますから、音が鳴らないと騒がれることはないだろうし、電車でゲームやりたい人も多いだろうからサイレントモードに従うのが正解な場合が多いでしょう。
つまりは、この設定はアプリケーションによります。

Audio Sessionには他にもサイレントモードを無視しないカテゴリなど、いくつかカテゴリがあり、状況、もしくは希望するオーディオの挙動に合わせて選択することができます。そんなわけで、オーディオ・アプリケーションではAudio Sessionのカテゴリの設定はともかく必須です。

Audio Sessionの重要性が理解してもらえたであろうところで、次回は今回の呪文について解説します。

PD会 第2回やりました

Posted in PD会 on 9月 20th, 2009 by Norihisa Nagano – Be the first to comment

Pure Dataのソースコードを読んでどうにかする会、第2回をやりました。
niwaさん会場提供感謝!

ざっと内容など。
・班に分かれてやってきたこと情報交換とそれをまとめて発表準備

DSP班

PICnomeのデモ
作者の山本さんから直々にデモしてもらいました。
PICnome、かっこいいし汎用性があるのでおすすめです。

Pd解明班

・Pd Vanillaのビルド方法
の発表がありました。
configure.inの修正が必要という話でした。
automake(だっけ)は依存しまくりなので大変。
現在、Pd Vanilla10.5でビルドできませんが、その解決方法など。
しかし10.6ではビルドできないので、課題となりました。

移植班

・エクスターナル・オブジェクトの開発
・Pdのオブジェクトについて
オブジェクトのコンパイルまでは
XcodeでPure Dataのオブジェクトを作る 1. Hello world
http://nagano.monalisa-au.org/?p=909
にまとめてあります。
これよりかなり突っ込んだ話をして、Outletが1000個のオブジェクトをデモしたりしました。

nagachikaさんからはクラスについてと、gensymのhashの話、オブジェクトのロード部分の解説がありました。
詳しい内容はnagachikaさんのはてなダイアリー参照。

Pd会、当初はソース読みが中心で考えていたのですが、フィジカル・コンピューティングに明るい、メンバのnaokiringさんと、naokiringさんがスカウトしてくださったメンバさんが加わって、ハードも含め多方面をターゲットにする会になってきました。
つまり、フィジカル・コンピューティング やPICnomeへの応用も視野に入れた上で「ソースコードを読んでなんとか」していこう、という感じになってます。
とはいえ、移植班(Pdの内部構造解明班)はかなりコアな部分の読解に向かっています。

そんなわけで、基本、C言語が分からないときついですが、join us!ということで。

次回は10/17 or 18の予定です。
(そのまえにPICnomeの特別スピンオフがあるかも?)

XcodeでPure Dataのオブジェクトを作る 1. Hello world

Posted in PD会 on 9月 14th, 2009 by Norihisa Nagano – 3 Comments

Pure Data(以下Pd)がiPhoneで動かせたので、いろいろ拡張すべく格闘しています。
Pdの使い方が実は分かってないとか、いろいろ(大きな)問題はありますが、なにはともあれプラグインで拡張です。
そう、Pdは自分でオブジェクトをCで書いて拡張できるようになっています(エクスターナル・オブジェクト。以下External)。画面に出てくるあのブロックを自作できるわけです。

Windowsはどうだか知りませんが、Mac OS Xの場合Pd-extendedをインストールしているなら
/Applications/Pd-extended.app/Contents/Resources/extra/bonk~/bonk~.pd_darwin
みたいに、.pd_darwinというファイルがあります。これがExternalです。
Cで書くのだから、Xcodeで作れます。
ということで作ってみよう!5分で作れます。

追記:
UNIXな人はnagachikaさんの記事を参照です。

準備

http://puredata.info/docs/developer/PdExternalsInXcode
にばっちり書いてあるので、この通りやればいいのですが、10.6で画面が少々違うし、日本語であるとうれしいかもなので書いておきます。

・プロジェクトを作る
Xcodeで新規プロジェクトを作ります。
Framework & LibraryのBSD C Libraryを選択して、TypeはDynamicにします。これ重要です。
名前はhelloworldにします。
Screen shot 2009-09-14 at 12.19.51

・ビルド設定
先にビルド設定を行います。
赤い丸のTargetsのhelloworld
Screen shot 2009-09-14 at 12.21.10

をダブルクリックするとインスペクタが開くのでBuildタブを選択して
Configuration:を[All Configurations]にして横の検索窓に”Other linker flags”と入力します。

Screen shot 2009-09-14 at 12.23.44

Other linker flagsのところをダブルクリックするとシートが出てくるので +ボタンを押して
-undefined dynamic_lookup
をコピペします。これをやらないと、「この関数の実装・変数が無い、無い、無い、無い」とビルドエラーが出まくって途方に暮れることになります。つまりこれはm_pd.hに定義がある(が実装などが見当たらない)ものは動的に見るよ、という呪文です。

同様に以下3つもやります。
“Product Name”: helloworldにする(なっている)
“Executable Prefix”: libを消す。(これでlibhelloworld.dylibというファイル名前からhelloworld.dylibに)
“Executable Extension”: pd_darwinにする(さらにhelloworld. pd_darwinになる)

追記:
上記設定名が、日本語環境だと違います。
”Other linker flags”→他のリンカフラグ
“Product Name”:→プロダクト名

“Executable Prefix”→実行可能ファイルのプレフィックス

“Executable Extension”→実行可能ファイルの拡張子
(thanks! yasoshimaさん)

以上をやってConfiguration:の下のShow:のところをSettings Defined at This Levelにするとこんな感じになってます。
Screen shot 2009-09-14 at 12.27.13

これで準備OK。

実装

http://puredata.info/downloadsからPdのソースをダウンロードしてきてm_pd.hを探してプロジェクトにコピーします。
m_pd.hにはPdのオブジェクトで使うクラスや型の定義、メソッドがもりもり書いてあります。

コマンド + Nで新規ファイルの追加画面が出るので、helloworld.cというファイルを作って追加します。このファイルに実装を書きます。

この時点でこういう感じになっています。
Screen shot 2009-09-14 at 12.50.28

Productsがhelloworld.pd_darwinになってないと設定が失敗してます。
.pd_darwinという拡張子じゃないとPdが読み込んでくれないので注意です。

次に、helloworld.cに
http://iem.at/pd/externals-HOWTO/node3.html

the code: helloworldのコードをコピペします。

これで実装は完了です。

このオブジェクトが何をやるかというと

void helloworld_bang(t_helloworld *x)
{
    post("Hello world !!");
}

となっているように、bangを送ったら、Hello world !!と出力します。

テスト

ビルドターゲットをReleaseにしてビルドしましょう。
Screen shot 2009-09-14 at 12.32.12

ファイルを見ると、こういうのが出来てます。
Screen shot 2009-09-14 at 12.34.10

このファイルを/Applications/Pd-extended.app/Contents/Resources/extraのどこかにコピーします。
extra/helloworld/helloworld.pd_darwinとか、フォルダを作って置いてもOKです。

では、Pdを起動してみましょう。

こんな感じでHello world !!
と出ます。

Screen shot 2009-09-14 at 12.36.33

Hello world !!

これでPdが拡張し放題ですね。

作ったXcodeプロジェクトファイル