MiniMidiKeyサポートページについて
ここでは、MakerFairTokyo2018で販売したMiniMidikeyについての情報を載せています。
この度は、たMiniMidikeyをお買い求めいただきありがとうございます。以下はサポート情報となります。
!注意!
1.本キットは「電子工作キット」です。長時間の演奏を保証するものではありません。(検証してないだけですので、出来るかもしれません。)
2.制作者の環境でのチェックはしておりますが、すべてのMIDI製品での動作を保証するものではありません。ご了承ください。
部品リスト
キットの内容物のリストです。ご確認ください。
番号 | 部材 | 型式 | 員数 |
---|---|---|---|
1 | 基板 | OSO FABオリジナル | 1 |
2 | タクトスイッチ | KSMC613A | 13 |
3 | aruduinoナノ互換機 | 1 | |
4 | 抵抗(200Ω) | 1 | |
5 | 3.5mmイヤホンジャック | AJ-1780 | 1 |
6 | 木工(キーボード) | OSO FABオリジナル | 1 |
7 | 木工(飾り) | OSO FABオリジナル | 1 |
8 | 木工(背面) | OSO FABオリジナル | 1 |
9 | ねじ | M3x6 バインド | 4 |
10 | スペーサ― | ASN-309 | 2 |
11 | midi端子 | MJ-173 他 | 1 |
12 | 3.5㎜ミニプラグ | MP-319 | 1 |
13 | 導線 | 3 |
組立動画
実際に半田付けしている動画を載せます。組立時の参考にしてください。
組立動画(木工)
通信ケーブル
ステレオミニジャックとMIDI端子を3本の導線を半田付けしてください。つなぎ方は写真を参照のこと。
ケーブルの接続方法
回路図
スイッチ(音階)とAruduinoピンの対応表
各音階のトグルスイッチとAruduinoピンの対応表となります。プログラムを変更する際の参考にしてください。
音階 | aruduino ピン番号 | 備考 |
---|---|---|
ド | 15 | アナログ1ピン |
レ(フラット) | 12 | |
レ | 16 | アナログ2ピン |
ミ(フラット) | 11 | |
ミ | 17 | アナログ3ピン |
ファ | 18 | アナログ4ピン |
ソ(フラット) | 2 | |
ソ | 19 | アナログ5ピン |
ラ(フラット) | 7 | |
ラ | 3 | |
シ | 10 | |
ド | 9 |
またMIDI通信(TX)は6ピンから抵抗を挟んで出力しています。
Arduino互換機について
安価なArduino互換機なのでAtmega16U2の代わりにCH340が使われています。環境によってはドライバーのインストールが必要になるので注意して下さい。以下、参考動画となります。
参考サイト
Arduino UNO 互換機のドライバー激安Arduino Nano互換機を試す
MIDI信号について
MIDI信号については下記リンク先等に詳しく載っているので、一読すると良いでしょう。
参考サイト
ArduinoでMIDI送信Web MIDI APIを扱うためのMIDI基礎知識
MIDIイベント
ソースコード
#include <SoftwareSerial.h>
SoftwareSerial MIDI(5, 6); // RX, TX
//--- pins ---
#define LED 13
#define PIN_NUM 13
byte pins[PIN_NUM] = {15, 12, 16, 11, 17, 18, 2, 19, 7, 3, 8, 10, 9};
//--- Switch ---
#define PUSH_SHORT 700 // judgement value of pushing counter
#define SW_LIMIT 710 // counter limit
short gauge [PIN_NUM];
//--- MIDI ---
#define MIDI_CH 2
#define VELOCITY 127
byte notes [PIN_NUM] = {60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72};
#define MIDI_ON 0x90|(MIDI_CH - 1)
#define MIDI_OFF 0x80|(MIDI_CH - 1)
void setup() {
pinMode(LED, OUTPUT);
for (byte i = 0 ; i < PIN_NUM ; i++) pinMode(pins[i], INPUT_PULLUP);
MIDI.begin(31250);
}
void loop() {
boolean led_stat = false;
for (byte i = 0 ; i < PIN_NUM ; i++)
{
byte sw_ret = BUTTON(i);
if (sw_ret == 1)
{
SEND_MIDI(MIDI_ON, notes[i], VELOCITY);
} else if (sw_ret == 255) {
SEND_MIDI(MIDI_OFF, notes[i], VELOCITY);
} else if (sw_ret != 0) led_stat = true;
}
digitalWrite(LED, led_stat);
}
byte BUTTON(byte num) {
byte sw_status = 0;
// pushing counter task
if (!digitalRead(pins[num]))
{
gauge[num]++;
if (gauge[num] > SW_LIMIT) gauge[num] = SW_LIMIT; // not to over limit of counter
} else {
if (gauge[num] > PUSH_SHORT) sw_status = 255;
gauge[num] = 0;
}
// action when pushing counter goes in range
if (gauge[num] > PUSH_SHORT) sw_status = 2;
else if (gauge[num] == PUSH_SHORT) sw_status = 1;
return sw_status;
}
void SEND_MIDI(byte cate, byte note, byte velo) {
byte data[3] = {cate, note, velo};
for (byte i = 0 ; i < 3 ; i++) MIDI.write(data[i]);
}
参考サイト
ArduinoでMIDI送信ソースコードについて(参考)
参考までに開発初期に作成したソースコードを開示します。(開発中に書いた無駄な記述が残っているかもしれませんが、ご容赦ください。)
#include <SoftwareSerial.h>
SoftwareSerial MIDI(5, 6); // RX, TX
//--- MIDI ---
#define MIDI_CH 2
#define VELOCITY 127
#define MIDI_ON 0x90|(MIDI_CH - 1)
#define MIDI_OFF 0x80|(MIDI_CH - 1)
//---入力ピン---
const int C_PIN = 15;
const int Df_PIN = 12;
const int D_PIN = 16;
const int Ef_PIN = 11;
const int E_PIN = 17;
const int F_PIN = 18;
const int Gf_PIN = 2;
const int G_PIN = 19;
const int Af_PIN = 7;
const int A_PIN = 3;
const int Bf_PIN = 8;
const int B_PIN = 10;
const int C5_PIN = 9;
const int C = 60 ;
const int Df = 61 ;
const int D = 62 ;
const int Ef = 63 ;
const int E = 64 ;
const int F = 65 ;
const int Gf = 66 ;
const int G = 67 ;
const int Af = 68 ;
const int A = 69 ;
const int Bf = 70 ;
const int B = 71 ;
const int C5 = 72 ;
void setup() {
// put your setup code here, to run once:
pinMode(5, OUTPUT);
pinMode(C_PIN,INPUT_PULLUP) ;
pinMode(Df_PIN,INPUT_PULLUP) ;
pinMode(D_PIN,INPUT_PULLUP) ;
pinMode(Ef_PIN,INPUT_PULLUP) ;
pinMode(E_PIN,INPUT_PULLUP) ;
pinMode(F_PIN,INPUT_PULLUP) ;
pinMode(Gf_PIN,INPUT_PULLUP) ;
pinMode(G_PIN,INPUT_PULLUP) ;
pinMode(Af_PIN,INPUT_PULLUP) ;
pinMode(A_PIN,INPUT_PULLUP) ;
pinMode(Bf_PIN,INPUT_PULLUP) ;
pinMode(B_PIN,INPUT_PULLUP) ;
pinMode(C5_PIN,INPUT_PULLUP) ;
//--- MIDI ---
MIDI.begin(31250);
Serial.begin(9600) ;
}
void loop() {
// put your main code here, to run repeatedly:
if (digitalRead(C_PIN) == LOW) { //スイッチの状態を調べる
SEND_MIDI(MIDI_ON, C, VELOCITY); //スイッチが押されていれば、MIDI信号のノートオンを送る
Serial.print("C") ; //スイッチが確認用のシリアル信号を送る。
} else {
SEND_MIDI(MIDI_OFF, C, VELOCITY); //スイッチが押されていないならMIDI信号のノートオフを送る
}
if (digitalRead(Df_PIN) == LOW) { //スイッチの状態を調べる
SEND_MIDI(MIDI_ON, Df, VELOCITY); /スイッチが押されていれば、/MIDI信号のノートオンを送る
Serial.print("Df") ; //スイッチが押されているならLEDを点灯
} else {
SEND_MIDI(MIDI_OFF, Df, VELOCITY); //スイッチが押されていないならMIDI信号のノートオフを送る
}
if (digitalRead(D_PIN) == LOW) { //スイッチの状態を調べる
SEND_MIDI(MIDI_ON, D, VELOCITY); //スイッチが押されていれば、MIDI信号のノートオンを送る
Serial.print("D") ; //スイッチが押されているならLEDを点灯
} else {
SEND_MIDI(MIDI_OFF, D, VELOCITY); //スイッチが押されていないならMIDI信号のノートオフを送る
}
if (digitalRead(Ef_PIN) == LOW) { //スイッチの状態を調べる
SEND_MIDI(MIDI_ON, Ef, VELOCITY); //スイッチが押されていれば、MIDI信号のノートオンを送る
Serial.print("Ef") ; //スイッチが押されているならLEDを点灯
} else {
SEND_MIDI(MIDI_OFF, Ef, VELOCITY); //スイッチが押されていないならMIDI信号のノートオフを送る
}
if (digitalRead(E_PIN) == LOW) { //スイッチの状態を調べる
SEND_MIDI(MIDI_ON, E, VELOCITY); //スイッチが押されていれば、MIDI信号のノートオンを送る
Serial.print("E") ; //スイッチが押されているならLEDを点灯
} else {
SEND_MIDI(MIDI_OFF, E, VELOCITY); //スイッチが押されていないならMIDI信号のノートオフを送る
}
if (digitalRead(F_PIN) == LOW) { //スイッチの状態を調べる
SEND_MIDI(MIDI_ON, F, VELOCITY); //スイッチが押されていれば、MIDI信号のノートオンを送る
Serial.print("F") ; //スイッチが押されているならLEDを点灯
} else {
SEND_MIDI(MIDI_OFF, F, VELOCITY); //スイッチが押されていないならMIDI信号のノートオフを送る
}
if (digitalRead(Gf_PIN) == LOW) { //スイッチの状態を調べる
SEND_MIDI(MIDI_ON, Gf, VELOCITY); //スイッチが押されていれば、MIDI信号のノートオンを送る
Serial.print("Gf") ; //スイッチが押されているならLEDを点灯
} else {
SEND_MIDI(MIDI_OFF, Gf, VELOCITY); //スイッチが押されていないならMIDI信号のノートオフを送る
}
if (digitalRead(G_PIN) == LOW) { //スイッチの状態を調べる
SEND_MIDI(MIDI_ON, G, VELOCITY); //スイッチが押されていれば、MIDI信号のノートオンを送る
Serial.print("G") ; //スイッチが押されているならLEDを点灯
} else {
SEND_MIDI(MIDI_OFF, G, VELOCITY); //スイッチが押されていないならMIDI信号のノートオフを送る
}
if (digitalRead(Af_PIN) == LOW) { //スイッチの状態を調べる
SEND_MIDI(MIDI_ON, Af, VELOCITY); //スイッチが押されていれば、MIDI信号のノートオンを送る
Serial.print("Af") ; //スイッチが押されているならLEDを点灯
} else {
SEND_MIDI(MIDI_OFF, Af, VELOCITY); //スイッチが押されていないならMIDI信号のノートオフを送る
}
if (digitalRead(A_PIN) == LOW) { //スイッチの状態を調べる
SEND_MIDI(MIDI_ON, A, VELOCITY); //スイッチが押されていれば、MIDI信号のノートオンを送る
Serial.print("A") ; //スイッチが押されているならLEDを点灯
} else {
SEND_MIDI(MIDI_OFF, A, VELOCITY); //スイッチが押されていないならMIDI信号のノートオフを送る
}
if (digitalRead(Bf_PIN) == LOW) { //スイッチの状態を調べる
SEND_MIDI(MIDI_ON, Bf, VELOCITY); //スイッチが押されていれば、MIDI信号のノートオンを送る
Serial.print("Bf") ; //スイッチが押されているならLEDを点灯
} else {
SEND_MIDI(MIDI_OFF, Bf, VELOCITY); //スイッチが押されていないならMIDI信号のノートオフを送る
}
if (digitalRead(B_PIN) == LOW) { //スイッチの状態を調べる
SEND_MIDI(MIDI_ON, B, VELOCITY); //スイッチが押されていれば、MIDI信号のノートオンを送る
Serial.print("B") ; //スイッチが押されているならLEDを点灯
} else {
SEND_MIDI(MIDI_OFF, B, VELOCITY); //スイッチが押されていないならMIDI信号のノートオフを送る
}
if (digitalRead(C5_PIN) == LOW) { //スイッチの状態を調べる
SEND_MIDI(MIDI_ON, C5, VELOCITY); //スイッチが押されていれば、MIDI信号のノートオンを送る
Serial.print("C5") ; //スイッチが押されているならLEDを点灯
} else {
SEND_MIDI(MIDI_OFF, C5, VELOCITY); //スイッチが押されていないならMIDI信号のノートオフを送る
}
}
void SEND_MIDI(byte cate, byte note, byte velo) {
byte data[3] = {cate, note, velo};
for (byte i = 0 ; i < 3 ; i++) MIDI.write(data[i]);
}
ケーブル類について
PCやiphonにつなぐためのケーブルを紹介します。実際に私が使ったものを紹介しますが、接続を保証するものではありません。