見出し画像

QWRT-004 MIDI Chord Generator

概要(QWRT 4作目)


USB MIDIで自動演奏できるMIDIデバイスモジュラーを作成しました。
外部クロック(Gate/Sync)で進行するコードジェネレーターとして機能します。また、CVによるRootKeyの変更も可能とし、トグルスイッチによる転調機能(同主調変調:parallel、平行調変調:relative、属調変調:dominant・subdominant)も実装しました。
※各種転調になじみのない方には難しいと思いますが、実際に聞いてみればすぐわかりますので近いうちにYoutubeにアップします。

※参考:関連モジュール、デバイス
・『QWRT-001 MIDI Thru USB HUB』:MIDI スルーHUB ※各デバイスのHUB
・『QWRT-002 MIDI Controller』:MIDIコントローラー
・『QWRT-003 MIDI NSX-1 Panel for eVY1』:MIDI音源

今回、4HPに収まらなかったので6HPでアクリルパネルをレーザ加工した
奥行きを最小限にするためミルフィーユ構造にした。
両面ユニバーサル基板3枚で完結
今回もSeeeduino xiao(SAMD)でUSB MIDIデバイスとして実装
電源はUSBケーブルから取得。(QWRT-001 MIDI Thru USB HUBに接続することを想定)
各層間の結線ははんだ付けなしのピンヘッダーのみで実装

MIDI音源のQWRT-003 MIDI NSX-1 Panel for eVY1で動作確認

アナログVCO SEM3340 x8個のPoly-8 VCOで動作確認

構成


1.Seeeduino xiao(SAMD)
2.OLEDディスプレイ(0.96インチ)
3.ロータリーエンコーダー
4.トグルスイッチ(ON-OFF) x 2
5.トグルスイッチ(ON-OFF-ON)
※以下に記載するサイトはあくまで参考です。調達先は都度ご検討ください。なお、私の調達先は後日アップするBOMをご確認ください。

BOM

近いうちにアップします。

配線

以下のサイトを参考にに配線しました。

OLEDディスプレイ

ロータリーエンコーダー

トグルスイッチ


プログラム


利用ライブラリ

たくさんあるので、コードのヘッダー部分をご確認ください。
主要な目的別ライブラリの項目は、以下の通り。
・メモリ保存用ライブラリ
・USB MIDI用ライブラリ
・ディスプレイ用ライブラリ
・ロータリーエンコーダー用ライブラリ

仕様

  • 入力されたGate/Sync信号をもとにあらかじめ設定されたコード進行を演奏する。

  • 入力されたV/OCTのCV信号でRoot keyをリアルタイムで変更して演奏する。 

  • 1つ目のトグルスイッチ(ON-OFF)でリアルタイムに同主調(parallel)変調可能

  • 2つ目のトグルスイッチ(ON-OFF)でリアルタイムに平行調(relative)変調可能

  • 3つ目のトグルスイッチ(ON-OFF-ON)でリアルタイムに属調変調:dominant・subdominantに変更可能

  • 上記トグルスイッチを組み合わせることで、属調平行調などに複合的に変調可能

  • コード進行はエディット機能により、ロータリエンコーダーでリアルタイムに変更可能、また、それをEEPROMに保存可能

作成したコード(β版)

※β版 メニュー機能で割り込み処理にまだバグがあります。

#include <FlashAsEEPROM.h>//flash memory use as eeprom
#include <Arduino.h>
#include "MIDIUSB.h"
//#include "USB\SAMD21_USBDevice.h"
//Oled setting
#include<Wire.h>
#include<Adafruit_SSD1306.h>
#include<Adafruit_GFX.h>
#define OLED_ADDRESS 0x3C
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Adafruit_SSD1306 display(-1);
//Rotery encoder setting
#define  ENCODER_OPTIMIZE_INTERRUPTS //counter measure of noise
#include <Encoder.h>

//EEPROM
byte EEPROM_SET_FLG = 1;
byte EEPROM_ADDRESS = 0;

//MIDI CHANNEL
 byte CH_DEFAULT = 2;    //Midi Channel No.
 byte CH = CH_DEFAULT;   //Midi Channel No.
 byte CH_MAX = 4;        //USE MAX Midi Channel COUNT.

//MIDI VELOCITY
 byte CHORD_VEL_DEFAULT=32;
 byte CHORD_VEL=CHORD_VEL_DEFAULT;

//CORD (MIDI NOTE NO LIST) TYPE:YAMAHA 
 String NOTE_LIST[128]= {"C-2","C#-2","D-2","D#-2","E-2","F-2","F#-2","G-2","G#-2","A-2","A#-2","B-2","C-1","C#-1","D-1","D#-1","E-1","F-1","F#-1","G-1","G#-1","A-1","A#-1","B-1","C0","C#0","D0","D#0","E0","F0","F#0","G0","G#0","A0","A#0","B0","C1","C#1","D1","D#1","E1","F1","F#1","G1","G#1","A1","A#1","B1","C2","C#2","D2","D#2","E2","F2","F#2","G2","G#2","A2","A#2","B2","C3","C#3","D3","D#3","E3","F3","F#3","G3","G#3","A3","A#3","B3","C4","C#4","D4","D#4","E4","F4","F#4","G4","G#4","A4","A#4","B4","C5","C#5","D5","D#5","E5","F5","F#5","G5","G#5","A5","A#5","B5","C6","C#6","D6","D#6","E6","F6","F#6","G6","G#6","A6","A#6","B6","C7","C#7","D7","D#7","E7","F7","F#7","G7","G#7","A7","A#7","B7","C8","C#8","D8","D#8","E8","F8","F#8","G8"};
 //String NOTE_LIST[128]= {"C-2","Db-2","D-2","Eb-2","E-2","F-2","F#-2","G-2","Ab-2","A-2","Bb-2","B-2","C-1","Db-1","D-1","Eb-1","E-1","F-1","F#-1","G-1","Ab-1","A-1","Bb-1","B-1","C0","Db0","D0","Eb0","E0","F0","F#0","G0","Ab0","A0","Bb0","B0","C1","Db1","D1","Eb1","E1","F1","F#1","G1","Ab1","A1","Bb1","B1","C2","Db2","D2","Eb2","E2","F2","F#2","G2","Ab2","A2","Bb2","B2","C3","Db3","D3","Eb3","E3","F3","F#3","G3","Ab3","A3","Bb3","B3","C4","Db4","D4","Eb4","E4","F4","F#4","G4","Ab4","A4","Bb4","B4","C5","Db5","D5","Eb5","E5","F5","F#5","G5","Ab5","A5","Bb5","B5","C6","Db6","D6","Eb6","E6","F6","F#6","G6","Ab6","A6","Bb6","B6","C7","Db7","D7","Eb7","E7","F7","F#7","G7","Ab7","A7","Bb7","B7","C8","Db8","D8","Eb8","E8","F8","F#8","G8"};

//CORD (MIDI NOTE NO LIST) TYPE:INTERNATIONAL
//String NOTE_LIST[128]= {"C-1","C#-1","D-1","D#-1","E-1","F-1","F#-1","G-1","G#-1","A-1","A#-1","B-1","C0","C#0","D0","D#0","E0","F0","F#0","G0","G#0","A0","A#0","B0","C1","C#1","D1","D#1","E1","F1","F#1","G1","G#1","A1","A#1","B1","C2","C#2","D2","D#2","E2","F2","F#2","G2","G#2","A2","A#2","B2","C3","C#3","D3","D#3","E3","F3","F#3","G3","G#3","A3","A#3","B3","C4","C#4","D4","D#4","E4","F4","F#4","G4","G#4","A4","A#4","B4","C5","C#5","D5","D#5","E5","F5","F#5","G5","G#5","A5","A#5","B5","C6","C#6","D6","D#6","E6","F6","F#6","G6","G#6","A6","A#6","B6","C7","C#7","D7","D#7","E7","F7","F#7","G7","G#7","A7","A#7","B7","C8","C#8","D8","D#8","E8","F8","F#8","G8","G#8","A8","A#8","B8","C9","C#9","D9","D#9","E9","F9","F#9","G9"};

 const int CV2NOTE_QUANTIZE_LIST[62] = {0, 9,  26, 43, 60, 77, 94, 111,  128,  145,  162,  179,  196,  213,  230,  247,  264,  281,  298,  315,  332,  349,  366,  383,  400,  417,  434,  451,  468,  485,  502,  519,  536,  553,  570,  587,  604,  621,  638,  655,  672,  689,  706,  723,  740,  757,  774,  791,  808,  825,  842,  859,  876,  893,  910,  927,  944,  961,  978,  995,  1012, 1024};
 byte ROOT_DEFAULT = 36;      //Ex. 65=F4(YAMAHA F3), 60=C4(YAMAHA C3), 67=G4(YAMAHA G3)
 byte ROOT = ROOT_DEFAULT;
 byte PITCH_NOTE = ROOT_DEFAULT;
 byte CHORD_KEY;
 byte CHORD[7][3];
 byte CHORD_MAJOR[7][3] = 
 {
  {0,4,7},    //1 +0 M +0 +4 +7 +11  
  {2,5,9},    //2 +2 m +0 +3 +7 +10
  {4,7,11},   //3 +2 m +0 +3 +7 +10
  {5,9,12},   //4 +1 M +0 +4 +7 +11
  {7,11,14},  //5 +2 M +0 +4 +7 +11
  {9,12,16},  //6 +2 m +0 +3 +7 +10
  {11,14,18}, //7 +1 m +0 +3 +7 +10
 };
 byte CHORD_MINOR[7][3] = 
 {
  {0,3,7},    //1 +0 m +0 +3 +7 +10
  {2,5,9},    //2 +2 m +0 +3 +7 +10
  {3,7,10},   //3 +1 M +0 +4 +7 +11
  {5,8,12},   //4 +2 m +0 +3 +7 +10
  {7,10,14},  //5 +2 m +0 +3 +7 +10
  {8,12,15},  //6 +1 M +0 +4 +7 +11
  {10,14,17}, //7 +2 M +0 +4 +7 +11
 };

//byte CHORD_DEFAULT[7][3] = {
//{0,4,7},    //1 +0 M +0 +4 +7 +11
//{2,5,9},    //2 +2 m +0 +3 +7 +10
//{4,7,11},   //3 +2 m +0 +3 +7 +10
//{5,9,12},   //4 +1 M +0 +4 +7 +11
//{7,11,14},  //5 +2 M +0 +4 +7 +11
//{9,12,16},  //6 +2 m +0 +3 +7 +10
//{11,14,18}, //7 +1 m +0 +3 +7 +10
//};

 byte CHORD_DEFAULT[7][3] = 
 {
  {0,4,7},    //1 +0 M +0 +4 +7 +11
  {2,5,9},    //2 +2 m +0 +3 +7 +10
  {4,7,11},   //3 +2 m +0 +3 +7 +10
  {5,9,12},   //4 +1 M +0 +4 +7 +11
  {7,11,14},  //5 +2 M +0 +4 +7 +11
  {9,12,16},  //6 +2 m +0 +3 +7 +10
  {11,14,18}, //7 +1 m +0 +3 +7 +10
 };

//CHORD STEP//
 //uint8_t CHORD_PROG_NUM[] = {1,5,6,3,4,1,4,5};  
 //uint8_t CHORD_PROG_NUM[] = {4,5,3,6}; //4-5-3-6
 uint8_t CHORD_PROG_NUM[] = {6,4,5,1};       //RANGE:1-7
 uint8_t CHORD_PROG_OCT[] = {0,0,0,12};      //RANGE:0-12  
 uint8_t CHORD_PROG_VEL[] = {48,48,48,48};   //RANGE:1-127

 byte CHORD_PROG_NUM_SIZE;
 byte CHORD_PROG_NUM_COUNT;
 byte CHORD_PROG_NUM_VALUE;
 byte CHORD_PROG_OCT_SIZE;
// byte CHORD_PROG_OCT_COUNT;
// byte CHORD_PROG_OCT_VALUE;
 byte CHORD_PROG_VEL_SIZE;
// byte CHORD_PROG_VEL_COUNT;
// byte CHORD_PROG_VEL_VALUE;

//CHORD NOTE
 byte CHORD_NOTE_SIZE;
 byte CHORD_NOTE_COUNT;
 byte CHORD_NOTE_VALUE;

//DISPLAY
 byte DISPLAY_MODE = 1;                   //0:MENU, 1:RUN, 2:EDIT, 3:ADD, 4:SAVE
  //DISPLAY_MODE(1:MENU)
   byte MENU_NO = 1;                      //1:EXIT, 2:EDIT, 3:ADD, 4:SAVE
  //DISPLAY_MODE(2:EDIT)
   byte EDIT_NO = 1;                      //1:EXIT, 2:SAVE, 3:EDIT
    //EDIT_NO(3:EDIT)
     byte CHORD_PROG_EDIT_MODE = 1;       //1:MENU, 2:SELECT CHORD_PROG_PAR, 3:SELECT CHORD_PROG, 4:EDIT
      //CHORD_PROG_EDIT_MODE(2:SELECT CHORD_PROG_PAR, 3:SELECT CHORD_PROG, 4:EDIT)
       int  CHORD_PROG_PAR = 1;     //0:BACK, 1:CHORD_PROG_NUM, 2:CHORD_PROG_OCT, 3:CHORD_PROG_VEL
        //CHORD_PROG_PAR(1:CHORD_PROG_NUM)
         int  CHORD_PROG_NUM_EDIT_NO = 0; //-1:BACK, 0-XX:STEP NO
        //CHORD_PROG_PAR(2:CHORD_PROG_OCT)
         int  CHORD_PROG_OCT_EDIT_NO = 0; //-1:BACK, 0-XX:STEP NO
        //CHORD_PROG_PAR(3:CHORD_PROG_VEL)
         int  CHORD_PROG_VEL_EDIT_NO = 0; //-1:BACK, 0-XX:STEP NO
  //DISPLAY_MODE(3:ADD)
   byte ADD_NO  = 1;                     //1:EXIT, 2:SAVE
  //DISPLAY_MODE(4:SAVE)
   byte SAVE_NO = 1;                     //1:EXIT, 2:SAVE

//GATE and CV and SWITCH 
 byte GATE_CV = 0;
 float PITCH_CV = 0;
 byte RELATIVE_KEY;    //平行調
 byte PARALLEL_KEY;    //同主調
 byte DOMINANT_KEY;    //属調
 byte SUBDOMINANT_KEY; //下属調

//ROTARY ENCODER
 byte ROTARY_ENCODER_PUISH_SW  = 0;
 float ROTARY_ENCODER_DATA     = -999;
 float ROTARY_ENCODER_DATA_OLD = -999;

// ROTARY_ENCODER_PUISH_SW
 bool          ROTARY_ENCODER_PUISH_SW_FLG  = 0;
 unsigned long ROTARY_ENCODER_PUISH_SW_TIME = 0;

//PIN SET
 byte PARALLEL_KEY_PIN            = 0;
 byte RELATIVE_KEY_PIN            = 1;
 byte DOMINANT_KEY_PIN            = 2;
 byte SUBDOMINANT_KEY_PIN         = 3;
 byte ROTARY_ENCODER_PUISH_SW_PIN = 6; 
 Encoder myEnc(7, 8);
 byte GATE_CV_PIN                 = 9;
 byte PITCH_CV_PIN                = 10;

 
void setup()
{
 //SERIAL SET
 Serial.begin(115200);
 delay(2000);
  pinMode(0, INPUT_PULLUP);    //PARALLEL_KEY SWITCH
  pinMode(1, INPUT_PULLUP);    //RELATIVE_KEY SWITCH
  pinMode(2, INPUT_PULLUP);    //DOMINANT_KEY
  pinMode(3, INPUT_PULLUP);    //SUBDOMINANT_KEY
 //PIN SET
  //      4                    //I2C SDA
  //      5                    //I2C SCL
  pinMode(6, INPUT_PULLUP);    //Rotery encoder SWITCH
  //      7                    //Rotery encoder 1
  //      8                    //Rotery encoder 2
  pinMode(9, INPUT_PULLDOWN);  //GATE CV
  pinMode(10, INPUT);          //PITCH CV

 // OLED SET
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

 //I2C connect
  Wire.begin();

 // DISPLAY SET
  DISPLAY_START();
}


void loop()
{
 //EEPROM SET
  if (EEPROM_SET_FLG == 1) 
  {
   EEPROM_SET();
   EEPROM_SET_FLG = 0;
  }

 //SWITCH SET
  PARALLEL_KEY     = digitalRead(PARALLEL_KEY_PIN);    //同主調
  RELATIVE_KEY     = digitalRead(RELATIVE_KEY_PIN);    //平行調
  DOMINANT_KEY     = digitalRead(DOMINANT_KEY_PIN);    //属調
  SUBDOMINANT_KEY  = digitalRead(SUBDOMINANT_KEY_PIN); //下属調

 //ROOT SET
  PITCH_CV         = analogRead(PITCH_CV_PIN);

 //CV Correction [PITCH_CV = CV * (Resistance Correction) - (Default Voltage)]
  // PITCH_CV         = PITCH_CV * 1.130 -11; 
  PITCH_CV         = PITCH_CV * 1.17 -45; 
  ROOT_SET();

 //CORD MIDI NOTE ON OFF and DISPLAY by GATE  
  MIDI_CHORD();

 //RUN: MIDI SLL CHANNEL ALL RESET
  MIDI_CH_ALL_RESET();
}


void EEPROM_SET() 
{
  CHORD_PROG_NUM_SIZE = sizeof CHORD_PROG_NUM / sizeof(CHORD_PROG_NUM[0]); //CHORD_PROG_NUM_SIZE
  if ( EEPROM.read(0) != 255 ){ for ( byte CHORD_PROG_NUM_COUNT_TMP = 0; CHORD_PROG_NUM_COUNT_TMP < CHORD_PROG_NUM_SIZE ; CHORD_PROG_NUM_COUNT_TMP++ ){  EEPROM_ADDRESS = CHORD_PROG_NUM_COUNT_TMP  ; CHORD_PROG_NUM[CHORD_PROG_NUM_COUNT_TMP] = EEPROM.read(EEPROM_ADDRESS); }}
  CHORD_PROG_OCT_SIZE = sizeof CHORD_PROG_OCT / sizeof(CHORD_PROG_OCT[0]); //CHORD_PROG_OCT_SIZE
  if ( EEPROM.read(10) != 255 ){ for ( byte CHORD_PROG_OCT_COUNT_TMP = 0; CHORD_PROG_OCT_COUNT_TMP < CHORD_PROG_OCT_SIZE ; CHORD_PROG_OCT_COUNT_TMP++ ){ EEPROM_ADDRESS = CHORD_PROG_OCT_COUNT_TMP + 10 ; CHORD_PROG_OCT[CHORD_PROG_OCT_COUNT_TMP] = EEPROM.read(EEPROM_ADDRESS); }}
  CHORD_PROG_VEL_SIZE = sizeof CHORD_PROG_VEL / sizeof(CHORD_PROG_VEL[0]); //CHORD_PROG_VEL_SIZE
  if ( EEPROM.read(20) != 255 ){ for ( byte CHORD_PROG_VEL_COUNT_TMP = 0; CHORD_PROG_VEL_COUNT_TMP < CHORD_PROG_VEL_SIZE ; CHORD_PROG_VEL_COUNT_TMP++ ){ EEPROM_ADDRESS = CHORD_PROG_VEL_COUNT_TMP + 20 ; CHORD_PROG_VEL[CHORD_PROG_VEL_COUNT_TMP] = EEPROM.read(EEPROM_ADDRESS); }}
}


void EEPROM_SAVE() {
  CHORD_PROG_NUM_SIZE = sizeof CHORD_PROG_NUM / sizeof(CHORD_PROG_NUM[0]); //CHORD_PROG_NUM_SIZE
  for ( byte CHORD_PROG_NUM_COUNT_TMP = 0; CHORD_PROG_NUM_COUNT_TMP < CHORD_PROG_NUM_SIZE ; CHORD_PROG_NUM_COUNT_TMP++ ){ EEPROM_ADDRESS = CHORD_PROG_NUM_COUNT_TMP  ; EEPROM.write(EEPROM_ADDRESS, CHORD_PROG_NUM[CHORD_PROG_NUM_COUNT_TMP]);}
  CHORD_PROG_OCT_SIZE = sizeof CHORD_PROG_OCT / sizeof(CHORD_PROG_OCT[0]); //CHORD_PROG_OCT_SIZE
  for ( byte CHORD_PROG_OCT_COUNT_TMP = 0; CHORD_PROG_OCT_COUNT_TMP < CHORD_PROG_OCT_SIZE ; CHORD_PROG_OCT_COUNT_TMP++ ){ EEPROM_ADDRESS = CHORD_PROG_OCT_COUNT_TMP + 10 ; EEPROM.write(EEPROM_ADDRESS, CHORD_PROG_OCT[CHORD_PROG_OCT_COUNT_TMP]);}
  CHORD_PROG_VEL_SIZE = sizeof CHORD_PROG_VEL / sizeof(CHORD_PROG_VEL[0]); //CHORD_PROG_VEL_SIZE
  for ( byte CHORD_PROG_VEL_COUNT_TMP = 0; CHORD_PROG_VEL_COUNT_TMP < CHORD_PROG_VEL_SIZE ; CHORD_PROG_VEL_COUNT_TMP++ ){ EEPROM_ADDRESS = CHORD_PROG_VEL_COUNT_TMP + 20 ; EEPROM.write(EEPROM_ADDRESS, CHORD_PROG_VEL[CHORD_PROG_VEL_COUNT_TMP]);}
  EEPROM.commit();
  delay(100);
}


void ROOT_SET()
{
 //PITCH CV TO NOTE QUANTIZE
  for ( byte CV2NOTE_QUANTIZE_LIST_COUNT = 0; CV2NOTE_QUANTIZE_LIST_COUNT <= 61 ; CV2NOTE_QUANTIZE_LIST_COUNT++ ) {
   if ( PITCH_CV >= CV2NOTE_QUANTIZE_LIST[CV2NOTE_QUANTIZE_LIST_COUNT] && PITCH_CV < CV2NOTE_QUANTIZE_LIST[CV2NOTE_QUANTIZE_LIST_COUNT + 1]) {
    PITCH_NOTE = 36 + CV2NOTE_QUANTIZE_LIST_COUNT;
   }
  }

 //PITCH CV TO NOTE QUANTIZE RANGE NOTE_36-97
  if ( PITCH_NOTE < 36 ) {   
   PITCH_NOTE = 36;
  } else if ( PITCH_NOTE > 97 ) {
   PITCH_NOTE = 97;
  }

 //DOMINANT and SUBDOMINANT SET
  if ( DOMINANT_KEY == 0 )
  {
   ROOT =  PITCH_NOTE + 7;
  } else if ( SUBDOMINANT_KEY == 0) {
   ROOT =  PITCH_NOTE - 7;
  } else {
   ROOT = PITCH_NOTE;
  } 

 //PARALLEL and RELATIVE SET
  if ( PARALLEL_KEY == 1 && RELATIVE_KEY == 1 ){
   CHORD_KEY = 0;  //MAJOR
   byte CHORD_NO_SIZE = sizeof CHORD_MAJOR / sizeof(CHORD_MAJOR[0]);
   for (byte c = 0; c < CHORD_NO_SIZE; c++)
   {
    byte CHORD_NOTE_SIZE = sizeof CHORD_MAJOR[c] / sizeof(CHORD_MAJOR[c][0]);
    for (byte d = 0; d < CHORD_NOTE_SIZE; d++)
    {
     CHORD[c][d] = CHORD_MAJOR[c][d] + ROOT;
    }
   }
  } else if ( PARALLEL_KEY == 1 && RELATIVE_KEY ==0 ) {
   CHORD_KEY = 1; //MINOR
   byte CHORD_NO_SIZE = sizeof CHORD_MINOR / sizeof(CHORD_MINOR[0]);
   for (byte c = 0; c < CHORD_NO_SIZE; c++)
   {
    byte CHORD_NOTE_SIZE = sizeof CHORD_MINOR[c] / sizeof(CHORD_MINOR[c][0]);
    for (byte d = 0; d < CHORD_NOTE_SIZE; d++)
    {
     CHORD[c][d] = CHORD_MINOR[c][d] + ROOT - 3;
    }
   }
  } else if ( PARALLEL_KEY == 0 && RELATIVE_KEY ==1 ) {
   CHORD_KEY = 1; //MINOR"
   byte CHORD_NO_SIZE = sizeof CHORD_MINOR / sizeof(CHORD_MINOR[0]);
   for (byte c = 0; c < CHORD_NO_SIZE; c++)
   {
    byte CHORD_NOTE_SIZE = sizeof CHORD_MINOR[c] / sizeof(CHORD_MINOR[c][0]);
    for (byte d = 0; d < CHORD_NOTE_SIZE; d++)
    {
     CHORD[c][d] = CHORD_MINOR[c][d] + ROOT;
    }
   }
  } else if ( PARALLEL_KEY == 0 && RELATIVE_KEY ==0 ) {
   CHORD_KEY = 0; //MAJOR
   byte CHORD_NO_SIZE = sizeof CHORD_MAJOR / sizeof(CHORD_MAJOR[0]);
   for (byte c = 0; c < CHORD_NO_SIZE; c++)
   {
    byte CHORD_NOTE_SIZE = sizeof CHORD_MAJOR[c] / sizeof(CHORD_MAJOR[c][0]);
    for (byte d = 0; d < CHORD_NOTE_SIZE; d++)
    {
     CHORD[c][d] = CHORD_MAJOR[c][d] + ROOT + 3;
    }
   }
  }
}


void MIDI_CHORD()
{
 // CHORD_PROG_NUM[4]
  CHORD_PROG_NUM_SIZE = sizeof CHORD_PROG_NUM / sizeof(CHORD_PROG_NUM[0]);
  for (CHORD_PROG_NUM_COUNT  = 0; CHORD_PROG_NUM_COUNT  < CHORD_PROG_NUM_SIZE; CHORD_PROG_NUM_COUNT ++)
  {
   
   //MIDI VEL SET
    CHORD_VEL = CHORD_PROG_VEL[CHORD_PROG_NUM_COUNT ];

   // CHORD_RUN
    CHORD_PROG_NUM_VALUE = CHORD_PROG_NUM[CHORD_PROG_NUM_COUNT ] - 1;
    CHORD_NOTE_SIZE = sizeof CHORD[CHORD_PROG_NUM_VALUE] / sizeof(CHORD[CHORD_PROG_NUM_VALUE][0]);

   //GATE ON CHECK and DISPLAY REFLASH
    do 
    {
     GATE_CV = digitalRead(GATE_CV_PIN); 
    } while ( GATE_CV != 1 );
    DISPLAY_SW();

   //MIDI NOTE ON
    for ( CHORD_NOTE_COUNT = 0; CHORD_NOTE_COUNT < CHORD_NOTE_SIZE; CHORD_NOTE_COUNT++ )
    {
     CHORD_NOTE_VALUE = CHORD[CHORD_PROG_NUM_VALUE][CHORD_NOTE_COUNT] + CHORD_PROG_OCT[CHORD_PROG_NUM_COUNT ];
     noteOn(CH, CHORD_NOTE_VALUE, CHORD_VEL); // Channel 0, middle C, normal velocity
    }
    MidiUSB.flush();

   //GATE OFF CHECK
    do 
    {      
     GATE_CV = digitalRead(GATE_CV_PIN); 
    } while ( GATE_CV != 0 );
    DISPLAY_SW();

   //MIDI NOTE OFF
    for (CHORD_NOTE_COUNT = 0; CHORD_NOTE_COUNT < CHORD_NOTE_SIZE; CHORD_NOTE_COUNT++ )
    {
     CHORD_NOTE_VALUE = CHORD[CHORD_PROG_NUM_VALUE][CHORD_NOTE_COUNT] + CHORD_PROG_OCT[CHORD_PROG_NUM_COUNT ];
     noteOff(CH, CHORD_NOTE_VALUE, CHORD_VEL); // Channel 0, middle C, normal velocity
    }
    MidiUSB.flush();


   //MIDI CHANNEL CYCLE
    CH = CH + 1 ;
    if ( CH > CH_MAX ){ CH = CH_DEFAULT; }
  }
}


// MIDI 
void programChange(byte channel, byte patch)
{
  midiEventPacket_t event = {0x0C, 0xC0 | channel, patch};
  MidiUSB.sendMIDI(event);
}


void controlChange(byte channel, byte control, byte value)
{
  midiEventPacket_t event = {0x0B, 0xB0 | channel, control, value};
  MidiUSB.sendMIDI(event);
}

void noteOn(byte channel, byte pitch, byte velocity)
{
  midiEventPacket_t noteOn = {0x09, 0x90 | channel, pitch, velocity};
  MidiUSB.sendMIDI(noteOn);
}


void noteOff(byte channel, byte pitch, byte velocity)
{
  midiEventPacket_t noteOff = {0x08, 0x80 | channel, pitch, velocity};
  MidiUSB.sendMIDI(noteOff);
}


void MIDI_CH_ALL_RESET()
{
 controlChange(1,128,0);
 controlChange(2,128,0);
 controlChange(3,128,0);
 controlChange(4,128,0);
 controlChange(5,128,0);
 controlChange(6,128,0);
 controlChange(7,128,0);
 controlChange(8,128,0);
 MidiUSB.flush();
}


void ROTARY_ENCODER_PUSH()
{
 ROTARY_ENCODER_PUISH_SW_FLG = 0;
 ROTARY_ENCODER_PUISH_SW = digitalRead(ROTARY_ENCODER_PUISH_SW_PIN);
 if ((ROTARY_ENCODER_PUISH_SW == 0 ) && ( ROTARY_ENCODER_PUISH_SW_TIME + 300 <= millis() )) 
 { 
   ROTARY_ENCODER_PUISH_SW_TIME = millis();
   ROTARY_ENCODER_PUISH_SW_FLG = 1;
 }
}


void DISPLAY_SW()
{
 //DISPLAY (0:MENU, 1:RUN, 2, EDIT, 3:SAVE)
 switch (DISPLAY_MODE) {
  case 0: //DISPLAY_MENU()
       ROTARY_ENCODER_PUSH();
       if ( ROTARY_ENCODER_PUISH_SW_FLG == 1 ) 
       {
        switch (MENU_NO) {
         case 1: //DISPLAY_RUN()
          DISPLAY_MODE = 1;
          break;
         case 2: //DISPLAY_EDIT()
          DISPLAY_MODE = 2; EDIT_NO = 1; CHORD_PROG_EDIT_MODE = 1; CHORD_PROG_NUM_EDIT_NO = 0;
          break;
         case 3: //DISPLAY_ADD()
          DISPLAY_MODE = 3;
          break;
         case 4: //DISPLAY_SAVE()
          DISPLAY_MODE = 4;
          break;
        }
       } else {
        DISPLAY_MENU();
        ROTARY_ENCODER_DATA = myEnc.read();
        if ( ROTARY_ENCODER_DATA > ROTARY_ENCODER_DATA_OLD + 2 ) //エンコーダ固有の数値ずれを2補正
        {
         MENU_NO = MENU_NO + 1;
         ROTARY_ENCODER_DATA_OLD = ROTARY_ENCODER_DATA;
        } else if ( ROTARY_ENCODER_DATA < ROTARY_ENCODER_DATA_OLD - 2 ){ //エンコーダ固有の数値ずれを2補正
         MENU_NO = MENU_NO - 1;
         ROTARY_ENCODER_DATA_OLD = ROTARY_ENCODER_DATA;
        }      
        if ( MENU_NO > 4 ){ MENU_NO = 4; }
        if ( MENU_NO < 1 ){ MENU_NO = 1; }
       }
       break;
  case 1: //DISPLAY_RUN()
       ROTARY_ENCODER_PUSH();
       if ( ROTARY_ENCODER_PUISH_SW_FLG == 1 ) { DISPLAY_MODE = 0; MENU_NO = 1;}
       else                                    { DISPLAY_RUN(); }
       break;
  case 2: //DISPLAY_EDIT()
       ROTARY_ENCODER_PUSH();
       if ( ROTARY_ENCODER_PUISH_SW_FLG == 1 ) 
       {
        switch (EDIT_NO) {
         case 1: //EXIT to MENU
          DISPLAY_MODE = 0; MENU_NO = 1;
          break;
         case 2: //SAVE
          DISPLAY_MODE = 2; MENU_NO = 2;
          EEPROM_SAVE(); //save flash mem
          break;
         case 3: //EDIT
          switch (CHORD_PROG_EDIT_MODE) {
           case 1: //EDIT MODE:MENU
            EDIT_NO = 3; CHORD_PROG_EDIT_MODE = 2; CHORD_PROG_PAR = 0;                         //to EDIT MODE:SELECT CHORD_PROG_PAR
            CHORD_PROG_NUM_EDIT_NO = 0; CHORD_PROG_OCT_EDIT_NO = 0; CHORD_PROG_VEL_EDIT_NO = 0;          //to EDIT MODE:SELECT CHORD_PROG_PAR
            break;
           case 2: //EDIT MODE:SELECT CHORD_PROG_PAR
            if ( CHORD_PROG_PAR == 0 ) {
             EDIT_NO = 3; CHORD_PROG_EDIT_MODE = 1;                                                   //to EDIT MODE:MENU
            } else {
             EDIT_NO = 3; CHORD_PROG_EDIT_MODE = 3;                                                   //to EDIT MODE:SELECT CHORD_PROG
             CHORD_PROG_NUM_EDIT_NO = -2; CHORD_PROG_OCT_EDIT_NO = -2; CHORD_PROG_VEL_EDIT_NO = -2;          //to EDIT MODE:SELECT CHORD_PROG_NUM            
            }
            break;
           case 3: //EDIT MODE:SELECT CHORD_PROG
            if     ( CHORD_PROG_NUM_EDIT_NO == -1 || CHORD_PROG_OCT_EDIT_NO == -1 || CHORD_PROG_VEL_EDIT_NO == -1 ) { 
             EDIT_NO = 3; CHORD_PROG_EDIT_MODE = 2;                                                  //to EDIT MODE:MENU
             CHORD_PROG_NUM_EDIT_NO = 0; CHORD_PROG_OCT_EDIT_NO = 0; CHORD_PROG_VEL_EDIT_NO = 0;         //to EDIT MODE:MENU
            } else {
             EDIT_NO = 3; CHORD_PROG_EDIT_MODE = 4;                                                  //to EDIT MODE:EDIT
            } 
            break;
           case 4: //EDIT MODE:EDIT
             EDIT_NO = 3; CHORD_PROG_EDIT_MODE = 3;                                                  //to EDIT MODE:SELECT CHORD_PROG
            break;
          }
          break;
        }
       } else {
        byte y = sizeof CHORD_PROG_NUM / sizeof(CHORD_PROG_NUM[0]); //CHORD_PROG_NUM_SIZE
        switch (CHORD_PROG_EDIT_MODE) {
         case 1: //EDIT MODE:MENU
          DISPLAY_EDIT();
          ROTARY_ENCODER_DATA = myEnc.read();
          if ( ROTARY_ENCODER_DATA > ROTARY_ENCODER_DATA_OLD + 2 ) //エンコーダ固有の数値ずれを2補正
          {
           EDIT_NO = EDIT_NO + 1;
           if ( EDIT_NO > 3 ){ EDIT_NO = 3; }
           ROTARY_ENCODER_DATA_OLD = ROTARY_ENCODER_DATA;
          } else if ( ROTARY_ENCODER_DATA < ROTARY_ENCODER_DATA_OLD - 2 ){ //エンコーダ固有の数値ずれを2補正
           EDIT_NO = EDIT_NO - 1;
           if ( EDIT_NO < 2 ){ EDIT_NO = 1; }
           ROTARY_ENCODER_DATA_OLD = ROTARY_ENCODER_DATA;
          }
          break;
         case 2: //EDIT MODE:SELECT CHORD_PROG_PAR
          DISPLAY_EDIT();
          ROTARY_ENCODER_DATA = myEnc.read();
          if ( ROTARY_ENCODER_DATA > ROTARY_ENCODER_DATA_OLD + 2 ) //エンコーダ固有の数値ずれを2補正
          {
           CHORD_PROG_PAR = CHORD_PROG_PAR + 1;
           ROTARY_ENCODER_DATA_OLD = ROTARY_ENCODER_DATA;
          } else if ( ROTARY_ENCODER_DATA < ROTARY_ENCODER_DATA_OLD - 2 ){ //エンコーダ固有の数値ずれを2補正
           CHORD_PROG_PAR = CHORD_PROG_PAR - 1;
           ROTARY_ENCODER_DATA_OLD = ROTARY_ENCODER_DATA;
          }
           if ( CHORD_PROG_PAR > 3 ){ CHORD_PROG_PAR = 3; }
           if ( CHORD_PROG_PAR < 0 ){ CHORD_PROG_PAR = 0; }
 
          break;       
         case 3: //EDIT MODE:SELECT CHORD_PROG
          DISPLAY_EDIT();
          switch (CHORD_PROG_PAR) {
           case 1: //CHORD_PROG_NUM
            ROTARY_ENCODER_DATA = myEnc.read();
            if ( ROTARY_ENCODER_DATA > ROTARY_ENCODER_DATA_OLD + 2 ) //エンコーダ固有の数値ずれを2補正
            {
             CHORD_PROG_NUM_EDIT_NO = CHORD_PROG_NUM_EDIT_NO + 1;
             ROTARY_ENCODER_DATA_OLD = ROTARY_ENCODER_DATA;
            } else if ( ROTARY_ENCODER_DATA < ROTARY_ENCODER_DATA_OLD - 2 ){ //エンコーダ固有の数値ずれを2補正
             CHORD_PROG_NUM_EDIT_NO = CHORD_PROG_NUM_EDIT_NO - 1;
             ROTARY_ENCODER_DATA_OLD = ROTARY_ENCODER_DATA;
            }
            if ( CHORD_PROG_NUM_EDIT_NO > y - 1 ){ CHORD_PROG_NUM_EDIT_NO = y -1 ; }
            if ( CHORD_PROG_NUM_EDIT_NO < 0 ){ CHORD_PROG_NUM_EDIT_NO = -1; }
            break;
           case 2: //CHORD_PROG_OCT
            ROTARY_ENCODER_DATA = myEnc.read();
            if ( ROTARY_ENCODER_DATA > ROTARY_ENCODER_DATA_OLD + 2 ) //エンコーダ固有の数値ずれを2補正
            {
             CHORD_PROG_OCT_EDIT_NO = CHORD_PROG_OCT_EDIT_NO + 1;
             ROTARY_ENCODER_DATA_OLD = ROTARY_ENCODER_DATA;
            } else if ( ROTARY_ENCODER_DATA < ROTARY_ENCODER_DATA_OLD - 2 ){ //エンコーダ固有の数値ずれを2補正
             CHORD_PROG_OCT_EDIT_NO = CHORD_PROG_OCT_EDIT_NO - 1;
             ROTARY_ENCODER_DATA_OLD = ROTARY_ENCODER_DATA;
            }
            if ( CHORD_PROG_OCT_EDIT_NO > y - 1 ){ CHORD_PROG_OCT_EDIT_NO = y -1 ; }
            if ( CHORD_PROG_OCT_EDIT_NO < 0 ){ CHORD_PROG_OCT_EDIT_NO = -1; }
            break;
           case 3: //CHORD_PROG_VEL             
            ROTARY_ENCODER_DATA = myEnc.read();
            if ( ROTARY_ENCODER_DATA > ROTARY_ENCODER_DATA_OLD + 2 ) //エンコーダ固有の数値ずれを2補正
            {
             CHORD_PROG_VEL_EDIT_NO = CHORD_PROG_VEL_EDIT_NO + 1;
             ROTARY_ENCODER_DATA_OLD = ROTARY_ENCODER_DATA;
            } else if ( ROTARY_ENCODER_DATA < ROTARY_ENCODER_DATA_OLD - 2 ){ //エンコーダ固有の数値ずれを2補正
             CHORD_PROG_VEL_EDIT_NO = CHORD_PROG_VEL_EDIT_NO - 1;
             ROTARY_ENCODER_DATA_OLD = ROTARY_ENCODER_DATA;
            }
            if ( CHORD_PROG_VEL_EDIT_NO > y - 1 ){ CHORD_PROG_VEL_EDIT_NO = y -1 ; }
            if ( CHORD_PROG_VEL_EDIT_NO < 0 ){ CHORD_PROG_VEL_EDIT_NO = -1; }
            break;
          }
          break;
         case 4: //EDIT MODE:EDIT
          DISPLAY_EDIT();
          switch (CHORD_PROG_PAR) {
           case 1: //CHORD_PROG_NUM
            ROTARY_ENCODER_DATA = myEnc.read();
            if ( ROTARY_ENCODER_DATA > ROTARY_ENCODER_DATA_OLD + 2 ) //エンコーダ固有の数値ずれを2補正
            {
             CHORD_PROG_NUM[CHORD_PROG_NUM_EDIT_NO] = CHORD_PROG_NUM[CHORD_PROG_NUM_EDIT_NO] + 1;
             ROTARY_ENCODER_DATA_OLD = ROTARY_ENCODER_DATA;
            } else if ( ROTARY_ENCODER_DATA < ROTARY_ENCODER_DATA_OLD - 2 ){ //エンコーダ固有の数値ずれを2補正
             CHORD_PROG_NUM[CHORD_PROG_NUM_EDIT_NO] = CHORD_PROG_NUM[CHORD_PROG_NUM_EDIT_NO] - 1;
             ROTARY_ENCODER_DATA_OLD = ROTARY_ENCODER_DATA;
            }
            if ( CHORD_PROG_NUM[CHORD_PROG_NUM_EDIT_NO] > 7 ){ CHORD_PROG_NUM[CHORD_PROG_NUM_EDIT_NO] = 7; }
            if ( CHORD_PROG_NUM[CHORD_PROG_NUM_EDIT_NO] < 1 ){ CHORD_PROG_NUM[CHORD_PROG_NUM_EDIT_NO] = 1; }
            break;
           case 2: //CHORD_PROG_OCT
            ROTARY_ENCODER_DATA = myEnc.read();
            if ( ROTARY_ENCODER_DATA > ROTARY_ENCODER_DATA_OLD + 2 ) //エンコーダ固有の数値ずれを2補正
            {
             CHORD_PROG_OCT[CHORD_PROG_OCT_EDIT_NO] = CHORD_PROG_OCT[CHORD_PROG_OCT_EDIT_NO] + 1;
             ROTARY_ENCODER_DATA_OLD = ROTARY_ENCODER_DATA;
            } else if ( ROTARY_ENCODER_DATA < ROTARY_ENCODER_DATA_OLD - 2 ){ //エンコーダ固有の数値ずれを2補正
             CHORD_PROG_OCT[CHORD_PROG_OCT_EDIT_NO] = CHORD_PROG_OCT[CHORD_PROG_OCT_EDIT_NO] - 1;
             ROTARY_ENCODER_DATA_OLD = ROTARY_ENCODER_DATA;
            }
            if ( CHORD_PROG_OCT[CHORD_PROG_OCT_EDIT_NO] > 14 ){ CHORD_PROG_OCT[CHORD_PROG_OCT_EDIT_NO] = 0;  }
            if ( CHORD_PROG_OCT[CHORD_PROG_OCT_EDIT_NO] > 12 ){ CHORD_PROG_OCT[CHORD_PROG_OCT_EDIT_NO] = 12; }
            if ( CHORD_PROG_OCT[CHORD_PROG_OCT_EDIT_NO] < 1  ){ CHORD_PROG_OCT[CHORD_PROG_OCT_EDIT_NO] = 0;  }
            break;
           case 3: //CHORD_PROG_VEL
            ROTARY_ENCODER_DATA = myEnc.read();
            if ( ROTARY_ENCODER_DATA > ROTARY_ENCODER_DATA_OLD + 2 ) //エンコーダ固有の数値ずれを2補正
            {
             CHORD_PROG_VEL[CHORD_PROG_VEL_EDIT_NO] = CHORD_PROG_VEL[CHORD_PROG_VEL_EDIT_NO] + 1;
             ROTARY_ENCODER_DATA_OLD = ROTARY_ENCODER_DATA;
            } else if ( ROTARY_ENCODER_DATA < ROTARY_ENCODER_DATA_OLD - 2 ){ //エンコーダ固有の数値ずれを2補正
             CHORD_PROG_VEL[CHORD_PROG_VEL_EDIT_NO] = CHORD_PROG_VEL[CHORD_PROG_VEL_EDIT_NO] - 1;
             ROTARY_ENCODER_DATA_OLD = ROTARY_ENCODER_DATA;
            }
            if ( CHORD_PROG_VEL[CHORD_PROG_VEL_EDIT_NO] > 127 ){ CHORD_PROG_VEL[CHORD_PROG_VEL_EDIT_NO] = 127; }
            if ( CHORD_PROG_VEL[CHORD_PROG_VEL_EDIT_NO] < 1 ){ CHORD_PROG_VEL[CHORD_PROG_VEL_EDIT_NO] = 1; }
            break;
          }
         break;
        }
       }
       break;
  case 3:  //DISPLAY_ADD()
       ROTARY_ENCODER_PUSH();
       if ( ROTARY_ENCODER_PUISH_SW_FLG == 1 ) { DISPLAY_MODE = 0; MENU_NO = 1;}
       else                                    { DISPLAY_ADD(); }
       break;
  case 4:  //DISPLAY_SAVE()
       ROTARY_ENCODER_PUSH();
       if ( ROTARY_ENCODER_PUISH_SW_FLG == 1 ) { DISPLAY_MODE = 0; MENU_NO = 1;}
       else                                    { DISPLAY_SAVE(); }
       break;
 }
}


//Display 
void DISPLAY_START()
{
  display.clearDisplay(); display.setCursor(0,0);
  display.setTextSize(1); display.setTextColor(WHITE);       display.println("");
  display.setTextSize(2); display.setTextColor(WHITE);       display.println("Chord Prog");
  display.setTextSize(2); display.setTextColor(WHITE);       display.println("Genarator");
  display.setTextSize(1); display.setTextColor(WHITE);       display.println("");
  display.setTextSize(1); display.setTextColor(WHITE);       display.println("Ver 1.00");
  display.display();        
  delay(800);
}


void DISPLAY_MENU()
{
 display.clearDisplay(); display.setCursor(0,0);
 display.setTextSize(2); display.setTextColor(WHITE);        display.println("MENU:");
 display.setTextSize(1); display.setTextColor(WHITE);        display.println("");
 switch (MENU_NO) {
  case 1:
   display.setTextSize(1); display.setTextColor(BLACK,WHITE); display.println("1:EXIT to RUN");
   display.setTextSize(1); display.setTextColor(WHITE);       display.println("2:EDIT CHORD PROG");
   display.setTextSize(1); display.setTextColor(WHITE);       display.println("3:ADD  CHORD PROG");
   display.setTextSize(1); display.setTextColor(WHITE);       display.println("4:SAVE CHORD PROG");
   break;
  case 2:
   display.setTextSize(1); display.setTextColor(WHITE);       display.println("1:EXIT to RUN");
   display.setTextSize(1); display.setTextColor(BLACK,WHITE); display.println("2:EDIT CHORD PROG");
   display.setTextSize(1); display.setTextColor(WHITE);       display.println("3:ADD  CHORD PROG");
   display.setTextSize(1); display.setTextColor(WHITE);       display.println("4:SAVE CHORD PROG");
   break;
  case 3:
   display.setTextSize(1); display.setTextColor(WHITE);       display.println("1:EXIT to RUN");
   display.setTextSize(1); display.setTextColor(WHITE);       display.println("2:EDIT CHORD PROG");
   display.setTextSize(1); display.setTextColor(BLACK,WHITE); display.println("3:ADD  CHORD PROG");
   display.setTextSize(1); display.setTextColor(WHITE);       display.println("4:SAVE CHORD PROG");
   break;
  case 4:
   display.setTextSize(1); display.setTextColor(WHITE);       display.println("1:EXIT to RUN");
   display.setTextSize(1); display.setTextColor(WHITE);       display.println("2:EDIT CHORD PROG");
   display.setTextSize(1); display.setTextColor(WHITE);       display.println("3:ADD  CHORD PROG");
   display.setTextSize(1); display.setTextColor(BLACK,WHITE); display.println("4:SAVE CHORD PROG");
   break;
 }
 display.display();
}


void DISPLAY_RUN()
{
 //CHORD_KEY:
  byte NO1=CHORD[0][0];
  byte NO2=CHORD[0][1];
  byte NO3=CHORD[0][2];
  display.clearDisplay(); display.setCursor(0,0);
  display.setTextSize(1); display.setTextColor(WHITE);       display.print  ("ROOT KEY:");
  display.setTextSize(1); display.setTextColor(WHITE);       display.print  (NO1);
  display.setTextSize(1); display.setTextColor(WHITE);       display.print  (",");
  display.setTextSize(1); display.setTextColor(WHITE);       display.print  (NO2);
  display.setTextSize(1); display.setTextColor(WHITE);       display.print  (",");  
  display.setTextSize(1); display.setTextColor(WHITE);       display.print  (NO3);
  display.setTextSize(1); display.setTextColor(WHITE);       display.println("");  
  display.setTextSize(1); display.setTextColor(WHITE);       display.print  (" "); 
  display.setTextSize(2); display.setTextColor(WHITE);       display.print  (NOTE_LIST[NO1]);
  switch (CHORD_KEY) {
   case 0: //MAJYOR
    display.setTextSize(1); display.setTextColor(WHITE);       display.print  (" Major");
    break;
   case 1: //MINOR
    display.setTextSize(2); display.setTextColor(WHITE);       display.print  ("m"); 
    display.setTextSize(1); display.setTextColor(WHITE);       display.print  (" minor"); 
    break;
  }
  display.setTextSize(2); display.setTextColor(WHITE);       display.println("");  
  
 //PARALLEL:
  display.setTextSize(1); display.setTextColor(WHITE);       display.print  ("PARALLEL:");
  switch (PARALLEL_KEY) {
   case 0:
    display.setTextSize(1); display.setTextColor(WHITE);       display.print  ("Maj");
    display.setTextSize(1); display.setTextColor(WHITE);       display.print  (" "); 
    display.setTextSize(1); display.setTextColor(BLACK,WHITE); display.println("min");
    break;
   case 1:
    display.setTextSize(1); display.setTextColor(BLACK,WHITE); display.print  ("Maj");
    display.setTextSize(1); display.setTextColor(WHITE);       display.print  (" "); 
    display.setTextSize(1); display.setTextColor(WHITE);       display.println("min");
    break;
  }

 //RELATIVE:
  display.setTextSize(1); display.setTextColor(WHITE);       display.print  ("RELATIVE:");
  switch (RELATIVE_KEY) 
  {
   case 0:
    display.setTextSize(1); display.setTextColor(BLACK,WHITE); display.print  ("ON");
    display.setTextSize(1); display.setTextColor(WHITE);       display.print  (" "); 
    display.setTextSize(1); display.setTextColor(WHITE);       display.println("OFF");
    break;
   case 1:
    display.setTextSize(1); display.setTextColor(WHITE);       display.print  ("ON");
    display.setTextSize(1); display.setTextColor(WHITE);       display.print  (" "); 
    display.setTextSize(1); display.setTextColor(BLACK,WHITE); display.println("OFF");
    break;
  }

 //DOMINANT_KEY:
  display.setTextSize(1); display.setTextColor(WHITE);       display.print  ("DOMINANT:");
  if ( DOMINANT_KEY == 1 && SUBDOMINANT_KEY == 1 )
  {
    display.setTextSize(1); display.setTextColor(WHITE);       display.print  ("DOM");
    display.setTextSize(1); display.setTextColor(WHITE);       display.print  (" "); 
    display.setTextSize(1); display.setTextColor(BLACK,WHITE); display.print  ("OFF");
    display.setTextSize(1); display.setTextColor(WHITE);       display.print  (" "); 
    display.setTextSize(1); display.setTextColor(WHITE);       display.println("SUB");
  } else if ( DOMINANT_KEY == 0 && SUBDOMINANT_KEY == 1 ) {
    display.setTextSize(1); display.setTextColor(BLACK,WHITE); display.print  ("DOM");
    display.setTextSize(1); display.setTextColor(WHITE);       display.print  (" "); 
    display.setTextSize(1); display.setTextColor(WHITE);       display.print  ("OFF");
    display.setTextSize(1); display.setTextColor(WHITE);       display.print  (" "); 
    display.setTextSize(1); display.setTextColor(WHITE);       display.println("SUB");
  } else if ( DOMINANT_KEY == 1 && SUBDOMINANT_KEY == 0 )  {
   display.setTextSize(1); display.setTextColor(WHITE);       display.print  ("DOM");
   display.setTextSize(1); display.setTextColor(WHITE);       display.print  (" "); 
   display.setTextSize(1); display.setTextColor(WHITE);       display.print  ("OFF");
   display.setTextSize(1); display.setTextColor(WHITE);       display.print  (" "); 
   display.setTextSize(1); display.setTextColor(BLACK,WHITE); display.println("SUB");
  }

  display.setTextSize(1); display.setTextColor(WHITE);       display.println("CHORD NUM: ");
  display.setTextSize(1); display.setTextColor(WHITE);       display.print  (" "); 
  display.setTextSize(1); display.setTextColor(WHITE);       display.print  (GATE_CV);
  display.setTextSize(1); display.setTextColor(WHITE);       display.print  (":");

 //CHORD_PROG_NUM
  CHORD_PROG_NUM_SIZE = sizeof CHORD_PROG_NUM / sizeof(CHORD_PROG_NUM[0]);
  for (byte CHORD_PROG_NUM_COUNT_TMP = 0; CHORD_PROG_NUM_COUNT_TMP < CHORD_PROG_NUM_SIZE; CHORD_PROG_NUM_COUNT_TMP++)
  {
   byte CHORD_PROG_NUM_VALUE_TMP = CHORD_PROG_NUM[CHORD_PROG_NUM_COUNT_TMP];
   //VALUE From MIDI_CHORD() : CHORD_PROG_NUM_COUNT
   if ( CHORD_PROG_NUM_COUNT_TMP == CHORD_PROG_NUM_COUNT  )
   {
    display.setTextSize(1); display.setTextColor(BLACK, WHITE);
   } else {
    display.setTextSize(1); display.setTextColor(WHITE);       
   }
   
   display.print  (CHORD_PROG_NUM_VALUE_TMP);
   
   if ( CHORD_PROG_NUM_COUNT_TMP != CHORD_PROG_NUM_SIZE - 1 )
   {
    display.setTextSize(1); display.setTextColor(WHITE);       display.print  ("-"); 
   } else {
    display.setTextSize(1); display.setTextColor(WHITE);       display.println("");
   }
  }
 display.display();      
}

void DISPLAY_EDIT()
{
 display.clearDisplay(); display.setCursor(0,0);
 display.setTextSize(2); display.setTextColor(WHITE);       display.println("EDIT:");
 display.setTextSize(1); display.setTextColor(WHITE);       display.println("");
 switch (EDIT_NO) {
  case 1:
   display.setTextSize(1); display.setTextColor(BLACK,WHITE); display.println("1:EXIT to MENU");
   display.setTextSize(1); display.setTextColor(WHITE);       display.println("2:SAVE");
   display.setTextSize(1); display.setTextColor(WHITE);       display.println("3:PROG EDIT");
   display.setTextSize(1); display.setTextColor(WHITE);       display.print  (" ");
   break;
  case 2:
   display.setTextSize(1); display.setTextColor(WHITE);       display.println("1:EXIT to MENU");
   display.setTextSize(1); display.setTextColor(BLACK,WHITE); display.println("2:SAVE");
   display.setTextSize(1); display.setTextColor(WHITE);       display.println("3:PROG EDIT");
   display.setTextSize(1); display.setTextColor(WHITE);       display.print  (" ");
   break;

  case 3:
   switch (CHORD_PROG_EDIT_MODE) {
    case 1:
     display.setTextSize(1); display.setTextColor(WHITE);        display.println("1:EXIT to MENU");
     display.setTextSize(1); display.setTextColor(WHITE);        display.println("2:SAVE");
     display.setTextSize(1); display.setTextColor(BLACK, WHITE); display.println("3:PROG EDIT");
     break;
    case 2:
 
     switch (CHORD_PROG_PAR) {
      case 0: //MENU
       display.setTextSize(1); display.setTextColor(BLACK, WHITE); display.println("3:PROG EDIT [EXIT]");
       display.setTextSize(1); display.setTextColor(WHITE);        display.print  (" NUM: ");
       CHORD_PROG_NUM_SIZE = sizeof CHORD_PROG_NUM / sizeof(CHORD_PROG_NUM[0]);
       for ( byte CHORD_PROG_OCT_COUNT_TMP = 0; CHORD_PROG_OCT_COUNT_TMP < CHORD_PROG_NUM_SIZE ; CHORD_PROG_OCT_COUNT_TMP++ )
       {
        byte CHORD_PROG_NUM_VALUE_TMP = CHORD_PROG_NUM[CHORD_PROG_OCT_COUNT_TMP];
        display.setTextSize(1); display.setTextColor(WHITE);        display.print  (CHORD_PROG_NUM_VALUE_TMP);
        display.setTextSize(1); display.setTextColor(WHITE);        display.print  (" ");
       }
       display.setTextSize(1); display.setTextColor(WHITE);        display.println  ("");
       display.setTextSize(1); display.setTextColor(WHITE);        display.print  (" OCT: ");
       CHORD_PROG_OCT_SIZE = sizeof CHORD_PROG_OCT / sizeof(CHORD_PROG_OCT[0]);
       for ( byte CHORD_PROG_OCT_COUNT_TMP = 0; CHORD_PROG_OCT_COUNT_TMP < CHORD_PROG_OCT_SIZE ; CHORD_PROG_OCT_COUNT_TMP++ )
       {
        byte CHORD_PROG_OCT_VALUE_TMP = CHORD_PROG_OCT[CHORD_PROG_OCT_COUNT_TMP];
        display.setTextSize(1); display.setTextColor(WHITE);        display.print  (CHORD_PROG_OCT_VALUE_TMP);
        display.setTextSize(1); display.setTextColor(WHITE);        display.print  (" ");
       }
       display.setTextSize(1); display.setTextColor(WHITE);        display.println  ("");
       display.setTextSize(1); display.setTextColor(WHITE);        display.print  (" VEL: ");
       CHORD_PROG_VEL_SIZE = sizeof CHORD_PROG_VEL / sizeof(CHORD_PROG_VEL[0]);
       for ( byte CHORD_PROG_VEL_COUNT_TMP = 0; CHORD_PROG_VEL_COUNT_TMP < CHORD_PROG_VEL_SIZE ; CHORD_PROG_VEL_COUNT_TMP++ )
       {
        byte CHORD_PROG_VEL_VALUE_TMP = CHORD_PROG_VEL[CHORD_PROG_VEL_COUNT_TMP];
        display.setTextSize(1); display.setTextColor(WHITE);        display.print  (CHORD_PROG_VEL_VALUE_TMP);
        display.setTextSize(1); display.setTextColor(WHITE);        display.print  (" ");
       }
       display.setTextSize(1); display.setTextColor(WHITE);        display.println  ("");
       break;
      case 1: //CHORD_PROG_NUM
       display.setTextSize(1); display.setTextColor(WHITE);        display.println("3:PROG EDIT [EXIT]");
       display.setTextSize(1); display.setTextColor(BLACK, WHITE); display.print  (" NUM: ");
       CHORD_PROG_NUM_SIZE = sizeof CHORD_PROG_NUM / sizeof(CHORD_PROG_NUM[0]);
       for ( byte CHORD_PROG_NUM_COUNT_TMP = 0; CHORD_PROG_NUM_COUNT_TMP < CHORD_PROG_NUM_SIZE ; CHORD_PROG_NUM_COUNT_TMP++ )
       {
        byte CHORD_PROG_NUM_VALUE_TMP = CHORD_PROG_NUM[CHORD_PROG_NUM_COUNT_TMP];
        display.setTextSize(1); display.setTextColor(BLACK, WHITE); display.print  (CHORD_PROG_NUM_VALUE_TMP);
        display.setTextSize(1); display.setTextColor(BLACK, WHITE); display.print  (" ");
       }
       display.setTextSize(1); display.setTextColor(WHITE);        display.println  ("");
       display.setTextSize(1); display.setTextColor(WHITE);        display.print  (" OCT: ");
       CHORD_PROG_OCT_SIZE = sizeof CHORD_PROG_OCT / sizeof(CHORD_PROG_OCT[0]);
       for ( byte CHORD_PROG_OCT_COUNT_TMP = 0; CHORD_PROG_OCT_COUNT_TMP < CHORD_PROG_OCT_SIZE ; CHORD_PROG_OCT_COUNT_TMP++ )
       {
        byte CHORD_PROG_OCT_VALUE_TMP = CHORD_PROG_OCT[CHORD_PROG_OCT_COUNT_TMP];
        display.setTextSize(1); display.setTextColor(WHITE);        display.print  (CHORD_PROG_OCT_VALUE_TMP);
        display.setTextSize(1); display.setTextColor(WHITE);        display.print  (" ");
       }
       display.setTextSize(1); display.setTextColor(WHITE);        display.println  ("");     
       display.setTextSize(1); display.setTextColor(WHITE);        display.print  (" VEL: ");
       CHORD_PROG_VEL_SIZE = sizeof CHORD_PROG_VEL / sizeof(CHORD_PROG_VEL[0]);
       for ( byte CHORD_PROG_VEL_COUNT_TMP = 0; CHORD_PROG_VEL_COUNT_TMP < CHORD_PROG_VEL_SIZE ; CHORD_PROG_VEL_COUNT_TMP++ )
       {
        byte CHORD_PROG_VEL_VALUE_TMP = CHORD_PROG_VEL[CHORD_PROG_VEL_COUNT_TMP];
        display.setTextSize(1); display.setTextColor(WHITE);        display.print  (CHORD_PROG_VEL_VALUE_TMP);
        display.setTextSize(1); display.setTextColor(WHITE);        display.print  (" ");
       }
       display.setTextSize(1); display.setTextColor(WHITE);        display.println  ("");
       break;
      case 2: //CHORD_PROG_OCT
       display.setTextSize(1); display.setTextColor(WHITE);        display.println("3:PROG EDIT [EXIT]");
       display.setTextSize(1); display.setTextColor(WHITE);        display.print  (" NUM: ");
       CHORD_PROG_NUM_SIZE = sizeof CHORD_PROG_NUM / sizeof(CHORD_PROG_NUM[0]);
       for ( byte CHORD_PROG_NUM_COUNT_TMP = 0; CHORD_PROG_NUM_COUNT_TMP < CHORD_PROG_NUM_SIZE ; CHORD_PROG_NUM_COUNT_TMP++ )
       {
        byte CHORD_PROG_NUM_VALUE_TMP = CHORD_PROG_NUM[CHORD_PROG_NUM_COUNT_TMP];
        display.setTextSize(1); display.setTextColor(WHITE);        display.print  (CHORD_PROG_NUM_VALUE_TMP);
        display.setTextSize(1); display.setTextColor(WHITE);        display.print  (" ");
       }
       display.setTextSize(1); display.setTextColor(WHITE);        display.println  ("");
       display.setTextSize(1); display.setTextColor(BLACK, WHITE); display.print  (" OCT: ");
       CHORD_PROG_OCT_SIZE = sizeof CHORD_PROG_OCT / sizeof(CHORD_PROG_OCT[0]);
       for ( byte CHORD_PROG_OCT_COUNT_TMP = 0; CHORD_PROG_OCT_COUNT_TMP < CHORD_PROG_OCT_SIZE ; CHORD_PROG_OCT_COUNT_TMP++ )
       {
        byte CHORD_PROG_OCT_VALUE_TMP = CHORD_PROG_OCT[CHORD_PROG_OCT_COUNT_TMP];
        display.setTextSize(1); display.setTextColor(BLACK, WHITE); display.print  (CHORD_PROG_OCT_VALUE_TMP);
        display.setTextSize(1); display.setTextColor(BLACK, WHITE); display.print  (" ");
       }
       display.setTextSize(1); display.setTextColor(WHITE);        display.println  ("");     
       display.setTextSize(1); display.setTextColor(WHITE);        display.print  (" VEL: ");
       CHORD_PROG_VEL_SIZE = sizeof CHORD_PROG_VEL / sizeof(CHORD_PROG_VEL[0]);
       for ( byte CHORD_PROG_VEL_COUNT_TMP = 0; CHORD_PROG_VEL_COUNT_TMP < CHORD_PROG_VEL_SIZE ; CHORD_PROG_VEL_COUNT_TMP++ )
       {
        byte CHORD_PROG_VEL_VALUE_TMP = CHORD_PROG_VEL[CHORD_PROG_VEL_COUNT_TMP];
        display.setTextSize(1); display.setTextColor(WHITE);        display.print  (CHORD_PROG_VEL_VALUE_TMP);
        display.setTextSize(1); display.setTextColor(WHITE);        display.print  (" ");
       }
       display.setTextSize(1); display.setTextColor(WHITE);        display.println  ("");
       break;
      case 3: //CHORD_PROG_VEL
       display.setTextSize(1); display.setTextColor(WHITE);        display.println("3:PROG EDIT [EXIT]");
       display.setTextSize(1); display.setTextColor(WHITE);        display.print  (" NUM: ");
       CHORD_PROG_NUM_SIZE = sizeof CHORD_PROG_NUM / sizeof(CHORD_PROG_NUM[0]);
       for ( byte CHORD_PROG_NUM_COUNT_TMP = 0; CHORD_PROG_NUM_COUNT_TMP < CHORD_PROG_NUM_SIZE ; CHORD_PROG_NUM_COUNT_TMP++ )
       {
        byte CHORD_PROG_NUM_VALUE_TMP = CHORD_PROG_NUM[CHORD_PROG_NUM_COUNT_TMP];
        display.setTextSize(1); display.setTextColor(WHITE);        display.print  (CHORD_PROG_NUM_VALUE_TMP);
        display.setTextSize(1); display.setTextColor(WHITE);        display.print  (" ");
       }
       display.setTextSize(1); display.setTextColor(WHITE);        display.println  ("");
       display.setTextSize(1); display.setTextColor(WHITE);        display.print  (" OCT: ");
       CHORD_PROG_OCT_SIZE = sizeof CHORD_PROG_OCT / sizeof(CHORD_PROG_OCT[0]);
       for ( byte CHORD_PROG_OCT_COUNT_TMP = 0; CHORD_PROG_OCT_COUNT_TMP < CHORD_PROG_OCT_SIZE ; CHORD_PROG_OCT_COUNT_TMP++ )
       {
        byte CHORD_PROG_OCT_VALUE_TMP = CHORD_PROG_OCT[CHORD_PROG_OCT_COUNT_TMP];
        display.setTextSize(1); display.setTextColor(WHITE);        display.print  (CHORD_PROG_OCT_VALUE_TMP);
        display.setTextSize(1); display.setTextColor(WHITE);        display.print  (" ");
       }
       display.setTextSize(1); display.setTextColor(WHITE);        display.println  ("");     
       display.setTextSize(1); display.setTextColor(BLACK, WHITE); display.print  (" VEL: ");
       CHORD_PROG_VEL_SIZE = sizeof CHORD_PROG_VEL / sizeof(CHORD_PROG_VEL[0]);
       for ( byte CHORD_PROG_VEL_COUNT_TMP = 0; CHORD_PROG_VEL_COUNT_TMP < CHORD_PROG_VEL_SIZE ; CHORD_PROG_VEL_COUNT_TMP++ )
       {
        byte CHORD_PROG_VEL_VALUE_TMP = CHORD_PROG_VEL[CHORD_PROG_VEL_COUNT_TMP];
        display.setTextSize(1); display.setTextColor(BLACK, WHITE); display.print  (CHORD_PROG_VEL_VALUE_TMP);
        display.setTextSize(1); display.setTextColor(BLACK, WHITE); display.print  (" ");
       }
       display.setTextSize(1); display.setTextColor(WHITE);        display.println  ("");
       break;
     }      
     break;
     
  default:
     display.setTextSize(1); display.setTextColor(WHITE);        display.println("3:PROG EDIT [EXIT]");

     if ( CHORD_PROG_NUM_EDIT_NO == -1 ) {
      display.setTextSize(1); display.setTextColor(BLACK, WHITE); display.print  (" NUM: ");
      CHORD_PROG_NUM_SIZE = sizeof CHORD_PROG_NUM / sizeof(CHORD_PROG_NUM[0]);
      for ( byte CHORD_PROG_NUM_COUNT_TMP = 0; CHORD_PROG_NUM_COUNT_TMP < CHORD_PROG_NUM_SIZE ; CHORD_PROG_NUM_COUNT_TMP++ )
      {
       byte CHORD_PROG_NUM_VALUE_TMP = CHORD_PROG_NUM[CHORD_PROG_NUM_COUNT_TMP];
       display.setTextSize(1); display.setTextColor(WHITE);        display.print  (CHORD_PROG_NUM_VALUE_TMP);
       display.setTextSize(1); display.setTextColor(WHITE);        display.print  (" ");
      }
      display.setTextSize(1); display.setTextColor(WHITE);        display.println  ("");
     } else {
      display.setTextSize(1); display.setTextColor(WHITE);        display.print  (" NUM: ");
      CHORD_PROG_NUM_SIZE = sizeof CHORD_PROG_NUM / sizeof(CHORD_PROG_NUM[0]);
      for ( byte CHORD_PROG_NUM_COUNT_TMP = 0; CHORD_PROG_NUM_COUNT_TMP < CHORD_PROG_NUM_SIZE ; CHORD_PROG_NUM_COUNT_TMP++ )
      {
       byte CHORD_PROG_NUM_VALUE_TMP = CHORD_PROG_NUM[CHORD_PROG_NUM_COUNT_TMP];
       if ( CHORD_PROG_NUM_COUNT_TMP == CHORD_PROG_NUM_EDIT_NO ){
        display.setTextSize(1); display.setTextColor(BLACK, WHITE); display.print  (CHORD_PROG_NUM_VALUE_TMP);
       } else {
        display.setTextSize(1); display.setTextColor(WHITE);        display.print  (CHORD_PROG_NUM_VALUE_TMP);
       }
       display.setTextSize(1); display.setTextColor(WHITE);        display.print  (" ");
      }
      display.setTextSize(1); display.setTextColor(WHITE);        display.println  ("");
     }

     if ( CHORD_PROG_OCT_EDIT_NO == -1 ) {
      display.setTextSize(1); display.setTextColor(BLACK, WHITE); display.print  (" OCT: ");
      CHORD_PROG_OCT_SIZE = sizeof CHORD_PROG_OCT / sizeof(CHORD_PROG_OCT[0]);
      for ( byte CHORD_PROG_OCT_COUNT_TMP = 0; CHORD_PROG_OCT_COUNT_TMP < CHORD_PROG_OCT_SIZE ; CHORD_PROG_OCT_COUNT_TMP++ )
      {
       byte CHORD_PROG_OCT_VALUE_TMP = CHORD_PROG_OCT[CHORD_PROG_OCT_COUNT_TMP];
       display.setTextSize(1); display.setTextColor(WHITE);        display.print  (CHORD_PROG_OCT_VALUE_TMP);
       display.setTextSize(1); display.setTextColor(WHITE);        display.print  (" ");
      }
      display.setTextSize(1); display.setTextColor(WHITE);        display.println  ("");
     } else {
      display.setTextSize(1); display.setTextColor(WHITE);        display.print  (" OCT: ");
      CHORD_PROG_OCT_SIZE = sizeof CHORD_PROG_OCT / sizeof(CHORD_PROG_OCT[0]);
      for ( byte CHORD_PROG_OCT_COUNT_TMP = 0; CHORD_PROG_OCT_COUNT_TMP < CHORD_PROG_OCT_SIZE ; CHORD_PROG_OCT_COUNT_TMP++ )
      {
       byte CHORD_PROG_OCT_VALUE_TMP = CHORD_PROG_OCT[CHORD_PROG_OCT_COUNT_TMP];
       if ( CHORD_PROG_OCT_COUNT_TMP == CHORD_PROG_OCT_EDIT_NO ){
        display.setTextSize(1); display.setTextColor(BLACK, WHITE); display.print  (CHORD_PROG_OCT_VALUE_TMP);
       } else {
        display.setTextSize(1); display.setTextColor(WHITE);        display.print  (CHORD_PROG_OCT_VALUE_TMP);
       }
       display.setTextSize(1); display.setTextColor(WHITE);        display.print  (" ");
      }
      display.setTextSize(1); display.setTextColor(WHITE);        display.println  ("");
     }

     if ( CHORD_PROG_VEL_EDIT_NO == -1 ) {
      display.setTextSize(1); display.setTextColor(BLACK, WHITE); display.print  (" VEL: ");
      CHORD_PROG_VEL_SIZE = sizeof CHORD_PROG_VEL / sizeof(CHORD_PROG_VEL[0]);
      for ( byte CHORD_PROG_VEL_COUNT_TMP = 0; CHORD_PROG_VEL_COUNT_TMP < CHORD_PROG_VEL_SIZE ; CHORD_PROG_VEL_COUNT_TMP++ )
      {
       byte CHORD_PROG_VEL_VALUE_TMP = CHORD_PROG_VEL[CHORD_PROG_VEL_COUNT_TMP];
       display.setTextSize(1); display.setTextColor(WHITE);        display.print  (CHORD_PROG_VEL_VALUE_TMP);
       display.setTextSize(1); display.setTextColor(WHITE);        display.print  (" ");
      }
     } else {
      display.setTextSize(1); display.setTextColor(WHITE);        display.print  (" VEL: ");
      CHORD_PROG_VEL_SIZE = sizeof CHORD_PROG_VEL / sizeof(CHORD_PROG_VEL[0]);
      for ( byte CHORD_PROG_VEL_COUNT_TMP = 0; CHORD_PROG_VEL_COUNT_TMP < CHORD_PROG_VEL_SIZE ; CHORD_PROG_VEL_COUNT_TMP++ )
      {
       byte CHORD_PROG_VEL_VALUE_TMP = CHORD_PROG_VEL[CHORD_PROG_VEL_COUNT_TMP];
       if ( CHORD_PROG_VEL_COUNT_TMP == CHORD_PROG_VEL_EDIT_NO ){
        display.setTextSize(1); display.setTextColor(BLACK, WHITE); display.print  (CHORD_PROG_VEL_VALUE_TMP);
       } else {
        display.setTextSize(1); display.setTextColor(WHITE);        display.print  (CHORD_PROG_VEL_VALUE_TMP);
       }
       display.setTextSize(1); display.setTextColor(WHITE);        display.print  (" ");
      }
     }
     break;
   } 
   break;
 }

 display.setTextSize(1); display.setTextColor(WHITE);       display.println("");
 display.display();
}


void DISPLAY_ADD(){
 display.clearDisplay(); display.setCursor(0,0);
 display.setTextSize(2); display.setTextColor(WHITE);       display.println("ADD:");
 display.setTextSize(1); display.setTextColor(WHITE);       display.println("");
 switch (ADD_NO) {
  case 1:
   display.setTextSize(1); display.setTextColor(BLACK,WHITE); display.println("1:EXIT to MENU");
   display.setTextSize(1); display.setTextColor(WHITE);       display.println("2:ADD");
   break;
  case 2:
   display.setTextSize(1); display.setTextColor(WHITE);       display.println("1:EXIT to MENU");
   display.setTextSize(1); display.setTextColor(BLACK,WHITE); display.println("2:ADD");
   break;
 }

 display.setTextSize(1); display.setTextColor(WHITE);       display.println("");
 display.display();
}


void DISPLAY_SAVE(){
 display.clearDisplay(); display.setCursor(0,0);
 display.setTextSize(2); display.setTextColor(WHITE);       display.println("SAVE:");
 display.setTextSize(1); display.setTextColor(WHITE);       display.println("");
 switch (SAVE_NO) {
  case 1:
   display.setTextSize(1); display.setTextColor(BLACK,WHITE); display.println("1:EXIT to MENU");
   display.setTextSize(1); display.setTextColor(WHITE);       display.println("2:SAVE");
   break;
  case 2:
   display.setTextSize(1); display.setTextColor(WHITE);       display.println("1:EXIT to MENU");
   display.setTextSize(1); display.setTextColor(BLACK,WHITE); display.println("2:SAVE");
   break;
 }

 display.setTextSize(1); display.setTextColor(WHITE);       display.println("");
 display.display();
}

余談


ハギオ氏のモジュラーシンセを作成しようと思ったところから始めたが、全く異なるものになってしまった。ハギヲさん申し訳ない。


この記事が気に入ったらサポートをしてみませんか?