2013年11月30日土曜日

Data structures 覚え書き(1)



PdのData structuresを使ったオブジェクト操作は,
・scalar(data structuresのインスタンス)自体を見れないこと
・何もワイヤーがつながっていないオブジェクトが動作しはじめること
というPdの基本的な処理フローと違う2要素の合わせ技が,まずワカリニクイところだと思う.

2013年11月27日水曜日

Pdのdata structures

プログラミング言語としてPdを理解するにあたり,上級編…というかある種の真髄みたいなものを感じられると目されている概念が「data structures」です.
弄りはじめたばっかりなので全くさっぱり使いこなせてないですが,とりあえず現状での自分の理解をメモしときます.


Pdはパーツとパーツを線で繋いでアルゴリズムを組めますが,そのようなデータフロー的な処理だけでは,Object-oriented的な意味での「ダイナミックさ」みたいなものに欠けるとも言えます.
例えばデータフロー処理では,音を鳴らした時に「音を鳴らすよ〜」というメッセージを起点にして処理が進んでいくものの,音楽を構成する「音」一つ一つの機能やパラメータを抽象化する概念がそこには足りない,ということです.

そこでPdでは,data structuresという構造体に似た概念が導入されています.
コードの実行時にコード自身によってダイナミックに生成できるインスタンスは,このdata structuresに集約されていると思います.

Processing + Pure Data

メディアプログラミングの海は広大だわ(深淵)

Pure Dataを弄ってると,次から次へとインスピレーションというかアイデアが沸いてきて時間を忘れるほど楽しい.
学生の時に妄想してた「ぼくのかんがえたさいきょうのシーケンサ」とか,いくらでも作れるよなあ…

今,Processing + Pure Data の組み合わせでいろいろと遊んでます.
ProcessingのデザインセンスがPdのインターフェースにも欲しいところですねぇ…

動画の書き出しをするとフレームレートが安定せず,音と映像の同期が取れてないですが一応こんなのを作ってみてます.イマイチ面白くないですがとりあえずってことで.


2013年10月31日木曜日

"random" に関する理解

Processingでグラフィックを描きはじめてすぐに気がついたのですが,random()を呼ぶと毎回違う値を出力してきます.
他の言語ではいわゆる乱数シードをいじってやらないと毎回同じ値が出てくるのとは対照的です.

これ,グラフィックやアートを強く意識した言語であるProcessingのインタラクティブ志向っぷりがシンプルに垣間見えるポイントの一つであるような気がします.


もう10年ぐらい前になってしまうんですが,高専時代の話.
高専って,大学のように最終学年で研究室に入って卒業研究をやるんですが,自分がやらせてもらったテーマはニューラルネットワークの数理的解析みたいなものでした.

最初に先生から以下のような指示を受けました.

「この関数1と関数2にそれぞれループで乱数を与えて,出力を並べてグラフにしてみて.」

Processingでグラフィックのスケッチ

以前,スケッチ用途に良いね〜と紹介したGLSL Sandboxは,本来は既に用意されたポリゴンに絵を貼ったり,影や反射を計算したりするのに使う「ピクセルシェーダ」そのものだけで画像を生成するレンダリング手法.
そのため,頂点の組み合わせ(点,線,面…)で図形を表現する,いわゆる「お絵描き」的なグラフィックは苦手です.典型的には,適当な四角形を描くだけで一苦労&高負荷.

ゲームの開発環境(Eclipse,libGDX)で試作を重ねていくのも可能なんですが,もう少しコンパクトにコードベースの「お絵描き」スケッチができる環境はないかな〜と思っていました.

MP3再生ソフトにあるようなビジュアライザなんかの方面にいい解決策があるんじゃないかと思っていろいろ漁ってたら,Processingというプログラミング言語に辿り着き.

2013年10月18日金曜日

How to embed pd-for-android in your libGDX project

libGDX supports cross-platform game development.
It is very convenient in the case of using your PC as a test environment of a mobile game application.

When you set up cross-platform project using gdx-setup-ui.jar,
following project folders will be made.
  • my-gdx-project : core project, includes main sources, common libraries and interfaces
    • your sources are connected to libGDX
  • my-gdx-project-android : Android project, includes only Android specific implementations and native libraries
    • libGDX is connected to Android: OpenGL ES, touch input, etc
  • my-gdx-project-desktop : Desktop project, includes only Win/Mac specific implementations and native libraries 
    • libGDX is connected to Win/Mac: DirectX, OpenGL, mouse input, etc
libpd is a library to embed the Data-Flow programming language Pd(Pure Data) in our application programs. Additionally, in Android systems, libpd supports OpenSL ES audio API expected to reduce audio latency after Jelly Bean.

libpd needs platform-specific implementations. So if you want to use libpd in the cross-platform projects, it would be better to trace the same way as above libGDX connection.

2013年10月16日水曜日

libpdでパッチ開いて鳴ったわー

鳴ったぜ.

libpdのJNI側のソースコードやAudio glueとサンプルプログラムを見比べてたら形が見えてきた.

2013年10月9日水曜日

Desktop環境(Mac)でJava上のlibpd


ハマり中~

PdBase.openAudio 等のオーディオ系のメソッドは,libpdに同梱されたJNIのNative関数を呼んでいます.
  1. 生のlibpdをデスクトップ環境向けにビルドするとNative関数の中身はカラッポ.jni/z_jni_plain.c
  2. Android向けにビルドすると,これが jni/z_jni_opensl.c に置き換えられる.
  3. PortAudio branch版のlibpdでのデスクトップ向けビルドでは, jni/z_jni_pa.c に置き換えられる.

2013年10月7日月曜日

libpdを始めるにあたっての前提知識

とりあえずlibpdが動いている所を見たいという方はこちらへどうぞ

Pdをコードに埋め込むという触れ込みの「libpd」ですが,これが具体的にどのレイヤの存在で,周りでどういう周辺サービスが動いてることになるのかをちゃんと押さえてないとマズかった.

まず,libpdは独自のサウンドAPIみたいな何かを持つわけではないです.一部ネットメディアで「libpdを使えばAndroidでもレイテンシが云々」みたいな紹介のされ方をしているので,あんまり詳しくない人は誤解をしてしまうかも(=私という説).

2013年10月3日木曜日

libGDXでシェーダやTweenなど

進捗.stackoverflow.comに出入りする日々です…

BG面

波打つタイルのポリゴンを作成.
各頂点には位置座標の他,色と面法線ベクトルを格納.

VRAM領域に2つのフレームバッファを用意し,普通の位置座標と色を使ったレンダリング画像Aと,法線マップのレンダリング画像Bをそれぞれ描きこむ.



2013年9月26日木曜日

やっぱり3Dは避けて通れなかった

映像的な面でのモチベーションとして,色々なデザインモチーフやVFX的効果を取り入れて動きを出し,画面いっぱいを使って楽しさを演出したいというイメージをもって進めています.

プログラマブルシェーダ使いたさ故にイキナリOpenGL ES 2.0で作り始めてるのは,そんな自分の中のイメージを楽に具現化できる機能というか可能性を感じるからで,全くGPUプログラミングの経験がない自分でも楽に試作を重ねられるGLSL Sandboxは大いに活用させてもらってます.

2013年9月17日火曜日

演算負荷を意識しはじめる

背景のエフェクトは解像度や各種演算精度をダイエットして負荷を節約することとしても、肝心のゲーム部分でも光の散乱や逆光とかパーティクルといったエフェクトを多用するイメージでいるため、なにやら早くもハードウェアリソースを最大限活用する必要がありそう。

CPUさんにはlibpdの動作のほうをがんばってもらう必要があるので、グラフィックについてはGPU/ソフトウェア処理を問わず、しっかり60fps出るように速度をチューニングできる余裕(=自分の知識、理解)を作っておきたい。

そうなってくると、動作テストのリファレンススペックのようなものを想定しておかないといけない気がします。

2013年9月16日月曜日

libGDXでOpenGL ES 2.0でシェーダ動いた

やればやるほど出口の見えなかったOpenGLでのグラフィック実装ですが,
libGDXを使いはじめてようやく軌道に乗ってきました.

libGDXはJavaベースでOpenGL ESを使ったゲームを作るライブラリですが,
マルチプラットフォームで開発できるので,PC上でもOpenGL ES 2.0で
テストができて超ラクチン.今までテスト環境に困ってたのは何だったんだ.

libGDXは,工程はラップせずに手段をラップする感じのフレームワーク.
ですので自由度がかなり高いと思われる一方,私のような初心者が触るには
敷居のほうも正直高い.
日本語のドキュメントはあんまりないので,主に海外のサイトを見て回って
使い方を覚える感じです.

OpenGLの使い方と並行して,キャラクターの書き込みプロセスや
状態遷移に関するメッセージの渡し方を考えてると,
何気にそれっぽくオブジェクト指向で書けてる気がしてきました,

で,とりあえずグラフィック面では「ここまで出来れば一段落」と思っていた
フラグメントシェーダの実装を形にするところまで辿り着きました.

先日の記事でGLSL Sandboxに投稿したエフェクト.



2013年9月14日土曜日

staticフィールドってなんぞー

VC++で挫折して以来触ってこなかったオブジェクト指向言語ですが,
Androidでのソフト開発も、ちゃんとJavaを理解してないとサンプルコードが解読できない!
OpenGLみたいな高度なAPIだとなおさら混乱混乱.

AndroidのContextの扱い方でエラーとか警告とか出まくったので,
もう初心のつもりで基本から.クラスのstaticフィールドの実験.

2013年9月10日火曜日

OpenGLESGLSLSGLEELSEG

いまAndroid上でOpenGL ES 1.0を使ってグラフィックの試作をしているのですが,何をするにも実機に流し込んで動作させてやる必要があって少し面倒.

ちょっとした描画やエフェクトのテスト程度のものは,開発環境(Mac OS XのDesktop画面)上で適当にできたりすると楽だなーと思いはじめました.

一般的なデスクトップPC環境で「JavaでOpenGLをやろう」と言いはじめる際にそれっぽくまとまってそうなのは,JOGLというOpen GLのラッパー.
JOGLは,2009年に開発が終了したver.1.1.1と現行バージョンの2.0が存在しますが,なんか2.0がうまく動かなかったのでとりあえず1.1.1のほうを使いはじめました.

2013年9月6日金曜日

OpenGL ESを触りはじめたり

今まで統合開発環境なんて触れた事があるのは 組み込み屋が使うCode Composer StudioやらHEW程度しかないわけですが,
当然Eclipseはもっともっともっとリッチな環境ということで,
Javaと並行してお勉強を進めながらも 色々とカルチャーショックを受けているところです.

実機デバッグも端末側ではなくあくまで開発環境側の目線から整理されてるあたりも, JTAGとは何だったのかと空を見つめながら思いたくなるところであります… 

その実機デバッグですが,ブレークポイントでうまく止まってくれませんでした.
以下の設定が必要なようです.
 ・AndroidManifest.xmlの"Debuggable"を"true"にする.
・プロジェクトのActivityのonCreateメソッドでwaitForDebugger();を呼ぶ.
protected void onCreate(Bundle savedInstanceState){
 android.os.Debug.waitForDebugger();
 super.onCreate(savedInstanceState);
}

Pdほど頻繁に記事を更新できるようなネタが上がらないと思いますが,
ぼちぼち進めていこうと思います.
libpdの実装に入るまでが第一関門ってとこですかね.

2013年8月29日木曜日

JK flip-flop on Pd(PURE DATA)

This article indicates examples of how to make JK flip-flop on Pd(PURE DATA),
without any DSP objects[~] and [expr].

JK flip-flop - Wikipedia(en)

The following circuit is a JK-FF circuit consists only of
arithmetic product, logical NOT, and basic PD objects [trigger] and [f].


This circuit simulates continuous feedback loops of logic circuit,
so a proper accuracy is expected.
Its logic context is pretty honest, and leaves the possibility of make more better.
Just do it as you like.
jkff1.pd

リアルタイムクォンタイザ

ボタン入力時に,効果音が自動的に16分音符に矯正されたリズムで発音される機能です.
これまでの設計の流れを継承しているので,当然シャッフル(リズムのヨレ)にも対応.
リズムよりわずかでも遅れると次のタイミングの入力と見なされてしまうのを防ぐため,
ボタンの入力に猶予をもたせる機構をつけてあり,これに少し手こずりました.
Pdでは,波形を作って任意のタイミングの値を読み出してANDをとるなど,
DSP出力をスカラの次元に持ってくる計算は途端にパフォーマンスが低下するので,
今回は全てスカラ値の計算でやりくりしたところがコダワリ.あとexprも不使用.

autoqnt.mp3

JKフリップフロップ的な構造になったので,いっそJKFFのモジュールも作って公開しようかな.
Pdはそこそこにして,ぼちぼちAndroid SDKのほうに移らないと(汗

2013年8月27日火曜日

OS X Tiger(10.4.11)でのPd-extended

Pdのワークショップや勉強会,ミーティングみたいなものが
国内でもたびたび開催されているらしく,勉強と情報収集も兼ねて
近々行きたいなあと思ったりしはじめました.

当然ながら,そういう場では自前でPdが動く端末を持参することが前提.
私はラップトップPCを持っていないので,どうしたものかと考えてたのですが…

いや,持ってなくはなかったです.
iBook G4の初期型を眠らせていたんでした.2003年発売なので10年前です(!)

2013年8月26日月曜日

簡易サンプラー作成

昨日のごちゃごちゃパッチのサンプラー部分をモジュール化.

課題として挙げていた,「[soundfiler]が"$0"を受け付けないのでローカル変数を使えない」問題はここを参照して解決しました.
PURE DATA forum~ / what is an abstraction, and why use $0, $1 etc ?? 

"$0"がMessageではローカル定数(?)とは解釈されないのが問題なので,一旦"$0"の実体を数値で出力したものをMessageに変換すればよいという話。
というか全く同じ用途(サンプル読み込み機能のある外部パッチを複数作りたい時)の話題が展開されてました.
[f $0]にbangを入れてやると,floatとして"$0"の実体が吐き出されてくるので,
あとはそれを[pack]に入れるなりして対象の形式に合わせてやればいいという事ですね.

というわけで
・Gain
・Pitch
・Gate
の3機能のみ備えた簡易サンプラーを作って外部パッチ化してみました.



twosamples_20130826.zip

2013年8月25日日曜日

Pdでシーケンス生成

楽しくて一日中Pdいじってました. 

昨日のデータを修正して,課題だった
・Shuffleを数値の足し引きではなく,偶数ステップにディレイをつける考え方に変更
・トリッキーな算術モジュール[expr]を使わず[+ ] [/ ]等の通常の算術Objectで計算
を済ませて,この過程で入力のHot/Coldの概念の理解も進んだ.

とりあえず次は再生ピッチ関連の機能だなということで作り進めて,
任意の波形をエンベロープ入力源としたピッチ制御を組み込み.
ついでに既存の波形だけじゃなくオシレータまわりの勉強もしとこうと思い,
16分刻みでミョコミョコ鳴るだけのシンセも入れてみました.

あと,freeverb(オープンソースのReverbですな)が入ってたのでとりあえず挟んでみました.


shufflertest20130824.zip

2013年8月23日金曜日

Pure Data(Pd)ことはじめ

サウンド系アプリを作ってみようと思ったきっかけは,libpdを知ったことにあります.

libpdは,音声処理向けのビジュアルプログラミング言語である
Pure Data(以下Pd)で作ったパッチ(≒キット,システム)を,CやJava等のコードに
組み込むためのライブラリです.

サウンド系アプリはその性質上,オーディオ系の機能に関する要求は
相応にリッチなものが必要になるんだろうなと想像してます.

AVDのconfig.ini

AVD上でメニューキーを押してApps一覧を開くと
「Unfortunately, Launcher has stopped.」
とかいって落ちる件.

特に,仮想のDeviceとしてNexus 7を選択した時に起きるという報告がよくされている模様.

Deviceは特定機種を仕様を想定した各種設定値のプリセットにすぎないので,
この問題はNexus 7固有のものってわけじゃないはず.

解決策としては,AVDのconfig.iniをテキストエディタで開いて
設定値を手でいじるというのが出回ってます.
config.iniの場所は以下.
~/.android/avd/{avd_name}/config.ini
というかAVDのイメージとかスナップショットとかもこのドットディレクトリの中に入ってるんですが.
重いバイナリをローカルにしれっと隠さないでくれよなー頼むよー(懇願)

で,以下の2項目を更新します.

2013年8月22日木曜日

Android仮想デバイスが重すぎて仰天


iOS SDKを入れてみて触ったiPhone Simulatorは
サクサクで快適なテスト環境だったんですが,
Android SDKのAndroid Virtual Deviceに同じものを期待していたら
どっこいはるかに重くて戦慄…
はっきりいって使い物にならんですな.

この規格外な遅さのストレス,なんか昔にあったような…と思ったら,
G4でVirtual PCを動かした時の,あのとてつもない苛立ち。あれだ.


そんなこんなで,みなさん速い仮想マシンを使おうと苦心されているようです。
一番メジャーなのは,ARMではなくx86の仮想マシンを立てて
x86ハードウェアでサポートされてる仮想化支援機能を効かせるという手法のようです.

2013年8月21日水曜日

Get started

最近、実現してみたいゲームを脳内で温めてるんですが,
たたき台でも自分で組み立てられないと,人を巻き込むこともできないなーという所で
しぶしぶ(?)手を動かし始めることにします.

タッチスクリーンタイプのデバイス上で組むことを想定しているんですが,
人を巻き込みたいという前提があると,実機のデバッグ環境がいちいち年会費制になるiOSは
なにかと不便だなあという印象を持ちました.
というわけで,まずはプラットホームとしてAndroidを選んでみたのですが,
当然Androidでのアプリケーション開発を勉強しなければならないわけで…