![見出し画像](https://assets.st-note.com/production/uploads/images/79573753/rectangle_large_type_2_1a7d8cc9e836ffc1194855ddd5ec3132.jpeg?width=1200)
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音源
![](https://assets.st-note.com/img/1653830961132-5bWmvSFiLc.jpg?width=1200)
![](https://assets.st-note.com/img/1653830966077-WXeDWiHg8R.jpg?width=1200)
![](https://assets.st-note.com/img/1653830975580-c5vshm46Sc.jpg?width=1200)
![](https://assets.st-note.com/img/1653830980212-yhAZEqe75G.jpg?width=1200)
![](https://assets.st-note.com/img/1653830985503-WKvEJPLrrd.jpg?width=1200)
![](https://assets.st-note.com/img/1654391162909-2cYd1HOzqe.jpg?width=1200)
MIDI音源のQWRT-003 MIDI NSX-1 Panel for eVY1で動作確認
動作確認OK(音量小さいです) pic.twitter.com/8tQc17T0V8
— qwrt_IG (@qwrt_ig) May 29, 2022
アナログVCO SEM3340 x8個のPoly-8 VCOで動作確認
ChordGeneratorをCEM3340 8 VCOでテスト。問題なし。 pic.twitter.com/84qLhNhNwa
— qwrt_IG (@qwrt_ig) June 5, 2022
構成
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();
}
余談
ハギオ氏のモジュラーシンセを作成しようと思ったところから始めたが、全く異なるものになってしまった。ハギヲさん申し訳ない。