ZOOM MS-70CDR+をMIDIコントロール その2

お疲れです!まるです。

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);

}


コメント