ふしぎの国のアリスに出てくる“しゃべるお花”の世界をつくりたい――そんな思いから始まった「しゃべるお花」プロジェクト。当初は10万円かかると言われどうなることかと思ったが、筆者がプライベートで購入したマイクロマウスPi:Co Classic2を使用することで、なんとか予算内(3000円)で収まることに。まずは花から音を鳴らす装置をつくるため秋月電子通商で購入したアンプキットを組み立て、スピーカーとステレオジャックにつなぎ、ハード環境は整った。
今回作る「しゃべるお花」の仕組みはこうだ。床に立てたPi:Co Classic2から出る赤外線を花に反射させ、Pi:Co Classic2のセンサーで受光させる。通常ならば赤外線は花に当たって反射するが、花が揺れていると反射せず、Pi:Co Classic2に光が戻ってこない。この仕組みを使って、Pi:Co Classic2が「光を受けた」と反応したらPCに信号を送り音を出し、反射する光を受けていなければ再びPCに信号を送り音を止める。つまり、お花が揺れているときだけ歌ってくれるというわけだ。
ところが「マイクロマウスのセンサーに反応して音が鳴る」というプログラムで壁に当たる。手をかざすとセンサーに反応して音が鳴るようになったものの、手をどけても音が鳴りやまない。……困った。
そんなときには、秋葉原にいるいつもの青木先生と山本先生に助けを求めればだいたい解決する。青木先生はしばらくコードをみつめ、少しコードをいじってこう言った――「『player.close();』がいらない。なぜか分からないけどこれなくしたらうまくいく」。「player.close();」はサウンドデータを終了するという意味。調べてみたところ、
void stop(){ }
の中に書くことはあるが
if ( idata > 150) { //150以上だったら音鳴る player.play(); //再生 } else { player.close(); //再生止める
と、ここに書くのはNG。「player.close();」ではなく、「player.pause();」を使うとよさそうだ。
import ddf.minim.*; //音関係のライブラリを読み込む import processing.serial.*; //シリアルポートのライブラリを読み込む Minim minim; //たぶん呪文・構造体 AudioPlayer player; //たぶん呪文・構造体 Serial port; //たぶん呪文・構造体 int ohana = 0; void setup(){ minim = new Minim(this); player = minim.loadFile("http://ccmixter.org/contests/freestylemix/Cornelius%20-%20Wataridori%202.mp3", 2048); println(Serial.list()); String PICOPort = Serial.list()[0]; // printlnで表示された番号を4の代わりに入れる port = new Serial(this, PICOPort, 38400); // PICOとの通信速度の設定 } void draw(){ size(400,400);//画面サイズ delay(1000);//1s if(port.available() > 0 ) { //何か文字を受信したら動く、受信しなかったら実行しない background(0,0,0); //黒 String data = port.readString(); //※文字列受信 fill(255,255,255);//文字色 textSize(10);//文字サイズ //int idata = int(data); //picoから受信したのは文字列。文字列でif文を書くと大変なので数字にしたい。なので、intを使って数字にする。 text(data,20,20);//文字を100,100の位置に表示 println(int(data));//黒いところにインフォメーションを出す if ( int(data) > 150) {//150以上だったら音鳴る player.play(); //再生 ohana = 1; } else { if(ohana == 1){ player.close();//再生止める ohana = 0; } } } } void stop() { player.close(); minim.stop(); super.stop(); }
import ddf.minim.*; //音関係のライブラリを読み込む import processing.serial.*; //シリアルポートのライブラリを読み込む Minim minim; //たぶん呪文 AudioPlayer player; //たぶん呪文 Serial port; //たぶん呪文 void setup(){ minim = new Minim(this); player = minim.loadFile("http://ccmixter.org/contests/freestylemix/Cornelius%20-%20Wataridori%202.mp3", 2048); println(Serial.list()); String PICOPort = Serial.list()[0]; // printlnで表示された番号を入れる port = new Serial(this, PICOPort, 38400); // PICOとの通信速度の設定 size(800,800);//画面サイズ } void draw(){ background(0,0,0); //文字を消すためにbackgroundを入れる delay(50); //0.05s int data = port.read(); // String data = port.readString(); //※文字列受信 を変えて1文字受信に fill(255,255,255); //文字色 textSize(50); //文字サイズ println(data); //黒いところにインフォメーションを出す if ( data == 121) { //yesの「y」アスキーコードだったら音鳴る text("play\n\r",100,100); //playの文字を表示する位置 player.play(); //再生 } else if( data == 110){ //noの「n」のアスキーコードだったら text("stop\n\r",100,200); //stopの文字を表示する位置 player.pause(); //一時停止 // player.rewind(); //巻き戻し } } //PCの中にあるメモリの開放 void stop(){ player.close(); minim.stop(); super.stop(); }
――と、とまった……!!! センサーに手をかざすと音が鳴り、離すと音が止まるプログラムが完成した。実際には、センサーをお花がさえぎったときに音が鳴り、センサーからお花が離れると音が止まるシステム。
まずはTera Termでマイクロマウスの動作確認。センサーが反応したら「Yes」の「y」、反応しないときは「No」の「n」が表示されるのを確認する。確認できたらProcessingを実行。歌った……! お花が歌った……!!
次回はいよいよ、ふしぎの国のアリスに出てくる“しゃべるお花”を目指し、プロジェクターでお花に顔の映像を投影する。クロマキー処理を行うため緑色の全身タイツを被り動画を撮影、顔の部分のみを切り出し、その動画をお花に映す。お花畑が歌を歌う日は、もうすぐそこまで来ている。
【次回予告(変わるかも)】クロマキー処理を行いプロジェクターでお花に顔の映像を投影。いよいよふしぎの国のアリスに出てくる“しゃべるお花”が!
小学3年生より国立音楽大学附属小学校に編入。小・中・高とピアノを専攻し、大学では音楽学と音楽教育(教員免許取得)を専攻し卒業。その後、慶應義塾大学大学院メディアデザイン研究科に入学。人と人とのコミュニケーションで発生するイベントに対して偶然性の音楽を生成するアルゴリズム「おところりん」を生み出し修了した。
大学院を修了後、2011年にアイティメディアに入社。営業配属を経て、2012年より@IT統括部に所属し、技術者コミュニティ支援やイベント運営・記事執筆などに携わり、2014年4月から2016年3月までねとらぼ編集部に所属。2016年4月よりITmedia ニュースに配属。プライベートでは約1年半、ロボット「Pepper」と生活を共にし、ロボットパートナーとして活動している。2016年4月21日にヒトとロボットの音楽ユニット「mirai capsule」を結成。
(太田智美)
Copyright © ITmedia, Inc. All Rights Reserved.
Special
PR