孫の手MIDIバイオリンにギターのコードを演奏できるように変更した。
ロータリーエンコーダーを右回転させるとダウンストローク、左回転させるとアップストロークと解釈して、ネックの7つのCDSにC, Dm, Em, F, G, Amの6つのコードを割り当てて、残りの1つと開放にはミュートを割り当てた。
GarageBandで鳴らしたのをSoundCloudにアップロードした。
#define NOTE_ON 144 #define NOTE_OFF 128 #define CONTROL_CHANGE 176 #define ALL_NOTE_OFF 120 volatile int state = 0; volatile boolean Flag_A = true; volatile boolean Flag_B = false; #define MAX_GENS (6) #define DOWN_STROKE (1) #define UP_STROKE (-1) #define NN (-1) static int flat0[MAX_GENS] = {52, 57, 62, 67, 71, 76}; static int offset[6][MAX_GENS] = { {0, 3, 2, 0, 1, 0}, {NN, 0, 0, 2, 3, 1}, {0, 2, 2, 0, 0, 0}, {1, 3, 3, 2, 1, 1}, {3, 2, 0, 0, 0, 3}, {0, 0, 2, 2, 1, 0} }; int current_note[MAX_GENS] = {NN, NN, NN, NN, NN, NN}; int gen_index = -1; void setup() { pinMode(2, INPUT_PULLUP); pinMode(3, INPUT_PULLUP); attachInterrupt(0, Fall_A, FALLING); attachInterrupt(1, Change_B, CHANGE); pinMode(4, INPUT); pinMode(5, INPUT); pinMode(6, INPUT); pinMode(7, INPUT); pinMode(8, INPUT); pinMode(9, INPUT); pinMode(10, INPUT); Serial.begin(31250); //Serial.begin(115200); sendMidi(CONTROL_CHANGE, ALL_NOTE_OFF, 0); } void loop() { } void Fall_A() { if (!Flag_A) { return; } Flag_B = true; Flag_A = false; } void Change_B() { if (!Flag_B) { return; } if (HIGH == digitalRead(2)) { int stroke = 0; if (HIGH == digitalRead(3)) { state--; stroke = UP_STROKE; gen_index--; if (gen_index < NN) { gen_index = NN; } } else { state++; stroke = DOWN_STROKE; gen_index++; if (gen_index > MAX_GENS) { gen_index = MAX_GENS; } } Flag_B = false; Flag_A = true; int code_index = NN; if (HIGH == digitalRead(4)) { code_index = 0; } if (HIGH == digitalRead(5)) { code_index = 1; } if (HIGH == digitalRead(6)) { code_index = 2; } if (HIGH == digitalRead(7)) { code_index = 3; } if (HIGH == digitalRead(8)) { code_index = 4; } if (HIGH == digitalRead(9)) { code_index = 5; } if (HIGH == digitalRead(10)) { code_index = NN; } if (code_index == NN) { for (int i = 0; i < MAX_GENS; i++) { if (current_note[i] != NN) { sendMidi(NOTE_ON, current_note[i], 0); } } } else { if ((gen_index >= 0) && (gen_index <= 5)) { if (current_note[gen_index] != NN) { sendMidi(NOTE_ON, current_note[gen_index], 0); } if (offset[code_index][gen_index] != NN) { int new_note = flat0[gen_index] + offset[code_index][gen_index]; current_note[gen_index] = new_note; sendMidi(NOTE_ON, current_note[gen_index], 127); } } else { } } } } void sendMidi(int cmd, int pitch, int velocity) { Serial.write(cmd); Serial.write(pitch); Serial.write(velocity); }