読者です 読者をやめる 読者になる 読者になる
一人もくもく会 α verでサービス開始しました。

arduinoでmidiコントローラ

processing

arduinoを手に入れたので楽器を作りたくなった。
サックスっぽいのを作りたい。
再生ソフトはMusic Studio Producerを選択。
色々と調べたところ、PC側に下記を導入すればできるとのこと。

arduino
→シリアルからMIDIに変換するソフト
(serial_midi_converter V2D)
→仮想MIDIケーブル
(YOKE)
→Music Studio Producer

カッコ内はよく挙げられていたソフトだが、windows8だと? 全然動かなかった。
serial_midi_converterはなんか動きがおかしい。
受信信号もエラーになってばかり。
しかもボーレートが31250でなくわけわからない値なので嫌になった。
processingでシリアル受信したら31250で普通に取得出来てるのに。

ということでprocessingのMidiBusを使って自分で作ってみることにした。
ところが仮想MIDIポート一覧を取得してもYOKEが出てこない。
同じくprocessingで作成されているserial_midi_converterでは出るのに。
しかもserial_midi_converterのソースを使って試すとそっちでは出ない。

色々悩んだ挙句、loopMIDIという仮想ケーブルに変えてみたところあっさり出来た。
YOKEはwindows8の64bitだと上手く動かないのかもしれない。

ということで最終的にこうなった。

arduino
→自作ソフトでシリアルからMIDIへ変換
→loopMIDI
→Music Studio Producer

なんとかうまいことMusic Stuido Producerで音を鳴らすことが出来た。
久々にガッツリプログラムした気分。
一応書いたばかりの適当コードも載っけておく。

arduinoのスケッチ

#include <MIDI.h>

char notes[] = {36, 38, 40, 41, 43, 45, 47, 48};

void setup()
{
    MIDI.begin();
}

void loop()
{
    for (int i = 0; i < 8; i++) {
      MIDI.sendNoteOn(notes[i],127,1);
      delay(1000);
      MIDI.sendNoteOff(notes[i],0,1);
      delay(1000);
    }
}

processingのスケッチ

import processing.serial.*;
import themidibus.*;

MidiBus myBus;
Serial port;
int[] val = new int[3];
int valno = 0;

void setup() {
  size(400, 400);
  background(0);

  MidiBus.list();
  myBus = new MidiBus(this, -1, "loopMIDI Port");
  String portName = Serial.list()[0];
  port=new Serial(this, portName, 31250);
}

void draw() {
  while (port.available() > 0) {
    int inByte = port.read();
    if (valno == 0) {
      if (inByte >= 128) {
        val[0] = inByte;
        valno++;
      }
    } else {
      val[valno++] = inByte;
      if (valno == 3) {
        valno = 0;
        if (val[0] == 128) {
          println(val);
          myBus.sendNoteOff(0, val[1], val[2]);
        } else if (val[0] == 144) {
          println(val);
          myBus.sendNoteOn(0, val[1], val[2]);
        }
      }
    }
  }
}