來未呼ミキ(2)

來未呼ミキ(仮称)のお話.
最近の挑戦はこれである.
Mac OSX においてProcessingというJavaベースのIDEによるプログラム(スケッチ)から themidibus ライブラリを用いて evy1シールドに歌わせるということに挑戦していたのである.本来evy1シールドはArduinoが制御するかたちで使用されるものであるが,今回はPCにUSB接続されたMIDI楽器として用いるのである.Windows上ではスムーズにいったのだが,Mac OSX の「Apple Java(のMIDI関連ライブラリ)」は不親切なことに SysEx モードに対応していないため,歌詞データの送信が無視されたのだった.しかし,themidibusライブラリに加え,MMJ なるものを用いると問題は解決した.そこで今回はこれの報告(自分用の覚え書き)というわけである.

evy1_P5_OSX

SWITCHSCIENCEのevy1シールドのページにupされていたProcessing用のサンププログラムをベースにこれを少々変更し,「ありあけこうせん」と歌わせる(しゃべらせる?)ことに成功した.実はもともとのサンプルプログラムは歌詞を送信しておらず,(ハードウェアにおける)デフォルトの「あ」を発声するだけである.だからそのサンプルプログラムは Windows上でもMac OSX上でも問題なく機能するのである.私自身,両方のOS上で動作を確認した.ところが,何か任意の歌詞を歌わせるとなると,上記 SysExモードを Apple は無視することが問題となる.歌詞の送信には SysEx モードを利用することになっているのである.

繰り返しに成るが,themidibus + MMJ で問題解決!
「ありあけこうせん」のコードは次の通り:

//////////////////////////////////////////////////////////////////
// This sketch is based on the sketch: eVY1_example.pde
//      at https://github.com/SWITCHSCIENCE/eVY1_Shield .
// Thanks to SWITCHSCIENCE !
//////////////////////////////////////////////////////////////////
import themidibus.*;
import de.humatic.mmj.*; // OSX specific

//// Please refer http://www.humatic.de/htools/mmj/doc/
////CoreMidiDevice[] cmd;    // OSX specific
MidiOutput mo_vocaloid;  // OSX specific
MidiSystem ms;           // OSX specific

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

///// ありあけこうせん ( using SysEx: causing problems in OSX )
byte[] data = {(byte)0xF0, (byte)0x43, (byte)0x79, (byte)0x09, // header(SysEx)
               (byte)0x00, (byte)0x50, (byte)0x10,             // header(SysEx)
               (byte)0x61, (byte)0x2C, 
               (byte)0x34, (byte)0x27, (byte)0x20,
               (byte)0x69, (byte)0x2C,
               (byte)0x61, (byte)0x2C,
               (byte)0x6B, (byte)0x20,
               (byte)0x65, (byte)0x2C,
               (byte)0x6B, (byte)0x20,
               (byte)0x6F, (byte)0x2C,
               (byte)0x4D, (byte)0x2C,
               (byte)0x73, (byte)0x20,
               (byte)0x65, (byte)0x2C,
               (byte)0x4E, (byte)0x5C, (byte)0x2C,
               (byte)0x00, (byte)0xF7  // footer(SysEx)
             };
/////
void setup() {
  size(800, 300);
  colorMode(HSB, 100);
  background(50);
  MidiBus.list();
  vocaloid = new MidiBus(this, "eVY1 MIDI" , "eVY1 MIDI");
  vocaloid.sendTimestamps(false);
  vocaloid.sendMessage(data);
  ////println("Max OSX specific: using MMJ"); // OSX specific
  ////println(MidiSystem.getOutputs());       // OSX specific
  ////cmd = MidiSystem.getDevices();          // OSX specific
  mo_vocaloid = ms.openMidiOutput(0);     // OSX specific
  mo_vocaloid.sendMidi(data);             // OSX specific
}

void draw() {
  if(keyPressed && key == ' ') {
    pitch = int(128 * mouseX / width + 0.5);
    velocity = int(128 * mouseY / height + 0.5);
    vocaloid.sendNoteOn(channel, pitch, velocity);
  } else {
    vocaloid.sendNoteOff(channel, pitch, velocity);
  }
  
  background(60,50,50);
  
  // draw selected block
  int p = int(128*mouseX/width+0.5);
  int v = int(128*mouseY/height+0.5);
  fill(45, 100, 100);
  rect(p*width/128, 0, width/128, height);
  for(int x = 0; x < 128; x++) {
    stroke(0);
    line(x*width/128, 0, x*width/128, height);
  }
  
  // draw info
  fill(50,100,100);
  text("pitch ->", 15, 10);
  pushMatrix();
    rotate(HALF_PI);
    text("velocity ->", 15, -5);
  popMatrix();
  
  // update title bar
  String title;
  title = "pitch:" + str(p) + " velocity" + str(v);
  frame.setTitle(title);
}

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

このような感じ.念のためもう一度言っておくと,このプログラムはSWITCHSCIENCEのサンプルプログラムを私が少々いじって歌詞の送信をテストするためのものであった.特に Mac OSX において.上記コードにおいて,// OSX specific の行は Windowsの上で走らせるときには不要です.

※スペースキーを押しているときのみ発声
(もとのサンプルコードと同様).
※Windows上ではthemidibusライブラリのみでOK.
( MMJライブラリは不要.)
※Mac OSX 上では要MMJ.
※Arduinoシールドとして用いるならばWindowsだろうがOSXだろうが関係ない(はず).PCから「MIDI楽器」evy1 を(USB経由で)用いようとする(SysExモードで)ときにJavaのMIDI用ライブラリを用いるのでOSX上で問題が生じるのだった.将来的には,AppleがMIDIに対して「完璧に親切」になれば,この問題は自然消滅するのかもしれない.