Tag Archive for 'gainer'

+GAINER に載せていただきました

今日、オーム社より復刊された +GAINER―PHYSICAL COMPUTING WITH GAINER の 復刊あとがきに、Gainer++QCGainer をつくったということで名前を載せていただけました。GAINER の小林さん、ありがとうございました!

ここしばらくはずっと iPhone ばっかしいじってたので、 GAINER とはちょっと離れてしまってますが、MAKE: Tokyo Meeting 02 ももうじきなのでまたなにか作ってみたいですね。


+GAINER―PHYSICAL COMPUTING WITH GAINER
GainerBook Labo + くるくる研究室
オーム社
売り上げランキング: 51938

QCGainer : Quartz Composer Gainer plugin

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

使い方

  1. Gainer I/O をMacとつなげる
  2. Funnelサーバを起動
  3. Quartz Composerを起動
  4. Pluginを配置

デモ

ビデオに撮るのがめんどうなので、Ruby会議 に持っていきます。

まとめ

こんなふうに、ありものをくっつけてささっと何かをつくるというとき、glue言語としてRubyはグッドですね。

Happy Physical Hacking !

Gainer++ その2

昨日のつづき。 今日のコミットで、以下の動作が確認できました。

  • コンストラクタでのモード切り替え
  • アナログ入力
  • デジタル入力

アナログ入力の確認中に、どうも値がヘンなことになってて30分くらい悩んだのですが、参考書によると、アナログ端子はアンテナみたいになるので値が不定になるよ、とのこと。そんなことも知らない素人です。

gainer-ruby のコードでは、デジタル入力が1ポートしか取れないことになっていたので、ビット演算したりして4ポートぶんとれるようにしました。

それにしてもプロトコルの仕様が知りたいよ、とうろうろしていたら、ちゃーんと公開されてました。さすが。ちゃんと調べなきゃですね。

Gainer++ – GainerをC++から使う

Gainerを、C++から使えるようなラッパを書いています。 Rubyから扱えるgainer-rubyのコードをC++に書き移して、Gainer++としてCodeReposに登録しておきました。コードはこちら

まだI/Oポート周りのコードを移していないのですが、Gainer I/OモジュールのLEDを点灯させるサンプルプログラム (gainer-rubyのページにあるもの) は動いています。(gainer-led.cc)

せっかくより書き易いRubyのライブラリがあるのにC++で書くなんて逆行してるよ! と自分でもつっこまざるを得ないのですが、Gainerをより低レイヤ (CoreMIDIとか)と連携させてみたい、というのが動機です。

つかったりコード直したりしてみてくださいね。

関連