MIDIといえば楽器間の音楽データを通信する規格ですが、35年前の古い規格にもかかわらず楽器に限らず幅広いデバイスで使われています。最近 Version 2 がアナウンスされ、話題となっています。
「MIDIが30年以上の時を経て「MIDI 2.0」にバージョンアップされることが決定」
https://gigazine.net/news/20190121-midi-prototyping-announced/
「NAMM 2019 – MIDI 2.0™ Prototyping Announced」
私も多数MIDI機器を所有していますが、ここでは外部入力デバイスとして使いグラフィックを操作するプログラムをつくってみました。
環境: Roland SC-155, Roland UM-ONE(MIDI I/F), Processing 3.3.7 / macOS High Sierra
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
import themidibus.*; MidiBus midi; float rotx = 0; float roty = 0; int p1 = 100, p2 = 0, p3 = 0; int p4 = 200, p5 = 0, p6 = 0; int p7 = 300, p8 = 0, p9 = 0; void setup(){ size(400,400, P3D); MidiBus.list(); midi = new MidiBus(this, 1, 2); // parent, in, out } void draw(){ lights(); background(128); rotateX(rotx); rotateY(roty); pushMatrix(); translate(p1, p2, p3); noStroke(); fill(255, 0, 0); box(50, 50, 50); popMatrix(); pushMatrix(); translate(p4, p5, p6); noStroke(); fill(0, 255, 0); box(50, 50, 50); popMatrix(); pushMatrix(); translate(p7, p8, p9); noStroke(); fill(0, 0, 255); box(50, 50, 50); popMatrix(); } void mouseDragged(){ rotx += (mouseY - pmouseY) * 0.01; roty += (pmouseX - mouseX) * 0.01; } void mousePressed(){ //midiout test midi.sendNoteOn(0, 64, 127); //ch, note, velocity delay(500); midi.sendNoteOff(0, 64, 127); } void controllerChange(int ch, int num, int val) { println(ch + ":" + num + ":" + val); switch(ch){ case 1: p2 = val + 100; break; case 2: p5 = val + 100; break; case 3: p8 = val + 100; break; case 4: p3 = val; break; case 5: p6 = val; break; case 6: p9 = val; break; } } |
ボリュームのコントロールチェンジの値を、6ch分のスライダーを使って変化させ、上記3つのオブジェクトの位置をコントロールしています。(マウスドラッグによってビューを変化させられます。)
パラメータが多い時は、このようなデバイスが重宝します。
私個人、MIDIによって通信プログラムの初歩を学びました。プロトコルがシンプルなのと実行結果が音を鳴らすという楽しいことだったので、かなりはまりました。
(当時NEC PC-9801にRolandのMIDIボードをさしてC言語で開発をしていました。大抵の人がそうしていたのでは)
久しぶりにこの音源をさわって、当時の楽しさがよみがえります。