6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SLP_KBITその2Advent Calendar 2016

Day 24

Web MIDI APIでシンセサイザーの入力を受け取ってみた

Posted at

##はじめに
この記事は SLP_KBITその2 Advent Calendar 2016 の24日目の記事です。

最近Web MIDI APIなるものを知りました。
これを使うとMIDIに対応しているデバイスをPCに接続するだけで、JavascriptでMIDIの入出力が行えるそうです。なにそれすごい。
そんなわけで早速シンセサイザーを使ってMIDIの入力を受け取ってみます。

##MIDIについて
MIDIは電子楽器の演奏データを通信するための規格です。
演奏情報の音を、音の高さ(ノート)、音の強さ(ベロシティ)、音の長さ(デュレーション)表現するそうです。
詳しいことはWebAudio Web MIDI API Advent Calendar 201618日目の記事が参考になりました。

##MIDIプロトコル
MIDIのプロトコルで扱うデータとして、音のON/OFF、使用するチャンネル、音の強弱、音程の変化があります
WikipediaでMIDIを調べたところ他にもいろいろなデータを送信しているようですが、これらのデータがあれば最低限演奏に必要なものは揃っています。

##MIDIデバイスを繋げる(物理)
今回はJUNO-Giというシンセサイザーを使用します。
このシンセサイザーをUSBケーブルでPCに接続します。
写真 2016-12-25 0 52 34.jpg

##使用できるMIDIデバイスを表示する
htmlはこんな感じです。

index.html
<html>
  <head>
    <meta charset="UTF-8" />
    <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
    <script type="text/javascript" src="sample.js"></script>
    <title>Web MIDI API</title>
  </head>
  <body>
    <label>入力デバイス</label>
    <ul id="input">
    </ul>

    <label>出力デバイス</label>
    <ul id="output">
    </ul>

    <label id="data">00 00 00</label>
  </body>
</html>

###MIDIの有効化
ブラウザでMIDIを有効にするには、requestMIDIAccess()を使用します。
また、引数にMIDIの有効が成功したときと失敗したときのコールバックを指定します。

navigator.requestMIDIAccess().then(successCallback,faildCallback);

###MIDIデバイスの表示
成功時のコールバックで、入力のMIDIデバイスと出力のMIDIデバイスを配列で記録します。
また、記録時にリストで表示も行います。

sample.js
navigator.requestMIDIAccess().then(successCallback,faildCallback);

var midi = null;
var inputs = [];
var outputs = [];

// MIDI接続成功時
function successCallback(m){
  midi = m;
  // 入力MIDIデバイスの記録
  var it = midi.inputs.values();
  for(var o = it.next(); !o.done; o = it.next()){
    inputs.push(o.value);
    $("#input").append("<li>"+ o.value.name +"</li>");
  }

  // 出力MIDIデバイスの記録
  var ot = midi.outputs.values();
  for(var o = ot.next(); !o.done; o = ot.next()){
    outputs.push(o.value);
    $("#output").append("<li>"+ o.value.name +"</li>");
  }
}

// MIDI接続失敗時
function faildCallback(msg){
  console.log("[Error]:"+msg);
}

うまくいけば、ページ読み込み時に現在接続されているMIDIデバイスが表示されいるはずです。
今回はJUNO-Giというシンセサイザーを使用しているため、その名前が表示されます。

キャプチャ.JPG

##MIDI入力の値を表示する
配列に記録している入力のMIDIデバイスに、入力が来たときの処理を登録します。

// 入力MIDIデバイスから入力が来たときの処理の登録
for(var cnt=0;cnt < inputs.length;cnt++){
  inputs[cnt].onmidimessage = onMIDIEvent;
}

今回は送られてきた信号をブラウザ上で表示させます。

//入力MIDIデバイスから入力が来たときの処理
function onMIDIEvent(e){
  var str = "";
  for(var i=0, out=[]; i<e.data.length; i++) {
    str = str + e.data[i].toString(16).substr(-2) + " ";
  }
  str = str;
  $("#data").text(str);
}

全体のコードは以下のようになります。

navigator.requestMIDIAccess().then(successCallback,faildCallback);

var midi = null;
var inputs = [];
var outputs = [];

// MIDI接続成功時
function successCallback(m){
  console.log("asd");
  midi = m;
  // 入力MIDIデバイスの記録
  var it = midi.inputs.values();
  for(var o = it.next(); !o.done; o = it.next()){
    inputs.push(o.value);
    $("#input").append("<li>"+ o.value.name +"</li>");
  }

  // 出力MIDIデバイスの記録
  var ot = midi.outputs.values();
  for(var o = ot.next(); !o.done; o = ot.next()){
    outputs.push(o.value);
    $("#output").append("<li>"+ o.value.name +"</li>");
  }

  // 入力MIDIデバイスから入力が来たときの処理の登録
  for(var cnt=0;cnt < inputs.length;cnt++){
    inputs[cnt].onmidimessage = onMIDIEvent;
  }
}

// MIDI接続失敗時
function faildCallback(msg){
  console.log("[Error]:"+msg);
}

//入力MIDIデバイスから入力が来たときの処理
function onMIDIEvent(e){
  var str = "";
  for(var i=0, out=[]; i<e.data.length; i++) {
    str = str + e.data[i].toString(16).substr(-2) + " ";
  }
  str = str;
  $("#data").text(str);
}

##実行する
それでは実行してみます。
鍵盤を叩くたびに値が変わっているのがわかります。
写真 2016-12-25 1 25 57.gif

##おわりに
今回はMIDIの入力を受け取るところまで行いました。
この調子で今度は音の出力や可視化を行っていこうと思います。

##参考
###Web MIDI API
MIDIデバイスの準備不要 !Web MIDI APIを使いこなそう!
JavaScriptだけでMIDIで遊べる!最高に乱暴なWeb MIDI API利用方法
###MIDIの知識
Web MIDI APIを扱うためのMIDI基礎知識
MIDIが良く分かる。バンドマンのためのDTMの基礎知識

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?