2024/1/13+
初版
本記事は「CCMapperをchuckで実装する」の続編になる。chuckのプログラムを他の実装のCCMapperと同じ機能を持つものに改良した。キー入力で設定を変更する仕様にしたかったが、MIDI送受信しながらキー入力する実装ができなかったので、キー入力がないままになる。
参照:
ChucK : Strongly-timed, Concurrent, and On-the-fly Music Programming Language
ChucK : Release version:1.4.1.1 (numchucks)
上のリンクからOS(MacOS,Linux,Windows)に応じたインストールプログラムをダウンロードしてインストールする。
miniAudicleといわれるIDEも同時にインストールされるが、本記事では、プログラミング言語chuckのみを使用する。
windowsではエラーになり動作しない。Linux/Macは動作する。
CCMapper3.ck
// CCMapper3
// 2024/1/13
// channel voice messages
0x80 => int MIDI_NOTE_OFF;
0x90 => int MIDI_NOTE_ON;
0xB0 => int MIDI_CONTROL_CHANGE;
0xC0 => int MIDI_PROGRAM_CHANGE;
0xE0 => int MIDI_PITCH_BEND;
0xD0 => int MIDI_AFTER_TOUCH; // Channel Pressure
0xA0 => int MIDI_POLY_PRESSURE;
// disp device status
//chuck --probe
// the message
MidiMsg msg;
//create object
MidiIn min;
MidiOut mout;
//connect to port Elefue/re.corder
min.open(1);
//connect to port loopMIDI
mout.open(0);
0 => int curNote;
while(true){
// Use the MIDI Event from MidiIn
min => now;
while( min.recv(msg) ){
//<<<msg.data1,msg.data2,msg.data3,"MIDI Message">>>;
if (msg.data1 == MIDI_NOTE_OFF) {
mout.send(msg);
// All Note Off
MIDI_CONTROL_CHANGE => msg.data1;
123 => msg.data2;
0 => msg.data3;
//return;
} else if (msg.data1 == MIDI_NOTE_ON) {
mout.send(msg);
msg.data2 => curNote;
} else if (msg.data1 == MIDI_CONTROL_CHANGE) {
msg.data1 => int status;
msg.data2 => int control;
msg.data3 => int value;
(status & 0xF) + 1 => int channel;
if ((control == 2)||(control == 11)){
//1 => msg.data2;
//mout.send(msg);
2 => msg.data2;
mout.send(msg);
7 => msg.data2;
mout.send(msg);
11 => msg.data2;
mout.send(msg);
74 => msg.data2;
mout.send(msg);
26 => msg.data2;
mout.send(msg);
// AT
MIDI_AFTER_TOUCH + channel - 1 => msg.data1;
value & 0x7F => msg.data2;
mout.send(msg);
// PP
MIDI_POLY_PRESSURE + channel - 1 => msg.data1;
curNote & 0x7F => msg.data2;
value & 0x7F => msg.data3;
mout.send(msg);
} else if(control == 1) {
// Modulation Wheel
mout.send(msg);
}
} else if (msg.data1 == MIDI_PITCH_BEND){
mout.send(msg);
int int14;
msg.data3 => int14; // 2nd byte
(int14<<7) => int14;
(int14|(msg.data2 & 0x7F)) => int14;
<<< "PITCH_BEND: ", int14 >>>;
}
}
}
以下のデバイス番号は実行環境に依存するので、自分の環境に合わせること。
//connect to port Elefue/re.corder
min.open(1);
//connect to port loopMIDI
mout.open(0);
自分の環境を確認する場合は
以下のコマンドを実行するとデバイス状況を表示する:
chuck --probe
出力例(MIDI/HIDデバイスのみ):
[chuck]: ------( chuck -- 2 MIDI inputs )------
[chuck]: [0] : "loopMIDI bus1"
[chuck]: [1] : "Elefue Bluetooth"
[chuck]:
[chuck]: ------( chuck -- 2 MIDI outputs )-----
[chuck]: [0] : "loopMIDI bus1"
[chuck]: [1] : "Elefue Bluetooth"
[chuck]:
[chuck]: ------( chuck -- 1 mouse device )------
[chuck]: [0] : "Apple Internal Keyboard / Trackpad"
[chuck]:
[chuck]: ------( chuck -- 1 keyboard device )------
[chuck]: [0] : "Apple Internal Keyboard / Trackpad"
[chuck]:
osx_version = 4865
[chuck]: ------( chuck -- 1 multitouch device )------
[chuck]: [0] : "MultiTouch Device"
[chuck]:
CCMapper関連:
CCMapper改良版(openFrameworks)
CCMapper(C#版/RtMidi)
processingでCCMapperを実装する
python版CCMapper - re.corder/ElefueをCCMapper経由で外部音源(Aria/Windows)と接続する(WIDI_Bud_Pro使用)
openframework関連:
openFrameworksを使用して独自のMIDI生成のリアルタイムビジュアルを作成します。
Novation LauchpadとopenFrameworksを使ってResolumeのVJコントローラを作る : コーディング編
プロジェクトにアドオンを追加する方法
新規プロジェクトの作成
Listen to events
変数の値を見る
ofLog
openFrameworks-コンソール表示する
oF:Windowsのopenframeworksでコンソールウインドウを出さない方法
openFrameworks-Log vol.1/環境設定と導入
openFramewoks – OSC (Open Sound Control) を利用したネットワーク連携
pygame.midi関連:
PythonでMIDI
pygame.midi
loopMIDI関連:
loopMIDI
loopMIDIでつなぐ
WIDI_Bud_Pro関連:
WIDI Bud Pro
WIDI Bud Pro 技術情報
re.corder関連:
owner’s manual re.corder
re.corder Downloads
re.corder Frequently Asked Questions
MIDI関連:
現時点、最強のBluetooth MIDIかも!? 各種BLE-MIDI機器と自動でペアリングしてくれるWIDI Masterがスゴイ!
Midi View
ASIO関連:
asio4all - ASIOドライバーのないオーディオインターフェイスをASIO対応にできるソフト
Aria関連:
EWI MASTER BOOK CD付教則完全ガイド【改訂版】のp100-p119の音色の設定方法がある
以上