<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>NIT-Universe</title>
    <link rel="alternate" type="text/html" href="http://blog.soprano.jp/" />
    <link rel="self" type="application/atom+xml" href="http://blog.soprano.jp/atom.xml" />
    <id>tag:blog.soprano.jp,2008-05-02://1</id>
    <updated>2012-01-08T09:38:06Z</updated>
    
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Commercial 4.27-ja</generator>

<entry>
    <title>Object Creation With XML</title>
    <link rel="alternate" type="text/html" href="http://blog.soprano.jp/2012/01/object-creation-with-xml.html?utm_source=blog&amp;utm_medium=rss" />
    <id>tag:blog.soprano.jp,2012://1.342</id>

    <published>2012-01-08T09:40:00Z</published>
    <updated>2012-01-08T09:38:06Z</updated>

    <summary>Objective-Cという言語が面白いのは、コンパイラ言語でありながら、インタ...</summary>
    <author>
        <name>forte</name>
        
    </author>
    
        <category term="programing" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.soprano.jp/">
        <![CDATA[<p>Objective-Cという言語が面白いのは、コンパイラ言語でありながら、インタプリタ言語のような動的操作ができる点ではないかと思う。</p>

<p>実際にはＣの上に構築されたプリプロセッサのようなイメージで、その操作はＣのコードとランタイムライブラリへのアクセスへと還元することが出来る。そしてＣの部分は隠蔽されることなく使用することが出来、それ故、インラインアセンブラのようにObjective-Cの操作をＣで記述したコードを混在させるといったことも出来てしまう。そういった泥臭さはＣ言語族の特徴と言うべきなのだろうか。</p>

<p>ランタイムライブラリをいじらないまでも、例えば文字列で指定されたクラス名のインスタンスを作成するのはこんな感じで出来る。</p>

<pre class="prettyprint">
Class klass = NSClassFromString(className);
id obj = [klass alloc];
</pre>

<p>この機能を使用すると、テキストファイルで指定されているクラスのインスタンスを動的に作成するというようなことが出来る。</p>

<p>さらに、標準のXMLパーサNSXMLParserと組み合わせると、手っ取り早く（とりあえずの）設定を読み取り、インスタンスを生成するモジュールを実装することが出来る。</p>]]>
        <![CDATA[<p>仕込みとしては、生成したいクラスにinitWithAttributes:という初期化メソッドを実装しておく。Objective-Cは<a href="http://ja.wikipedia.org/wiki/ダック・タイピング">duck typing</a>対応(?)なので、特に何かの基底クラスの派生クラスでないといけないという制約はない。</p>

<p>NSXMLParserはエレメントを見つけたときのdelegate呼び出しに、エレメントのアトリビュートをNSDictionaryで渡してくれる。これをそのままインスタンスの初期化に渡してしまおうというわけだ。</p>

<pre class="prettyprint">
#define kAttributeName @"name"

@implementation Foo

- (id) initWithAttributes:(NSDictionary *)attributes {
    if ((self = [super init])) {
        self.name = [attributes objectForKey:kAttributeName];
    }
    return self;
}

@end
</pre>

<p>NSXMLParserは、せめてuserData等のプロパティがあれば良かったのだけど、無いので、派生させて必要なプロパティを追加しておく。</p>

<pre class="prettyprint">
@interface KTXMLParser : NSXMLParser

@property (assign) NSUInteger state;
@property (assign) NSMutableArray *objects;

@end

@implementation KTXMLParser

@synthesize state = _state;
@synthesize objects = _objects;

@end
</pre>

<p>パース部分は相当手抜きして、ルートとその子エレメントしか考慮しないことにする。</p>

<pre class="prettyprint">
- (void)parser:(KTXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
    switch (parser.state) {
        case 0:
            if (![elementName isEqualToString:kRootElement]) {
                NSLog(@"The document starts with unknown element %@",elementName);
                [parser abortParsing];
            }
            break;
        case 1:
            {
                id obj = _createInstance(elementName, attributeDict,_cmd);
                if (obj) {
                    [parser.objects addObject:obj];
                    [obj release];
                } else {
                    NSLog(@"Instance creation failure");
                    [parser abortParsing];
                }
            }
            break;
        default:
            NSLog(@"Invalid document structure");
            [parser abortParsing];
    }
    parser.state += 1;
}
</pre>

<p>エレメント名をクラス名としてインスタンスを作成する。&lt;Foo .../&gt;だとFooクラスのインスタンスと言うことになる。</p>

<p>そしてインスタンス作成部分はというと。</p>

<pre class="prettyprint">
static
id _createInstance(NSString *className,NSDictionary *attributes,SEL _cmd) {
    Class klass = NSClassFromString(className);
    id obj = nil;
    if (klass) {
		
        obj = [klass alloc];
        if ([obj respondsToSelector:@selector(initWithAttributes:)]) {
            obj = [obj performSelector:@selector(initWithAttributes:) withObject:attributes];
        } else {
            NSLog(@"A instance of class %@ can not respond to selector initWithAttributes:",className);
            [obj release];
            obj = nil;
        }
    } else {
        NSLog(@"Unknown class:%@",className);
    }
    return obj;
}
</pre>

<p>メソッドではなくstaticな関数として実装しているのは、Objective-Cにはプライベートメソッドが存在せず、そのかわりなのか、@implementaionと@endの中にある関数はインスタンスのプライベートメンバにアクセスが出来る。つまり、プライベートメソッドはそういう風に実装してねという暗黙の了解なのかもしれない。と、いった理由による。</p>

<p>引数で_cmdを渡しているのだけど、これはメソッドの中では自動的に定義される変数で、そのメソッドのセレクタを示す。NSLogは_cmdを必要とするので、とりあえず呼び出し元の値を渡している。</p>

<p>_createInstanceの中身の主なところは前出の指定クラスのインスタンスの作成だ。そのあと、initWithAttributes:が実装されているかを調べ、実装されている場合には呼び出し、されていない場合は削除してnil（失敗）を返す。</p>

<p>以上で主な実装は終了だ。クラスを追加したとしても、initWithAttributes:にさえ対応していれば特に追加で実装しなくても良い。つまり、使い回しがきく。</p>

<p>実際には作成できるオブジェクトの制限がないので、プロダクトに使うのはどうかと思うのだけど、プロトタイピングでサクッと試したい場合には便利だ。昨年作成したKinectのプロジェクトでも使用している。</p>

<p>ソースは<a href="https://gist.github.com/1577809">https://gist.github.com/1577809</a>を参照ください。</p>]]>
    </content>
</entry>

<entry>
    <title>A Happy New Year! 2012</title>
    <link rel="alternate" type="text/html" href="http://blog.soprano.jp/2012/01/a-happy-new-year-2012.html?utm_source=blog&amp;utm_medium=rss" />
    <id>tag:blog.soprano.jp,2012://1.341</id>

    <published>2012-01-08T07:13:28Z</published>
    <updated>2012-01-08T07:19:13Z</updated>

    <summary> 今年もいろんなことに挑戦していきたいと思います。 ...</summary>
    <author>
        <name>forte</name>
        
    </author>
    
        <category term="雑記" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.soprano.jp/">
        <![CDATA[<p align="center"><img src="http://blog.soprano.jp/images/2012.png"></p>
<p>今年もいろんなことに挑戦していきたいと思います。</p>
]]>
        
    </content>
</entry>

<entry>
    <title>Touch The Air</title>
    <link rel="alternate" type="text/html" href="http://blog.soprano.jp/2011/12/touch-the-air.html?utm_source=blog&amp;utm_medium=rss" />
    <id>tag:blog.soprano.jp,2011://1.330</id>

    <published>2011-12-23T14:15:00Z</published>
    <updated>2011-12-23T14:13:07Z</updated>

    <summary> 12/18の日曜日に、妻の主催する「子どもの音楽会」でKinectを使ったイン...</summary>
    <author>
        <name>forte</name>
        
    </author>
    
        <category term="オンガク" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.soprano.jp/">
        <![CDATA[<p align="center"><img src="https://lh3.googleusercontent.com/-0PjHP8uNO00/Tu_3CLXzLZI/AAAAAAAAApU/I7VAKLU4zcM/s400/PC182263.jpg"></p>

<p>12/18の日曜日に、妻の主催する「子どもの音楽会」でKinectを使ったインタラクティブな音楽作品の発表を行いました。</p>

<p>手を叩くと音が鳴るように、空間に触れると音が鳴る、挙動が音になる。そういった、触覚ではなく、音によるフィードバックによる空間と身体のインタラクションだ。それは、空間を楽器にしてしまおうという試みでもある。</p>

<p>マルチタッチサーフェスを仮想的に空間に用意し、触れたり、かき回す（お風呂に腕を突っ込んだり、かき混ぜたりするイメージがわかりやすいかもしれない）ことにより音を奏でる機能を実装してみた。</p>

<p>今回、Kinectを使い、その上でアプリケーションを構築してみるという、わたしにとっては最初の挑戦であり、いくつか入力方法を用意してみて、試していく過程で、わかりやすさ、確実性という点から絞っていった。そこには、「子どもの音楽会」と冠されるように、メインの対象は子どもで、見ただけで、まねしてみただけで出来る事が必要という理由もあった。</p>
]]>
        <![CDATA[<p align="center"><img src="http://blog.soprano.jp/images/20111220_diagram.png"></p>

<p>やってみないと分からないことはあるもので、男の子は意外にシャイだという点が、「あれ、そうなの？」と言う感じだった。やんちゃに走り回ってたりするのにね。一人で前に出てやってみると言うのはなかなか難しいのだ。母親といっしょとか、誰かとコンビでなんとか。わたしもこのぐらいの年頃（３歳から７歳ぐらい）はそうだったのだろうか。</p>

<p>男の子とは対照的に女の子は積極的で、どんどん参加してくれた。それは三歳の女の子ですらそうで、彼女にはどういう世界が見えてるのかとても興味があるのだけど、すごい集中力で、一心不乱に踊っている（操作をしてる人を端から見ると踊ってるように見えるのだ）姿は可愛かった。</p>

<p>チラシを刷るのにタイトルを決めなきゃということで、「miburi-teburi（イタリア語っぽくミブーリテブーリと読む）」なんて適当に決めたのだけど、よくよく調べてみると<a href="http://mibutebu.sega.jp/">ミブリー＆テブリー</a>とか、<a href="http://ma7.mashupaward.jp/works/97">ミブリ・テブリ</a>（こちらはKinectってあたりも被っている）なんて先人がいた。当然のことながら、これらの作品とわたしはなんの関係もない。しかし、良くあるネーミングだし、まあそのままでも良いかなと思っている。</p>
]]>
    </content>
</entry>

<entry>
    <title>Exhibition Announcement</title>
    <link rel="alternate" type="text/html" href="http://blog.soprano.jp/2011/11/exhibition-announcement.html?utm_source=blog&amp;utm_medium=rss" />
    <id>tag:blog.soprano.jp,2011://1.313</id>

    <published>2011-11-13T06:20:00Z</published>
    <updated>2011-11-13T06:20:46Z</updated>

    <summary> もう、このエントリーを書く時点では会期がはじまってしまっているのですが、義妹で...</summary>
    <author>
        <name>forte</name>
        
    </author>
    
        <category term="Announcement" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.soprano.jp/">
        <![CDATA[<p align="center"><img src="http://blog.soprano.jp/images/info20111113.jpg"></p>

<p></p>

<p>もう、このエントリーを書く時点では会期がはじまってしまっているのですが、義妹でガラス作家の金子博子さんの企画展に参加しています。</p>

<p>架空の会社「宝の水酒造」をめぐり、様々な作家の方が共演を繰り広げます。</p>

<p>わたしはというと、「宝の水酒造」イメージソング「宝の水」の歌詞に曲をつけ音楽で参加しています。</p>

<p>会場は<a href="http://www.studio-stick.jp/">スタジオ・スティック</a>さんで、今月１１月の２７日までとなっています。</p>

<p>よろしければ、是非。</p>]]>
        
    </content>
</entry>

<entry>
    <title>I Will Not Forget You</title>
    <link rel="alternate" type="text/html" href="http://blog.soprano.jp/2011/10/i-will-not-forget-you.html?utm_source=blog&amp;utm_medium=rss" />
    <id>tag:blog.soprano.jp,2011://1.300</id>

    <published>2011-10-07T03:00:00Z</published>
    <updated>2011-10-07T03:02:30Z</updated>

    <summary> 何となくの予感はあったのだけど、いざ訪れてしまうとどんな言葉でも言い表せない。...</summary>
    <author>
        <name>forte</name>
        
    </author>
    
        <category term="Apple" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.soprano.jp/">
        <![CDATA[<div style="float:left"><img src="http://blog.soprano.jp/images/apple_logo_blk.png"></div>
<p>何となくの予感はあったのだけど、いざ訪れてしまうとどんな言葉でも言い表せない。 <br>
&nbsp;<br>
あなたの作品をもっと見たかった。<br>
あなたの示すビジョンをもっと見たかった。<br>
<br>
スティーブ、たくさんのワクワクをありがとう。そして安らかに。<br>]]>
        
    </content>
</entry>

<entry>
    <title>A Day In Junkudo 3</title>
    <link rel="alternate" type="text/html" href="http://blog.soprano.jp/2011/04/a-day-in-junkudo-3.html?utm_source=blog&amp;utm_medium=rss" />
    <id>tag:blog.soprano.jp,2011://1.211</id>

    <published>2011-03-31T15:30:00Z</published>
    <updated>2011-03-31T15:31:25Z</updated>

    <summary>なんだか一月がたつのが早い。と、いうわけで、第三回我が家のジュンク堂の日もつつが...</summary>
    <author>
        <name>forte</name>
        
    </author>
    
        <category term="雑記" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.soprano.jp/">
        <![CDATA[<p>なんだか一月がたつのが早い。と、いうわけで、第三回我が家のジュンク堂の日もつつがなく執り行われたのだ。このエントリーは月末にばたばたと書いているわけだが、実際には彼の地震の翌週末だった。</p>

<p>今回、店舗をまた新宿店に戻した。やはり上下移動が少なく１フロアでたくさん見て回れるのは、書架の間を泳ぐという点では優れているのではないかと思う。</p>

<p>まずは前回選んだ３冊だけど、「私デザイン」はプロダクションの現場のパワーと熱気あふれる雰囲気が魅力的だ。そして、タフなのがとても良い。ものつくりの現場は一筋縄ではいかなくて、それでも進むしかないのだ。</p>

<p>「調理場という戦場」浪花節かと思いきや、そこはフランスでの修行を乗り越えただけの事があって、そこここに見え隠れするドライな感覚。それがまたプロフェッショナルなんだなと感じた。この人の作る料理はどういう物なのだろうと思いを馳せる。一度お店に行ってみたい。</p>

<p>「建築が生まれるとき」はカタログと言うよりイントロダクション集みたいな感じだった。美術展のパンフレットの文字の部分だけを集めてきた。そんな雰囲気。最初その感じに戸惑ったけど、要はイントロダクションを読み、ビジュアルは自分でどうにかすればいいという事だ。ときどき姿を現す建築家としての著者の主観による現実世界の切り取り。それは問いかけのようでも内省のようでもあった。</p>

<p>さて、だんだんと難しくなってきてるのが、パターンを避けようとしてアンチパターンにはまらないようにする事だ。前の続きでこれ、でも、これは選んでないからこれ、でもなく、何にも気負わずすっと選び取る。なんだか禅な世界に踏み込みつつあるような気がしないでもない。</p>

<p>そんな中でも、今回はこれはと思った書籍が多くて、さらにその中から選び取るという形となった。書物の世界はどれだけ広いのだろうか。</p>

<table>
<tr><td>

<div style="float:left;width:120px;height:140px;border:3px solid #005e66;margin:5px;padding: 5px">
<a href="http://www.junkudo.co.jp/detail.jsp?ID=0193609725">
<p align="center">
<img src="http://www.junkudo.co.jp/covers/noImage.jpg">
</p>
<p align="center">秘密は何もない</p></a>
</div>

<p>「秘密は何もない」魅惑的なタイトルではないか。</p>

<p>演劇の演出家の自身の演出についての言及。といっても論文集といった固い物ではなく、序文にもあるように講演を書き起こしたような、そんな本だ。</p>

<p>秘密はない。では、なにがそこにはあるのだろうか。その中を覗いてみたいと思ったのだ。</p>

</td></tr>
<tr><td>

<div style="float:left;width:120px;height:140px;border:3px solid #005e66;margin:5px;padding: 5px">
<a href="http://www.junkudo.co.jp/detail.jsp?ID=0279110585">
<p align="center">
<img src="http://www.junkudo.co.jp/covers/noImage.jpg">
</p>
<p align="center">ニューロフィードバック</p></a>
</div>

<p>サブタイトル、いや、そもそも原題が「シンフォニーインザブレイン」となっている。よくよく考えるとローカライズタイトルがカタカナ語で原題と違うという点に不思議な感じを感じなくもない。</p>

<p>帯の「脳波が人をコントロールしているのだろうか」というコピーもとても興味をそそられる。</p>

<p>といっても、サイエンスではなく心理学的なメソッドの話であるらしい。脳波が人に影響するのだろうか。それとも心の揺らぎが脳波の揺らぎとなるのだろうか。</p>

</td></tr>
<tr><td>

<div style="float:left;width:120px;height:140px;border:3px solid #005e66;margin:5px;padding: 5px">
<a href="http://www.junkudo.co.jp/detail.jsp?ID=0112278842">
<p align="center">
<img src="http://www.junkudo.co.jp/images/482226470X.jpg">
</p>
<p align="center">デザインの骨格</p></a>
</div>

<p>タイトルもさることながら、帯の「デザインには理由がある」というのが心に響いた。</p>

<p>自由奔放ではなく、工業的にも、ユーザビリティにも制約された条件の中でいかにデザインするか。そこがインダストリアルデザインのおもしろさだと思う。</p>

<p>中に読んだ事がある一編があった。どこかで連載していた物をまとめたのだろうか。</p>

</td></tr>
</table>]]>
        
    </content>
</entry>

<entry>
    <title>Deeply Sleepy</title>
    <link rel="alternate" type="text/html" href="http://blog.soprano.jp/2011/03/deeply-sleepy.html?utm_source=blog&amp;utm_medium=rss" />
    <id>tag:blog.soprano.jp,2011://1.208</id>

    <published>2011-03-21T13:22:22Z</published>
    <updated>2011-03-21T13:20:56Z</updated>

    <summary> Late 2010バージョンのMacBookAirは待機時間が最大３０日という...</summary>
    <author>
        <name>forte</name>
        
    </author>
    
        <category term="Macintosh" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.soprano.jp/">
        <![CDATA[<div style="float:left;width: 160px">
<img src="http://blog.soprano.jp/images/deepsleep.png">
</div>

<p>Late 2010バージョンのMacBookAirは待機時間が最大３０日という事になっている。その秘密はどうやらある一定時間が過ぎると、スリープがディープスリープに切り替わる事らしい（そしてＳＳＤとの組み合わせのマジックでもある）。</p>

<p>ディープスリープかどうかの違いは、簡単に言えばメモリ上の情報をＨＤＤに待避するかどうかと言う事になる。通常のスリープではメモリを保持するバッテリーを消費する代わりに、起こせばすぐに戻ってくると言う利点がある。</p>

<p>ところで、MacBookシリーズのスリープは通常ではSafe Sleepというモードになっている。何がセーフなのかという事なのだけど、これはバッテリーが持ちそうな間はメモリ上に、危なくなってきたらＨＤＤに待避してディープスリープに移行する仕組みから来ている。</p>

<p>危なくなってきたらという、おそらく残容量をキーにして移行するという点が違うのだけど、自動的にディープスリープに移行する仕組みは元々備わっていた。時間によって移行する仕掛けが新機能というわけだ。</p>

<p>普段持ち歩いていてもこの後はしばらく使わないというのが分かって閉じる事がある。こういうときにあらかじめディープスリープさせておけたら、もう少し使える時間が延びるのではないかと常々思っていた。</p>

<p>MacBookは（OSXはという方が正しいのかもしれない）スリープモードを、スリープのみ、ディープスリープのみ、セーフスリープ（前述の物）の３つのうちのどれかに設定する事が出来る。つまり積極的にディープスリープだけを使うという設定にも出来るのだけど、残念な事にディープスリープからの復帰はLate 2010 Airのように数秒とはいかないのだ。設定してみた物の毎回数十秒待たされるのに閉口して元に戻してしまった。</p>

<p>そこで登場するのが<a href="http://www.axoniclabs.com/DeepSleep/">DeepSleep</a>というWidgetだ。使い方はわざわざ説明するまでもなく、以前のバージョン、1.2の時はWidgetを使ってスリープさせたときの挙動を選べたのだけど、最新版の1.5.1はきわめてシンプルになって、押すとディープスリープする。以上。という潔さ。</p>

<p>ただし注意する点が一つだけある。ACにつないだ状態の場合だと、マシンの設定によってディープスリープには移行しないことがあるようだ。</p>

<p>わたしの場合、長時間電車などで移動する間にAir(Late 2008)を使用し、降りて移動する前にWidgetでディープスリープさせるといった使い方をしている。そのまま次の日まで忘れてたりする事もあるのだけど、感覚的にはもっと減ってるはずのバッテリーの残量にびっくりするのだ。</p>

<p><blockquote><a href="http://www.axoniclabs.com/DeepSleep/">Axonic Labs - DeepSleep Widget - Hibernate your Mac</a></blockquote><p>]]>
        
    </content>
</entry>

<entry>
    <title>A Day In Junkudo 2</title>
    <link rel="alternate" type="text/html" href="http://blog.soprano.jp/2011/02/a-day-in-junkudo-2.html?utm_source=blog&amp;utm_medium=rss" />
    <id>tag:blog.soprano.jp,2011://1.194</id>

    <published>2011-02-28T13:40:00Z</published>
    <updated>2011-02-28T13:41:24Z</updated>

    <summary>２月も、ジュンク堂に赴き、その書架の海に潜り、そしてこれはと思う本を探すイベント...</summary>
    <author>
        <name>forte</name>
        
    </author>
    
        <category term="雑記" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.soprano.jp/">
        <![CDATA[<p>２月も、ジュンク堂に赴き、その書架の海に潜り、そしてこれはと思う本を探すイベントがつつがなく行われた。我が家ではそのイベントを「ジュンク堂大会」もしくは「ジュンク堂の日」と呼んでいる。どちらでもいいのだけど、そろそろどちらにするか決めておいた方が良いかもしれない。</p>

<p>前回の三冊は、結論から言うとどれもとても面白かった。まず読み上げたのは、「にほんの建築家　伊藤豊雄観察記」だった。頭の中かから現実にそのイメージを物として焼き付けるプロセス、そのパワー、その執念。あたりまえだけど、マクロな視点からミクロな視点まで、ネジをどうするかに至るまで誰かが決めないといけないのだ。それを統治すべく君臨する建築家</p>

<p>そして「たったひとつの冴えたやり方」は文章の軟らかさに完全にしてやられたと言っていいだろう。少年ＳＦという印象で読み進んでいったらあんな結末に導かれるとは！</p>

<p>「重力のデザイン」は二部構成といえるのではないかと思うけど、前半はみっしりと印刷物、とりわけタイポグラフィーと重力という事に対して述べられている。そろりそろりとしか進めないのだけど、知的で魅惑的な、いうなれば都市の風景だ。そして、後半はうって変わって軽やかな郊外の風景とでも言えるデザインの中の写真の話題となる。前半とは違って、なにか作者の思索をみていると言うという印象が強い。</p>

<p>さて、今回はジュンク堂の池袋店で行った。別段店舗を変える理由もなかったのだけど、変えない理由もなかったのだ。ただ、あちこちふらふらと泳ぎ回るには、フロア数が多いというのは意外にやりづらいということが分かった。その点、新宿店は３フロアで横に長い売り場レイアウトなので適している。そんなのは書店の良し悪しとは全く関係ない事なんだけど。</p>

<p>今回感じたのは、どこを起点に見るかというその最初の視点も自分の選択に影響を与えてるのではないかということだ。次回はドリトル先生のように目をつぶって指さしたところからスタートというのも良いかもしれない。狙うは知のモンテカルロ法なのだ。</p>

<p>それでは今回選んだものをご紹介しよう。</p>

<table>
<tr><td>

<div style="float:left;width:120px;height:140px;border:3px solid #005e66;margin:5px;padding: 5px">
<a href="http://www.junkudo.co.jp/detail.jsp?ID=0105920558">
<p align="center">
<img src="http://www.junkudo.co.jp/covers/noImage.jpg">
</p>
<p align="center">私デザイン</p></a>
</div>

<p>デザイナー石岡瑛子さんの、自伝的、プロジェクトがどうやって生まれどうやって完成していったかが当のデザイナーの一人称の視点で語られる一冊。前回の伊藤豊雄氏の話もそうだけど、物が出来ていくその現場というのはパワーがあふれていていい。</p>
<p>書架の一番上の段にあったこの本の装丁がふと目を引き、そしてマイルス・ディビスのTUTUのデザインをやったという最初のカラーをみたときにとても興味を引かれたのだ。</p>

</td></tr>
<tr><td>

<div style="float:left;width:120px;height:140px;border:3px solid #005e66;margin:5px;padding: 5px">
<a href="http://www.junkudo.co.jp/detail.jsp?ID=0111814423">
<p align="center">
<img src="http://www.junkudo.co.jp/images/486073047X.jpg">
</p>
<p align="center">建築が生まれるとき</p></a>
</div>

<p>前回建築物を選んだから・・・ではなく、平積みになってるこの本の表紙のアイコンっぽい絵に惹かれたのだ。中を見て建築関係の書籍と分かったときは正直、「あちゃあ、かぶったか」と思ったのだけど、その簡潔にまとめられた建築家の思考カタログ的なところにぐっときたのだ。意識しない所にも建築家の意識が込められている。</p>

</td></tr>
<tr><td>

<div style="float:left;width:120px;height:140px;border:3px solid #005e66;margin:5px;padding: 5px">
<a href="http://www.junkudo.co.jp/detail.jsp?ID=0102544740">
<p align="center">
<img src="http://www.junkudo.co.jp/covers/noImage.jpg">
</p>
<p align="center">調理場という戦場</p></a>
</div>

<p>フレンチのシェフ斉須政雄さんの自伝。読んでいると、とても元気が出る本。ぐいぐいと読み進んでしまう。</p>
<p>もともとは「ほぼ日刊イトイ新聞」の連載がベースになってるようだ。</p>
<p>ただ継続してやるという事のすごみを感じる。やってきた人だからこその言葉の本物さを感じるのだ。</p>

</td></tr>
</table>]]>
        
    </content>
</entry>

<entry>
    <title>A Day In Junkudo</title>
    <link rel="alternate" type="text/html" href="http://blog.soprano.jp/2011/01/a-day-in-junkudo.html?utm_source=blog&amp;utm_medium=rss" />
    <id>tag:blog.soprano.jp,2011://1.174</id>

    <published>2011-01-09T13:22:22Z</published>
    <updated>2011-01-09T13:31:57Z</updated>

    <summary>今日は妻と新宿のジュンク堂に行き、おおよそ５千円ときめた予算の中でお互いに気にな...</summary>
    <author>
        <name>forte</name>
        
    </author>
    
        <category term="雑記" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.soprano.jp/">
        <![CDATA[<p>今日は妻と新宿のジュンク堂に行き、おおよそ５千円ときめた予算の中でお互いに気になる本を買うというイベントの第一回を行った。</p>

<p>ジュンク堂という書店は、わたしにとってとても親しみのある書店で、というのも、もともと神戸発祥のこの書店の三宮にある店へ父親に幼少の頃から連れて行かれていたのだった。そして、自分の好きな本と父親がこれと決めた本を一冊ずつ、１ヶ月のうちに一回買いに行くというのがなんとなく我が家の定期行事だったのだ。</p>

<p>それに習ったわけではないのだけど、今年は入力し出力する年と年始に決めて、それならばとなんとなく妻に提案してみたところ開催と相成ったわけだ。妻という他人が入ることによって、さらに別の「目」による発見も期待できる。</p>

<p>金額もお互い１万円というのも考えたのだけど、一年たってみたら（そう、最低一年毎月行おうと思ってるのだ）書籍の量もとんでもないものになってるのではないかというので、とりあえず半額にしてみた。とはいえ、厳密にその予算の中に納めるというゲームではないので、目安ではある。</p>

<p>もちろん、普段から読書量は少なくない方なので、本を読みましょうと言うキャンペーンではない。書店に行って、その書架の海を放浪して、そしてなにかピンと来る本を見つけましょうというのがその趣旨なわけだ。</p>

<p>わたしが人生において最も重要なスキルはジャケ買いのスキルだと思っているのだけど、その話はおいておこう。</p>

<p>いざジュンク堂に行ってみると、自分の書店での行動がいかに目的の本を探すかという行動原理に従ってるかというのに気がつく。どうも先に頭でイメージした本を探すというそんな動きになってしまうのだ。</p>

<p>もちろん、目的のものを買いに行った場合にはそれも理にかなっているのだけど、今回はそうではない。捜し物をするときのコツはいかに探していないところを見つけるかで、そうでないと同じ所を探してぐるぐる回ってしまうのだけど、同じように、固定化した自分のパターンの中で探してみても想像を超えるものは出てこない。</p>

<p>なるべくニュートラルに自分を保ちつつ書架をうろついてるうちに、最初はぎこちなかったのだけど、徐々になんとなく流せるようになってくる。世の中にはいろんな本があるものだなと思う。</p>

<p>そんな中でどうやって本を選び取るか、だけど、それは不思議なもので、まず第一印象で手に取るかどうかが決まり、そして、手にした後にぱらぱらとめくり始めると吸い付いたように離れない、どんどん先を進めたくなる本というのがあるのだ。</p>

<p>そういう本をかごに入れては放浪していたらわずか３冊で予算を少々超えるという結果になった。ぎりぎり判断に迷った本はそのまま書架に戻し、本当に縁があれば次回選び取るだろうとすっぱりあきらめた。</p>

<p>さて、わたしが選んだ３冊は以下の通り。せっかくなのでジュンク堂へのリンクとしたいのだけど、Amazonのようには気の利いたパーツがないので、画像などは直リンクとなってしまって、あまりお行儀がよろしくない。そのうち切れてしまうかもしれない。</p>

<p>いずれもまださわり程度でほぼ未読だと言うことはお断りしておかないといけない。</p>

<table>
<tr><td>

<div style="float:left;width:120px;height:140px;border:3px solid #005e66;margin:5px;padding: 5px">
<a href="http://www.junkudo.co.jp/detail.jsp?ID=0288706264">
<p align="center">
<img src="http://www.junkudo.co.jp/images/4887062648.jpg">
</p>
<p align="center">にほんの建築家　伊東豊雄・観察記</p></a>
</div>

<p>父が建築家だったこともあり、建築というものには親しみがある。そして建築というものが今年の重要なファクターの一つになるのではないか思っているのだけど、それはそれとして、「アーキテクトとは、チャンスがあれば世界の果てまでも出かけてコンペを競うK-1ファイターのような存在である」という伊東氏の言葉が面白い。</p>
<p>とりあえず第一歩として、とっかかりとなるのではないかという予感があった。</p>

</td></tr>
<tr><td>

<div style="float:left;width:120px;height:140px;border:3px solid #005e66;margin:5px;padding: 5px">
<a href="http://www.junkudo.co.jp/detail.jsp?ID=0279176320">
<p align="center">
<img src="http://www.junkudo.co.jp/covers/noImage.jpg">

</p>
<p align="center">重力のデザイン</p></a>
</div>

<p>写真のコーナーで見つけた。たしかに副題は「本から写真へ」となってはいるけど、その実はデザイン（主に印刷物）における「重力」の与える影響について書かれた本・・・らしい。たしかに、そういう視点でデザインを考えたことがなかったな、と。その切り口だけでも魅力的だ。</p>
<p>「なぜ鏡像は、左右は逆転するのに天地は逆転しないのか」。森博嗣の小説でもその話題が出てきたことがあったな。</p>

</td></tr>
<tr><td>

<div style="float:left;width:120px;border:3px solid #005e66;margin:5px;padding: 5px">
<a href="http://www.junkudo.co.jp/detail.jsp?ID=0109264011">
<p align="center">
<img src="http://www.junkudo.co.jp/images/4152089512.jpg">

</p>
<p align="center">たったひとつの冴えたやりかた</p></a>
</div>

<p>SFの古典的名作・・・らしい。実は読んだことがなかった。まず惹かれたのはその装丁。そして帯にある「生まれも、育ちも、種族さえちがっても、ともだちになれると思った。」というフレーズ。紹介のプロットも心惹かれるものがある。同作を含む短編集が同じ早川からでている。そして、そちらの方が安い。そのせいなのかどうなのか２００８年の初版本だった。</p>

</td></tr>
</table>]]>
        
    </content>
</entry>

<entry>
    <title>A Happy New Year! 2011</title>
    <link rel="alternate" type="text/html" href="http://blog.soprano.jp/2011/01/a-happy-new-year-2011.html?utm_source=blog&amp;utm_medium=rss" />
    <id>tag:blog.soprano.jp,2011://1.170</id>

    <published>2011-01-01T14:50:00Z</published>
    <updated>2011-01-01T14:45:27Z</updated>

    <summary> 今年もいろいろなことに挑戦していきたいと思います！ ...</summary>
    <author>
        <name>forte</name>
        
    </author>
    
        <category term="雑記" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.soprano.jp/">
        <![CDATA[<p align="ceter">
<img src="http://blog.soprano.jp/images/2011.png">
</p>

<p>
今年もいろいろなことに挑戦していきたいと思います！
</p>]]>
        
    </content>
</entry>

<entry>
    <title>Exploring Into SuperCollider 7</title>
    <link rel="alternate" type="text/html" href="http://blog.soprano.jp/2010/12/exploring-into-supercollider-7.html?utm_source=blog&amp;utm_medium=rss" />
    <id>tag:blog.soprano.jp,2010://1.150</id>

    <published>2010-12-22T16:00:00Z</published>
    <updated>2010-12-22T15:53:00Z</updated>

    <summary> 前回までのところでタイマーに対し演奏されるべき時間にトリガーをかけてもらう予約...</summary>
    <author>
        <name>forte</name>
        
    </author>
    
        <category term="SuperCollider" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.soprano.jp/">
        <![CDATA[<p>
前回までのところでタイマーに対し演奏されるべき時間にトリガーをかけてもらう予約を行うところまで来ていた。あとはトリガーに対して演奏データを処理する、つまりは最終的にsclangのランドから、scsynthに対してコマンドを発行することになる。
</p>

<p>
ようやくUGenからみていったSuperColliderの処理の流れも、一周してきたというわけだ。
</p>]]>
        <![CDATA[<h3 class="heading">Responding to timer trigger</h3>

<p>流れをもう一度確認してみよう。</p>
<p>同じような流れは以前にも出てきたのだけど、少々込み入っていて把握しづらい。図示してみた。</p>

<p align="center">
<img src="http://blog.soprano.jp/images/20101031_sc01.png">
</p>

<p>図の上段が前回の部分だ。そして、タイマーからのトリガーが下段だ。このawakeからの部分は、実は以前にも見ていて対象のクラスが違うので微妙に異なる部分があるのだけど、大体においては同じだ。</p>

<p>と、いうことで、今回はprNextからの流れを見ていくことにしよう。</p>

<p>EventStreamPlayerクラスのprNextの実装は次のようになっている。</p>

<p><pre class="prettyprint">
    prNext { arg inTime;
        var nextTime;
        var outEvent = stream.next(event.copy);	    // 1
        if (outEvent.isNil) {
            streamHasEnded = stream.notNil;
            cleanup.clear;
            this.removedFromScheduler;
            ^nil
        }{
            nextTime = outEvent.playAndDelta(cleanup, muteCount > 0); // 2
            if (nextTime.isNil) { this.removedFromScheduler; ^nil };
            nextBeat = inTime + nextTime;	// inval is current logical beat
            ^nextTime
        };
    }
</pre></p>
<blockquote><em>prNext Stream.sc</em></blockquote>

<p>
大まかにいうと演奏すべきイベントを取り出し(1)、実際に演奏する(2)という流れになっている。戻り値は次にトリガーを予約する時間で、次に演奏すべきデータがない場合はnilを返すようになっている。
</p>

<p>stream.nextで取り出したoutEventを演奏するメソッド、playAndDeltaはEventクラスで実装されている。</p>

<p><pre class="prettyprint">
    playAndDelta { | cleanup, mute |
        if (mute) { this.put(\freq, \rest) }; // 3
            cleanup.update(this);
            this.play;        // 4
            ^this.delta;
        }
</pre></p>
<blockquote><em>playAndDelta Event.sc</em></blockquote>

<p>ミュートが指定されている場合、3でなにやら設定しているようなのだけど、とりあえず飛ばして先に進んでみる。4でそのものずばりのメソッドplayが呼ばれる。

<p><pre class="prettyprint">
    play {
        if (parent.isNil) {
            parent = defaultParentEvent;
        };
        this.use {
            this[\play].value;	// 5
        };
//      ^this.delta
    }
</pre></p>
<blockquote><em>play Event.sc</em></blockquote>

<p>さっきのmuteのところでも気になったのだけど、5でなにやら自分に対してシンボル\playにひも付いた値を取り出そうとしているように見える。</p>

<p>Eventクラスの継承関係はどうなってるのだろうか。</p>

<p align="center">
<img src="http://blog.soprano.jp/images/20101031_sc02.png">
</p>

<p>EventクラスはDictionaryクラスの派生クラス（直接ではないけど）ということが見えてくる。保留にしていたmuteの時の処理(3)も\freqのというキーに\restというシンボルを結びつけているということがわかる。</p>

<p>
さて、EventがDictionaryクラスのサブクラスなのはわかったのだけど、では[\play]、そしてそのオブジェクトに対してvalueというメソッドを呼び出している(5)の意味とはなんだろうか。その答えは、Eventクラスのクラス初期化を追っていくとわかる。
</p>

<p><pre class="prettyprint">
    *initClass {
        Class.initClassTree(Server);
        Class.initClassTree(TempoClock);
        this.makeParentEvents;                // 6
		
        StartUp.add {
            Event.makeDefaultSynthDef;
        };
    }
</pre></p>
<blockquote><em>initClass Event.sc</em></blockquote>

<p>
*initClassはクラスファイルが読み込まれたときに一度だけ実行されるメソッドだ。
このなかでmakeParentEventsというメソッドが呼ばれている(6)。
</p>

<p>このmakeParentEventsというのはEventクラスのクラスメソッドで、こんな感じで実装されている。</p>

<p><pre class="prettyprint">
    *makeParentEvents {		
        // define useful event subsets.
        partialEvents = (

</pre><p>
<blockquote><em>makeParentEvents Event.sc</em></blockquote>

<p>
makeParentEventsはとても巨大なメソッドなので冒頭の部分だけの抜粋になるけど、ここでは演奏用のイベントデータのパターンをすべて登録しているのだ。そして、このメソッドの最後で、
</p>

<p><pre class="prettyprint">
defaultParentEvent = parentEvents.default;
</pre></p>

<p>と、クラス変数defaultParentEventにセットしている。</p>

<p>つまり、this[\play]で取り出されているものは\playに結びつけられた、つまり演奏用のイベント情報なわけだ。</p>





<h3 class="heading">value</h3>

<p>さて、this[\play]に続くvalueだけど、これはもう何度も出てきているのでおなじみかもしれない。このメソッドはレシーバを評価するというメソッドだ。このメソッドはObjectに定義されている。
</p>

<p><pre class="prettyprint">
    value { ^this }
</pre></p>

<p>
デフォルトの挙動では自分自身を返す。もし、レシーバがFunctionクラスのインスタンスだった場合を見てみると、
</p>

<p><pre class="prettyprint">
    value { arg ... args; 
        _FunctionValue         // 7
        // evaluate a function with args
        ^this.primitiveFailed 
    }
</pre></p>

<p>
実装の実体は_FunctionValueで、これはおなじみのプリミティブ、つまりはネイティブに実装された内部ルーチンが呼び出されることになる。このようにレシーバがFunctionクラスの場合、その値はメソッドを実行した戻り値となる。
</p>

<p>
さて、Eventクラスのキー\playに対する値がどう定義されているのだろうか。
</p>

<p><pre class="prettyprint">
    play: #{
        var tempo, server;
					
        ~finish.value;

        server = ~server ?? { Server.default };
					
        tempo = ~tempo;
        if (tempo.notNil) {
            thisThread.clock.tempo = tempo;
        };
        ~eventTypes[~type].value(server);
    },
</pre></p>

<p>
このようにのブロック（関数）となっている。valueメソッドで評価されるものは、このブロックがとなる（このブロックが実行されて値を返す）。つまり、このブロックこそがEventクラスが演奏を行うときのコアロジックとなるわけだ。
</p>

<h3 class="heading">Environment Variable</h3>

<p>
ところで、~が頭につく変数というのはどういう変数なのだろうか。グローバル変数のように使用できるのだけど、グローバル変数というのはいまひとつ正確ではない。SuperColliderのドキュメントにはこのように記されている。
</p>

<p>
<blockquote><pre>
~			access an environment variable
~abc			compiles to \abc.envirGet
~abc = value		compiles to \abc.envirPut(value)
<a href="http://supercollider.svn.sourceforge.net/viewvc/supercollider/trunk/common/build/Help/Language/SymbolicNotations.html"><em>supercollider.svn.sourceforge.net--SymbolicNotations.html</em></a><br>
</pre></blockquote>
</p>

<p>つまり~はenvironment variable（環境変数）へのアクセスを行うためのシンタクスシュガーなわけだ。環境(environment)は、そのものずばり、Environmentというクラスがある。環境変数というのはそのEnvironmentクラスのインスタンスのキー値となる。</p>

<p>さて、~abcみたいに、対象のインスタンスを指定しなくてもアクセスできているということは、the environmentと呼べるようなEnvironmentクラスのインスタンスがどこかに存在するはずだ。</p>

<p>どこかというと、やはりObjectクラスが思い浮かぶわけで、実際Objectクラスにはクラス変数としてcurrentEnvironmentというEnvironmentクラスの変数が定義されているのだ。</p>

<p>
こんなコードで実験をしてみた。
</p>

<p><pre class="prettyprint">
<strong>~x = 'hello';</strong>
<strong>~x.postln</strong>
<em>(上の２行を評価)</em>
hello
hello
<strong>currentEnvironment = Environment.new</strong>
<em>(上の行を評価)</em>

Environment[  ]
<strong>~x.println</strong>
<em>(上の行を評価)</em>

ERROR: Message 'println' not understood.
RECEIVER:
   nil
</pre></p>

<p>途中でcurrentEnvironmentにあたらしいEnvironmentクラスのインスタンスをセットしている。それによって~xが未定義状態になっていることがわかる。新しいEnvironmentには\xの値をセットしていないからだ。</p>

<p>このように、環境変数はごっそりと環境ごと換えて（換えられて）しまうことが出来る。</p>

<h3 class="heading">Event Types</h3>

<p>
さて、寄り道が長くなってしまったが、Eventクラスのplayメソッドに戻ろう。playメソッドにはとてもさり気ない記述なのだけど重要な処理を行っている部分がある。</p>

<p><pre class="prettyprint">
    play {
        if (parent.isNil) {
            parent = defaultParentEvent;
        };
        this.use {  // 8
            this[\play].value;
        };
//      ^this.delta
    }
</pre></p>
<blockquote><em>play Event.sc</em></blockquote>

<p>この(8)の部分だ。自身のuseメソッドをブロックを引数に呼び出している。useの実装はEnvironmentクラスで行われている。</p>

<p><pre class="prettyprint">
    use { arg function;
        // temporarily replaces the currentEnvironment with this, 
        // executes function, returns the result of the function
        var result, saveEnvir;
	
        saveEnvir = currentEnvironment;
        currentEnvironment = this;    // 9
        protect {
            result = function.value(this);
        }{
            currentEnvironment = saveEnvir;
        };
        ^result
    }
</pre><p>
<blockquote><em>use Environment.sc</em></blockquote>

<p>(9)をみるとcurrentEnvironmentを自分自身で書き換えている。(9)で環境を取り替えた後、他のスレッドからは排他的に実行するためにprotectメソッドの中で引数の関数ブロックを実行する。そして、終了したらまた環境を元に戻すという処理を行っている、</p>

<p>さて、\playによって評価されるのは現在の環境の\playに結びつけられた値、今の場合ブロックなのでブロックが評価される（実行される）。</p>

<p>もう一度\playに結びつけられているブロックをふりかえってみよう。</p>

<p><pre class="prettyprint">
    play: #{
        var tempo, server;
					
        ~finish.value;

        server = ~server ?? { Server.default };
					
        tempo = ~tempo;    // 10
        if (tempo.notNil) {
            thisThread.clock.tempo = tempo;
        };
        ~eventTypes[~type].value(server);  // 11
    },
</pre></p>

<p>(10)で自身に\tempoのキーで値が設定されていないかを調べて、設定されていた場合にはテンポを設定している。</p>

<p>このようにデフォルトの値が設定されていないキーもあれば設定されているキーもある。(11)では\eventTypesキーに結びつけられたオブジェクトのさらに\typeのキーに結びつけられたオブジェクトを引き、それを評価(value)している。</p>

<p>\typeは\playの定義のすぐ上でこんな風に定義されている。</p>

<p><pre class="prettyprint">
    type: \note,
</pre></p>

<p>何も指定しなかった場合、イベントのタイプは\noteとなるわけだ。</p>

<p>\eventTypeにはいろんなタイプの演奏イベントが定義されている。例えば\restはこうなっている。</p>

<p><pre class="prettyprint">
    rest: #{},
</pre></p>

<p>何もしないというのが一目瞭然だ。</p>

<p>さて、いま、とりあえずイベントのタイプは\noteだとして進もう。\noteはというと、こんな風に定義されている。</p>

<p><pre class="prettyprint">
note: #{|server|
    var freqs, lag, strum, strumTime, sustain;
    var bndl, addAction, group, sendGate, ids;
    var msgFunc, desc, synthLib, bundle, instrumentName, schedBundleArray, offset;
						
    freqs = ~detunedFreq.value;
            ...
</pre></p>

<p>とても長いので、流れをざっとみていくことにする。</p>

<p>
前半はソースのコメントにもあるとおり、OSCメッセージを組み立てている。そして、後半、処理は二つに分かれる。ひとつはそのまま組み立てたメッセージをまとめて送信するか、それともアルペジオのように間隔を空けて順次送信するかだ。</p>

<p>そしてどちらも最終的に到達するメソッドは同じで、server.sendBundleとなる。余談になるけど、その前段階に呼ばれる~schedBundleArray.valueも~schedStrummedNote.valueも、この巨大な辞書の中に定義されている。このノリは少しJavaScriptににているような気がする。</p>

<p>
~schedBundleArrayの方を見てみると、以下のようになっている。
</p>

<p><pre class="prettyprint">
    schedBundleArray: #{ | lag, offset, server, bundleArray |
        thisThread.clock.sched ( offset, {
            if (lag !=0 ) {
                SystemClock.sched(lag, { server.sendBundle(server.latency, *bundleArray) })  //12
            } {
                server.sendBundle(server.latency, *bundleArray)  // 13
            }
        })
    },
</pre></p>

<p>
offsetによってタイマーのトリガを予約して、トリガーがかかると、lagが０のときはすぐにserver.sendBundleを行い(13)、そうでない場合はタイマーにsendBundleの実行を予約している(12)。offsetもlagも０ではないときはoffset+lag分二回のタイマーのトリガを経てserver.sendBundleに到達することになる。</p>

<p>
ここで、ようやくイベントはサーバに届き、音として再生されることとなるわけだ。
</p>]]>
    </content>
</entry>

<entry>
    <title>Have A Long Trip With MacBook Air</title>
    <link rel="alternate" type="text/html" href="http://blog.soprano.jp/2010/10/have-a-long-trip-with-macbook.html?utm_source=blog&amp;utm_medium=rss" />
    <id>tag:blog.soprano.jp,2010://1.149</id>

    <published>2010-10-18T16:30:00Z</published>
    <updated>2010-10-18T16:25:55Z</updated>

    <summary> HyperMacというMacBook用の外部補助バッテリーの存在を思い出し、購...</summary>
    <author>
        <name>forte</name>
        
    </author>
    
        <category term="Macintosh" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="gadget" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.soprano.jp/">
        <![CDATA[<div style="float:left">
<img src="http://lh4.ggpht.com/_YR02p1m6ZAM/TLxc09xgWXI/AAAAAAAAAmI/qpUgI2Wc8gM/s288/P1030514.JPG" class="corner iradius22 ishadow33" >
</div>

<p><a href="http://www.hypershop.com/HyperMac-External-Battery-for-MacBook-iPhone-iPad-iPod-s/91.htm">HyperMac</a>というMacBook用の外部補助バッテリーの存在を思い出し、購入しようと思うきっかけになったのはMagSafeコネクタのパテント関連でこの製品を販売しているメーカーがAppleから訴えられたというニュースを見たことだった。</p>

<p>仕事で外出するときはMacBook Airを持ってでかけている。AirはMacintoshの中では軽くて携帯性は良い方なのだけど、如何せんバッテリーの持ちはあまり良くない。メーカースペックでは５時間となっているけど、なんとなく実際に使ってる感じでは２時間半ぐらいだろうか。</p>

<p>行き帰りの電車でフルに使うと、あとはスターバックスで使うにも心許ない量しか残ってないという状態だ。なので、ACアダプタも持ち歩いてチャンスがあれば充電していた。それとは別にPocket Wifiも持ち歩いていて、こちらも持って４時間ぐらい。一日出歩くにはちょっと足りないので何か補助バッテリーが必要だった。</p>

<p>Airの方は仕方ないにしても、Pocket Wifiの方は何とかしたいと思っていたところにニュースを見て、その存在を思い出したのだ。</p>

<p>さて、わたしが購入したのはMacBook用のMagSafeコネクタがつくタイプの中では一番小さい<a href="http://www.hypershop.com/HyperMac-External-MacBook-Battery-60Wh-p/mbp-060.htm">60Whのもの</a>だ。Airのバッテリー容量は40Whとあるので、1.5倍の容量と言うことになる。MacBookへの電源供給とは別に給電用USBポートがついているので、ちょうどわたしのAir+Pocket Wifiと言うニーズにマッチする。この製品は製品のページの注意書きにもあるように15"以上のMacBook Proは未対応なので注意が必要だ。</p>

<p>購入はこのメーカの直販のネットストアから行った。最近は海外ネット通販もあまり心理的な障壁は感じない。もっとも、今まで購入してきたものが不良品ではなかったので苦労しなかったというのもあるかもしれない。返品や交換となると大変そうだ。このHyperMacの製品で初期不良を引いてしまって交換が大変だったという方もネットで見かけた。いざというときの対処は必要になるかもしれないというのは覚悟をしておくべきかもしれない。</p>

<p>注文時には充電用のACアダプタのコンセントの型がいくつかと、MagSafeのコネクタの型が通常のMacBook型かAir型かが選べる（MagSafeコネクタは無しも選べるけど、この製品を買うユーザはその選択肢はないんじゃないかな？あと、追加料金を払えばどちらもつけることもできる）。コンセント型はUSタイプでOKだ。MagSafeは（当然）Airタイプを選んだ。</p>

<p>発送まで、わたしが注文したときは一週間位というステータスだったのだけど、三日後ぐらいには既に発送されたというメールが届いた。さらに三日ぐらいで手元まで届いた。一週間ぐらいで手に入ったわけだ。あまり国内の通販と感覚的にも変わらない。</p>

<div style="float:right">
<img src="http://lh5.ggpht.com/_YR02p1m6ZAM/TLxc1w3VliI/AAAAAAAAAmM/R5eLY1ccK3k/s288/P1030515.JPG" class="corner iradius22 ishadow33">
</div>

<p>さて、肝心の製品だけど、パッケージは海外の製品の例に違わずかなり雑な感じだ。なかでもMagSafeコネクタは右の写真のように後からパッケージにテープで貼り付けられていた。しかも綺麗に貼ろうという意志が全く感じられないのが潔い。</p>

<p>MagSafeコネクタは先だけで根本の方はACアダプタでおなじみのアレだ。MagSafeの部分はアップルのACアダプタの部品の流用品という噂もあるのもうなづけるほどまんまな感じだ。</p>

<p>HyperMacの充電は付属のACアダプタで行う。戸惑ったのは、充電中といったステータスが一切バッテリー側には出ないことだ。ボタンを押して残量を表示することは出来るけど、それも一定時間で消えてしまう。</p>

<p>もしかして充電電圧制御を行ってないのではないかという不安もよぎったのだけど、充電ステータスはACアダプタ側に出るという仕様なのだった。ACアダプタにLEDがついていて、充電中なら赤、完了で緑になる。完了で緑になってコンセントより先にバッテリーを外すとそのまま緑というアバウト設計だ。</p>

<p>Airへの充電はMagSafeのコネクタを使って行う。このコネクタを挿すところと、ACアダプタを挿すところは別なのだけど、どちらにも挿すことが出来そうだ。その結果どうなるかは怖くて試していない。</p>

<p>Airへの充電は、さすがにACに比べると時間がかかる。ここでもMagSafeのコネクタ部分は充電中でオレンジになって完了で緑になるけど、完了後にAirから取り外しても緑のまま光ってるというアバウト設計だ。何かちゃんと制御すべきな所をやっていないのだろうか。わたしは、使用時はAirの内蔵バッテリで使い、移動時に充電させておくというような使い方をしている。</p>

<p>さて、色々不安要素もあるのだけど、トータルでみて大満足だ。Airの稼働時間は軽く２倍は伸びた。かつ、Pocket Wifi程度なら１０時間ぐらい使いっぱなしでも４段階あるバッテリー残量表示の１目盛しか消費しなかった（線形に減るとは限らないけど・・・）。なので、AirをPocket Wifiと組み合わせて外出先で使うという用途ではバッテリー残量を気にする必要はなさそうだ。</p>

<div style="float:left">
<img  src="http://lh6.ggpht.com/_YR02p1m6ZAM/TLxc2BUtCwI/AAAAAAAAAmQ/pzMoFakvaO0/s288/P1030518.JPG" class="corner iradius22 ishadow33">
</div>

<p>重さは360g程だけども、見た目よりずっと軽い感じがする。Airと合わせて1.8Kgぐらいにはなるのだけど、それでもMacBook Pro 13"よりは軽いわけだ。大きさもAirのACアダプタと比較してみてもらったら分かるとおり、文庫本より小さい（厚みはやや太めの文庫本ぐらい）。</p>

<p>欲を言えばUSBポートがもうひとつあればさらに助かるのだけど、それは二股USBケーブルでも作って対応しようと思う。</p>

<p>こういうアクセサリがAppleの純正で出ないかなと思うのだけど、美意識的に絶対に出さないんだろうな。</p>]]>
        
    </content>
</entry>

<entry>
    <title>Moving Layers</title>
    <link rel="alternate" type="text/html" href="http://blog.soprano.jp/2010/09/moving-layers.html?utm_source=blog&amp;utm_medium=rss" />
    <id>tag:blog.soprano.jp,2010://1.148</id>

    <published>2010-09-13T15:45:00Z</published>
    <updated>2010-09-13T15:36:50Z</updated>

    <summary>Animating UIViewのエントリーではUIViewにラップされたインタ...</summary>
    <author>
        <name>forte</name>
        
    </author>
    
        <category term="iPhone" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="programing" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.soprano.jp/">
        <![CDATA[<p><a href="http://blog.soprano.jp/2010/06/animating-uiview.html">Animating UIView</a>のエントリーではUIViewにラップされたインターフェイスからCore Animationの機能、アニメーションをさせてみた。簡単なお約束ごとでアニメーションを実行できるのだけど、Core Animationのクラス、CALayerだとどうだろうか。</p>

<p>いきなり結論から言ってしまうと、CALayerを使うともっと簡単にアニメーションができてしまう。実はCALayerクラスのアニメーション可能となっているプロパティに値を設定すると、それは即時実行ではなく現在値からのアニメーションとして設定される。</p>

<p>つまり何も考えずにプロパティ値を設定するだけでアニメーションを実行できてしまうわけだ。これをCoreAnimationではImplicit Animationと呼んでいる。</p>

<p>たとえば、<pre class="prettyprint">
theLayer.alpha = 0.0f;
</pre>とするだけで、レイヤーはalpha=0へと消えていく。</p>

<p>今回はImplicit Animationを使ってみようと思う。</p>]]>
        <![CDATA[<h3 class="heading">Implicit Animation</h3>

<p>アニメーションの長さはどうなっているのだろうか？Implicit Animationの場合デフォルトでは0.25秒になっている。この値は変更が可能だ。</p>

<p><pre class="prettyprint">
[CATransaction begin];
[CATransaction setValue:[NSNumber numberWithFloat:10.0f]
    forKey:kCATransactionAnimationDuration];     // 1

theLayer.zPosition=200.0;
theLayer.opacity=0.0;

[CATransaction commit];
</pre></p>

<p>CATransactionのクラスメソッドのbeginとcommit挟まれた部分でsetValue:forKey:でキーkCATransactionAnimationDurationに対して10を設定している(1)。これでcommitされるまでに設定されるアニメーションの長さは10秒に設定される。</p>

<p>beginで始まりcommitで終わるこのフォームはUIViewのラッパーの類似性を思い出して欲しい。</p>

<h3 class="heading">key-value coding</h3>

<p>ここでちょっと寄り道をしてみる。さっきのアニメーションの再生長を指定した時に使ったメソッド、setValue:forKey:はNSObjectで定義されているメソッドだ。つまり、どのクラスでも使えるということになる。</p>

<p>これはkey-value codingという機能の一環で、Objective-Cの動的言語な側面が垣間見える。</p>

<p>次のようなクラスを書いてみる。</p>

<p><pre class="prettyprint">
@interface kvtest : NSObject {
	int _number;
	NSPoint _point;
	NSString *_text;
}

- (void)setPoint:(NSPoint )point;
- (void)setText:(NSString *)text;

@end

@implementation kvtest

- (void)setPoint:(NSPoint )point
{
	NSLog(@"setPoint");
	_point = point;
}

- (void)setText:(NSString *)text
{
	[_text release];
	_text = [text copy];
}

@end

void test(void)
{
    kvtest *obj = [[kvtest alloc] init];

    [obj setValue:[NSValue valueWithPoint:NSMakePoint(100,200)]
        forKey:@"point"];      // 2
    [obj setValue:@"test" forKey:@"text"];  // 3

    [obj setValue:[NSNumber numberWithInt:100]
        forKey:@"number"];     // 4
}
</pre></p>

<p>2、3はなんとなくset+key名のメソッドがあるので、そのメソッドを検索してるのだろうなということはわかるのだけど、面白いのが4ではないだろうか。何もメソッドが用意されていないインスタンス変数に対してちゃんと値が設定されるのだ。</p>

<p>もちろん、どんなインスタンス変数でも探し出して値をセットしてくれるわけではない。どうやって、何を探すかというのには決まりがあるのだ。その決まり事はKey-Value Coding Programming Guideの<a href="http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/KeyValueCoding/Concepts/SearchImplementation.html">Accessor Search Implementation Details</a>の章に詳しく書いてある。</p>

<p>探索の順番は次の通りだ。
<ol>
	<li>set&lt;Key&gt;名のメソッド。</li>
	<li>もし1が存在しなく、accessInstanceVariablesDirectlyの戻り値がYESだった場合。<br>
	_&lt;key&gt;、_is&lt;Key&gt;、&lt;key&gt;、is&lt;Key&gt;の順に。
	<li>それも存在しない場合は、setValue:forUndefinedKey:が呼ばれる。</li>
</ol>
</p>

<p>さらにすごいのは、setValue:のところでNSValueクラスのオブジェクトを渡しているのだけど、値をセットするときには元の型に自動的に戻してセットしてくれることだ。このあたりはObjective-Cのruntimeと深く関係してくるのだけど、そこまで行ってしまうと脱線から帰ってこれなくなるので今回は触れない。</p>

<p>Key-Value CodingはCocoaフレームワークの重要な機能の一つで、いろんなことがこの機能によって実現されている。Core Animationにも、また、深く関わっているのだ。</p>

<h3 class="heading">Non Animating Setup</h3>

<p>Core Animationではプロパティに値を設定するだけでアニメーションが実行できるお手軽さなのだけど、さて、最初の位置に動かすなど、アニメーションさせないで即時反映させたい場合はどうすればいいのだろうか。</p>

<p>この方法はおきまりの「型」がある。</p>

<p><pre class="prettyprint">
[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue
                forKey:kCATransactionDisableActions];  // 5

theLayer.alpha = 1.0f;

[CATransaction commit];
</pre></p>

<p>5のように、beginのあとにCATransactionのkCATransactionDisableActionsにkCFBooleanTrueをセットしてやると、そこからcommitするまでの間のプロパティへの値のセットはアニメーション実行でなく、即時実行になる。</p>

<p>このプロパティ値の設定はcommitまで有効で、セットしたらその後ずっと有効というわけではない。また、その値をセットするだけのメソッドも用意されている。</p>

<p><pre class="prettyprint">
[CATransaction setDisableActions:YES];  // 6
</pre></p>

<p>6のコードの効果は5と同じとなる。</p>

<h3 class="heading">Chained Animation</h3>

<p>一つのアニメーションの再生が終わったときに次のアニメーションを続けて再生したい場合等の、終了時に処理を行える機能ももちろん用意されている。</p>

<p>それには、Objective-C 2.0の新機能の一つBlocksが使われている。以前はセレクタなどで実装されていたような機能も、新しく追加されるメソッドは積極的にBlocksを使うようになっているようだ。</p>

<p>Blocksとはなにかというと、Objective-C版のクロージャと言える無名関数を使うための機能だ。こんな感じで使うことが出来る。</p>

<p><pre class="prettyprint">
void (^block)(void) = ^{ printf("hello,world!"); }
block();
</p></pre>

<p>ぱっと見た感じ、^というキーワードが目新しいぐらいで関数ポインタと変わらないように見えるのだけど、一つ大きな違いがある。実はBlockはオブジェクトなのだ。試しに次のようなコードを実行させてみると、__NSGlobalBlock__というクラス名ということがわかる。</p>

<p><pre class="prettyprint">
NSLog(@"%@",[(^{ }) className]);
</pre></p>

<p>今は内部クラスであるBlockも、そのうちクラスとして使えるようになるのかもしれない。</p>

<p>Blocksはメッセージ式の引数として使われ、CATransactionでもアニメーション終了時に実行するBlockを登録することによって、終了時に処理を行うことが可能になる。</p>

<p><pre class="prettyprint">
- (void)execAnimation
{
    [CATransaction begin];

    ....

    [CATransaction setValue:^{ [self execAnimation]; }
            forKey:kCATransactionCompletionBlock];  // 7
</pre></p>

<p>7はアニメーションが完了したときに実行するBlockを設定する。Blockはオブジェクトなのでこんな感じにkey-value codingの引数として渡すことが出来る。この例では終了時に再度アニメーションの実行メソッド（execAnimation）が呼ばれるので、ずっと繰り返すアニメーションになる。</p>

<p>このkCATransactionCompletionBlockのキー値を設定するメソッドも用意されている。</p>

<p><pre class="prettyprint">
[CATransaction setCompletionBlock:^{ [self execAnimation]; }];  // 8
</pre></p>

<p>8は7と同じ結果となる。</p>

<h3 class="heading">Summary and Sample Code</h3>

<p>ざっと見てきたCALayer、およびCATransactionクラスの機能を使うと簡単なアニメーションを作成することが出来るだろう。</p>

<p><ul>
<li>継続処理が必要無いものはプロパティ値に設定してやるだけでとりあえず動いてしまう。</li>
<li>即時実行や指定時間でアニメーションさせたいときはCATransactionのbeginとcommitの間で指定すれば良い。</li>
<li>終了時処理を行いたい場合はCATransactionクラスにBlocksの機能を使って処理を登録する。</li>
</ul></p>

<p>さて、実はCATransactionのアニメーションは入れ子構造にすることが出来る。例えば指定場所に移して（即時実行）から、その位置から別の位置に移動させるといったようなときに必要になるだろう。</p>

<p>実装としては入れ子ではないものと変わらないので、説明は省略しようと思うが、サンプルプログラムで簡単にその機能を使っている。</p>

<p>サンプルプログラムはフェードインフェードアウトしながら場所を４角に移動していくアニメーションだ。即時実行で位置を移動してopacity(透明度)をアニメーションさせている。詳しくはソースの方を参照して欲しい。</p>

<p>CABasicSampleのソースコードは<a href="http://blog.soprano.jp/sourcecodes/CABasicSample.zip">ここ(CABasicSample.zip)</a>にある。</p>]]>
    </content>
</entry>

<entry>
    <title>Exploring Into SuperCollider 6</title>
    <link rel="alternate" type="text/html" href="http://blog.soprano.jp/2010/08/exploring-into-supercollider-6.html?utm_source=blog&amp;utm_medium=rss" />
    <id>tag:blog.soprano.jp,2010://1.147</id>

    <published>2010-08-11T16:00:00Z</published>
    <updated>2010-08-11T15:52:58Z</updated>

    <summary>前回までにClock(TempoClock)によってトリガーを発生させ、そのタイ...</summary>
    <author>
        <name>forte</name>
        
    </author>
    
        <category term="SuperCollider" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="programing" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="オンガク" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.soprano.jp/">
        <![CDATA[<p>前回までにClock(TempoClock)によってトリガーを発生させ、そのタイミングでコマンドをシンセサイザノードに送信することによって演奏を行うことが可能だと言うことを見てきた。</p>

<p>ただ、その操作はローレベル過ぎて、確かに可能なのだけど、毎回このような基礎の部分から行わないといけないとなると面倒だ。おそらく、プログラムをかける人なら必ずなんらかの手間の簡略化（クラス化なり）を行うだろう。</P.

<p>そしてSuperColliderにもそういった上位のラッパークラスが用意されていて、演奏をさせたいのに、それまでのことに煩わせらるといったことがないようになっている。</p>

<p>今回見ていくのはPatternクラスだ。Patternクラスは豊富な派生クラスが存在していて、名前が示すとおりパターンとして登録しておけばそれを演奏してくれるというものだ。必ずしも最初に決められたものだけではなく、ジェネレーティブなものもある、そしてそれらを複雑に組み合わせることも出来る。</p>

<p>パターンクラスを使うと、例えばこんなコードで演奏をさせることが出来る。</p>

<p><pre class="prettyprint">
Pbind(\degree, Pseq(#[0,1,2],2)).play
</pre></p>

<p>さて、これを見ていると、ふと疑問がわいてくる。魔法というものが存在しないように、前々回見たような処理を誰かが行ってくれているわけだ。それは誰がどのようにして行っているのだろうか。どうやってコマンドは手元からシンセサイザノードに届くのだろうか。</p>

<p>その点に注目してPatternクラスを見ていこう。</p>]]>
        <![CDATA[<h3 class="heading">Play</h3>

<p>入り口はplayメソッドだ。PatternクラスのPlayメソッドはこうなっている。</p>

<p><pre class="prettyprint">
play { arg clock, protoEvent, quant;
        ^this.asEventStreamPlayer(protoEvent).play(clock, false, quant)
}
</pre></p>

<p>まずasEventStreamPlayerを呼んでいる。asEventStreamPlayerの実装はというと、こんな風になっている。</p>

<p><pre class="prettyprint">
asEventStreamPlayer { arg protoEvent;
        ^EventStreamPlayer(this.asStream, protoEvent);
}
</pre></p>

<p>EventStreamPlayerクラスのコンストラクタを呼び、そのインスタンスを作成して返すメソッドだ。EventStreamPlayerは名前からもわかるかもしれないけどStreamクラスの派生クラスとなっている。</p>

<p align="center"><img src="http://blog.soprano.jp/images/20100810_sc01.png"></p>

<p>EventStreamPlayerのコンストラクタの引数、asStreamに注目する。</p>

<p><pre class="prettyprint">
asStream { ^Routine({ arg inval; this.embedInStream(inval) }) }
</pre></p>

<p>こちらもRoutineクラスのコンストラクタを呼んで、そのインスタンスを返している。
このあたりの流れは複雑なのだけど、前回、前々回見たとおり、Clockクラスはトリガー時に登録されているRoutineクラスのインスタンスに対してトリガー処理を行うのだ。</p>

<p>引数にはブロック（関数）を渡している。この流れもRoutineでの演奏を見たときに見ているのだけど、最終的にRoutineのメソッドprStartで実行される。そしてその戻り値となるのだ。戻り値は再びClockに登録されるオブジェクトになるという流れを思い出して欲しい。</p>

<p>asEventStreamPlayerにもどって、EventStreamPlayerクラスはStream.scで実装されている。コンストラクタはこんな感じだ。</p>

<p><pre class="prettyprint">
*new { arg stream, event;
        ^super.new(stream).event_(event ? Event.default).init;
}
</pre></p>

<p>引数としてstreamとeventをとる。eventはPatternのplayメソッドで引数として与えるprotoEventということになるのだけど、ここは通常何も指定しないのでnilと考えて良いだろう。最後がアンダースコアで終わるメソッドはプロパティへのセッターメソッドだ。そeventがnilの場合はその値はEvent.defaultに設定されることになる。</p>

<h3 class="heading">そしてPlay</h3>

<p>さて、Patternクラスのメソッドplayの最後の処理は、asEventStreamPlayerで取得したEventStreamPlayerのインスタンスへのplayメソッド呼び出しだ。このplayメソッドは少々長い。</p>

<p><pre class="prettyprint">
play { arg argClock, doReset = (false), quant;
	if (stream.notNil, { "already playing".postln; ^this });
	if (doReset, { this.reset });
	clock = argClock ? clock ? TempoClock.default;  // 1
	streamHasEnded = false;
	stream = originalStream;			
	isWaiting = true;	// make sure that accidental play/stop/play sequences
					// don't cause memory leaks
	era = CmdPeriod.era;
	quant = quant.asQuant;                         // 2
	event = event.synchWithQuant(quant);           // 3

	clock.play({                                   // 4
		if(isWaiting and: { nextBeat.isNil }) {
			clock.sched(0, this );
			isWaiting = false;
			this.changed(\playing)
		};
		nil
	}, quant);
	this.changed(\userPlayed);
	^this
}
</pre></p>

<p>ポイントを順に見ていこう。(1)はもうおなじみだと思うのだけど、clockの指定がない場合はTempoClock.defaultが使われるという処理だ。</p>

<p>(2)は引数のquantのasQuantというメソッドを呼び出している。なぜそういう処理を行っているかというと、この引数も通常nilになっていて、NilクラスのasQuantを呼び出しているのだ。NilクラスのasQuantはこんな実装になっている。</p>

<p><pre class="prettyprint">
asQuant { ^Quant.default }
</pre></p>

<p>Quantクラスのdefaultを返している。defaultはクラス変数だ。ではQuantクラスのdefaultはというと、</p>

<p><pre class="prettyprint">
*default { ^default ?? { Quant.new } }
</pre></p>

<p>と、なっていて、defaultにセットされていない場合は新たにインスタンスを作成して返している。ところで、quantにちゃんとQuantクラスのインスタンスをセットした場合はどうなるかというと、</p>

<p><pre class="prettyprint">
asQuant { ^this.copy }
</pre></p>

<p>と、自分自身のコピーを返すので問題ないのだ。</p>

<p>ところで、このquantという引数、そして、Quantクラスとは何者なのだろうか。それは実はQuantクラスが実装されているソース、Quant.scの先頭にそのものずばり書かれている。</p>

<p><blockquote><em>
<p>This class is used to encapsulate quantization issues associated with EventStreamPlayer and TempoClock.<br>
<strong>quant</strong> and <strong>phase</strong> determine the starting time of something scheduled by a TempoClock.<br>
<strong>timingOffset</strong> is an additional timing factor that allows an EventStream to compute "ahead of time" enough to allow<br>
negative lags for strumming a chord, etc.<br></p>
<p>このクラスはEventStreamPlayerやTempoClockで用いられる量子化(quantization)関連の事柄をカプセル化している。<br>
<strong>quant</strong>や<strong>phase</strong>のプロパティはTempoClockによってスケジュールされる開始時間を決定する。<br>
<strong>timingOffset</strong>のプロパティはEventStreamPlayerに前方向の時間計算も可能にする追加の時間的要素だ。<br>
マイナス方向のラグ（前のめり）でコードをストラミングするとかね。
</em></blockquote></p></p>

<p>そのEventStreamPlayerに対するQuantの処理が、まさしく(3)となる。EventクラスのsynchWithQuantの実装はこうなっている。</p>

<p><pre class="prettyprint">
synchWithQuant { | quant |
	if(quant.timingOffset.notNil) {
		^this.copy.put(\timingOffset, quant.timingOffset)
	} {
		quant.timingOffset = this[\timingOffset];
		^this
	};
}
</pre></p>

<p>ぱっと見ても分かるとおり、中で使用されているのはtimingOffsetだけだ。実は、この実装にもEventクラスの重要な部分が垣間見えているのだけど、とりあえず今はさらっと流しておこう。</p>

<p>そして(4)でついにclock.playとなる。clockはほとんどの場合TempoClockで、その実装は、</p>

<p><pre class="prettyprint">
play { arg task, quant = 1; 
	this.schedAbs(quant.nextTimeOnGrid(this), task) 
}
</pre></p>

<p>となっていて、quant.nextTimeOnGridで指定される時間後にtaskのトリガーを予約している。さて、quantはいまQuantクラスのインスタンスなので、QuantクラスのnextTimeOnGridの実装を見てみると、</p>

<p><pre class="prettyprint">
nextTimeOnGrid { | clock |
	^clock.nextTimeOnGrid(quant, (phase ? 0) - (timingOffset ? 0));
}
</pre></p>

<p>となっていて、結局は元のTempoClockのnextTimeOnGridが呼ばれることになる。TempoClockのnextTimeOnGridの実装。</p>

<p><pre class="prettyprint">
nextTimeOnGrid { arg quant = 1, phase = 0;
	if (quant == 0) { ^this.beats + phase };             // 1
	if (quant < 0) { quant = beatsPerBar * quant.neg };  // 2
	if (phase < 0) { phase = phase % quant };            // 3
	^roundUp(this.beats - baseBarBeat - (phase % quant), quant) + baseBarBeat + phase // 4
}
</pre></p>

<p>引数が異なっていることに注意だ。またquantもQuantクラスのインスタンスではなく、呼び出し時にQuantクラスのプロパティquantの値になっている。</p>

<p>いまquantは0でphaseはnilなので、(1)によりTempoClockクラスのプロパティ値、Beatsを返して終了してしまう。それでも分かることが一つある。beatsにphaseを足していると言うことはこの二つの単位は同じであると言うことだ。つまり、phaseの単位は（TempoClockの場合）拍ということになる。</p>

<p>面白いのは(2)の処理かもしれない。quantが負の場合、その値を正にしたものにbeatsPerBarをかけている。これはつまり、<strong>quantが負の場合その単位系は小節である</strong>というルールだと言うことだ。正の場合はその単位は拍（beat）ということになる。</p>

<p>(3)はphaseが負の場合にその値をquantで丸めている。quantの値の範囲内以上の過去は指定できないと言うことだろうか（Δtがquantだと、それ以上の過去はもう既に過ぎているので指定してもトリガーがかかることがない）。</p>

<p>(4)はroundUp()で前回から一番近い単位時間(quant)単位の時間（単位時間で割りきれる時間）を計算して、そこに基準位置とphaseを足して最終的な時間を算出している。</p>

<p>さて以上でTempoClockにトリガーをかけて演奏のタイミングを待つところまで来た。次回は、後半のトリガーがかかって以降の処理を見ていこうと思う。</p>]]>
    </content>
</entry>

<entry>
    <title>Exploring Into SuperCollider 5</title>
    <link rel="alternate" type="text/html" href="http://blog.soprano.jp/2010/07/exploring-into-supercollider-5.html?utm_source=blog&amp;utm_medium=rss" />
    <id>tag:blog.soprano.jp,2010://1.145</id>

    <published>2010-07-06T17:00:00Z</published>
    <updated>2010-07-06T16:59:40Z</updated>

    <summary>前回は実際にサウンドの生成を行っているサーバscsynthを離れて、クライアント...</summary>
    <author>
        <name>forte</name>
        
    </author>
    
        <category term="SuperCollider" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="programing" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="オンガク" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.soprano.jp/">
        <![CDATA[<p>前回は実際にサウンドの生成を行っているサーバscsynthを離れて、クライアントであるsclang側でのシンセサイザコントロールのさわりの部分を見てみた。</p>

<p>SuperColliderにはClockというクラスがあり、その機能はトリガーをかけて欲しい時間を登録しておき、トリガーのタイミングで行いたい処理を実行すれば良いという仕組みになっていた。トリガーは一度かかると解除されるので、繰り返し行いたい場合は処理の終了時に再度トリガーを登録しておく必要がある。</p>

<p>そのClockクラスの主要な派生クラスの一つがTempoClockであり、名前の通りテンポによる時間管理を行うクラスになっている。主要というのは、このクラスにはdefaultというクラス変数があり、クラスがロードされたときに暗黙にそこにインスタンスが生成される。そして、いろんな演奏に関するクラスがClockに関するパラメータのデフォルト引数（引数が明示的に指定された無かった場合も）としてTempoClock.defaultを使用しているからだ。</p>

<p>TempoClockにはプロパティtempoがあるのだけど、ではこのtempoのパラメータの単位はなんだろうか。メトロノームと同じくBPMでいいのか、はたまた違うのか。初期的に設定されているテンポはどれぐらいの速さなのだろうか。</p>

<p>今回はTempoClockに注目してみようと思う。</p>]]>
        <![CDATA[<h3 class="heading">テンポの設定</h3>

<p>まずはClock.scにあるTempoClockの定義の頭の部分を見てみよう。SuperColliderのクラス変数およびインスタンス変数の宣言は冒頭の部分でしか行うことが出来ない。つまり、頭の部分を見ればそのクラスがどんな変数を持っているかが分かる。</p>

<p><pre class="prettyprint">
TempoClock : Clock {
	classvar &lt;all, &lt;&gt;default;

	var &lt;queue, ptr;
	
	var &lt;beatsPerBar=4.0, barsPerBeat=0.25;
	var &lt;baseBarBeat=0.0, &lt;baseBar=0.0;
	var &lt;&gt;permanent=false;
</pre></p>
<p>classvarで宣言されているものがクラス変数で、varで宣言されているものがインスタンス変数だ。変数名の頭についてる&lt;および&gt;はその変数の外部からのアクセス制限を表していて、&lt;がread、&gt;がwriteとなっている。&lt;&gt;の形でread/writeと覚えるのが覚えやすいかもしれない。
</p>

<p>さて、TempoClockクラスの変数宣言は引用した部分のとおりなのだけど、ぱっとみたところtempoという名前の変数がないことに気付くのではないだろうか。無いとはいえ、たとえば、
<pre class="prettyprint">
TempoClock.default.tempo = 1.0;
</pre>
などと実行してみても分かるようにtempoというプロパティは設定できる。これはSuperColliderにはプロパティのsetter/getterメソッドを定義することができるからだ。setterメソッドはプロパティ名＋アンダースコアという命名規則がある。tempoはどうかというと、こんな風に実装されている。</p>
<p><pre class="prettyprint">
tempo_ { arg newTempo;
	this.setTempoAtBeat(newTempo, this.beats);
	this.changed(\tempo);  // this line is added
}
</pre></p>
<p>そしてsetTempoAtBeat。</p>
<p><pre class="prettyprint">
setTempoAtBeat { arg newTempo, beats;
	_TempoClock_SetTempoAtBeat    // 1
	^this.primitiveFailed
}
</pre></p>
<p>アンダースコアで始まる識別子(1)はおなじみのプリミティブであり、内部関数が呼ばれることになる。
</p>

<p>実際に呼ばれるのはPyrSched.cppにあるprTempoClock_SetTempoAtBeatだ。この関数ではTempoClockクラスの実体であるC++のクラスTempoClockのSetTempoAtBeatを呼んでいる。ところでこのprTempoClock_SetTempoAtBeatの頭の方にこんな記述がある。
</p>
<p><pre class="prettyprint">
int prTempoClock_SetTempoAtBeat(struct VMGlobals *g, int numArgsPushed)
{
	PyrSlot *a = g->sp - 2;
	PyrSlot *b = g->sp - 1;
	PyrSlot *c = g->sp;

	TempoClock *clock = (TempoClock*)a->uo->slots[1].uptr;  // 1
</pre></p>

<p>SuperColliderのVMはメソッド呼び出し方法がＣと同じく引数をスタックに積んでコールするという実装になっている。このメソッドの引数は２つなのだけど、先にレシーバをスタックに積んでるあたりはＣ＋＋と同じといった方が良いかもしれない。</p>

<p>aはレシーバオブジェクトなので、TempoClockのインスタンスになる。そのオブジェクトのslotsの２番目がC++実装のTempoClockオブジェクトへのポインタとなってることになる(1)。</p>

<p>さて、SuperColliderのTempoClockの実装の冒頭のところを再び思い出してもらって、２つめのインスタンス変数はなんだったろうか。それはアクセス許可子なしのptrだ。ここに実は内部オブジェクトのポインタが格納されているというわけだ。</p>

<p>prTempoClock_SetTempoAtBeatは、最終的には内部C++クラスTempoClockのSetTempoAtBeatを呼び出していて、その実装はこんな風になっている。</p>
<p><pre class="prettyprint">
void TempoClock::SetTempoAtBeat(double inTempo, double inBeats)
{
	mBaseSeconds = BeatsToSecs(inBeats);  // 1
	mBaseBeats = inBeats;                 // 2
	mTempo = inTempo;                     // 3
	mBeatDur = 1. / mTempo;               // 4
	pthread_cond_signal (&mCondition);    // 5
}
</pre></p>
<p>mBaseSecondsというインスタンス変数に引数のテンポを変更する拍数を実際の秒数に変換したものを代入する(1)。これはテンポ単位（拍=beat）と実時間の変換を最適化するためだろう。</p>

<p>mBaseBeatsにはテンポを変える拍数を(2)、mTempoには引数のテンポをそのまま代入している(3)。そう、内部クラスの方にはtempoを保持するインスタンス変数が存在するのだ。</p>

<p>そしてmBeatDur。名前からして一拍あたりの長さだろう。これは１をテンポで割ったものとしている(4)。単位はmBaseSecondsという変数があるあたりからもおそらく秒だろう。そうすると、この値は１拍何秒かということになる。BPM=120の場合一秒間に２拍、１拍の長さは0.5秒となる。</p>

<p>つまり、最初の疑問、TempoClockのtempoプロパティに設定する値の単位は何かという事への答えはBPS(beats per second)ということになる。BPM=120の場合BPS=2、BPM=60の場合はBPS=1となる。</p>

<h3 class="heading">テンポスレッドへの変更の通知</h3>

<p>SetTempoAtBeatの最後はシグナルを上げて実際に処理を行っているスレッドにテンポの変更を通知する(5)。スレッドの部分は前回見た部分なのだけど、こういう処理を行っている。</p>

<p align="center"><img src="http://blog.soprano.jp/images/20100614_sc03.png"></p>

<p>この「指定時間になるかシグナルが来るまで」の「シグナル」の処理になるわけだ。テンポが変更されているので待つべき時間を再計算して既に過ぎているようならトリガーをかけないといけない。</p>

<p>さて、一つ気付くことがある。SuperColliderのTempoClockのsetTempoAtBeatは２つの引数を取り、最初が変更するテンポ、次がいつからそのテンポを変えるかということになるのだけど、内部C++クラスのTempoClockのメソッドsetTempoAtBeatではmBeatDurがすぐに変更されてしまっている(4)。</p>

<p>つまりこういうことだ。</p>
<p><strong><em>「フレーズの途中で次の拍からテンポを変えるというような指定をした場合、演奏中のフレーズのテンポも変わってしまう。」</em></strong></p>

<p>tempoプロパティ経由で設定するときは「いつから」の引数が今の拍数(this.beats)になっているので問題は起こらない。もし予約設定のようにsetTempoAtBeatによってテンポを設定する場合は注意する必要があるだろう。</p>

<p>ところで、実は内部C++クラスTempoClockのクラス宣言部にこういう記述がある。</p>
<p><pre class="prettyprint">
double mTempo; // beats per second
double mBeatDur; // 1/tempo
double mBeats; // beats
</pre></p>
<p>そう、ちゃんと（内部ソースの）コメントにテンポの単位はBPSと書いてあったのだった。</p>

<h3 class="heading">テンポの初期値</h3>

<p>それではテンポの初期値はいくつなのだろうか。</p>

<p>内部クラスにしかテンポを保持するクラスがないのなら内部クラスのコンストラクタを見るのが早いのではないかと思うのだけど、内部クラスもコンストラクタでは引数としてテンポを受け取っているのだ。</p>
<p><pre class="prettyprint">
TempoClock(VMGlobals *inVMGlobals, PyrObject* inTempoClockObj, 
			double inTempo, double inBaseBeats, double inBaseSeconds);
</pre></p>

<p>では、誰が初期テンポを設定しているのだろうか。TempoClock.defaultの生成を追ってみる。</p>
<p><pre class="prettyprint">
*initClass {
	default = this.new.permanent_(true);  // 1
	CmdPeriod.add(this);
}	
</pre></p>
<p>*initClassはクラスファイルがロードされたときに呼ばれるメソッドだ。ここではnewを引数無しで呼び出している(1)。</p>
<p><pre class="prettyprint">
*new { arg tempo, beats, seconds, queueSize=256;
	^super.new.init(tempo, beats, seconds, queueSize)
}
</pre></p>
*newでは親クラスのnewを呼び出した後initを呼んでいる。ここでSuperColliderは引数がない場合、その値はnilとなることを思い出して欲しい。</p>
<p><pre class="prettyprint">
init { arg tempo, beats, seconds, queueSize;
	queue = Array.new(queueSize);
	this.prStart(tempo, beats, seconds);  // 1
	all = all.add(this);
}
</pre></p>
<p>tempoはnilのままprStartへ進む(1)。</p>
<p><pre class="prettyprint">
prStart { arg tempo;
	_TempoClock_New
	^this.primitiveFailed
}
</pre></p>

<p>そして、nilのままプリミティブへ。_TempoClock_Newの実体はPyrSched.cppのprTempoClock_Newだ。そのprTempoClock_Newの冒頭にこんな記述がある。</p>

<p><pre class="prettyprint">
double tempo;
int err = slotDoubleVal(b, &tempo);  // 1
if (err) tempo = 1.;                 // 2
</pre></p>

<p>double型の値を取り出そうとしている(1)のだけど、tempoはnilなのでエラー終了する。そしてエラー終了した場合tempo=1となるのだ(2)。
</p>

<p>つまり、テンポの初期値はBPS=1(BPM=60)ということになる。</p>

<h3 class="heading">dependency</h3>

<p>テンポ設定時の一つ忘れ物を片付けておこう。tempo_メソッドの最後にあるこの処理。</p>

<p><pre class="prettyprint">
	this.changed(\tempo);  // this line is added
</pre></p>

<p>changedメソッドの実装はObjectクラスにある。</p>

<p><pre class="prettyprint">
changed { arg what ... moreArgs;
	dependantsDictionary.at(this).do({ arg item;
		item.update(this, what, *moreArgs);
	});
}
</pre></p>

<p>changedが呼ばれるとdependantsDictionaryに自分自身（レシーバ）をキーとして登録されているオブジェクトにupdateのメッセージが投げられる。dependantsDictionaryはObjectクラスのクラス変数だ。*initClassでインスタンス生成が行われている。</p>

<p><pre class="prettyprint">
*initClass { dependantsDictionary = IdentityDictionary.new(4); }
</pre></p>

<p>キーはレシーバ自身だとして、その値は何かというと、レシーバに依存関係オブジェクトを登録するメソッドaddDependantにその答えがある。</p>

<p><pre class="prettyprint">
addDependant { arg dependant;
	var theDependants;
	theDependants = dependantsDictionary.at(this);           // 1
	if(theDependants.isNil,{                                 // 2
		theDependants = IdentitySet.new.add(dependant);  // 3
		dependantsDictionary.put(this, theDependants);   // 4
	},{
		theDependants.add(dependant);                    // 5
	});		
}
</pre></p>

<p>dependantsDictionaryから自分自身をキーとして値を引き(1)、そのエントリーが存在しない場合(2)は新たにIdentitySetのインスタンスを生成し、依存関係オブジェクトをそこに足し(3)、最後にdependantsDictionaryに登録を行っている(4)。エントリーが存在する場合はそこに追加する(5)。
</p>

<p>さて、updateはObjectで実装されているメソッドだ。
</p>
<p><pre class="prettyprint">
update { arg theChanged, theChanger;	// respond to a change in a model
}
</pre></p>

<p>
これを見ても分かるように、デフォルトでは何もしない空のメソッドだ。
</p>
<p><pre class="prettyprint">
TempoClock.default.addDependant( 1 );
</pre></p>
<p>
等としても何も起こらない（Integerクラス、及びその親クラスにはupdateは実装されていない＝Objectクラスのupdateメソッドが実行される）。
</p>
<p><pre class="prettyprint">
DebugOut {
	update { arg theChanged, theChanger;
		theChanger.asString.postln;
	}
}
</pre></p>
<p>
例えば、このようなクラスを作ってそのインスタンスを注目するオブジェクトに設定しておけば値が変わる度（changedが呼ばれる度）それを表示するといったことも出来る。</p>

<p>コントロール用のオブジェクトを一つ作っておき、その状態が変わったらパターンを変えるなんていうことにも使うことが出来る（状態が変わったときにchangedを呼ぶ）。また、update時にさらにchangedを発生して連鎖的に変化させるといったことも出来るだろう。</p>

<p>オブジェクトの状態変更に合わせて何かをしたい場合に使える機能だ。<p>

<p>Objective-C（というよりそのフレームワークのCocoa）にもNotificationとして同じような機能が用意されている。</p>]]>
    </content>
</entry>

</feed>

