木曜日, 11月 22, 2007

AudioIn with MacBook built-in-microphone

MacBook Proに移行して、SuperCollider3も3.1にして、processingと連携させて遊んだりしたんだけど、
ある時マイクを使おうとしたら入力ができなかった。
解決法をwebで発見したので記録しておく。

アプリケーション>ユーティリティ>Audio MIDI設定を起動して、メニューから機器セットエディタを開く
+ボタンで機器セット追加。名前をsupercolliderとでもつけておく
内蔵マイク、内蔵出力にチェックして、完了
デフォルトの入力と出力をsupercolliderにしておく

で、SC3起動(既に起動してる場合は再起動)。
Serverをbootするとこんなメッセージが出るはず。
Number of Devices: 4
0 : "Built-in Microphone"
1 : "Built-in Input"
2 : "Built-in notification is on


"supercollider" Input Device
Streams: 1
0 channels 2

"supercollider" Output Device
Streams: 1
0 channels 2

新規ファイルを開いて、

{Out.ar(0,AudioIn.ar(1))}.play;

で無事左チャンネルから音が聞こえて録音もできましたとさ。

月曜日, 11月 19, 2007

today's glitch 3


この間、youpyさんに教えてもらったOSXで超簡単にglitchする方法で、

cat ファイル名 | sed 's/9/1/g' > ファイル名

てのがある。
sedコマンドで

s/検索文字列/置換文字列/g

って感じで数値を置換してる。数値を変えると結果も変わる。ファイルはmp3とかもいける。

同じようにprocessingでも単純にバイナリ形式で開いて、if文で置換。
数値は色々試さないとできたファイルがうまく開けなかったりする。finderのプレビューで見るのと、アプリケーションのプレビューで見るのと、photoshopで見るので結果が違ってたりする。

byte[] b = loadBytes("hysysk.jpg");
for(int i=0;i<b.length;i++) {
//println(b[i]);
if(b[i]==18) {
b[i]=1;
} else {
b[i]=b[i];
}
}
saveBytes("glitch.jpg", b);

土曜日, 11月 17, 2007

jython + p5#2

後半。本当にやりたかったのはここから。
irbでやってるみたいに、インタラクティブにコードを書き換える。
Processing by Ruby #2 - Quietstar

コードはrubyとほとんど同じ。下のコードをSketchTest2.pyとか名前付けて、保存。
jythonを起動して、

>>> from SketchTest2 import *

これでjrubyのloadと同じなのかな。

>>> applet = Sketch()

で、Sketchクラスのインスタンスを作る。

>>> run(applet)

とするとアプレットが動きます。ランダムな位置に四角が描かれては消される。
jrubyでの例と同じように

applet.stop()

とかすれば止まるし、

applet.strokeWeight(5)

とかすれば線が太くなる。これは楽しい。
GUIもCUIもPhysical Computingも全部組み込みたいものだ。

from javax.swing import JFrame
from processing.core import PApplet

class Sketch(PApplet):
def __init__(self):
pass
def setup(self):
self.size(200, 200)
self.rect(0, 0, 100, 100)
def getField(self, name):
return self.class.superclass.getDeclaredField(name).get(self)
def draw(self):
self.background(255);
self.rect(self.random(self.width), self.random(self.height), 10, 10)

def run(applet):
frame = JFrame(title="Processing",
resizable = 0,
defaultCloseOperation=JFrame.EXIT_ON_CLOSE)
frame.contentPane.add(applet)
applet.init()
frame.pack()
frame.visible = 1

if __name__ == '__main__':
run(Sketch())

jython + p5#1

jrbでprocessingっていうこの記事読んで同じことがjythonでもできないかと思った。
Processing by Ruby - Quietstar

jythonのインストール
Installation

ここからリンク先をクリックしてjarファイルをダウンロード
Downloads

jarファイルをダブルクリックするか、terminalで

java -jar jython_installer-2.2.1.jar

と打ち込む。
GUIが出てきて色々聞いてくるので、色々答える。Installation typeはStanderdにした。
あとはひたすら光ってるとこをクリックしてくと、jython2.2.1というフォルダが作られる。

PATHを通す(コマンドサーチパスに加える、というのか)。terminalで

open .bash_profile

して、bash profileを開く。jython2.2.1フォルダ内にjython実行ファイルがあって、ホーム(hysysk)のすぐ下に置いたので、

export PATH="/Users/hysysk/jython2.2.1:${PATH}"

とすればよい。他に色々ある場合は:でつないでいく。${PATH}は忘れずに。
これでterminalから

jython

と打ち込むだけで起動するようになる。

Processingの方。
.bash_profileにprocessingのCLASSPATHを書いておくと実行する時に楽。
ここを参考に。
JRuby上のirbでインタラクティブにProce55ingを動かす:TKMR.blog.show

export P5_HOME=/Applications/Processing¥ 0133
export CLASSPATH=$CLASSPATH:$P5_HOME/lib/core.jar

こんな感じで。exportってのは変数の宣言みたいなものか。
Processing 0133じゃなくてProcessing¥ 0133。\か¥を入れる。フォルダ名変えればいいのか?試さない。

jythonでの書き方はここを参考に(via koyachiさん。いつもありがとうございます!)。
Backspaces: Processing: .. with Jython

ただ四角を描くだけのコード。SketchTest.pyとか名前付けて保存して、

jyhton SketchTest.py

で実行される、はず。上のサイトの人もあんましいいコードじゃないけどとりあえず動くからいいよね的なこと言ってるけど、僕もそんな感じです(僕の場合、どこがどう悪いかもわからない)。ご了承下さい。後半へ続く

from javax.swing import JFrame
from processing.core import PApplet

class Sketch(PApplet):
def __init__(self):
pass
def setup(self):
self.size(200, 200)
self.rect(0, 0, 100, 100)
def getField(self, name):
return self.class.superclass.getDeclaredField(name).get(self)

if __name__ == '__main__':
frame = JFrame(title="Processing",
resizable = 0,
defaultCloseOperation=JFrame.EXIT_ON_CLOSE)
panel = Sketch()
frame.add(panel)
panel.init()
while panel.defaultSize and not panel.finished:
pass
frame.pack()
frame.visible = 1

金曜日, 11月 16, 2007

dial

本審査まであと1ヶ月を切った。泣いても笑ってもと言う感じ。数年前に比べれば情報も増えたし、環境も良くなってる分、求められるレベルは上がっている。

音楽機材のインターフェースと、テキストエディタのインターフェースを組み合わせたものを作るのに、ダイアル必要でしょ、ということでDialクラス自作。controlP5あるけど、基本的にSpringGUI使ってるので最終的な見た目を調整する際にもう少しフレキシブルにする必要があると思ったので。casey&benのp5本を参考に。基本的にはスクロールバーと同じ。まだまだ最適化できると思うけど、とりあえず。
ダイアルの中心部から離れれば離れるほど分解能が下がるのは、仕様ってことで。。。
dial : Built with Processing

使い方は、
Dial d = new Dial(x位置, y位置, 大きさ, 最小値, 最大値)
でインスタンス作って、

d.update(mouseX, mouseY)
でマウスオーバー検出、

d.press(mouseX, mouseY)
でロックして、

d.getVal()で値を取得。

日曜日, 11月 11, 2007

20071111

today's glitch 2


今日もglitch。

最初のものはグリッチを起こすタイミングをランダムに設定していたんだけど、周期的にずれ具合を変えるという風に変えてみた。koyachiさんが参考にしてたmikrosophtみたいに。
Flickr: Photos from mikrosopht

マウスのx位置とって何ピクセル目にグリッチさせるかってのを設定してる。どれくらいずらすかは毎回変わるので、同じ位置で何回かクリックしてみてもいい。preタグだと<があれなのでインデントこんなんですが、OSXだとprocessingIDEでコマンドキー+T(Toolsメニュー>Auto Format)で自動でインデントつけてくれるので、コピー&ペーストして試してみてください。

/*
inspired by HSYNC Glitch t.koyachi
http://d.hatena.ne.jp/koyachi/20071107
hysysk
*/
int interval= 1;
void setup() {
size(500, 375);
PImage imgsrc;
background(255);
noStroke();
int slideX = 0;
int slideY = 0;
int randSlideX = int(random(15));
int randSlideY = int(random(5));
imgsrc = loadImage("cXHwYYMtm1he27ib375S4A0e_500.jpg");
int glit=0;

loadPixels();
for(int j=0; j<height; j++) {
if(glit%interval==0) {
randSlideX = int(random(10));
randSlideY = int(random(5));
}
else {
slideX += randSlideX;
slideY += randSlideY;
}
for(int i=0; i<width; i++) {
int current = j * width + i;
int src = current + slideY * height + slideX;
if(src>=height*width) {
src = current - width;
}
pixels[current] = imgsrc.pixels[src];
glit++;
}

}
updatePixels();
}

void draw() {
interval = max(1,mouseX);
}

void keyPressed() {
saveFrame("glitch.jpg");
}

void mousePressed() {
setup();
}

土曜日, 11月 10, 2007

today's glitch


koyachiさんが作ってたglichを元に僕もやってみた。
きょうのglitch - koyachiの日記

jrubyでの書き方がよくわかってないのでところどころ書き換えてます。
hysncglitch : Built with Processing

マウスクリックで描画し直します。
コメントアウトしてるけど、キーを押すと画像の保存。

ポイントとしては外側のfor文の中の変数glitに入る乱数の値(1行読むごとに再設定される)が、

0の場合 
x軸方向にrandSlideX分、y軸方向にrandSlideY分ずれたところをソースにする

1の場合 
randSlideX、randSlideYの値を再設定

それ以外の場合 変化なし

という風に分岐してるとこかな。画像変える場合はsize()の大きさを画像の大きさに合わせてね。
色々試す。

(追記:試した結果、縦の方が長いの画像の場合、配列のエラーが出ます。原因究明中。眠い。)
(さらに追記:直しました。int current = j * width + i;としなければならないところ、widthがheightになってました。koyachiさんありがとうございます!)

金曜日, 11月 09, 2007

pre presentation


修士制作予備審査終了。前日に受けたアドバイス(とにかくでかくプロジェクションしろ、でかい音を出せ、今何やってるかわかるようにしろ)が効いて何とか乗り切った感じ。素早い変更ができるのはprocessingとかmax/mspの最大の利点。

複数行の入力を可能にして、回転を加えたところ、波形は面白くなった。
テキスト操作の結果、音響合成の理論ではどういう効果に位置づけられるのかというところを丁寧に調べていく必要がある。文字の幅を調整して周波数を変えるとか、90度回転させて打ち込むと普通の波形テーブルの編集みたいになるとか。

今回はキーボードでテキスト編集、マウスで形状変化、という風にしたけど、tex/tspでやってたみたいにコマンドっぽい機能をつければまた変わると思う。マウスじゃなくてフェーダーとかツマミで操作もしたい。最初はグリッチだったりエラーを利用して楽しむ感じだったけど、次の段階はそれをオーガナイズすること。耳を頼りに操作してかっこいいグラフィックができてるとか夢。

アカデミーの高桑教授が本気でプログラム書く時はモニタ見ないでうなだれた状態で目を閉じてキーボードをタイプするそうだ。大度君も本気で演奏する時は目を閉じるとか言ってたし、触覚的なインターフェースについてももっと考察してもいい。視覚的にいくらリッチにしたところで越えられない壁ってのはやっぱりある。

去年思い描いていた通りGUIもCUIもフィジカルコンピューティングもデザインも音響もグリッチも全部広く浅く盛り込んだ作品になりそう。

解放感というよりは、上記のようなブラフをどれくらい実現できるのかってとこの重圧。
とはいえ進むべき方向が見えつつあるのはいい。

日曜日, 11月 04, 2007

gnu.io.PortInUseException: Unknown Application

gainer使うのに一苦労してしまった。
まずファームウェアとライブラリのバージョンが合ってなかったのと、シリアルを使う際のこのエラー。

答えはfaqにあった。
Serial \ Libraries \ Processing 1.0 (BETA) \ Processing 1.0 (BETA)

Processing/libraries/serialフォルダ内のmacosx_setup.commandをダブルクリックすると、terminalが起動する。シリアルを使えるようにするプロンプトが出て、Do you want to continue?と聞かれるので、yを入力してエンター。アカウントのパスワードを入力して、そのままOSを再起動。無事使えるようになった。

さらによく見てみると、Gainer公式サイトにしっかり載ってました。
GAINER.cc | Tutorial / Processingで使う

慣れたつもりでやってると痛い目見るので注意が必要ですね。

20071104

まだ何もないけど(正確にはあるが、リンクを貼ってない)、webちょっとずつ作り直してる。自分の作品を見せるというよりは今後のため。

jquery使ってみたら非常に便利だった。最初メニューを定義リストで作ってて、dtをクリックしたらddの中身が表示されるようにしてたんだけど、コンテンツが増えると最初の読み込みが重くなりそうな予感がしたので書き換えた。innerHTMLにhtmlを動的に読み込む形式。何かでもこれもパーマリンク力弱そう。うまいやり方ないかなー。この人のページのこの画像(とか文章)っていうのにすぐアクセスできるようにしたいんだけど。栞とかポストイットみたいな感じで、そのページにいくと自分が気に入ってるところをすぐ見られる仕組み。

見た目も、構造も、ちょっと変わっててかっこよくて便利な物を作りたい。

でもまずは修士制作だろ。8日予備審査。