ARTIST SHOWCASE Edison とトップアーティストの共演

at Maker Faire Tokyo 2015

KIMURA(TASKO)
柳澤知明・比嘉了(Rhizomatiks)
2bit君(buffer Renaiss)
Edison でバンドやろうぜ!

MMI(Musical Mechanical Instrument)

  • Maker Faire Tokyo 2014
  • Interactive Art



ダフト・マシーンが奏でる新しい音楽

マシーン・ビートを刻む無人のドラムセット。その足元でFRISKケースに収められた Edison が静かに稼働し、遠隔地でやはり自動演奏するギター&ベースとのセッションを紡ぎ出す。《MMI(Musical Mechanical Instrument)》は、Maker Faire Tokyo 2014(以下、MFT2014)のインテルブース「SHOWCASE」展に登場し、ハードかつメランコリックな演奏で異彩を放ったマシーン・バンドだ。
《MMI》は、2本指で演奏する「オート・オートマタG」と「オート・オートマタB」のギター&ベースコンビと、演奏を主導するドラマー「セミ・オートDrum」で構成される。ドラムの複数箇所に接続された Edison がMIDIトリガーとしてギター&ベースに送信。どこかレイジーな雰囲気もありつつ刺激的なロックを奏でるこのバンドのセッションを、 Edison が実現させた。

Works

開発の発起人であるKIMURA(TASKO)によれば、発想の原点は「ものづくりの人間としてうらやんでいた、ミュージシャンたちのライブにおける高揚感」。コツコツと機械工作を続けてようやく発表の日を迎える自らの製作スタイルに対し、「一夜のステージで、周りを“おお〜っ!!”と盛り上げるあの感じ、あれがうらやましいなーとかねて思ってまして。ま、自分は結局いつもどおりに作ることになるんですけど(笑)」。そんな想いも背景に、生セッションを行う機械ロックバンド、という構想が持ち上がった。

MFT2014における《MMI》。インテルブースのドラムマシーン

TASKOブースのギター&ベース

エンジンやモーターを用いた「KIMURA式自走機シリーズ」など不思議な装置を手がける彼と、テクノロジー表現の精鋭集団・Rhizomatiksから柳澤知明と比嘉了がジョイントしての制作。さらに助っ人プログラマーとして2bit君(buffer Renaiss)も合流し、作り手側もバンドのようなコンビネーションとライブ感での開発が行われた。

機械バンドに託した、ジャムセッションの妙味

Edison と超小型拡張基板「Eaglet」(プロトタイプ)を用い、FRISKケースに収納。

MFT2014での《MMI》システム構成図

MFT2014では、会場入口そばのインテルブースにドラムを、最奥部のTASKOブースにギター&ベースを配し、遠隔セッションを実現した。ドラム各部には、拡張基板「Eaglet」に接続した Edison を配置。さらにテンポを決める メトロノームの役割をする1台のEdisonからの情報を受け取り、スティックやキック部を駆動する。その情報は連携するPC&オーディオインタフェース経由でギター&ベース側にも送信され、ドラムビートに導かれてのセッションを生み出す。ちなみに弦楽器の演奏は、あらかじめラジコン・プロポでの制御モードによる演奏をサンプリングし、そのシーケンス生成で実現している。

ブース間の音声のタイムラグを極力回避するため、ネット経由でリアルタイムセッションを(ふつうは人間が)行うためのアプリ「Netduetto」も活用した。ブースには互いの現場映像を中継するモニターも配し、来場者にバンド演奏を体感してもらう。なお中継による遅延をなるべく避ける為、映像は音声ラインと切り分け、iPadのFaceTimeを活用して相互の映像をモニターに表示する構成をとっている。

それぞれのEdison、それぞれのこれから

今回の挑戦を振り返っての、制作メンバーの感想を聞いた。
「ずっとやりたかった機械バンドが実現して嬉しい。今回はデバイスエンジニアやプログラマーと一緒にやれたことも、すごく刺激になりました」(KIMURA)
「Edison をはじめとして、ふだん使うハードウェアとはまた違ったので、どういうことができるのか手探りの制作でした。その意味で今回は最初の一歩でもあり、今後、より演奏の精度や能力を上げられたらと思います」(柳澤)
「初めてギターを弾いたときの辿々しさを思い出しながら、ロボット制御のプログラミングに初挑戦しました。 Edisonはnode.jsやPythonを使ってLEDやモーターなどを制御できるのが魅力的です」(比嘉)
「ときどきドラムがモタついたり、セッションに少しズレが生じたりする部分は、今後の課題。でもそれってすごく生演奏的でもあり、これを逆手に取った面白さもありそうです。 Edison は初挑戦でしたが、小さく速いという特徴を活かしたアイデアは色々生まれそう」(2bit)
限られた制作時間で、全く新しい技術での開発は、すべてが挑戦だ。その過程ではインテル株式会社の協力によるテクニカルサポートも、大いに助けになったという。また、「FRISKケースの中に収まるコンピューターでWi-Fi通信ができる」「ライブラリが多様」などは Edison の魅力であり、今後の創作ではBluetoothでの連携や、オーディオをより「使える」ようにするなど、各メンバーはさらなる挑戦への意欲も語ってくれた。
ひとまず、MFT2014で2daysの初ステージを終えた《MMI》。今後は当初から構想していた、「セミ・オートDrum」と人間の協働演奏システムや、さらなる機械メンバーの追加にも挑みたいという。2015年2月には、恵比寿 Liquid roomにも登場するようで、進化したバンドの姿が見られるかもしれない。詳細はMMIのFacebookページで。


ソースコード

制作メモ

下記chk_gpioは EdisonのGPIO(汎用入出力)ピンのon/offをチェック。
servo_moveはサーボモーターの駆動を、intel_edison_servo_hihatは、関数の宣言とメインのループ制御をそれぞれ行う。

1. 《MMI》にてEdison を制御するコード

app.js
Copy

        (function() {
	var setting = require('./setting.js'),
	    osc = require('node-osc'),
	    server = new osc.Server(setting.in.port, setting.in.ip),
	    client = new osc.Client(setting.out.ip, setting.out.port);

	var mraa = require('mraa'),
		pins = {
		GP41: new mraa.Gpio(51),
		GP42: new mraa.Gpio(50)
	};

	for(var key in pins) {
		pins[key].dir(mraa.DIR_OUT);
	}

	function address(msg) {
		return msg[0];
	}

	function attack41(address, msg, rinfo) {
		pins.GP41.write(1);
		setTimeout(function() {
			pins.GP41.write(0);
		}, 30);
	}

	function attack42(address, msg, rinfo) {
		pins.GP42.write(1);
		setTimeout(function() {
			pins.GP42.write(0);
		}, 30);
	}

	var callbacks = {};
	if(setting.mode == "kicks") {
		callbacks["/kicks"] = attack41;
	} else if(setting.mode == "hihat") {
		callbacks["/hihat"] = attack41;
		callbacks["/cymbal"] = attack42;
	} else if(setting.mode == "snare") {
		callbacks["/snare"] = attack41;
	} else if(setting.mode == "spare") {
		callbacks["/spare"] = attack41;
	}
	
	server.on("message", function(msg, rinfo) {
		var address = msg.shift();
		if(Object.keys(callbacks).indexOf(address) != -1) {
			console.log(address);
			callbacks[address](address, msg, rinfo);
		} else {
			console.error("unknown address");
			client.send("/unknown_message", address);
		}
	});
})();
      

settings.js
Copy

        module.exports = {
	in : {
		ip: "0.0.0.0",
		port: 10000
	},
	out : {
		ip: "10.0.1.211",
		port: 10001
	},
	mpuInterval: 30,
	mode: "kicks"
};
      

2. Arduinoスケッチ

chk_gpio.ino
Copy

        void chk_gpio()
{
  for(int i=0; i<2; i++)
  {
    gpio_state[i] = digitalRead(gpio[i]);
    if(last_gpio_state[i] != gpio_state[i])
    {
      if(gpio_state[0] == 1)
      {
        servo_trigger = 1;
      }
      else if(gpio_state[1] == 1)
      {
        servo_trigger = 2;
      }
    }
  }
}

      

servo_move.ino
Copy

        void servo_move(int mode)
{
  if(servo_trigger == mode)
  {
    digitalWrite(led, HIGH);
    if(start_p[mode-1] > end_p[mode-1])
    {
      for(pos = start_p[mode-1]; pos>=end_p[mode-1]; pos-=1)
      {                                
        myservo.writeMicroseconds(pos);
        delayMicroseconds(t);
      }
      
      delay(w[mode-1]);
      
      for(pos = end_p[mode-1]; pos <= start_p[mode-1]; pos += 1)
      {
        myservo.writeMicroseconds(pos);
        delayMicroseconds(t);
      }
    }
    
    if(start_p[mode-1] < end_p[mode-1])
    {
      for(pos = start_p[mode-1]; pos<=end_p[mode-1]; pos+=1)
      {                                
        myservo.writeMicroseconds(pos);
        delayMicroseconds(t);
      }
      
      delay(w[mode-1]);
      
      for(pos = end_p[mode-1]; pos>start_p[mode-1]; pos-=1)
      {
        myservo.writeMicroseconds(pos);
        delayMicroseconds(t);
      }
    }
    
    servo_trigger = 0;
    digitalWrite(led, LOW);
  }
}

      

intel_edison_servo_hihat.ino
Copy

        #include <Servo.h>
#define led 10 

 
Servo myservo;
 
int pos = 0;
unsigned int t = 200; //refresh pulse_wideness for Angle



const int gpio[2] = {2, 4}; //0:GPIO42 1:GPIO41
unsigned int gpio_state[2];
unsigned int last_gpio_state[2];
unsigned int servo_trigger;

unsigned int begin_p = 1400; // angle when power is on

unsigned int min_p = 1050; //min pulse
unsigned int max_p = 1400; //max pulse

//start -> end -> interval -> start
unsigned int start_p[2] = {1200, 1400}; //start angle
unsigned int end_p[2] = {1050, 1050}; //end angle
unsigned int w[2] = {200,0}; //interval time

void setup() 
{
  for(int i=0; i<2; i++)
  {
    pinMode(gpio[i], INPUT);
  }
  
  pinMode(led, OUTPUT);
  digitalWrite(led,HIGH);
//  delay(1000);
//  digitalWrite(led,LOW);
  
  myservo.attach(9, min_p, max_p);  // attaches the servo on pin 9 to the servo object
  myservo.writeMicroseconds(begin_p);
} 
 
 
void loop() 
{ 
  chk_gpio();
  
  if(servo_trigger > 0)
  {
    servo_move(servo_trigger);
  }
  
  for(int i=0; i<2; i++)
  {
    last_gpio_state[i] = gpio_state[i];
  }
} 

      

Download All

Sketch (Making of)


01作品構想スケッチ



02制作過程



03制作過程


材料

  • インテル® Edison 拡張基板「Eaglet」5個
  • FRISKケース(上記格納用)
  • 自作演奏デバイス(サーボモーター、滑車、3D プリンター出力部品等)
  • ギター、ベース、各1台
  • ドラムセット 1組
  • 音声同期セット(ノートPC(Netduetto搭載)1台、オーディオインターフェイス1台、集音SM58相当マイク&スタンド2式、ミキサー1台、BOSE101&スタンド2式、アンプ1台)×2セット
  • 映像同期セット(iPad Air 1台、上記設置用スタンド1本)×2セット

Profile

左から、柳澤知明、2bit、比嘉了、KIMURA

KIMURA(TASKO)

1981年、東京生まれ。明和電機のアシスタントワークを経て独立後、「東京KIMURA工場」を設立。エンジンやモータを用いたKIMURA式自走機シリーズなど、いわゆるバカ機械や誰に頼んでいいかわからない機械の受注・生産を手がける。2012年、株式会社TASKOの設立に参加。現在は同社の設計制作事業部・工場長を務め、ステージ、広告、プロダクト、アート、各業界とのコラボレーションやテクニカルディレクション等、活動の舞台を広げている。
http://masakimura.com/
http://tasko.jp/

柳澤知明|Tomoaki Yanagisawa(Rhizomatiks)

1980年生まれ。4nchor5 la6の一員として、リサーチからデザイン、ハードウェアデバイスの開発設計・制作に至る知識と技術をもとに活躍。アート、広告、MV、プロダクト開発などのプロジェクトにテクニカルディレクション、デザイン、デバイスエンジニアリングで参加する。2012年よりRhizomatiks所属。Perfumeのための一連のLED衣装、変形衣装、デバイスの開発も担当し、2013年カンヌ国際広告祭でパフォーマンスを行った。
http://www.harshush.com/
http://rhizomatiks.com/

比嘉了|Satoru Higa(Rhizomatiks)

1983年生まれ。プログラムやデバイスを用いたサウンド・パフォーマンスや、ソフトウェア・アートを手がけ、リアルタイム音響合成ソフトウェア「VP3L」の開発でも知られる。Rhizomatiksが手がけるリアルタイムな舞台演出やインスタレーション、ライブパフォーマンスなどを、主にソフトウェア・プログラミング分野から支える。
http://www.satoruhiga.com/

石井通人 / ISHII 2bit(buffer Renaiss)

プログラマー。大学では数学を専攻し、証明論を志すも挫折、MerzbowやMegoに憧れてPowerBookG4を買う。英語で一度の留年を経て卒業。大学院に進学するも挫折。結果、充実したモラトリアム期間を過ごす。寒々しい就活生の姿を見た結果、鈴木隆志と会社を起こすことに。2010年、鈴木、小松と共に株式会社バッファールネスを設立。
http://2bit.jp/
http://www.buffer-renaiss.com/