お疲れです!まるです。
MIDIコントローラーの続きです。
ChatGPTに手伝ってもらい3バンク切替をできるようにしました。
参考にしたサイトがありすぎて忘れてしまいましたが、切り貼りしてChatGPTに修正してもらいました。
MS-70CDR+のユーザープリセットである81番から12プリセット利用できます。
ケースに入れるまで時間がかかりそうなので先に接続図とArduinoのスケッチを公開しときます。
スケッチ
// ZOOM MS-70CDR+ //
#include <MIDI.h>
#include <Wire.h>
#include <Usb.h>
#include <usbh_midi.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiAvrI2c.h"
#define I2C_ADDRESS 0x3C
#define RST_PIN -1
MIDI_CREATE_DEFAULT_INSTANCE();
SSD1306AsciiAvrI2c display;
USB Usb;
USBH_MIDI Midi(&Usb);
const byte pushButtons[] = {17,2,15,6};//ボタンのpin番号
const byte leds[] = {16,3,14,7};//LEDのピン番号
const byte outPin5 = 5;
const byte pinBank = 4; // バンク切替pin番号
const byte pinLedBank = 8; // バンク切替LED pin番号
const byte bypass = 99; // バイパス時のプリセットの値-1
int dlay = 80; // ボタンの反応速度
int patch = 80; // プリセットを何番-1から使うか
int oled = 0;
byte buttonPushCounter[] = {0, 0, 0, 0}; // ボタンが押された回数のカウンター
bool prevButtonState[4] = {false, false, false, false}; // ボタンの直前の状態
bool buttonState;
int currentBank = 0;
void setup() {
display.begin(&Adafruit128x64, I2C_ADDRESS, RST_PIN);
display.clear();
for (byte m = 0; m < 4; m++) {
pinMode(pushButtons[m], INPUT_PULLUP);
pinMode(leds[m], OUTPUT);
}
pinMode(pinBank, INPUT_PULLUP);
pinMode(pinLedBank, OUTPUT);
if (Usb.Init() == -1) {
digitalWrite(outPin5, HIGH);
while (1);
}
MIDI.begin(MIDI_CHANNEL_OMNI);
intro();
}
void loop() {
handleButtonPress(currentBank * 4 + patch);
if (!digitalRead(pinBank)) {
currentBank = (currentBank + 1) % 3;
resetCounter();
updateBankLed();
delay(dlay);
}
}
void handleButtonPress(int patchOffset) {
for (byte i = 0; i < 4; i++) {
buttonState = !digitalRead(pushButtons[i]);
if (buttonState != prevButtonState[i]) {
prevButtonState[i] = buttonState;
if (buttonState) {
if (buttonPushCounter[i] == 0) {
SendMIDI(i + patchOffset);
resetCounter();
resetAllLeds();
buttonPushCounter[i]++;
ligarLed(leds[i]);
oled = i + patchOffset;
OledDisplay();
} else {
SendMIDI(bypass);
resetCounter();
resetAllLeds();
OledDisplayBypass();
}
}
delay(dlay);
}
}
}
void resetAllLeds() {
for (byte k = 0; k < 4; k++) {
digitalWrite(leds[k], LOW);
}
}
void resetCounter() {
for (byte j = 0; j < 4; j++) {
buttonPushCounter[j] = 0;
}
}
void updateBankLed() {
digitalWrite(pinLedBank, HIGH);
delay(100); // 一時的に点灯する時間
digitalWrite(pinLedBank, LOW);
}
void SendMIDI(byte number) {
Usb.Task();
if (Usb.getUsbTaskState() == USB_STATE_RUNNING) {
SendMIDIintro(number);
} else if (Usb.getUsbTaskState() == USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE) {
resetCounter();
resetAllLeds();
for (byte p = 0; p < 4; p++) {
digitalWrite(leds[p], HIGH);
delay(50);
digitalWrite(leds[p], LOW);
delay(50);
}
}
}
void OledDisplay() {
display.clear();
display.setCursor(25, 0);
display.setFont(CalBlk36);
display.set2X();
display.print(oled + 1);
delay(dlay);
}
void OledDisplayBypass() {
display.clear();
display.setFont(CalBlk36);
display.set2X();
display.setCursor(25, 0);
display.print("BP");
delay(dlay);
}
void OledDisplayIntro() {
display.clear();
display.setFont(Cooper19);
display.setCursor(10, 10);
display.println("ZOOM");
display.setCursor(10, 30);
display.println("MS-70CDR+");
}
void intro() {
OledDisplayIntro();
delay(5000);
for (byte pos = 0; pos < 4; pos++) {
SendMIDIintro(pos);
digitalWrite(leds[pos], HIGH);
delay(350);
digitalWrite(leds[pos], LOW);
}
for (int b = 0; b < 8; b++) {
for (byte k = 0; k < 4; k++) {
digitalWrite(leds[k], HIGH);
}
delay(75);
for (byte l = 0; l < 4; l++) {
digitalWrite(leds[l], LOW);
}
delay(75);
}
delay(3000);
OledDisplayBypass();
SendMIDIintro(bypass);
}
void SendMIDIintro(byte number) {
Usb.Task();
if (Usb.getUsbTaskState() == USB_STATE_RUNNING) {
byte Message[2];
Message[0] = 0xC0;
Message[1] = number;
Midi.SendData(Message);
}
}
void ligarLed(byte pinPort) {
digitalWrite(pinPort, HIGH);
delay(40);
digitalWrite(pinPort, LOW);
delay(40);
digitalWrite(pinPort, HIGH);
}
コメント