CCMapper3(chuck)

CCMapper3(chuck)

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.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の音色の設定方法がある

以上

Go to Toplevel