今回はarduino unoを使ってmidiデバイスとして使えるmidi音源に改造したいと思います。
こんな感じです。
Arduino UNOでmidi 3和音 3 chords を再生
手順1
パソコンを用意します。
パソコンはwin/macどちらでも良いですが、今回はmacでやっていきたいと思います。
2.Xcodeの上のタブより、Preference→Locationsに行き、Command Line Toolsの欄に何か書かれている(インストールされている)ことを確認してください。
私の場合はXcode 10.1 (10B61)
何もない場合はCommand Line Toolをインストールしてください。
3.MacPortsをインストールします。
4.インストール完了後、ターミナルより、[sudo port install dfu-programmer]を実行します。
手順2
Arduino UNOをmidiデバイスとして認識(改造)させる。
1.まずarduinoをdfuモードに移行します。
写真にある、赤い丸同士をショート(結線)します。
その後、パソコンと接続します。
2.1で結線させてあったジャンパを抜きます。
GitHub - kuwatay/mocolufa: mocoLUFA (MIDI firmware for Arduino Uno)
4.ダウンロードしたファイルのうちの、dualMoco.hexというファイルだけをデスクトップへ移動します。
5.その後、ターミナルを起動し
dfu-programmer atmega16u2 erase dfu-programmer atmega16u2 flash /Users/*****/Desktop/dualMoco.hex *****はユーザー名です。 dfu-programmer atmega16u2 reset
これが完了したらひとまず、arduinoがmidiデバイスとして認識するはずです。
確認のため、midiを使えるソフトなどを立ち上げて確認します。
Alchemusicaというソフトで確認したところ、MocoLUFA-MocoLUFAというデバイスがありますが、これが改造したarduinoです。
手順3
arduinoにmidi信号を音信号に変換するプログラムを書き込みます。
1.写真にある箇所をショート(結線)させます。
このプログラムを書き込んでください。
#include <MIDI.h> #include <Tone.h> #define Speaker1 13 #define Speaker2 12 #define Speaker3 11 MIDI_CREATE_DEFAULT_INSTANCE(); int m2t[127] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 11, 19, 27, 35, 43, 51, 59, 67, 75, 83, 91, 99, 107, 115, 123, //NOTE_B2 131, //NOTE_C3 139, //NOTE_CS3 147, //NOTE_D3 156, //NOTE_DS3 165, //NOTE_E3 175, //NOTE_F3 185, //NOTE_FS3 196, //NOTE_G3 208, //NOTE_GS3 220, //NOTE_A3 233, //NOTE_AS3 247, //NOTE_B3 262, //NOTE_C4 277, //NOTE_CS4 294, //NOTE_D4 311, //NOTE_DS4 330, //NOTE_E4 349, //NOTE_F4 370, //NOTE_FS4 392, //NOTE_G4 415, //NOTE_GS4 440, //NOTE_A4 466, //NOTE_AS4 494, //NOTE_B4 523, //NOTE_C5 554, //NOTE_CS5 587, //NOTE_D5 622, //NOTE_DS5 659, //NOTE_E5 698, //NOTE_F5 740, //NOTE_FS5 784, //NOTE_G5 831, //NOTE_GS5 880, //NOTE_A5 932, //NOTE_AS5 988, //NOTE_B5 1047, //NOTE_C6 1109, //NOTE_CS6 1175, //NOTE_D6 1245, //NOTE_DS6 1319, //NOTE_E6 1397, //NOTE_F6 1480, //NOTE_FS6 1568, //NOTE_G6 1661, //NOTE_GS6 1760, //NOTE_A6 1865, //NOTE_AS6 1976, //NOTE_B6 2093, //NOTE_C7 2217, //NOTE_CS7 2349, //NOTE_D7 2489, //NOTE_DS7 2637, //NOTE_E7 2794, //NOTE_F7 2960, //NOTE_FS7 3136, //NOTE_G7 3322, //NOTE_GS7 3520, //NOTE_A7 3729, //NOTE_AS7 3951, //NOTE_B7 4186, //NOTE_C8 4435, //NOTE_CS8 4699, //NOTE_D8 4978 //NOTE_DS8 }; int vol = 0; int tone1Interval = 0; int tone2Interval = 0; int tone3Interval = 0; int note; Tone tone1; Tone tone2; Tone tone3; Tone tone4; void setup() { tone1.begin(Speaker1); tone2.begin(Speaker2); tone3.begin(Speaker3); MIDI.begin(0); } void loop() { //音出力---------------------------------------------------------- uint8_t code; uint8_t ch,data1,data2,Channel; if (MIDI.read()) { MIDI.setInputChannel(vol); // Channel switch(MIDI.getType()) { case midi::NoteOn: data1 = MIDI.getData1(); // note no data2 = MIDI.getData2(); // velocity if(data2 == 0){ } else { if(tone1Interval == 0){ tone1Interval = data1; tone1.play(m2t[data1]); }else{ if(tone2Interval == 0){ tone2Interval = data1; tone2.play(m2t[data1]); }else{ if(tone3Interval == 0){ tone3Interval = data1; tone3.play(m2t[data1]); } } } } break; case midi::NoteOff: data1 = MIDI.getData1(); // note no if(tone1Interval == data1){ tone1Interval = 0; tone1.stop(); } if(tone2Interval == data1){ tone2Interval = 0; tone2.stop(); } if(tone3Interval == data1){ tone3Interval = 0; tone3.stop(); } break; default: break; } } }