MIDIプログラミング(Win)

MIDIプログラミングとは

本演習ではProcessingを利用したMIDIプログラミングの方法を紹介する。MIDIプログラミングでは、電子楽器やコンピュータでの音楽制作のための規格であるMIDIを用いてプログラミングを行う。MIDIを利用することで、プログラミングによる音楽制作、独自の演奏インターフェースを持ったソフトウェアやハードウェアとしてのMIDIコントローラの開発を行うことができる。

Processing以外にも、Cycling’74 MaxPureDataのようにもともと音楽制作のために開発されたツールもあり、それらには音響処理のためのアルゴリズムや音楽制作用の機能が多数実装されている。Maxについては別途演習を行う。

下の映像の作品は、音に関する処理には全てMIDIが利用されている。

Back To Top

MIDIとは

Musical Instrument Digital Interfaceの略で、電子楽器デジタルインタフェースの世界共通規格。楽器同士を接続して演奏情報を伝達するためのハードウェアおよびソフトウェアやファイル形式まで多岐に渡る。演奏するためのインターフェースをMIDIコントローラ、音を発生させる装置をMIDI音源と呼び、MIDIコントローラとMIDI音源を接続して使う場合や、MIDIコントローラとMIDI音源が一体化された電子楽器もある。シンセサイザーやコンピュータを使った音楽制作にはなくてはならないものである。

MIDIは1982年に実装されたもので、現在では通信速度や柔軟性に難があり、MIDIの代替規格としてネットワーク経由で演奏情報を伝達可能なOSC (Open Sound Control)も使われ始めている。

参考文献:MIDIバイブル〈1〉MIDI1.0規格 基礎編

様々な形のMIDIコントローラ

 

MIDI音源(ハードウェア)

Back To Top

プログラムの動作環境

本講義ノートで紹介するプログラム(スケッチ)の動作確認は以下の環境で行っている。

OS: Windows 10 64bit
Processing:バージョン3.5.4
MIDIライブラリ:MidiBus 8 ※インストール必要

ライブラリの追加は「スケッチメニュー > ライブラリをインポート > ライブラリを追加」から行うことができる。

Back To Top

実験1 マウスで音を鳴らす

①スケッチの準備

Processingを起動して、空のスケッチウィンドウに以下のコードをコピー&ペーストする。

import themidibus.*; //MidiBusライブラリの読み込み
MidiBus myBus; //MidiBusクラスのインスタンス名

int dev = 2; //MIDIデバイスの設定
int ch = 0; //MIDIチャンネルの設定
int program = 0; //プログラムチェンジ(音色)の設定

int note = 60; //ノートナンバー(音階)の設定
int vel = 100;  //ベロシティ(音の強さ)の設定0〜127

void setup() {
  size (500, 300); //ウィンドウサイズ
  MidiBus.list(); ///MIDIデバイスリストの取得
  myBus = new MidiBus(this, 0, dev); //インスタンスの作成(入出力音源の設定)
  myBus.sendMessage(0xC0, program); //プログラムチェンジ送信
}

void draw() {
  background (0, 104, 55);
  text ("Click and release! ", 15, 20);
    
  text ("MIDI Device No: " + dev, 15, 60);
  text ("Program Change: " + program, 15, 80);
  text ("Note Number: " + note, 15, 100);

}

void mousePressed () { //マウスを押した時
  myBus.sendNoteOn (ch, note, vel); //NoteOnの送信
}
 
void mouseReleased () { //マウスを離した時
  myBus.sendNoteOff (ch, note, vel); //NoteOffの送信
}

 

②MIDI音源の確認と設定

スケッチをRun(実行)して、Processing IDEの下方にあるコンソールウィンドウのMicrosoft GS Wavetable Synthの左側の番号を確認する。

スケッチ4行名のdev(MIDIデバイス番号)をMicrosoft GS Wavetable Synthの番号に変更する。

int dev = 2; //MIDIデバイスの設定

 

③マウス左クリックで音を鳴らす

緑ウィンドウ上を左クリックする。マウスを押した長さで音の長さが変わる。

 

④ノートナンバー(音階)の変更

スケッチ8行目のnoteの数値を変更する。
ノートナンバーの詳細は「5 MIDIメッセージ解説」参照。

int note = 60; //ノートナンバー(音階)の設定

 

⑤プログラムチェンジ(音色)の変更

スケッチ6行目のprogramの数値を変更する。
プログラムチェンジの詳細は「5 MIDIメッセージ解説」参照。

int program = 0; //プログラムチェンジ(音色)の設定

Back To Top

MIDIメッセージ解説

MIDIにおける演奏情報の送受信にはMIDIメッセージが使われる。ここではノートオン/オフ、プログラムチェンジについて解説する。

 

①ノートオン/オフ

ノートオンメッセージ:鍵盤を押した時に送信されるデータセット。
ノートオフメッセージ:鍵盤を離した時に送信されるデータセット。

ノートオン/オフメッセージは以下のデータで構成されている。

ノートナンバー:音階を数字で表現したもの(0-127)
ベロシティ:鍵盤を押す早さ、音の強さ(0-127)

ノートナンバーはピアノの鍵盤で見ると下図のように対応する。中央のC(ド)=60。

 

②プログラムチェンジ

プログラムチェンジを利用して音色を変更できる。音色の種類についてはGeneral MIDI(GM)参照。以下にその一部を掲載する。

1  Acoustic Piano アコースティックピアノ
2  Bright Piano ブライトピアノ
3  Electric Grand Piano エレクトリックグランドピアノ
4  Honky-tonk Piano  ホンキートンクピアノ
5  Electric Piano エレクトリックピアノ
6  Electric Piano 2 エレクトリックピアノ2
7  Harpsichord ハープシコード
8  Clavi  クラビネット
9  Celesta  チェレスタ
10  Glockenspiel グロッケンシュピール
11  Musical box オルゴール
12  Vibraphone ヴィブラフォン
13  Marimba マリンバ
14  Xylophone シロフォン
15  Tubular Bell チューブラーベル
16  Dulcimer ダルシマー
17  Drawbar Organ ドローバーオルガン
18  Percussive Organ パーカッシブオルガン
19  Rock Organ ロックオルガン
20  Church organ チャーチオルガン
21  Reed organ リードオルガン
22  Accordion アコーディオン
23  Harmonica ハーモニカ
24  Tango Accordion タンゴアコーディオン
25  Acoustic Guitar (nylon)  アコースティックギター(ナイロン弦)
26  Acoustic Guitar (steel)  アコースティックギター(スチール弦)
27  Electric Guitar (jazz)  ジャズギター
28  Electric Guitar (clean) クリーンギター

Back To Top

実験2 キーボードで演奏

①スケッチの準備

Processingを起動して、空のスケッチウィンドウに以下のコードをコピー&ペーストする。

import themidibus.*; //MidiBusライブラリの読み込み
MidiBus myBus; //MidiBusクラスのインスタンス名

int dev = 2; //MIDIデバイスの設定
int ch = 0; //MIDIチャンネルの設定
int program = 0; //プログラムチェンジ(音色)の設定

int note_on = 0;  //ノートオンナンバー
int note_off = 0; //ノートオフナンバー
int pitchbend = 63; //ピッチベンド
int vel = 100;  //ベロシティ(音の強さ)の設定0〜127
int lock = 0; //キーボード連打を防止するため
int mouseX_offset = 0;

void setup() {
  size (500, 300); //ウィンドウサイズ
  MidiBus.list(); ///MIDIデバイスリストの取得
  myBus = new MidiBus(this, 0, dev); //インスタンスの作成(入出力音源の設定)
  myBus.sendMessage(0xC0, program); //プログラムチェンジ送信
}

void draw() {
  background (164, 0, 0);
  text ("Push Keys !", 15, 20);
  text ("MIDI Device No: " + dev, 15, 60);
  text ("Program Change: " + program, 15, 80);
  
  if(note_on==0) {
    text ("Note Number: --", 15, 100); 
    text ("Pushed Key: --", 15, 120); 
  } else {
    text ("Note Number: " + note_on, 15, 100);
    text ("Pushed Key: " + key, 15, 120);
  }
  
  text ("PitchBend: " + (pitchbend - 63), 15, 140);
}

void keyPressed () { //キーを押した時
  if(lock==0){
    switch(key) {
      case'z': note_on = 41; break;
      case'x': note_on = 43; break;
      case'c': note_on = 45; break;
      case'v': note_on = 47; break;
      case'b': note_on = 48; break;
      case'n': note_on = 50; break;
      case'm': note_on = 52; break;
      case',': note_on = 53; break;
      case'.': note_on = 55; break;
      case'/': note_on = 57; break;
      case'_': note_on = 59; break;
      case'a': note_on = 60; break;
      case's': note_on = 62; break;
      case'd': note_on = 64; break;
      case'f': note_on = 65; break;
      case'g': note_on = 67; break;
      case'h': note_on = 69; break;
      case'j': note_on = 71; break;
      case'k': note_on = 72; break;
      case'l': note_on = 74; break;
      case';': note_on = 76; break;
      case':': note_on = 77; break;
      case']': note_on = 79; break;
      default: note_on = 0; break;
    }
    mouseX_offset = mouseX;
    pitchbend = 63; //ピッチベンドのリセット
    myBus.sendMessage(0xE0, 0, pitchbend); //ピッチベンドの送信
    myBus.sendNoteOn ( ch, note_on, vel ); //ノートオンの送信 
    lock=1;
  }
}
 
void keyReleased () { //キーを離した時
  switch(key) {
    case'z': note_off = 41; break;
    case'x': note_off = 43; break;
    case'c': note_off = 45; break;
    case'v': note_off = 47; break;
    case'b': note_off = 48; break;
    case'n': note_off = 50; break;
    case'm': note_off = 52; break;
    case',': note_off = 53; break;
    case'.': note_off = 55; break;
    case'/': note_off = 57; break;
    case'_': note_off = 59; break;
    case'a': note_off = 60; break;
    case's': note_off = 62; break;
    case'd': note_off = 64; break;
    case'f': note_off = 65; break;
    case'g': note_off = 67; break;
    case'h': note_off = 69; break;
    case'j': note_off = 71; break;
    case'k': note_off = 72; break;
    case'l': note_off = 74; break;
    case';': note_off = 76; break;
    case':': note_off = 77; break;
    case']': note_off = 79; break;
    default: note_off = 0; break;
  }
    myBus.sendNoteOff(ch, note_off, vel); //ノートオフの送信
    lock=0;
}

void mouseMoved ()
{
  if ((mouseX - mouseX_offset) > -250 && (mouseX - mouseX_offset) < 250) {
    pitchbend = (int)map(mouseX-mouseX_offset, -250, 250, 0, 127);
    myBus.sendMessage(0xE0, 0, pitchbend); //ピッチベンドの送信
  }
}

 

②キーボードで演奏

Runボタンを押して実行すると赤いウィンドウが表示される。

キーボードの下図のキーを押すことで演奏することができる。
赤ウィンドウが手前にある状態でないと音は鳴らないので注意。
今回のスケッチでは、複数キーの同時発音には対応していない。

 

③マウスでピッチベンドの操作

キーを押したまま、マウスを左右に振ることで音高を変化させることができる。

 

④音色の変更

スケッチの6行目のprogramの引数を変更して音色を変えてみよう。

int program = 0; //プログラムチェンジ(音色)の設定

Back To Top

ProcessingとMIDI音源の関係

※MIDI音源、MIDIデバイス、ソフトウェアシンセサイザーは同じ位置づけ

 

A. 実験1と実験2のフロー

 

B. UVI Workstation利用の場合のフロー

Windowsで異なるソフトウェア間でMIDI信号を送受信するためには、仮想MIDケーブルソフトウェアのインストールが必要になる。仮想MIDケーブルにはいくつか種類があるが、ここではloopMIDIを利用する。

Back To Top

loopMIDIとUVI Workstationの準備

①loopMIDI、UVI Workstationのインストール

下記URLからダウンロードしてのインストールする。

 

②仮想MIDIポートの起動

loopMIDIを起動して、下図左下の「+」ボタンを押して新しいポート「loopMIDI Port(名前は任意)」を作成する。

 

③UVI Workstationの出力とMIDI受信設定

UVI Workstationを起動して、Fileメニュー > Audio and MIDI Settingsをクリックする。

Audio and MIDI Settingsウィンドウ(下図)が表示される。

Outputを自分の環境に合わせて変更する。Testボタンを押して音を確認できる。
※環境によってはAudio device typeをWindows Audioではなく、DirectSoundにしないと音が鳴らない場合がある

Active MIDI inputsのloopMIDI Portにチェックを入れる。loopMIDIを起動しないと表示されないので注意。

 

④サウンドライブラリの読み込み

フォルダアイコンをクリックして、Soundbanks > Falcon Preset Tour > 任意のサウンドライブラリをダブルクリックする。

 

⑤演奏実験

下図アイコンをクリックして、Keyboardインターフェースを表示する。

鍵盤をクリックして音が鳴るか実験。

Back To Top

実験3 ProcessingとUVI Workstationの連携

①実験2のProcessingスケッチからloopMIDIのデバイス番号を確認

実験2のスケッチをRunして、コンソールウィンドウのOutputリストからloopMIDI Portの左側の番号を確認する。※loopMIDIは起動している状態

 

②デバイス番号の変更

スケッチ4行名のdevをloopMIDI Portの番号に変更する。

int dev = 3; //MIDIデバイスの設定

 

③キーボードとマウスで演奏

下図のようにProcessingの赤いウィンドウが前面にないとキーが反応しないので注意。
キーを押しながらマウスを動かしてみよう。

 

④別のサウンドライブラリを試す

ライブラリによって、あらかじめ演奏のシーケンスパターンが設定されているアルペジエータ(参考:MOTIF ES 3/6 アルペジエーター活用法)が利用できるものもある。

UVI Workstationでは複数のサウンドライブラリの同時演奏も可能だが、今回のスケッチでは実装していない。

Back To Top