Published on
October 28, 2008 in
book.
Tags: gainer.
今日、オーム社より復刊された +GAINER―PHYSICAL COMPUTING WITH GAINER の
復刊あとがきに、Gainer++ と QCGainer をつくったということで名前を載せていただけました。GAINER の小林さん、ありがとうございました!
ここしばらくはずっと iPhone ばっかしいじってたので、 GAINER とはちょっと離れてしまってますが、MAKE: Tokyo Meeting 02 ももうじきなのでまたなにか作ってみたいですね。
GainerBook Labo + くるくる研究室
オーム社
売り上げランキング: 51938
RubyCocoaでQuartzComposer プラグインをつくれるようになった ので、さっそくつくってみました。
みんな大好きGainer の入力を QuartzComposer からとれるようにしました。
ソースコード
github:qc_gainer に。MITライセンスです。
Funnel, osc を使っています。
短かいので、コードをはっておきます。ごさんこうに。
#
# qc_gainer.rb
#
# Created by mootoh on 6/6/08.
# Copyright (c) 2008 deadbeaf.org. All rights reserved.
#
require 'osx/cocoa'
OSX.require_framework 'QuartzComposer'
require 'funnel'
class QCGainer < OSX::QCPlugIn
def self.executionMode
2
end
def self.timeMode
1
end
def initialize
@initialized = false
@gio = Funnel::Gainer.new(Funnel::Gainer::MODE1)
@ain = [0,0,0,0]
@din = [0,0,0,0]
@aot = [0,0,0,0]
@dot = [0,0,0,0]
end
def startExecution(context)
Thread.new do
sleep 0.1
4.times { |i| addInputPortWithType_forKey_withAttributes(OSX::QCPortTypeNumber, "aot_" + i.to_s, nil) }
4.times { |i| addInputPortWithType_forKey_withAttributes(OSX::QCPortTypeNumber, "dot_" + i.to_s, nil) }
4.times { |i| addOutputPortWithType_forKey_withAttributes(OSX::QCPortTypeNumber, "ain_" + i.to_s, nil) }
4.times { |i| addOutputPortWithType_forKey_withAttributes(OSX::QCPortTypeNumber, "din_" + i.to_s, nil) }
end
true
end
def execute_atTime_withArguments(context, time, args)
unless @initialized
4.times do |i|
@gio.ain(i).on Funnel::PortEvent::CHANGE do |event|
@ain[i] = event.target.value
end
@gio.din(i).on Funnel::PortEvent::CHANGE do |event|
@din[i] = event.target.value
end
end
@initialized = false
end
4.times do |i|
setValue_forOutputKey(@ain[i], "ain_" + i.to_s)
setValue_forOutputKey(@din[i], "din_" + i.to_s)
end
true
end
def stopExecution(context)
true
end
end
使い方
- Gainer I/O をMacとつなげる
- Funnelサーバを起動
- Quartz Composerを起動
- Pluginを配置
デモ
ビデオに撮るのがめんどうなので、Ruby会議 に持っていきます。
まとめ
こんなふうに、ありものをくっつけてささっと何かをつくるというとき、glue言語としてRubyはグッドですね。
Happy Physical Hacking !
昨日のつづき。
今日のコミットで、以下の動作が確認できました。
- コンストラクタでのモード切り替え
- アナログ入力
- デジタル入力
アナログ入力の確認中に、どうも値がヘンなことになってて30分くらい悩んだのですが、参考書によると、アナログ端子はアンテナみたいになるので値が不定になるよ、とのこと。そんなことも知らない素人です。
gainer-ruby のコードでは、デジタル入力が1ポートしか取れないことになっていたので、ビット演算したりして4ポートぶんとれるようにしました。
それにしてもプロトコルの仕様が知りたいよ、とうろうろしていたら、ちゃーんと公開されてました。さすが。ちゃんと調べなきゃですね。
Gainerを、C++から使えるようなラッパを書いています。
Rubyから扱えるgainer-rubyのコードをC++に書き移して、Gainer++としてCodeReposに登録しておきました。コードはこちら。
まだI/Oポート周りのコードを移していないのですが、Gainer I/OモジュールのLEDを点灯させるサンプルプログラム (gainer-rubyのページにあるもの) は動いています。(gainer-led.cc)
せっかくより書き易いRubyのライブラリがあるのにC++で書くなんて逆行してるよ! と自分でもつっこまざるを得ないのですが、Gainerをより低レイヤ (CoreMIDIとか)と連携させてみたい、というのが動機です。
つかったりコード直したりしてみてくださいね。
関連