大人の科学「ポケット・ミク」を無改造でテルミン化してみました

ポケット・ミク

 「ポケット・ミク」昨日早速分解してみましたが、改造はちょっと難しそうだったのでひとまず置いておいて。まずは正攻法で攻めてみることにしました。
 今日は正式発売日ということで、正式な歌詞入力アプリポケミクアプリ | 歌うキーボード ポケット・ミク | 大人の科学.netがダウンロード開始したりしたようですが、私はとりあえずそんなものには目もくれず明後日の方向に向かおうかと思います。

Arduinoと「ポケット・ミク」接続

 まずは手軽なところでテルミン化から初めてみようと思います。昔Arduino使ってMIDI機器と繋げるテルミンとか作ったことあるのですが、「ポケット・ミク」は残念ながら直接MIDIを繋げる口がありません。ただ、USB経由でMIDI通信ができるようなのでこれを使うことにします。具体的どうするかというと、下図のようにパソコンを間に経由することでArduinoと「ポケット・ミク」を改造することなく接続することができます。

f:id:karaage:20140403235722j:plain

 具体的な処理の流れは以下のようになります。

  • Arduinoが赤外線センサで受けた距離情報をデジタルデータに変換しシリアルデータを出力
  • パソコンはシリアルデータを受けて、MIDI信号に変換して「ポケット・ミク」にUSB経由で出力
  • 「ポケット・ミク」はパソコンから受けたMIDI信号を元に歌う

 Arduinoのセンサをシリアルデータ出力する部分と、パソコンのシリアルデータを受けてMIDI信号に変換して出力する部分は、Processingというプログラミング言語でソフトを自作することになります。

回路と接続

 面倒くさいので、回路図は省略(回路というようなものは無いですし)。写真貼っておきます。

Arduinoと赤外線センサ

140403_PocketMiku 1
 Arduino UNOと赤外線測距モジュール(GP2Y0A21)です。赤が電源(5V)、緑がGND、白がアナログ信号(A0)に繋がっています。

全体的な絵

140403_PocketMiku 2
 Arduinoとパソコンとポケットミクを接続。基本的に全部USBケーブルです。

「ポケット・ミク」テルミンを試奏してみた動画

 こんな感じです。チューニングすればもうちょいよい感じになると思います。やっぱりパソコンは邪魔だなー。改造してeVY1みたいに直接ポケット・ミクのMIDIポートにアクセスしたいです。

参考リンク

建築発明工作ゼミ2008: Arduino-Processing シリアル通信2
eVY1シールド(ピンヘッダ有り)--販売終了 - スイッチサイエンス

 上記2つのサイトのプログラム参考にしました。というかほとんどコピペ

Amazonリンク

【永久保証付き】Arduino Uno

【永久保証付き】Arduino Uno

歌うキーボード ポケット・ミク (学研ムック 大人の科学マガジンシリーズ)

歌うキーボード ポケット・ミク (学研ムック 大人の科学マガジンシリーズ)

 ソースコードとか欲しい人は、続きを読んでみて下さい。

ソースコード

 ノークレームノーリターンでお願いいたします。ProcessingのVersionは2.0.3、ArduinoのVersionは1.0.3です。
 Arduinoを動かしてからProcessingを実行して、スペースキーをクリックすると、うまくいくと音が出ます。

Arduinoのソースコード

int x=0;

void setup(){
  Serial.begin(9600);
}

void loop(){
  x=ReadAverageSensor();

  if(Serial.available()>0){
    Serial.write(x);
    Serial.read();
  }
}

int ReadAverageSensor(){
  int i;
  int sval;

  for (i = 0; i < 5; i++){
    if(analogRead(0) < 10){
      sval += 10;
    }else{
      sval = sval + analogRead(0);
    }
  }

  sval = sval / 5;
  sval = sval / 4;
  sval = (int)(sval / 1.5); // for miku
  return sval;
}

Processingのソースコード

 ライブラリのインポートの仕方はグーグル先生に聞いてみて下さい。
myPort=new Serial(this,"/dev/tty.usbmodem1421",9600);の部分は環境によって変わるはずです、これもグーグル先生に調べ方を聞いてみて下さい。

import themidibus.*;
import processing.serial.*;
Serial myPort;

int x=0;
MidiBus vocaloid;
int channel = 0; //0:eVocaloid
int pitch = 0;
int velocity = 64;

void setup() {
  size(800, 300);
  background(255);
  MidiBus.list();
  vocaloid = new MidiBus(this, "NSX-39 " , "NSX-39 ");
  myPort=new Serial(this,"/dev/tty.usbmodem1421",9600);
}

void draw() {
  vocaloid.sendNoteOn(channel, pitch, velocity);
  background(60);
  
  fill(255);
  text("pitch ->", 15, 10);
  pushMatrix();
    rotate(HALF_PI);
    text("velocity ->", 15, -5);
  popMatrix();
  
  // update status
  String status;
  status = "pitch:" + str(pitch) + " velocity" + str(velocity);
  frame.setTitle(status);
}

void serialEvent(Serial p){
  if(myPort.available()>0){
    pitch=myPort.read();
    myPort.write(65);
  }
}

void mousePressed(){
  myPort.clear();
  myPort.write(65);
}

void exit() {
  vocaloid.sendNoteOff(channel, pitch, velocity);
  vocaloid.close(); // bye bye!
  super.exit();
}