FiFiWiki2

FiFiWikiの第2版

ユーザ用ツール

サイト用ツール


usb_midi_controller:arduino_midi_controller

差分

この文書の現在のバージョンと選択したバージョンの差分を表示します。

この比較画面にリンクする

次のリビジョン
前のリビジョン
usb_midi_controller:arduino_midi_controller [2018/03/31 02:02]
fifi 作成
usb_midi_controller:arduino_midi_controller [2018/04/21 02:19] (現在)
fifi [ソースコード(2018/4/21)]
ライン 3: ライン 3:
 すごい参考になる資料 https://​www.slideshare.net/​tadfmac/​arduinomidi すごい参考になる資料 https://​www.slideshare.net/​tadfmac/​arduinomidi
 MOCOの焼き方が書かれている 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)
  
  
ライン 69: ライン 119:
  
  
 +## ソースコード(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.send(midi::​ControlChange,​ tVR.ControlNumber,​ vel, 1);
 +
 +      tVR.Old = vel;
 +      VR_List[i] = tVR;
 +
 +    }
 +  }
 +
 +  // ============================================ //
 +  // 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.1522461747.txt.gz · 最終更新: 2018/03/31 02:02 by fifi