Hi-farm blog

ActionScript 3.0 , AIR , FLEXからCocoa, OpenGL

2009年2月25日に開催された、第31回Flash OOP 勉強会に行ってきました。

�׋���̕��i

場所:

サイバーエージェントビル1F セミナースペース

4万円ほどで作れるマルチタッチディスプレイということで、マルチタッチのデバイスを自作して、ActionScriptをUIとして使っていました。
iPhoneとかで最近マルチタッチの話題が増えてきていたので、どの様にしてマルチタッチの機能を実現しているのか、実際の制作時の話しを含めて聞きたかったので行ってきました。

実現方法は、sakusan様のブログに説明していらっしゃいましたのでご興味のあるかた是非どうぞ。

簡単にはWebカメラで映像を受け取り、tbetaいうソフトが解析してsocketでAS3にタッチの情報を送る、という仕組みの様です。
AS3でタッチイベントを扱いやすくするためにMulti-Touchライブラリを自作されており、
・TouchManagerクラス:Touchを管理するクラス
・TouchEventクラス:触ったときに発生するイベント
・Fingerクラス:触った座標(0〜1の相対座標)、touchを一意にするためのIDを所有するクラス

を持っていて、TouchEventクラスのインスタンスがfingerを持っているので、Touchイベントが発生したときにイベントハンドラ内部で
e.finger.id
e.finger.x
e.finger.y
と記述することで触られた点を知る事ができるというものでした。(e = TouchEvent)

実際に触る時間がいっぱいあったので触ってみたのですが、

�f�B�X�v���C

でかい。

タッチ可能な領域が大きいということは、iPhoneの様にはいかず、タッチする人数が多くなる可能性があり、コンテンツを作るときに気にしないといけない問題が沢山あるのでどのようにタッチイベントの制御を行えばユーザーが意図した動きにるように作れるのかというのは結構難しい問題であるな、と感じました。
finger.idとタッチイベントが発生した座標をとって、或る程度の範囲内なら同じ人物の動作とみなすという判定が必要になるのかな?実際に作ったわけではないので想像でしかありませんが。

後は、このマルチタッチのデバイスを作ること自体が結構むずかしそうな気がしたので、どこかの段階でハードウェア屋さんと協力して新しいデバイスを次々と作る事ができると面白い展開があるのかも?とか想像していました。

このデバイスをみたり触ったりしているときに、感触を再現することができれば面白いなあなんて思ったのですが、これって音圧とか使うと少しは再現できたりするのかな?この辺の研究は一度やってみたいです。

この様なマルチタッチのデバイス+コンテンツを業務時間外で作り上げる力にはただひたすら感心するのみでした。本当にご苦労様でした。これからも面白いコンテンツを見せていただける事を楽しみにしています。
ってかうらやましいっす!

補足2:
サイバーエージェントさんって、こういうのも作ってたんですね。すてき。

��

さて、先日2009.02.14-02.15の間、自分のちょっとしたつぶやきから始まった『iPhoneアプリ開発合宿』に行ってきました。
場所は箱根、強羅 一の湯。
http://www.ichinoyu.co.jp/gora/

twitter上で呼びかけ、twitter上でやりとりしている方や知り合いの方合計5人で開催されました。
参加者は実際にiPhoneアプリを作っている人だけで、普段はなかなかきくことができないObjective-Cの話をする事ができました。

今回の合宿は、あくまで各自作りたいもの、やりたいことがあって、同じ場所でそれぞれの目標に向かって一日作りましょう、という主旨でした。
それぞれが作った(作ろうとした)アプリについてはどこまで何を書いてよいのかわからないので、大まかに書いておくと、

  • フリックさせて画面を次々と切り替えるアプリ(こうかくと普通ですが、アイディアがすごく素敵で、app storeに公開された後の展開が楽しみなアプリです!)
  • 心が安らぐ環境系(?)アプリ(こちらもアイディアが素敵で、デザイナーの方とタッグを組んでアプリを作っている事が特に印象的でした。)
  • hirataraさん:http://d.hatena.ne.jp/hiratara/ は、弾幕ゲームアプリ(OpenGL ESを使っています)
  • 画像ビューワーアプリ(コンポーネントの自作にチャレンジされていました。)

で、僕はここ最近取り組んでいるOpenALを使ったアプリの開発を続けました。(完成にはたどり着けなかったですが、そこそこ進めることができました)

なんと『インターネットが使えない』という問題があったものの、豊富な経験とバックグラウンドを持っているメンバーが集まったおかげで、各自メインテーマが違っていたり、ネットが使えなかったりしながらもみんなで協力しながら開発を続けることができ、いい刺激になりました。
特に、appleのサンプルソースがいかに優れているかという事を実感しました。

また、チェックイン15:00のチェックアウト12:00であることもあり、夜中まで頑張っていました。
途中で温泉につかったり、飲める人はお酒を呑んで開発を続けたり。意外とお酒を呑んでもみんな開発を続けていたのがとても印象的でした。

何より、みんなで集まってiPhoneアプリ作りができる、という環境が今まで無かったのでとても濃く、充実した時間を過ごす事ができました。

これからiPhone合宿が色々と開催されたり、この会も第二回目が開催されますが、iPhone開発している人と沢山であって、良い刺激を受けたいと思っています。

合宿 夜中の風景

夜中の風景。広い部屋に5人なのでそれぞれ自分のスペースで作業してました。

飲酒後ですが意外にもエンジンがかかってました。

合宿 朝の風景

合宿 朝の風景

そして朝。Emobileが赤いのが何とも残念ですね。(EMobileが圏外という事です)

箱根登山鉄道

箱根登山鉄道

箱根登山鉄道。スイッチバックを堪能しまくりでした。

また次回も開催予定ですので、今回参加された方&興味のあるかたは是非一緒に合宿しましょう!
参加された方へ:初幹事でいろいろと御迷惑おかけしてと思いますがありがとうございました。これからもよろしくお願いします。

今回は前回のpostに引き続きscilabについて。

scilabには、コマンドラインからサウンドをならす関数である、playsndが最初から定義されていて、変数でサイン波とかを用意してplaysndに突っ込むと音がなる、という仕組みなのですが、Macの場合はなぜだかそのままでは使う事ができません。

本当は、http://science6.2ch.net/test/read.cgi/kikai/1068735555/108n-

に書いているようにすればplaysndを使えるようになるらしいのですが、僕の環境ではできなかったので、代わりに自分でplaysnd関数もどきを定義しよう、と考えました。その手順からテストするまでを記述します。

当然、Macであることを前提とします。

 

1 playsnd.sciを開く。

playsnd.sciはscilab.appを右クリック(Control+クリック)し、「パッケージの内容を表示」を選択、その後、「Contents/Resources/macros/sound/playsnd.sci」と進み、ファイルをテキストエディタか何かで開く。

 

すると、どうやらplaysndは

 

  1. “TMPDIR/_playsnd_.wav”というファイルを生成
  2. PlaySound関数で直ぐに再生
ということを行って音を再生する機能を実現している、とわかります。
次に色々とif文の記述がありますが、どこがMacに関係するのかを調べましょう。

 

しばらく眺めると、12行目あたりからが怪しい、とわかります。(理由は、12行目のelseに対応するif文に、”MSDOS”と書いているから、12行目以降はWindows以外を指しているんだろうな、と検討をつける事ができます。だってMac OS XってBSDベースでしょ。)

ここを見ると、「/dev/audio」と書かれているところがあります。

が、まずこの階層は、デフォルトではないと思いますし、なんか別のアイコンが表示されていて、/devを作るのは難しいと思うので、ここでは、/audiodevというフォルダを作り、そこにオーディオファイルを作成します。

 

次に、なぜか僕の環境ではwavファイルを扱うsavewave, rwaveなどが使えなかったので、前回のポストでも使った、.auファイルを生成してならすことにします。

.auファイルの書き出しに関しては、まさに前回のauwriteを使うのですが、では再生はどうすれば良いでしょうか。

 

幸いにもシェルぽく使えるunix関数があるので、コマンドラインで音を鳴らせるプログラムと.auファイルを指定する、という方針にします。

 

コマンドラインからオーディオファイルを鳴らすプログラムを探す

ここではコマンドラインからオーディオファイルを鳴らすプログラムとしては、afplayをつかう事にします。

afplayに関しては、ここが詳しいです。(こちらはOctaveでの例ですね。)

で、afplayにパスを通します。(.bash_profileとかをいじって下さいね。)

 

これでコマンドラインからオーディオファイルを鳴らす事ができるようになりましたので、あとは独自に定義したplaysoundという関数を作成します。

 

playsndライクな関数、playsoundを作成する

 

それでは、playsound関数を作成しましょう。

といっても、playsnd関数をちょこっといじるだけです。

 

 

  1. Macintosh HD直下に、scilabというフォルダを作成します。
  2. 1.で作成したフォルダに、”playsound.sci”というファイルを作成します。
  3. 2.で作成したファイルに下記のように記述し、保存します。
function []=playsound(y,rate,bits,aplay)
// play signal y at sample rate rate 
// bits is unused 
  [lhs,rhs]=argn(0);
  if rhs <= 3 aplay=’aplay’; end 
  if rhs <= 2 bits=16; end 
  if rhs <= 1 rate=22050; end 
  if MSDOS  then
    savewave(TMPDIR+’/_playsnd_.wav’,y,rate);
    PlaySound(TMPDIR+’/_playsnd_.wav’);      
    return 
  else
    if aplay<>’/audiodev‘ then 
      // should send aplay to PlaySound 
      auwrite(y, rate, ‘/audiodev/_playsnd_.au’);
      unix(’afplay /audiodev/_playsnd_.au’);
    else
      [fp,www] = mopen(’/devaudio‘,’wb’,0);
      if www<0 then 
fp = -1;
      end
      if fp==(-1) then
disp(’Audio capabilities not available’);
return
      end
      mput(lin2mu(y),’uc’,fp);
      mclose(fp);
    end
  end
endfunction
これで/audiodevというところに_playsnd_.auというファイルを作成し、それを再生するという関数playsoundを作成できました。

実際にplaysound関数を使ってみる

それでは実際に使ってみましょう。
1. まず、なんでもいいのでscilabからファイルを開く。
2. 下記の内容を記述する。
 //————————– test playsound function
 getf(’/scilab/playsound.sci’); // 1
 sfrq = 22050;
 while(1)
    state = input(’play sound?’);
    if state == [] then break end;
    frq = 440;
    T = 1/sfrq;
    tmax = 3;
    tnum = tmax*sfrq;
    
    k = 0: 1: tnum;
    ys = cos(2 * %pi * frq * k * T);
    ymax = max(abs(ys));
    ys = ys/ymax;
    playsound(ys); // 2
   end
3. Executeから実行する。
すると
play Sound?–>
となるので、何かしら1でも何でもいいので入力し、enterを押します。
すると、440Hzで3秒間音がなると思います。
実際に使う時のポイントとしては、
getf関数で先ほど作ったファイルの参照を入れる事くらいでしょうか。
やっとこれからサンプルを触りながら波形の勉強ができる!!やった!

scilabでのオーディオファイルの書き出しについて。

Windows環境では、wavが標準なので、swaveとか、rwaveなんてコマンドがあり、このコマンドに値を渡すとファイルの書き出しやら読み込みを行えています。

書き込みを例にとると:

swave(’ファイル名’, [書き出す対象となる変数], [書き出す周波数]);

ですが、Macの場合に標準でついている関数は、.auファイルを読み書きするので、

auwrite([書き出す対象となる変数], [書き出す周波数], ‘ファイル名’);  // 拡張子は当然、”.au”

となります。

引数の順番が違うのね。

本当にものすごく久々の投稿になってしまいました。

先日、11/26に行われた、Spark勉強会で、Dynamic Sound Generationの発表をしてきたので、その資料をアップします。

(※再生には音楽ファイルを必要なので、各自用意して下さい。)

ソース一式

PDF

「フーリエ変換を使わない、エフェクトのかけかた」というタイトル通り、信号処理には本来フーリエ変換は欠かせないものですが、フーリエ変換の話しになると一気に敷居が高くなる(というか自分が今勉強している状態なので、この様な発表になりました。

 

ただ、やはりフーリエ変換を使えていない&勉強途中での発表になってしまったので、波形が途切れてしまっているところがあるようで、ぷつぷつと途切れる音が結構聴こえてしまいます。。。

あくまでご参考程度にしていただければと思います。

 

 

[ファイル構成について]

 

SoundGeneration.mxml:ラジオボタンやスライダーがついているView + 実際に音を鳴らすファイル

model/SoundObj.as:Dynamic Sound Generationを使って音楽を再生したり、エフェクトをかけたりするスクリプトを記述しているファイル。

 

SoundObj.asに関しては、mxmlでも使いやすいように、IMXMLObjectインターフェイスを実装しています。

 

[SoundObj.asの仕組み]

_currentEffectというプロパティを切り替えて、どのエフェクトをかけるのかを選択します。

 

extractメソッドを呼び出すたびに、bufferプロパティにデータを蓄えています。

これを使って、ディレイや逆再生を実現しています。

 

なお、逆再生に関しては、こちらが大変参考になります。

次は、フーリエ変換からめてしっかりとエフェクトをかけられるようになりたいなあ。
フーリエ変換とエフェクトの掛け方を勉強できる機会があれば、是非参加したいです。

spark勉強会。

さて、7.22はadobeにてspark勉強会でした。

会社を早めに出勤して、そうそうに向かったのですが、若干の遅刻。
やっぱり時間は苦手だなあ。

到着すると、Adobeの方からFlash Playerやpixel Benderなどの紹介がありました。
pixel Benderは是非試してみたいのですが、あいにく僕が持っているのはMacBookなので、まだ試す事はできなさそうです。。
MovieClipだけでなく、動画にもエフェクトがつけれるらしいですし、さらには噂では音にもエフェクトをつけられるという話しを聞いているので、とても興味があるのですが。。

 

Flash Player10は、Dynamic Sound Generationや、縦書きテキストの対応など、とても期待をしております。

ただ、いづれも最先端過ぎるのか、文献が少ないので習得するのは大変そうですね。

あと、FlashのSEO対策は、外部XMLとかも検索対象にしてくれるようだ、という話しを聞けたので、今後FlashはSEOに弱い!という通説が覆りそうで、楽しみです。

 

で、発表会。

はじめは、主催者でもある、yossy@beintaractiveさん。

Spark Projectの今までの経緯と、Actionscriptで疑似スレッドを実現する、ActionScript Thread Library 1.0 (そうめん)の紹介をされていました。

非同期処理を処理の流れ通りに記述できたり、割り込み処理や例外処理など、使いこなすとかなりASの開発が便利になりそうでした。

 

次は、seagirlさんの「Genius Framework」のご紹介。

シンプルで使い勝手が良さそうでした。Flexの方は一度触られてみてはいかがでしょうか?

あとは、コマンドラインでスケルトンコードを作ってくれる機能は、かなり便利なんじゃないかと思っています。

 

つぎは、mutsuさんのFrocessing

テキストの扱いとか、3Dとかが比較的書きやすそうなのと、これで覚えれば本家Processingも使えるようになりそうですので、一度触ってみたいですね。

 

つぎは、arkwさん。

今まで全く考えていなかったような深い、深すぎるフレームについての話しが聞けて、すごく勉強になりました。

 

そして、最近Dynamic Sound Genrerationに興味を持っている僕が特に楽しみにしていた、

zk33さんの、sazameki紹介。

どこかでみたようなおもちゃから繰り出される音には、ただただ感激するのみでした。

勉強になります!

これがspark projectにコミットされているだなんて。すごいですね。

 

あまりにも文献が少ないサウンド系の情報を充実させよう!と思っていらっしゃるようです。

僕も何か力になれればと思うのですが、なかなか壁は高そうです。

 

サイトは、ksakaiさんの発表。

Swfを埋め込む時のタグについてや今後の方向性など、詳しいレベルでご説明いただいて、とても勉強になりました。

 

とってもためになる勉強会で、満足しつつ、2次会へ。

うーん。反省ですわ。。かなり気持ち悪い事を言っていたような気が。。。

しまった。

 

でも楽しかったです。

AIRとしょこたん。

なんか自分のやるべき事が見えた気がしました。

 

AIRでなんかしないとなあ。

 

お断り:

タグとかカテゴリーについては、無視して下さい。

 

 

 

7/21、Kayacさん主催の「ごはんとFlash 2杯目」に行ってきました。

http://level0.cuppy.co.jp/2008/07/flash_14.php

ごはんとFlash2杯目会場

場所が鎌倉は由比ケ浜、DONBURI BEACH CAFE bowls @鎌倉・由比ガ浜海岸でした。

http://www.crocs-bowls.com/access/

最近やろうとしては苦労していたSound周りをすでにやっていらっしゃる方や、興味のある方、システムの人やデザインの人、Flash界の著名人の方達といろんな方が参加されていました。

 

bowlsさんのおいしいごはんを食べつつFlashの話しなどをする、という僕にとってはこれ以上ない幸せなイベントです。

 

で、最後にプレゼントコーナーがありまして、

ART-Meterさんで販売している作品や、

http://www.art-meter.com/

元気玉無料券

http://sparkball.kayac.com/

Kayac代表の柳澤さんの書籍など、素敵な品物が次々とプレゼントされているのを見ながら、

「どうせ自分はこんなのはあたらないのよね」

とか、

「元気玉があたったら僕の夢を叶えてもらおう(*)」とか考えていたのですが、当然あたらないまま、最後へ。

発売したばっかりの、『Adobe Flash CS3 詳細!Actionscript 3.0 入門ノート』(大重美幸 著)!

 

 

あたりました。

 

 

全然想像もしてなかったので、驚きながらも興奮しながら頂きにステージへ。

なんと本人様からの手渡し。うれしいですね。

さらにはコメントも求められ、取り乱してしまったのですが、

「でかっ」とかおいしいところ持って行った、と行っていただけたので、個人的には大満足でした。

 

Flashでちゃんとなんか作りますね。

 

前回のごはんとFlash、さらにはおかわりと参加させて頂いていますが、本当にいいイベントを開いていただいて心から感謝いたしますよ。Kayacさんをはじめとする主催者の皆様に。

 

さらには昨日は京都でも開催されていて、そちらも盛り上がったようです。

このようなつながり感とか、デザインよりの人とシステムよりの人がFlashを通して一緒に話しができること、さらには音楽の人とかいろんな人とFlashというアプリケーションを通じて交流ができる、この流れがきっと(しっかり調査したわけではありませんが)他の言語とかにはない、魅力だな、と感じています。

 

 

もちろん他の技術とかも楽しいし大好きですが、こういう交流が生まれるのは本当すごいことだと思います。

ほんと本日出会えた皆様、ありがとうございました。今後ともよろしくです。

 

 

 

 

あと、

こういっといて何なのですが、最近はiPhoneの勉強会やりたいなあ、って思ってるんですが、やっぱり「Cocoa勉強会」に参加するべきですよね?

iPhoneのCocoaは、GCとかないみたいなので(Mac OS X 10.5になって、GCが搭載されるようになったようです。)

 

*:ここで書くと気持ち悪い人、と思われそうなので控えておきます。

 

PHP5のこと。

PHP4のサポートが終了してから、結構な時間が経ち、レンタルサーバーでもPHP4を打ち切るところが出てきましたが、

変更点の一つが、

php.iniのallow_url_fopenがデフォルトではoffであることです。

ってことは、http経由でごにょごにょしている人には、file関数とか、fopenとかに問題がでる恐れがあります。

それを回避するには、様々な方法がありますが、一つには、socket通信する、という方法があります。

使い方はこんなふうです。要はPHPでtelnetしてる感覚ですね。

ちなみに、以下の例では、80番ポートと決めうちしてアクセスしているので、サイトによっては別途ポートを指定する必要があります。

 

$domain = "www.hi-farm.net"; // 対象ドメイン

$file = "sample.php"; // URL以下のパス(GETも使えます)

$fp = fsockopen($domain, 80, $errno, $errstr, 4); // 80番ポートに接続

$out = "GET /{$file} HTTP/1.1\r\n"; 

$out .= "Host: {$domain}\r\n";

$out .= "Connection: Close\r\n\r\n";

 

fwrite($fp, $out);

stream_set_timeout($fp, 4);

 

while(!feof($fp))

{

	$file_data0 .= fget($fp);

}

fclose($fp);

 

セキュリティうんぬんはわかるので、PHP側での対応はわかるけど、php.iniでしか変えれないのよね。。。

レンタルサーバーやっている業者さんは、単に「変更されますので準備しろ」だけでなくて、テストする環境を用意してくれよ

って思います。。。

 

ぐちってしまった。。。

今さらエイリアン展

えっと、今更なのですが、先日未来館にて開催されていた、エイリアン展に行ってきました。

ようするにエイリアンについての展示なのですが、さすが未来館というだけあって、見せ方がすごい。

これなのですが、大きな台(卓球台よりでかい)に上からプロジェクターを複数台使い、画面を作ります。

で、台の上に映しだされているボタンをタッチすると、実際にタッチしたことになり、新しいコンテンツを開くことができます。

※上下逆さまでごめんなさい。

職員さんをつかまえて強引に仕組みを聞いてみたのですが、

なんでも、この仕組みは、台に静電気センサーを仕込み、複数同時タッチに対応しているようです。

ちなみに、静電気センサーは調べたところ、15万くらい?でした。

静電気センサーについては、こちらが詳しいです。

株式会社 キーエンス様サイト

 

さらに最後には、「宇宙空間にメッセージを送ろう!」という事で、トラックボールを使ったりして、メッセージの組み合わせを選ぶことができます。

 

で、写真を撮って、メッセージと同時に大画面に表示されます。

ちと恥ずかしいね。

 

Flashでやるなら、Gainer(Funnel?)と絡めたりするんでしょうね。

ここまで大がかりなものを作る事ができたら楽しいだろうなー。

[flash] Honda | AIRWAVE

素敵なサイトを見つけました。

バーチャルですが、ドライブデートができます。

優れているな、と思ったのが、デートする中で、色々と操作をしなければいけないのですが、

デートするなかで、温度調整など、何をするにはどこにあるものを触ればいいか、という手順が流れにそって理解できるようになっています。

例えば、曲を変更するとき。

女の子がこんな風に言ってきます。

 

そういわれてムードを変えなきゃ男じゃあありません。早速変えようとしたときに、「+」表示されるので、

曲を変えたいときにはここを操作すれば良いのか、とすんなりと知る事ができます。

 

それにしても、ここに操作ボタンがあるのはいいですね。曲を頻繁に替える人にも使いやすそう。

写真がズームされ、矢印をクリックすると曲を変える疑似体験ができます。

COLTEMONIKAが入っているのは個人的にはうれしい。

 

この様な操作をいくつか行うなかで、車の操作方法を覚えてます。

 

そして、デートだけにロマンチックな方向へ。。。

 

さて、何を送ろうかな。どきどきします。

本気で考えた結果、1にしました。

2はいきなりすぎるし、3はなあ。。

 

と答えてた結果が最後に現れます。

女の子とドライブするのなれてるとか言ってくれました。

これだけでAIRWAVEを好きになりそうです。

ですが、曲変更ボタンなど、車自体がとてもユーザビリティを考えて作られていることがこのサイトを体験する事で伝わりますし、何より僕には疑似デートっていうだけでドキドキしてました。

 

ちなみに、僕がみた時は、デートモードもありました。

試してみたいな。