FiFiWiki2

FiFiWikiの第2版

ユーザ用ツール

サイト用ツール


usb_midi_controller:arduino_midi_controller

**以前のリビジョンの文書です**

Arduino

すごい参考になる資料 https://www.slideshare.net/tadfmac/arduinomidi MOCOの焼き方が書かれている

pitch bendエラーの原因が分かった

おそらく

 Serial.begin(9600);

のせいで異なるフォーマットで通信していた可能性がある

Arduino Midi Librari リファレンス

ソースコード : http://arduinomidilib.sourceforge.net/a00001.html#ac34d163205bb01ac5e03df7e64facebe

ソースコード sendControlChange : http://arduinomidilib.sourceforge.net/a00001.html#a3a80e9bd2cfdb619be91d80e8f3b7825

なぜかMIDI.send***は使い物にならない
↓を参考に: サンプルコード
http://forum.arduino.cc/index.php?topic=293460.0

#include <MIDI.h>
#include <midi_Defs.h>
#include <midi_Message.h>
#include <midi_Namespace.h>
#include <midi_Settings.h>

//http://forum.arduino.cc/index.php?topic=293460.0

MIDI_CREATE_DEFAULT_INSTANCE();

void setup() {
 MIDI.begin();
}

void loop() {
  for(int i=0; i<128; i++){
    for(int j=0; j<128; j++){
      for(int c=1; c<17; c++){
        MIDI.send(midi::ControlChange, i, j, c);
      }
    }
  }
}

使い方

Ch: 1 (固定) Controller : potにより変更 Value : pot 0-127, (btn 0 or 127)

デバイスマネージャの認識/表示についてのメモ

  • 通常時 : USER-PC > ポート(COMとLPT) > Arduino Uno (COM5)
  • DFUA時 : USER-PC > ATMEGGA > 16U2 -

Moco For LUFAの焼き方

備忘録

  • Arduino公式のMIDIライブラリをダウンロード/配置 Arduino/librariesの下に配置

http://playground.arduino.cc/Main/MIDILibrary

LEDチカで動作を確認

#define LED_PIN 13
void setup() {
  pinMode(LED_PIN, OUTPUT);
}
 
void loop() {
  digitalWrite(LED_PIN, HIGH);
  delay(3000);
  digitalWrite(LED_PIN, LOW);
  delay(3000);
}

スイッチを押してみよう

ISCPのピン配置

受け側 C

ソースコード(2018/4/21)

/*
   8chマルチプレクサ4051を使って8chVRの値を読み取る

  2018/04/21 FiFI
  
*/
#include <MIDI.h>
#include <midi_Defs.h>
#include <midi_Message.h>
#include <midi_Namespace.h>
#include <midi_Settings.h>

MIDI_CREATE_DEFAULT_INSTANCE();

// ==========================
// 構造体
// ==========================
struct MIDI_NOTE {
  int ControlNumber; // 出力するノート番号
  int Old; // 前の値
};


// ==========================
// VR構造体配列
// ==========================
struct MIDI_NOTE VR_List[8] = {
  {10, 0}, // ControlNumber 0, value 0
  {11, 0}, // ControlNumber 1, value 0
  {12, 0}, // ControlNumber 2, value 0
  {13, 0}, // ControlNumber 3, value 0
  {14, 0}, // ControlNumber 4, value 0
  {15, 0}, // ControlNumber 5, value 0
  {16, 0}, // ControlNumber 6, value 0
  {17, 0}, // ControlNumber 7, value 0
};
int VR_COUNT = 8; // ちゃんと更新する

// ==========================
// BTN構造体配列
// ==========================
struct MIDI_NOTE BTN_List[8] = {
  {20, 0}, // ControlNumber 0, value 0
  {21, 0}, // ControlNumber 1, value 0
  {22, 0}, // ControlNumber 2, value 0
  {23, 0}, // ControlNumber 3, value 0
  {24, 0}, // ControlNumber 4, value 0
  {25, 0}, // ControlNumber 5, value 0
  {26, 0}, // ControlNumber 6, value 0
  {27, 0}, // ControlNumber 7, value 0
};
int BTN_COUNT = 8; // ちゃんと更新する

// ==========================
// MUXのチャンネル配列 (定数)
// ==========================
int MUX_CHANNELS[8][3] = {
  // A, B, C, (s0, s1, s2)
  {0, 0, 0}, // Channel 0
  {1, 0, 0}, // Channel 1
  {0, 1, 0}, // Channel 2
  {1, 1, 0}, // Channel 3
  {0, 0, 1}, // Channel 4
  {1, 0, 1}, // Channel 5
  {0, 1, 1}, // Channel 6
  {1, 1, 1}, // Channel 7
};

struct s_mux_pins {
  int s0;
  int s1;
  int s2;
  int io_a; // アナログ入力PIN (不使用は-1)
  int io_d; // デジタル入力PIN (不使用は-1)
};

// ===============================================
// 初期化処理
// ===============================================
// VR用 8ch MUX (pin配置はユーザが変更可能です)
struct s_mux_pins VR_MUX_PIN = {2, 3, 4, 0, -1}; // s0,s1,s2,io_a,io_d
// BTN用 8ch MUX (pin配置はユーザが変更可能です)
struct s_mux_pins BTN_MUX_PIN = {3, 4, 5, -1, 6}; // s0,s1,s2,io_a,io_d


void setup() {
  // VR MUX Setup
  pinMode(VR_MUX_PIN.s0, OUTPUT);
  pinMode(VR_MUX_PIN.s1, OUTPUT);
  pinMode(VR_MUX_PIN.s2, OUTPUT);
  digitalWrite(VR_MUX_PIN.s0, LOW);
  digitalWrite(VR_MUX_PIN.s1, LOW);
  digitalWrite(VR_MUX_PIN.s2, LOW);

  // BTN MUX Setup
  pinMode(BTN_MUX_PIN.s0, OUTPUT);
  pinMode(BTN_MUX_PIN.s1, OUTPUT);
  pinMode(BTN_MUX_PIN.s2, OUTPUT);
  digitalWrite(BTN_MUX_PIN.s0, LOW);
  digitalWrite(BTN_MUX_PIN.s1, LOW);
  digitalWrite(BTN_MUX_PIN.s2, LOW);

  // MIDI Setup
  MIDI.begin();
  //  MIDI.turnThruOff();
  // Serial Setup
  //  Serial.begin(9600); // 悪い影響与えている可能性あり

}

// ===============================================
// ヘルパー
// ===============================================
boolean checkChange(int val1, int val2, int range);
int readMux4VR(int channel);

// ===============================================
// メインルーチン
// ===============================================
void loop() {
  int i;

  // TODO:  一巡目は無視

  // ============================================ //
  // Read VR Mux
  // ============================================ //
  for (int i = 0; i < VR_COUNT; i++) {
    int analog = readMux4VR(i);
    int vel = map(analog, 0, 1023, 0, 127); // VRの現在値を取得
    MIDI_NOTE tVR = VR_List[i]; // MIDI送信先情報

    // ローパス
    // vel = (VR1.old * 0.9) + (vel * 0.1);

    if (checkChange(vel, tVR.Old, 1)) {

      //      MIDI.sendNoteOn(0, vel, tVR.ControlNumber); // 書き出す (note no, velocity, ch)
      MIDI.send(midi::ControlChange, tVR.ControlNumber, vel, 1);

      tVR.Old = vel;
      VR_List[i] = tVR;

      //      Serial.print(i);
      //      Serial.print(":");
      //      Serial.print(vel);
      //      Serial.print(":");
      //      Serial.print(analog);
      //      Serial.println("");      // 改行
      //      delay(10);
    }
  }

  // ============================================ //
  // Read Button Mux
  // ============================================ //


}



// + 以下、ヘルパー関数 + //

// ===============================================
// ヘルパー関数
// ===============================================
// これはセンサー入力のフラつき対策
boolean checkChange(int val1, int val2, int range) {
  int l, h;
  l = val2 - range;
  h = val2 + range;
  if ((val1 < l) || (h < val1)) {
    return true;
  }
  return false;
}




int readMux4VR(int channel) {
  int controlPins[] = {VR_MUX_PIN.s0, VR_MUX_PIN.s1, VR_MUX_PIN.s2};
  digitalWrite(VR_MUX_PIN.s0, MUX_CHANNELS[channel][0]);
  digitalWrite(VR_MUX_PIN.s1, MUX_CHANNELS[channel][1]);
  digitalWrite(VR_MUX_PIN.s2, MUX_CHANNELS[channel][2]);
  //read the value at the SIG pin
  int val = analogRead(VR_MUX_PIN.io_a);
  return val;
}

usb_midi_controller/arduino_midi_controller.1524277151.txt.gz · 最終更新: 2018/04/21 02:19 by fifi