Skip to content

Instantly share code, notes, and snippets.

@aisot

aisot/README.md Secret

Last active February 24, 2023 09:08
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aisot/fa44d7b350829c112911616bea18a553 to your computer and use it in GitHub Desktop.
Save aisot/fa44d7b350829c112911616bea18a553 to your computer and use it in GitHub Desktop.
Processing4を使う場合

midiToOSC.pde

これは、MIDI入力をOSCとして送信するためのprocessing4用のスケッチです。

「[OSC]MIDI受信ピアノ」VCIで使うことを想定しています : https://seedonline.jp/products/4ad022dddfe7db79221ecd456d8f47d303df9f514e0542d9a26366fb5c7e081b

image1

動作条件

  • Processing 4.2
  • MIDI入力できるデバイス(MIDIキーボード等)

実行方法

processing本体のインストール

  1. 「processing-4.2-windows-x64.zip」ダウンロードします - https://processing.org/download
  2. zipファイルを展開し「processing.exe」を起動します。

必要ライブラリのインストール

  1. processingのメニューから「ツール」を選び[Manager Tools]を選択します。
  2. [Libraries]タブのFilterに「ControlP5」を入力して、出てきた「ControlP5」を選択し[Install]ボタンを押してインストールします。
  3. 同じ方法で「oscP5」と「The MidiBus」もインストールします。

image2

実行

このページにある「midiToOSC.pde」ファイルダウンロードして読み込むか、内容をエディターにコピー&ペーストします。

実行ボタンをクリックすると実行されます

アプリケーション化(EXEファイルの作成)

  1. OpenJDK17をダウンロードしてインストールします - https://adoptium.net/
  2. EXEファイルを作りたい場所に「midiToOSC.pde」を保存しておきます。
  3. メニューの「ファイル」から アプリケーションとしてエクスポートを選択します。
  4. 「Windows(Intel 64-bit)」と「Include Java...」にチェックを入れて「エクスポート」ボタンをクリックします。

「windows-amd64」フォルダの中に「midiToOSC.exe」ファイルが作られ実行できるようになります。

ライセンス

「midiToOSC.pde」はMIDI入力をOSC送信するサンプルとして書いたものなので、CC0 1.0(著作権なし)とします。

// License:CC0 1.0
int OSCSendPort = 19100;
int OSCReceivePort = 28100;
import oscP5.*;
import netP5.*;
import themidibus.*;
import controlP5.*;
MidiBus myBus;
ControlP5 cp5;
OscP5 oscP5;
NetAddress remoteOscServer;
String textMessage = "/";
String midiInputDeviceName;
boolean IsRawMidiMode = false;
CheckBox checkbox;
void setup() {
size(400, 200);
myBus = new MidiBus(this, -1, -1);
oscP5 = new OscP5(this, OSCReceivePort);
remoteOscServer = new NetAddress("127.0.0.1", OSCSendPort);
cp5 = new ControlP5(this);
String[] midiInDeviceList = MidiBus.availableInputs();
cp5.addScrollableList("MIDI_INPUT_DEVICE")
.setPosition(20, 20)
.setSize(200, 180)
.setBarHeight(24)
.setItemHeight(24)
.addItems(midiInDeviceList)
;
checkbox = cp5.addCheckBox("checkBox")
.setPosition(280, 20)
.setSize(15, 15)
.addItem("RAW_MODE", 0)
;
}
void MIDI_INPUT_DEVICE(int n) {
String newDeviceName = cp5.get(ScrollableList.class, "MIDI_INPUT_DEVICE").getItem(n).get("name").toString();
myBus.removeInput(midiInputDeviceName);
midiInputDeviceName = newDeviceName;
myBus.addInput(midiInputDeviceName);
}
void controlEvent(ControlEvent theEvent) {
if (theEvent.isFrom(checkbox)) {
IsRawMidiMode = (checkbox.getArrayValue()[0] == 1.0f) ? true : false;
println(IsRawMidiMode);
}
}
void oscSend(String oscAddPtn,int data1,int data2,int data3){
if(!IsRawMidiMode){
OscMessage sendData = new OscMessage(oscAddPtn);
sendData.add(data1);
sendData.add(data2);
sendData.add(data3);
oscP5.send(sendData, remoteOscServer);
textMessage = oscAddPtn + " " + data1 + " " + data2 + " " + data3;
}
}
void draw() {
background(0);
textSize(10);
text("MIDI INPUT:", 20, 15);
text("OSC SEND PORT : " + OSCSendPort, 270, 180);
text("OSC SEND ADDRESS:", 40, 80);
textSize(24);
text(textMessage, 40, 80 + 24);
}
void noteOn(int channel, int pitch, int velocity) {
oscSend("/midi/noteon/",channel,pitch,velocity);
}
void noteOff(int channel, int pitch, int velocity) {
oscSend("/midi/noteoff/",channel,pitch,velocity);
}
void controllerChange(int channel, int number, int value) {
oscSend("/midi/controlchange",channel,number,value);
}
void pitchBend(int channel, int msb, int lsb) {
oscSend("/midi/pitchbend",channel,msb,lsb);
}
void rawMidi(byte[] data) {
if (IsRawMidiMode == true){
String oscAddPtn = "/rawmidi";
textMessage = oscAddPtn + " ";
OscMessage sendData = new OscMessage(oscAddPtn);
for (byte d: data){
sendData.add(Byte.toUnsignedInt(d));
textMessage = textMessage + " " + hex(d) + "h";
}
oscP5.send(sendData, remoteOscServer);
}else{
int event = Byte.toUnsignedInt(data[0]);
//Pitch Bend
if (event >= 0xE0 & event <= 0xEF){
int channel = event - 0xE0;
int msb = Byte.toUnsignedInt(data[1]);
int lsb = Byte.toUnsignedInt(data[2]);
pitchBend(channel,msb,lsb);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment