STD Nyokki's Lab Ⅴ

STD Nyokki's Lab Ⅴ

電子工作、バイク、パソコンを中心に記事を掲載しています。youtube一応やってます。www.youtube.com/user/tatsushi100

Arduino UNOの3和音+midiデバイス化

今回はarduino unoを使ってmidiバイスとして使えるmidi音源に改造したいと思います。

こんな感じです。

Arduino UNOでmidi 3和音 3 chords を再生


手順1

パソコンを用意します。

パソコンはwin/macどちらでも良いですが、今回はmacでやっていきたいと思います。

1.macXcodeをインストールする。

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で結線させてあったジャンパを抜きます。

3.ここからmidiファームウェアをダウンロードします。

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

これが完了したらひとまず、arduinomidiバイスとして認識するはずです。

確認のため、midiを使えるソフトなどを立ち上げて確認します。

Alchemusicaというソフトで確認したところ、MocoLUFA-MocoLUFAというデバイスがありますが、これが改造したarduinoです。


手順3

arduinomidi信号を音信号に変換するプログラムを書き込みます。

1.写真にある箇所をショート(結線)させます。


2.後は、arduino IDEを開いて

このプログラムを書き込んでください。


#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;
}
}
}