Integrated version

Committer:
ryood
Date:
Thu May 04 09:42:36 2017 +0000
Revision:
18:6ba18820777d
Parent:
17:5c8c173008cf
Display DCF version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ryood 0:5bc618f6d862 1 /*
ryood 0:5bc618f6d862 2 * BaseMachineUIController.h
ryood 0:5bc618f6d862 3 *
ryood 0:5bc618f6d862 4 * 2016.11.06 created
ryood 0:5bc618f6d862 5 *
ryood 0:5bc618f6d862 6 */
ryood 10:a8ec7391a066 7
ryood 12:d4e5feab3a2d 8 #define UART_TRACE_EEPROM (0)
ryood 16:566ddb132ef8 9 #define UART_TRACE_CLIPBOARD (1)
ryood 0:5bc618f6d862 10
ryood 0:5bc618f6d862 11 #ifndef _UICONTROLLER_H_
ryood 0:5bc618f6d862 12 #define _UICONTROLLER_H_
ryood 0:5bc618f6d862 13
ryood 0:5bc618f6d862 14 #include "mbed.h"
ryood 0:5bc618f6d862 15 #include "rtos.h"
ryood 0:5bc618f6d862 16
ryood 0:5bc618f6d862 17 #include "BaseMachineCommon.h"
ryood 0:5bc618f6d862 18
ryood 0:5bc618f6d862 19 #include "st7565LCD.h"
ryood 10:a8ec7391a066 20 #include "AT24C1024.h"
ryood 0:5bc618f6d862 21 #include "PinDetect.h"
ryood 0:5bc618f6d862 22 #include "RotaryEncoder.h"
ryood 0:5bc618f6d862 23 #include "AverageAnalogIn.h"
ryood 5:c3ed523c0330 24 #include "ExioBufferedDebounceIn.h"
ryood 9:70b8f9935ef7 25 #include "ExioBufferedRotaryEncoder.h"
ryood 0:5bc618f6d862 26
ryood 0:5bc618f6d862 27 #include "Sequence.h"
ryood 0:5bc618f6d862 28 #include "ST7565_SequencerDisplay.h"
ryood 0:5bc618f6d862 29
ryood 0:5bc618f6d862 30 #define GLCD_SPI_RATE (1000000)
ryood 0:5bc618f6d862 31 #define POT_RESOLUTION (7) // bit
ryood 0:5bc618f6d862 32 #define AIN_AVERAGE (16) // AnalogInを移動平均する要素数
ryood 0:5bc618f6d862 33
ryood 0:5bc618f6d862 34 const int bpmMax = 240;
ryood 0:5bc618f6d862 35 const int bpmMin = 60;
ryood 0:5bc618f6d862 36 const int octaveMax = 2;
ryood 0:5bc618f6d862 37 const int octaveMin = -2;
ryood 0:5bc618f6d862 38 const int waveShapeMax = 1;
ryood 6:5ef23727ce6a 39 const int UImodeMax = 2;
ryood 15:646a57eb89f3 40 const int EEPROMSlotMax = 16;
ryood 0:5bc618f6d862 41
ryood 17:5c8c173008cf 42 const int ExioPinToPattern[] = {
ryood 17:5c8c173008cf 43 0, 4, 1, 5, 2, 6, 3, 7
ryood 17:5c8c173008cf 44 };
ryood 16:566ddb132ef8 45
ryood 16:566ddb132ef8 46 typedef enum {
ryood 16:566ddb132ef8 47 flagEepromOK = 0x04,
ryood 17:5c8c173008cf 48 flagEepromCancel = 0x08,
ryood 17:5c8c173008cf 49 flagSaveToEeprom = 0x10,
ryood 17:5c8c173008cf 50 flagLoadFromEeprom = 0x20,
ryood 17:5c8c173008cf 51 flagCopyToClipBoard = 0x40,
ryood 17:5c8c173008cf 52 flagPasteFromClipBoard = 0x80
ryood 16:566ddb132ef8 53 } LoadSaveFlagT;
ryood 16:566ddb132ef8 54
ryood 0:5bc618f6d862 55 struct OscillatorParam {
ryood 0:5bc618f6d862 56 uint8_t waveShape;
ryood 0:5bc618f6d862 57 uint8_t pulseWidth;
ryood 0:5bc618f6d862 58
ryood 0:5bc618f6d862 59 OscillatorParam() : waveShape(0), pulseWidth(0) {}
ryood 0:5bc618f6d862 60 };
ryood 0:5bc618f6d862 61
ryood 0:5bc618f6d862 62 struct FilterParam {
ryood 0:5bc618f6d862 63 uint8_t cutoff;
ryood 0:5bc618f6d862 64 uint8_t resonance;
ryood 0:5bc618f6d862 65
ryood 0:5bc618f6d862 66 FilterParam() : cutoff(0), resonance(0) {}
ryood 0:5bc618f6d862 67 };
ryood 0:5bc618f6d862 68
ryood 0:5bc618f6d862 69 struct EnvelopeParam {
ryood 0:5bc618f6d862 70 uint8_t level;
ryood 0:5bc618f6d862 71 uint8_t length;
ryood 0:5bc618f6d862 72 uint8_t duration;
ryood 0:5bc618f6d862 73 uint8_t decay;
ryood 0:5bc618f6d862 74 uint8_t sustain;
ryood 0:5bc618f6d862 75
ryood 0:5bc618f6d862 76 EnvelopeParam() : level(0), length(0), duration(0), decay(0), sustain(0) {}
ryood 0:5bc618f6d862 77 };
ryood 0:5bc618f6d862 78
ryood 0:5bc618f6d862 79 class BaseMachineUIController
ryood 0:5bc618f6d862 80 {
ryood 0:5bc618f6d862 81 public:
ryood 0:5bc618f6d862 82 BaseMachineUIController() :
ryood 0:5bc618f6d862 83 bpm(120),
ryood 0:5bc618f6d862 84 accentLevel(127),
ryood 7:0f8efe0e1e3f 85 sequencePattern(0),
ryood 15:646a57eb89f3 86 loadSaveFlag(0),
ryood 15:646a57eb89f3 87 eepromSlot(0),
ryood 0:5bc618f6d862 88 editingStep(0),
ryood 0:5bc618f6d862 89 playingStep(0),
ryood 0:5bc618f6d862 90 isRunning(false),
ryood 0:5bc618f6d862 91 isDirty(true),
ryood 12:d4e5feab3a2d 92 isClipBoardEmpty(true),
ryood 0:5bc618f6d862 93 UImode(0),
ryood 0:5bc618f6d862 94 isStepChanged(false),
ryood 0:5bc618f6d862 95 errCutoff(0),
ryood 0:5bc618f6d862 96 errDuration(0),
ryood 0:5bc618f6d862 97 errDecay(0),
ryood 0:5bc618f6d862 98 errSustain(0),
ryood 0:5bc618f6d862 99 errResonance(0),
ryood 0:5bc618f6d862 100 errLevel(0),
ryood 0:5bc618f6d862 101 errPulseWidth(0),
ryood 0:5bc618f6d862 102 errAccentLevel(0) {
ryood 0:5bc618f6d862 103 }
ryood 0:5bc618f6d862 104
ryood 0:5bc618f6d862 105 ~BaseMachineUIController() {}
ryood 0:5bc618f6d862 106
ryood 0:5bc618f6d862 107 void init() {
ryood 0:5bc618f6d862 108 //--------------------------------------------------------------------
ryood 0:5bc618f6d862 109 // Create Dvices
ryood 0:5bc618f6d862 110 //
ryood 0:5bc618f6d862 111 //ST7565(PinName mosi, PinName sclk, PinName cs, PinName rst, PinName a0);
ryood 0:5bc618f6d862 112 gLCD = new ST7565(PB_15, PB_13, PB_12, PB_2, PB_1);
ryood 8:62a65664a2fb 113 sequencerDisplay = new ST7565_SequencerDisplay(gLCD, sequences[sequencePattern], SEQUENCE_N);
ryood 0:5bc618f6d862 114
ryood 0:5bc618f6d862 115 AinPulseWidth = new AverageAnalogIn(PC_2, AIN_AVERAGE);
ryood 0:5bc618f6d862 116 AinCutOff = new AverageAnalogIn(PB_0, AIN_AVERAGE);
ryood 0:5bc618f6d862 117 AinResonance = new AverageAnalogIn(PC_1, AIN_AVERAGE);
ryood 0:5bc618f6d862 118 AinLevel = new AverageAnalogIn(PC_0, AIN_AVERAGE);
ryood 0:5bc618f6d862 119 AinDuration = new AverageAnalogIn(PA_4, AIN_AVERAGE);
ryood 0:5bc618f6d862 120 AinDecay = new AverageAnalogIn(PA_1, AIN_AVERAGE);
ryood 0:5bc618f6d862 121 AinSustain = new AverageAnalogIn(PA_0, AIN_AVERAGE);
ryood 0:5bc618f6d862 122 AinAccentLevel= new AverageAnalogIn(PC_3, AIN_AVERAGE);
ryood 0:5bc618f6d862 123
ryood 0:5bc618f6d862 124 RotEncStep = new RotaryEncoder(PA_11, PA_12, 0, SEQUENCE_N - 1, 0);
ryood 0:5bc618f6d862 125 RotEncPitch = new RotaryEncoder(PB_5, PB_4, 0, Sequence::getMaxPitch() - 1, 0);
ryood 4:0a55042fa86c 126 //RotEncBpm = new RotaryEncoder(PC_12, PC_10, bpmMin, bpmMax, 120);
ryood 4:0a55042fa86c 127 RotEncBpm = new RotaryEncoder(PA_14, PA_15, bpmMin, bpmMax, 120);
ryood 0:5bc618f6d862 128
ryood 4:0a55042fa86c 129 //PinWaveShape = new PinDetect(PD_2, PullUp);
ryood 4:0a55042fa86c 130 PinWaveShape = new PinDetect(PB_7, PullUp);
ryood 4:0a55042fa86c 131 //PinUIMode = new PinDetect(PC_11, PullUp);
ryood 4:0a55042fa86c 132 PinUIMode = new PinDetect(PC_13, PullUp);
ryood 0:5bc618f6d862 133 PinOctaveUp = new PinDetect(PB_3, PullUp);
ryood 0:5bc618f6d862 134 PinOctaveDown = new PinDetect(PA_10, PullUp);
ryood 0:5bc618f6d862 135 PinNoteOnOff = new PinDetect(PC_5, PullUp);
ryood 0:5bc618f6d862 136 PinTie = new PinDetect(PC_6, PullUp);
ryood 0:5bc618f6d862 137 PinAccent = new PinDetect(PC_8, PullUp);
ryood 0:5bc618f6d862 138 PinRunStop = new PinDetect(PC_9, PullUp);
ryood 5:c3ed523c0330 139
ryood 5:c3ed523c0330 140 Spi3 = new SPI(PC_12, PC_11, PC_10); // SPI3 mosi, miso, sclk;
ryood 5:c3ed523c0330 141 // ExioMcp23s17(int hardwareaddress, SPI& spi, PinName nCs, PinName nReset);
ryood 5:c3ed523c0330 142 Exio = new ExioMcp23s17(0x00, *Spi3, PD_2, PA_13);
ryood 5:c3ed523c0330 143 Exio->reset();
ryood 9:70b8f9935ef7 144
ryood 9:70b8f9935ef7 145 ExioInBufferA = new ExioInBuffer(Exio, ExioPortA);
ryood 17:5c8c173008cf 146 for (int i = 2; i < 8; i++) {
ryood 9:70b8f9935ef7 147 ExioInA[i] = new ExioBufferedDebounceIn(ExioInBufferA, i);
ryood 9:70b8f9935ef7 148 }
ryood 5:c3ed523c0330 149
ryood 5:c3ed523c0330 150 ExioInBufferB = new ExioInBuffer(Exio, ExioPortB);
ryood 5:c3ed523c0330 151 for (int i = 0; i < 8; i++) {
ryood 5:c3ed523c0330 152 ExioIn[i] = new ExioBufferedDebounceIn(ExioInBufferB, i);
ryood 5:c3ed523c0330 153 }
ryood 0:5bc618f6d862 154
ryood 17:5c8c173008cf 155 ExioRotEnc1 = new ExioBufferedRotaryEncoder(ExioInBufferA, 0, 1, 0, EEPROMSlotMax - 1, 0);
ryood 9:70b8f9935ef7 156
ryood 10:a8ec7391a066 157 I2c1 = new I2C(PB_9, PB_8);
ryood 10:a8ec7391a066 158 At24c1024 = new AT24C1024(*I2c1);
ryood 10:a8ec7391a066 159
ryood 0:5bc618f6d862 160 //--------------------------------------------------------------------
ryood 0:5bc618f6d862 161 // Setup Devices
ryood 0:5bc618f6d862 162 //
ryood 0:5bc618f6d862 163 gLCD->set_spi_frequency(GLCD_SPI_RATE);
ryood 0:5bc618f6d862 164 gLCD->begin(0x12);
ryood 0:5bc618f6d862 165 gLCD->clear();
ryood 0:5bc618f6d862 166 gLCD->drawstring(0, 0, TITLE_STR1);
ryood 0:5bc618f6d862 167 gLCD->drawstring(0, 1, TITLE_STR2);
ryood 18:6ba18820777d 168 gLCD->drawstring(0, 2, TITLE_STR3);
ryood 0:5bc618f6d862 169 gLCD->display();
ryood 0:5bc618f6d862 170 Thread::wait(1000);
ryood 0:5bc618f6d862 171
ryood 0:5bc618f6d862 172 RotEncStep->setInterval(100);
ryood 0:5bc618f6d862 173 RotEncPitch->setInterval(100);
ryood 0:5bc618f6d862 174 RotEncBpm->setInterval(100);
ryood 0:5bc618f6d862 175
ryood 0:5bc618f6d862 176 PinWaveShape->attach_asserted(this, &BaseMachineUIController::swWaveShapePressed);
ryood 0:5bc618f6d862 177 PinWaveShape->setAssertValue(0);
ryood 0:5bc618f6d862 178 PinWaveShape->setSampleFrequency();
ryood 0:5bc618f6d862 179
ryood 0:5bc618f6d862 180 PinUIMode->attach_asserted(this, &BaseMachineUIController::swUIModePressed);
ryood 0:5bc618f6d862 181 PinUIMode->setAssertValue(0);
ryood 0:5bc618f6d862 182 PinUIMode->setSampleFrequency();
ryood 0:5bc618f6d862 183
ryood 0:5bc618f6d862 184 PinOctaveUp->attach_asserted(this, &BaseMachineUIController::swOctaveUpPressed);
ryood 0:5bc618f6d862 185 PinOctaveUp->setAssertValue(0);
ryood 0:5bc618f6d862 186 PinOctaveUp->setSampleFrequency();
ryood 0:5bc618f6d862 187
ryood 0:5bc618f6d862 188 PinOctaveDown->attach_asserted(this, &BaseMachineUIController::swOctaveDownPressed);
ryood 0:5bc618f6d862 189 PinOctaveDown->setAssertValue(0);
ryood 0:5bc618f6d862 190 PinOctaveDown->setSampleFrequency();
ryood 0:5bc618f6d862 191
ryood 0:5bc618f6d862 192 PinNoteOnOff->attach_asserted(this, &BaseMachineUIController::swNoteOnOffPressed);
ryood 0:5bc618f6d862 193 PinNoteOnOff->setAssertValue(0);
ryood 0:5bc618f6d862 194 PinNoteOnOff->setSampleFrequency();
ryood 0:5bc618f6d862 195
ryood 0:5bc618f6d862 196 PinTie->attach_asserted(this, &BaseMachineUIController::swTiePressed);
ryood 0:5bc618f6d862 197 PinTie->setAssertValue(0);
ryood 0:5bc618f6d862 198 PinTie->setSampleFrequency();
ryood 0:5bc618f6d862 199
ryood 0:5bc618f6d862 200 PinAccent->attach_asserted(this, &BaseMachineUIController::swAccentPressed);
ryood 0:5bc618f6d862 201 PinAccent->setAssertValue(0);
ryood 0:5bc618f6d862 202 PinAccent->setSampleFrequency();
ryood 0:5bc618f6d862 203
ryood 0:5bc618f6d862 204 PinRunStop->attach_asserted(this, &BaseMachineUIController::swRunStopPressed);
ryood 0:5bc618f6d862 205 PinRunStop->setAssertValue(0);
ryood 0:5bc618f6d862 206 PinRunStop->setSampleFrequency();
ryood 5:c3ed523c0330 207
ryood 9:70b8f9935ef7 208 ExioInBufferA->run(10);
ryood 17:5c8c173008cf 209 for (int i = 2; i < 8; i++) {
ryood 9:70b8f9935ef7 210 ExioInA[i]->set_debounce_us(5000);
ryood 9:70b8f9935ef7 211 }
ryood 9:70b8f9935ef7 212
ryood 5:c3ed523c0330 213 ExioInBufferB->run(10);
ryood 5:c3ed523c0330 214 for (int i = 0; i < 8; i++) {
ryood 6:5ef23727ce6a 215 ExioIn[i]->set_debounce_us(5000);
ryood 5:c3ed523c0330 216 }
ryood 0:5bc618f6d862 217
ryood 9:70b8f9935ef7 218 ExioRotEnc1->setInterval(1000);
ryood 9:70b8f9935ef7 219
ryood 0:5bc618f6d862 220 //--------------------------------------------------------------------
ryood 0:5bc618f6d862 221 // Initialize objects
ryood 0:5bc618f6d862 222 //
ryood 0:5bc618f6d862 223 Sequence::setBaseNoteNumber(baseNoteNumber);
ryood 0:5bc618f6d862 224
ryood 8:62a65664a2fb 225 for (int j = 0; j < PATTERN_N; j++) {
ryood 8:62a65664a2fb 226 for (int i = 0; i < SEQUENCE_N; i++) {
ryood 8:62a65664a2fb 227 sequences[j][i].setPitch(pitch[i]);
ryood 8:62a65664a2fb 228 sequences[j][i].setNoteOn(noteOn[i]);
ryood 8:62a65664a2fb 229 sequences[j][i].setTie(tie[i]);
ryood 8:62a65664a2fb 230 sequences[j][i].setAccent(accent[i]);
ryood 8:62a65664a2fb 231 }
ryood 0:5bc618f6d862 232 }
ryood 8:62a65664a2fb 233 RotEncPitch->setVal(sequences[sequencePattern][0].getPitch());
ryood 12:d4e5feab3a2d 234
ryood 12:d4e5feab3a2d 235 for (int i = 0; i < SEQUENCE_N; i++) {
ryood 12:d4e5feab3a2d 236 sequenceClipBoard[i].setPitch(pitch[i]);
ryood 12:d4e5feab3a2d 237 sequenceClipBoard[i].setNoteOn(noteOn[i]);
ryood 12:d4e5feab3a2d 238 sequenceClipBoard[i].setTie(tie[i]);
ryood 12:d4e5feab3a2d 239 sequenceClipBoard[i].setAccent(accent[i]);
ryood 12:d4e5feab3a2d 240 }
ryood 0:5bc618f6d862 241 }
ryood 0:5bc618f6d862 242
ryood 0:5bc618f6d862 243 void destract() {
ryood 0:5bc618f6d862 244 //--------------------------------------------------------------------
ryood 0:5bc618f6d862 245 // Destract Devices
ryood 0:5bc618f6d862 246 //
ryood 0:5bc618f6d862 247 delete gLCD;
ryood 0:5bc618f6d862 248
ryood 0:5bc618f6d862 249 delete AinPulseWidth;
ryood 0:5bc618f6d862 250 delete AinCutOff;
ryood 0:5bc618f6d862 251 delete AinResonance;
ryood 0:5bc618f6d862 252 delete AinLevel;
ryood 0:5bc618f6d862 253 delete AinDuration;
ryood 0:5bc618f6d862 254 delete AinDecay;
ryood 0:5bc618f6d862 255 delete AinSustain;
ryood 0:5bc618f6d862 256 delete AinAccentLevel;
ryood 0:5bc618f6d862 257
ryood 0:5bc618f6d862 258 delete RotEncStep;
ryood 0:5bc618f6d862 259 delete RotEncPitch;
ryood 0:5bc618f6d862 260 delete RotEncBpm;
ryood 0:5bc618f6d862 261
ryood 0:5bc618f6d862 262 delete PinWaveShape;
ryood 0:5bc618f6d862 263 delete PinUIMode;
ryood 0:5bc618f6d862 264 delete PinOctaveUp;
ryood 0:5bc618f6d862 265 delete PinOctaveDown;
ryood 0:5bc618f6d862 266 delete PinNoteOnOff;
ryood 0:5bc618f6d862 267 delete PinTie;
ryood 0:5bc618f6d862 268 delete PinAccent;
ryood 0:5bc618f6d862 269 delete PinRunStop;
ryood 5:c3ed523c0330 270
ryood 9:70b8f9935ef7 271 delete[] ExioInA;
ryood 9:70b8f9935ef7 272 delete ExioRotEnc1;
ryood 5:c3ed523c0330 273 delete[] ExioIn;
ryood 9:70b8f9935ef7 274 delete ExioInBufferA;
ryood 5:c3ed523c0330 275 delete ExioInBufferB;
ryood 5:c3ed523c0330 276 delete Exio;
ryood 5:c3ed523c0330 277 delete Spi3;
ryood 10:a8ec7391a066 278
ryood 10:a8ec7391a066 279 delete At24c1024;
ryood 10:a8ec7391a066 280 delete I2c1;
ryood 0:5bc618f6d862 281 }
ryood 0:5bc618f6d862 282
ryood 3:f790643458d9 283 void getSequences(Sequence (*pSequences)[SEQUENCE_N]) {
ryood 8:62a65664a2fb 284 memcpy(pSequences, sequences[sequencePattern], sizeof(sequences[sequencePattern]));
ryood 3:f790643458d9 285 }
ryood 8:62a65664a2fb 286 /*
ryood 8:62a65664a2fb 287 void setSequences(Sequence* pSequence) {
ryood 8:62a65664a2fb 288 memcpy(sequences[sequencePattern], pSequence, sizeof(sequences[sequencePattern]));
ryood 8:62a65664a2fb 289 }
ryood 8:62a65664a2fb 290 */
ryood 3:f790643458d9 291
ryood 0:5bc618f6d862 292 void getOscillatorParam(OscillatorParam* pParam) {
ryood 0:5bc618f6d862 293 memcpy(pParam, &oscillatorParam, sizeof(oscillatorParam));
ryood 0:5bc618f6d862 294 }
ryood 0:5bc618f6d862 295 void getFilterParam(FilterParam* pParam) {
ryood 0:5bc618f6d862 296 memcpy(pParam, &filterParam, sizeof(filterParam));
ryood 0:5bc618f6d862 297 }
ryood 0:5bc618f6d862 298 void getEnvelopeParam(EnvelopeParam* pParam) {
ryood 0:5bc618f6d862 299 memcpy(pParam, &envelopeParam, sizeof(envelopeParam));
ryood 0:5bc618f6d862 300 }
ryood 0:5bc618f6d862 301 uint8_t getBpm() { return bpm; }
ryood 0:5bc618f6d862 302 uint8_t getAccentLevel() { return accentLevel; }
ryood 7:0f8efe0e1e3f 303 uint8_t getSequencePattern() { return sequencePattern; }
ryood 0:5bc618f6d862 304
ryood 0:5bc618f6d862 305 bool getIsRunning() { return isRunning; }
ryood 0:5bc618f6d862 306
ryood 0:5bc618f6d862 307 void setPlayingStep(int step)
ryood 0:5bc618f6d862 308 {
ryood 0:5bc618f6d862 309 playingStep = step;
ryood 0:5bc618f6d862 310 isDirty = true;
ryood 0:5bc618f6d862 311 }
ryood 0:5bc618f6d862 312
ryood 0:5bc618f6d862 313 void update() {
ryood 0:5bc618f6d862 314 pollingRotEncs();
ryood 0:5bc618f6d862 315 pollingPots();
ryood 5:c3ed523c0330 316 pollingExio();
ryood 0:5bc618f6d862 317
ryood 0:5bc618f6d862 318 switch (UImode) {
ryood 0:5bc618f6d862 319 case 0:
ryood 0:5bc618f6d862 320 if (isDirty) {
ryood 1:ecae97c65943 321 if (isRunning) {
ryood 1:ecae97c65943 322 sequencerDisplay->update(SequencerDisplay::run, editingStep, playingStep);
ryood 1:ecae97c65943 323 } else {
ryood 1:ecae97c65943 324 sequencerDisplay->update(SequencerDisplay::stop, editingStep, playingStep);
ryood 1:ecae97c65943 325 }
ryood 1:ecae97c65943 326 isDirty = false;
ryood 0:5bc618f6d862 327 }
ryood 0:5bc618f6d862 328 break;
ryood 0:5bc618f6d862 329 case 1:
ryood 1:ecae97c65943 330 dumpToLCD00();
ryood 0:5bc618f6d862 331 break;
ryood 0:5bc618f6d862 332 case 2:
ryood 0:5bc618f6d862 333 dumpToLCD01();
ryood 0:5bc618f6d862 334 break;
ryood 5:c3ed523c0330 335 case 3:
ryood 5:c3ed523c0330 336 dumpToLCD02();
ryood 5:c3ed523c0330 337 break;
ryood 0:5bc618f6d862 338 }
ryood 10:a8ec7391a066 339
ryood 15:646a57eb89f3 340 switch (loadSaveFlag) {
ryood 16:566ddb132ef8 341 case flagSaveToEeprom:
ryood 16:566ddb132ef8 342 saveToEeprom();
ryood 16:566ddb132ef8 343 Thread::wait(500);
ryood 10:a8ec7391a066 344 isDirty = true;
ryood 10:a8ec7391a066 345 break;
ryood 16:566ddb132ef8 346 case flagLoadFromEeprom:
ryood 16:566ddb132ef8 347 loadFromEeprom();
ryood 16:566ddb132ef8 348 Thread::wait(500);
ryood 10:a8ec7391a066 349 isDirty = true;
ryood 10:a8ec7391a066 350 break;
ryood 16:566ddb132ef8 351 case flagCopyToClipBoard:
ryood 12:d4e5feab3a2d 352 copyToClipBoard();
ryood 16:566ddb132ef8 353 Thread::wait(10);
ryood 16:566ddb132ef8 354 isDirty = true;
ryood 12:d4e5feab3a2d 355 break;
ryood 16:566ddb132ef8 356 case flagPasteFromClipBoard:
ryood 12:d4e5feab3a2d 357 pasteFromClipBoard();
ryood 16:566ddb132ef8 358 Thread::wait(10);
ryood 12:d4e5feab3a2d 359 isDirty = true;
ryood 12:d4e5feab3a2d 360 break;
ryood 10:a8ec7391a066 361 }
ryood 0:5bc618f6d862 362 }
ryood 0:5bc618f6d862 363
ryood 0:5bc618f6d862 364 private:
ryood 0:5bc618f6d862 365 ST7565* gLCD;
ryood 5:c3ed523c0330 366
ryood 5:c3ed523c0330 367 SPI* Spi3;
ryood 5:c3ed523c0330 368 ExioMcp23s17* Exio;
ryood 9:70b8f9935ef7 369 ExioInBuffer* ExioInBufferA;
ryood 5:c3ed523c0330 370 ExioInBuffer* ExioInBufferB;
ryood 17:5c8c173008cf 371 ExioBufferedDebounceIn* ExioInA[8];
ryood 5:c3ed523c0330 372 ExioBufferedDebounceIn* ExioIn[8];
ryood 9:70b8f9935ef7 373 ExioBufferedRotaryEncoder* ExioRotEnc1;
ryood 10:a8ec7391a066 374
ryood 10:a8ec7391a066 375 I2C* I2c1;
ryood 10:a8ec7391a066 376 AT24C1024* At24c1024;
ryood 0:5bc618f6d862 377
ryood 0:5bc618f6d862 378 AverageAnalogIn* AinPulseWidth;
ryood 0:5bc618f6d862 379 AverageAnalogIn* AinCutOff;
ryood 0:5bc618f6d862 380 AverageAnalogIn* AinResonance;
ryood 0:5bc618f6d862 381 AverageAnalogIn* AinLevel;
ryood 0:5bc618f6d862 382 AverageAnalogIn* AinDuration;
ryood 0:5bc618f6d862 383 AverageAnalogIn* AinDecay;
ryood 0:5bc618f6d862 384 AverageAnalogIn* AinSustain;
ryood 0:5bc618f6d862 385 AverageAnalogIn* AinAccentLevel;
ryood 0:5bc618f6d862 386
ryood 0:5bc618f6d862 387 RotaryEncoder* RotEncStep;
ryood 0:5bc618f6d862 388 RotaryEncoder* RotEncPitch;
ryood 0:5bc618f6d862 389 RotaryEncoder* RotEncBpm;
ryood 0:5bc618f6d862 390
ryood 0:5bc618f6d862 391 PinDetect* PinWaveShape;
ryood 0:5bc618f6d862 392 PinDetect* PinUIMode;
ryood 0:5bc618f6d862 393 PinDetect* PinOctaveUp;
ryood 0:5bc618f6d862 394 PinDetect* PinOctaveDown;
ryood 0:5bc618f6d862 395 PinDetect* PinNoteOnOff;
ryood 0:5bc618f6d862 396 PinDetect* PinTie;
ryood 0:5bc618f6d862 397 PinDetect* PinAccent;
ryood 0:5bc618f6d862 398 PinDetect* PinRunStop;
ryood 0:5bc618f6d862 399
ryood 0:5bc618f6d862 400 ST7565_SequencerDisplay* sequencerDisplay;
ryood 0:5bc618f6d862 401
ryood 8:62a65664a2fb 402 Sequence sequences[PATTERN_N][SEQUENCE_N];
ryood 12:d4e5feab3a2d 403 Sequence sequenceClipBoard[SEQUENCE_N];
ryood 0:5bc618f6d862 404
ryood 0:5bc618f6d862 405 OscillatorParam oscillatorParam;
ryood 0:5bc618f6d862 406 FilterParam filterParam;
ryood 0:5bc618f6d862 407 EnvelopeParam envelopeParam;
ryood 0:5bc618f6d862 408
ryood 0:5bc618f6d862 409 uint8_t bpm;
ryood 0:5bc618f6d862 410 uint8_t accentLevel;
ryood 6:5ef23727ce6a 411 uint8_t sequencePattern;
ryood 15:646a57eb89f3 412 uint8_t loadSaveFlag;
ryood 15:646a57eb89f3 413 uint8_t eepromSlot;
ryood 0:5bc618f6d862 414
ryood 0:5bc618f6d862 415 int editingStep;
ryood 0:5bc618f6d862 416 int playingStep;
ryood 0:5bc618f6d862 417 bool isRunning;
ryood 0:5bc618f6d862 418 bool isDirty;
ryood 12:d4e5feab3a2d 419 bool isClipBoardEmpty;
ryood 0:5bc618f6d862 420 int UImode;
ryood 0:5bc618f6d862 421
ryood 0:5bc618f6d862 422 bool isStepChanged;
ryood 0:5bc618f6d862 423
ryood 0:5bc618f6d862 424 int errCutoff;
ryood 0:5bc618f6d862 425 int errDuration;
ryood 0:5bc618f6d862 426 int errDecay;
ryood 0:5bc618f6d862 427 int errSustain;
ryood 0:5bc618f6d862 428 int errResonance;
ryood 0:5bc618f6d862 429 int errLevel;
ryood 0:5bc618f6d862 430 int errPulseWidth;
ryood 0:5bc618f6d862 431 int errAccentLevel;
ryood 0:5bc618f6d862 432
ryood 0:5bc618f6d862 433 //------------------------------------------------------------------------
ryood 0:5bc618f6d862 434 // PinDetect callback functions
ryood 0:5bc618f6d862 435 //------------------------------------------------------------------------
ryood 0:5bc618f6d862 436 void swWaveShapePressed() {
ryood 0:5bc618f6d862 437 #if (UART_TRACE)
ryood 0:5bc618f6d862 438 printf("PinWaveShape Pushed\r\n");
ryood 0:5bc618f6d862 439 #endif
ryood 0:5bc618f6d862 440 uint8_t _waveShape = oscillatorParam.waveShape;
ryood 0:5bc618f6d862 441 _waveShape++;
ryood 0:5bc618f6d862 442 if (_waveShape > waveShapeMax) {
ryood 0:5bc618f6d862 443 _waveShape = 0;
ryood 0:5bc618f6d862 444 }
ryood 0:5bc618f6d862 445 oscillatorParam.waveShape = _waveShape;
ryood 0:5bc618f6d862 446 sequencerDisplay->setWaveShape(_waveShape);
ryood 0:5bc618f6d862 447 isDirty = true;
ryood 0:5bc618f6d862 448 }
ryood 0:5bc618f6d862 449
ryood 0:5bc618f6d862 450 void swUIModePressed() {
ryood 0:5bc618f6d862 451 #if (UART_TRACE)
ryood 0:5bc618f6d862 452 printf("PinUIMode Pushed\r\n");
ryood 0:5bc618f6d862 453 #endif
ryood 0:5bc618f6d862 454 UImode++;
ryood 0:5bc618f6d862 455 if (UImode > UImodeMax) {
ryood 0:5bc618f6d862 456 UImode = 0;
ryood 0:5bc618f6d862 457 }
ryood 0:5bc618f6d862 458 isDirty = true;
ryood 0:5bc618f6d862 459 }
ryood 0:5bc618f6d862 460
ryood 0:5bc618f6d862 461 void swOctaveUpPressed() {
ryood 0:5bc618f6d862 462 #if (UART_TRACE)
ryood 0:5bc618f6d862 463 printf("PinOctaveUp Pushed\r\n");
ryood 0:5bc618f6d862 464 #endif
ryood 0:5bc618f6d862 465 if (sequencerDisplay->getOctave() < octaveMax) {
ryood 0:5bc618f6d862 466 sequencerDisplay->setOctave(sequencerDisplay->getOctave() + 1);
ryood 0:5bc618f6d862 467 isDirty = true;
ryood 0:5bc618f6d862 468 }
ryood 0:5bc618f6d862 469 }
ryood 0:5bc618f6d862 470
ryood 0:5bc618f6d862 471 void swOctaveDownPressed() {
ryood 0:5bc618f6d862 472 #if (UART_TRACE)
ryood 0:5bc618f6d862 473 printf("PinOctaveDown Pushed\r\n");
ryood 0:5bc618f6d862 474 #endif
ryood 0:5bc618f6d862 475 if (sequencerDisplay->getOctave () > octaveMin) {
ryood 0:5bc618f6d862 476 sequencerDisplay->setOctave(sequencerDisplay->getOctave() - 1);
ryood 0:5bc618f6d862 477 isDirty = true;
ryood 0:5bc618f6d862 478 }
ryood 0:5bc618f6d862 479 }
ryood 0:5bc618f6d862 480
ryood 0:5bc618f6d862 481 void swNoteOnOffPressed() {
ryood 0:5bc618f6d862 482 #if (UART_TRACE)
ryood 0:5bc618f6d862 483 printf("PinNoteOnOff Pushed\r\n");
ryood 0:5bc618f6d862 484 #endif
ryood 8:62a65664a2fb 485 sequences[sequencePattern][editingStep].setNoteOn(!sequences[sequencePattern][editingStep].isNoteOn());
ryood 0:5bc618f6d862 486 isDirty = true;
ryood 0:5bc618f6d862 487 }
ryood 0:5bc618f6d862 488
ryood 0:5bc618f6d862 489 void swTiePressed() {
ryood 0:5bc618f6d862 490 #if (UART_TRACE)
ryood 0:5bc618f6d862 491 printf("PinTie Pushed\r\n");
ryood 0:5bc618f6d862 492 #endif
ryood 8:62a65664a2fb 493 sequences[sequencePattern][editingStep].setTie(!sequences[sequencePattern][editingStep].isTie());
ryood 0:5bc618f6d862 494 isDirty = true;
ryood 0:5bc618f6d862 495 }
ryood 0:5bc618f6d862 496
ryood 0:5bc618f6d862 497 void swAccentPressed() {
ryood 0:5bc618f6d862 498 #if (UART_TRACE)
ryood 0:5bc618f6d862 499 printf("PinAccent Pushed\r\n");
ryood 0:5bc618f6d862 500 #endif
ryood 8:62a65664a2fb 501 sequences[sequencePattern][editingStep].setAccent(!sequences[sequencePattern][editingStep].isAccent());
ryood 0:5bc618f6d862 502 isDirty = true;
ryood 0:5bc618f6d862 503 }
ryood 0:5bc618f6d862 504
ryood 0:5bc618f6d862 505 void swRunStopPressed() {
ryood 0:5bc618f6d862 506 #if (UART_TRACE)
ryood 0:5bc618f6d862 507 printf("PinRunStop Pushed\r\n");
ryood 0:5bc618f6d862 508 #endif
ryood 0:5bc618f6d862 509 if (isRunning) {
ryood 0:5bc618f6d862 510 isRunning = false;
ryood 0:5bc618f6d862 511 } else {
ryood 0:5bc618f6d862 512 isRunning = true;
ryood 0:5bc618f6d862 513 }
ryood 0:5bc618f6d862 514 isDirty = true;
ryood 0:5bc618f6d862 515 }
ryood 0:5bc618f6d862 516
ryood 0:5bc618f6d862 517 //------------------------------------------------------------------------
ryood 0:5bc618f6d862 518 // Functions
ryood 0:5bc618f6d862 519 //------------------------------------------------------------------------
ryood 0:5bc618f6d862 520 void pollingRotEncs() {
ryood 0:5bc618f6d862 521 int _bpm = RotEncBpm->getVal();
ryood 0:5bc618f6d862 522 if (_bpm != bpm) {
ryood 0:5bc618f6d862 523 bpm = _bpm;
ryood 0:5bc618f6d862 524 sequencerDisplay->setBpm(_bpm);
ryood 0:5bc618f6d862 525 isDirty = true;
ryood 0:5bc618f6d862 526 }
ryood 0:5bc618f6d862 527
ryood 0:5bc618f6d862 528 int _step = RotEncStep->getVal();
ryood 0:5bc618f6d862 529 if (_step != editingStep) {
ryood 0:5bc618f6d862 530 editingStep = _step;
ryood 0:5bc618f6d862 531 // syncronize sequence value & Rotary Encoder's value
ryood 8:62a65664a2fb 532 RotEncPitch->setVal(sequences[sequencePattern][editingStep].getPitch());
ryood 0:5bc618f6d862 533 isDirty = true;
ryood 0:5bc618f6d862 534 }
ryood 0:5bc618f6d862 535
ryood 0:5bc618f6d862 536 int _pitch = RotEncPitch->getVal();
ryood 8:62a65664a2fb 537 if (_pitch != sequences[sequencePattern][editingStep].getPitch()) {
ryood 8:62a65664a2fb 538 sequences[sequencePattern][editingStep].setPitch(_pitch);
ryood 0:5bc618f6d862 539 isDirty = true;
ryood 0:5bc618f6d862 540 }
ryood 0:5bc618f6d862 541 }
ryood 0:5bc618f6d862 542
ryood 0:5bc618f6d862 543 void pollingPots() {
ryood 0:5bc618f6d862 544 uint8_t pulseWidth = AinPulseWidth->read_u16() >> (16 - POT_RESOLUTION);
ryood 0:5bc618f6d862 545 if (pulseWidth != oscillatorParam.pulseWidth) {
ryood 0:5bc618f6d862 546 oscillatorParam.pulseWidth = pulseWidth;
ryood 0:5bc618f6d862 547 errPulseWidth++;
ryood 1:ecae97c65943 548 //isDirty = true;
ryood 0:5bc618f6d862 549 }
ryood 0:5bc618f6d862 550
ryood 0:5bc618f6d862 551 uint8_t cutoff = AinCutOff->read_u16() >> (16 - POT_RESOLUTION);
ryood 0:5bc618f6d862 552 if (cutoff != filterParam.cutoff) {
ryood 0:5bc618f6d862 553 filterParam.cutoff = cutoff;
ryood 0:5bc618f6d862 554 errCutoff++;
ryood 1:ecae97c65943 555 //isDirty = true;
ryood 0:5bc618f6d862 556 }
ryood 0:5bc618f6d862 557
ryood 0:5bc618f6d862 558 uint8_t resonance = AinResonance->read_u16() >> (16 - POT_RESOLUTION);
ryood 0:5bc618f6d862 559 if (resonance != filterParam.resonance) {
ryood 0:5bc618f6d862 560 filterParam.resonance = resonance;
ryood 0:5bc618f6d862 561 errResonance++;
ryood 1:ecae97c65943 562 //isDirty = true;
ryood 0:5bc618f6d862 563 }
ryood 0:5bc618f6d862 564
ryood 0:5bc618f6d862 565 uint8_t level = AinLevel->read_u16() >> (16 - POT_RESOLUTION);
ryood 0:5bc618f6d862 566 if (level != envelopeParam.level) {
ryood 0:5bc618f6d862 567 errLevel++;
ryood 0:5bc618f6d862 568 envelopeParam.level = level;
ryood 1:ecae97c65943 569 //isDirty = true;
ryood 0:5bc618f6d862 570 }
ryood 0:5bc618f6d862 571
ryood 0:5bc618f6d862 572 uint8_t duration = AinDuration->read_u16() >> (16 - POT_RESOLUTION);
ryood 0:5bc618f6d862 573 if (duration != envelopeParam.duration) {
ryood 0:5bc618f6d862 574 errDuration++;
ryood 0:5bc618f6d862 575 envelopeParam.duration = duration;
ryood 1:ecae97c65943 576 //isDirty = true;
ryood 0:5bc618f6d862 577 }
ryood 0:5bc618f6d862 578
ryood 0:5bc618f6d862 579 uint8_t decay = AinDecay->read_u16() >> (16 - POT_RESOLUTION);
ryood 0:5bc618f6d862 580 if (decay != envelopeParam.decay) {
ryood 0:5bc618f6d862 581 errDecay++;
ryood 0:5bc618f6d862 582 envelopeParam.decay = decay;
ryood 1:ecae97c65943 583 //isDirty = true;
ryood 0:5bc618f6d862 584 }
ryood 0:5bc618f6d862 585
ryood 0:5bc618f6d862 586 uint8_t sustain = AinSustain->read_u16() >> (16 - POT_RESOLUTION);
ryood 0:5bc618f6d862 587 if (sustain != envelopeParam.sustain) {
ryood 0:5bc618f6d862 588 errSustain++;
ryood 0:5bc618f6d862 589 envelopeParam.sustain = sustain;
ryood 1:ecae97c65943 590 //isDirty = true;
ryood 0:5bc618f6d862 591 }
ryood 0:5bc618f6d862 592
ryood 0:5bc618f6d862 593 uint8_t _accentLevel = AinAccentLevel->read_u16() >> (16 - POT_RESOLUTION);
ryood 0:5bc618f6d862 594 if (_accentLevel != accentLevel) {
ryood 0:5bc618f6d862 595 errAccentLevel++;
ryood 0:5bc618f6d862 596 accentLevel = _accentLevel;
ryood 1:ecae97c65943 597 //isDirty = true;
ryood 0:5bc618f6d862 598 }
ryood 0:5bc618f6d862 599 }
ryood 17:5c8c173008cf 600
ryood 5:c3ed523c0330 601 void pollingExio()
ryood 5:c3ed523c0330 602 {
ryood 6:5ef23727ce6a 603 int i;
ryood 6:5ef23727ce6a 604 for (i = 0; i < 8; i++) {
ryood 6:5ef23727ce6a 605 if (ExioIn[i]->read()) break;
ryood 6:5ef23727ce6a 606 }
ryood 17:5c8c173008cf 607 if (i != 8 && sequencePattern != ExioPinToPattern[i]) {
ryood 17:5c8c173008cf 608 sequencePattern = ExioPinToPattern[i];
ryood 8:62a65664a2fb 609 // syncronize sequence value & Rotary Encoder's value
ryood 8:62a65664a2fb 610 RotEncPitch->setVal(sequences[sequencePattern][editingStep].getPitch());
ryood 8:62a65664a2fb 611
ryood 8:62a65664a2fb 612 sequencerDisplay->setSequences(sequences[sequencePattern]);
ryood 10:a8ec7391a066 613 sequencerDisplay->setSequencePattern(sequencePattern);
ryood 6:5ef23727ce6a 614 isDirty = true;
ryood 5:c3ed523c0330 615 }
ryood 9:70b8f9935ef7 616
ryood 15:646a57eb89f3 617 loadSaveFlag = 0;
ryood 17:5c8c173008cf 618 for (i = 2; i < 8; i++) {
ryood 15:646a57eb89f3 619 loadSaveFlag |= ((ExioInA[i]->read()) << i);
ryood 9:70b8f9935ef7 620 }
ryood 13:d3ee2ba4efaf 621
ryood 13:d3ee2ba4efaf 622 #if (UART_TRACE)
ryood 15:646a57eb89f3 623 if (loadSaveFlag != 0) {
ryood 15:646a57eb89f3 624 printf("loadSaveFlag: %d\r\n", loadSaveFlag);
ryood 12:d4e5feab3a2d 625 }
ryood 13:d3ee2ba4efaf 626 #endif
ryood 9:70b8f9935ef7 627
ryood 15:646a57eb89f3 628 eepromSlot = ExioRotEnc1->getVal();
ryood 5:c3ed523c0330 629 }
ryood 5:c3ed523c0330 630
ryood 0:5bc618f6d862 631 void dumpToLCD00() {
ryood 0:5bc618f6d862 632 char buff[64];
ryood 0:5bc618f6d862 633 int col = 0;
ryood 0:5bc618f6d862 634
ryood 0:5bc618f6d862 635 gLCD->clear();
ryood 0:5bc618f6d862 636
ryood 8:62a65664a2fb 637 sprintf(buff, "Run:%d BPM:%03d Ptn:%02d", isRunning, bpm, sequencePattern + 1);
ryood 0:5bc618f6d862 638 gLCD->drawstring(0, col++, buff);
ryood 0:5bc618f6d862 639
ryood 0:5bc618f6d862 640 sprintf(buff, "Stp:%02d Nto:%d Pch:%02d",
ryood 8:62a65664a2fb 641 editingStep, sequences[sequencePattern][editingStep].isNoteOn(), sequences[sequencePattern][editingStep].getPitch());
ryood 0:5bc618f6d862 642 gLCD->drawstring(0, col++, buff);
ryood 0:5bc618f6d862 643
ryood 15:646a57eb89f3 644 sprintf(buff, "Oct:%-2d Tie:%d Acc:%d",
ryood 15:646a57eb89f3 645 sequencerDisplay->getOctave(), sequences[sequencePattern][editingStep].isTie(),sequences[sequencePattern][editingStep].isAccent());
ryood 0:5bc618f6d862 646 gLCD->drawstring(0, col++, buff);
ryood 0:5bc618f6d862 647
ryood 15:646a57eb89f3 648 sprintf(buff, "Wsp:%d Mod:%d pStp:%d", oscillatorParam.waveShape, UImode, playingStep);
ryood 0:5bc618f6d862 649 gLCD->drawstring(0, col++, buff);
ryood 0:5bc618f6d862 650
ryood 15:646a57eb89f3 651 sprintf(buff, "LSF:%d SLT:%d", loadSaveFlag, eepromSlot);
ryood 15:646a57eb89f3 652 gLCD->drawstring(0, col++, buff);
ryood 15:646a57eb89f3 653
ryood 18:6ba18820777d 654 col++;
ryood 18:6ba18820777d 655 gLCD->drawstring(0, col++, TITLE_STR2);
ryood 18:6ba18820777d 656 gLCD->drawstring(0, col++, TITLE_STR3);
ryood 18:6ba18820777d 657
ryood 15:646a57eb89f3 658 /*
ryood 2:238127b00dd3 659 sprintf(buff, "RSO:%4d CO :%4d", filterParam.resonance, filterParam.cutoff);
ryood 0:5bc618f6d862 660 gLCD->drawstring(0, col++, buff);
ryood 0:5bc618f6d862 661 sprintf(buff, "LVL:%4d DUR:%4d", envelopeParam.level, envelopeParam.duration);
ryood 0:5bc618f6d862 662 gLCD->drawstring(0, col++, buff);
ryood 1:ecae97c65943 663 sprintf(buff, "PW :%4d DCY:%4d", oscillatorParam.pulseWidth, envelopeParam.decay);
ryood 1:ecae97c65943 664 gLCD->drawstring(0, col++, buff);
ryood 1:ecae97c65943 665 sprintf(buff, "ACL:%4d SUS:%4d", accentLevel, envelopeParam.sustain);
ryood 0:5bc618f6d862 666 gLCD->drawstring(0, col++, buff);
ryood 15:646a57eb89f3 667 */
ryood 0:5bc618f6d862 668
ryood 0:5bc618f6d862 669 gLCD->display();
ryood 0:5bc618f6d862 670 }
ryood 0:5bc618f6d862 671
ryood 5:c3ed523c0330 672 void dumpToLCD01()
ryood 5:c3ed523c0330 673 {
ryood 0:5bc618f6d862 674 char buff[64];
ryood 0:5bc618f6d862 675
ryood 0:5bc618f6d862 676 gLCD->clear();
ryood 0:5bc618f6d862 677
ryood 0:5bc618f6d862 678 sprintf(buff, "Cutoff %3d %5d", filterParam.cutoff, errCutoff);
ryood 0:5bc618f6d862 679 gLCD->drawstring(0, 0, buff);
ryood 0:5bc618f6d862 680 sprintf(buff, "Duration %3d %5d", envelopeParam.duration, errDuration);
ryood 0:5bc618f6d862 681 gLCD->drawstring(0, 1, buff);
ryood 0:5bc618f6d862 682 sprintf(buff, "Decay %3d %5d", envelopeParam.decay, errDecay);
ryood 0:5bc618f6d862 683 gLCD->drawstring(0, 2, buff);
ryood 0:5bc618f6d862 684 sprintf(buff, "Sustain %3d %5d", envelopeParam.sustain, errSustain);
ryood 0:5bc618f6d862 685 gLCD->drawstring(0, 3, buff);
ryood 0:5bc618f6d862 686 sprintf(buff, "Resonance %3d %5d", filterParam.resonance, errResonance);
ryood 0:5bc618f6d862 687 gLCD->drawstring(0, 4, buff);
ryood 0:5bc618f6d862 688 sprintf(buff, "Level %3d %5d", envelopeParam.level, errLevel);
ryood 0:5bc618f6d862 689 gLCD->drawstring(0, 5, buff);
ryood 0:5bc618f6d862 690 sprintf(buff, "PulseWidth %3d %5d", oscillatorParam.pulseWidth, errPulseWidth);
ryood 0:5bc618f6d862 691 gLCD->drawstring(0, 6, buff);
ryood 0:5bc618f6d862 692 sprintf(buff, "AccentLvl %3d %5d", accentLevel, errAccentLevel);
ryood 0:5bc618f6d862 693 gLCD->drawstring(0, 7, buff);
ryood 0:5bc618f6d862 694
ryood 0:5bc618f6d862 695 gLCD->display();
ryood 0:5bc618f6d862 696 }
ryood 5:c3ed523c0330 697
ryood 5:c3ed523c0330 698 void dumpToLCD02()
ryood 5:c3ed523c0330 699 {
ryood 5:c3ed523c0330 700 char buff[64];
ryood 5:c3ed523c0330 701
ryood 5:c3ed523c0330 702 gLCD->clear();
ryood 5:c3ed523c0330 703
ryood 6:5ef23727ce6a 704 sprintf(buff, "sequencePattern %d", sequencePattern);
ryood 5:c3ed523c0330 705 gLCD->drawstring(0, 0, buff);
ryood 5:c3ed523c0330 706
ryood 5:c3ed523c0330 707 gLCD->display();
ryood 5:c3ed523c0330 708 }
ryood 10:a8ec7391a066 709
ryood 16:566ddb132ef8 710 void saveToEeprom()
ryood 10:a8ec7391a066 711 {
ryood 10:a8ec7391a066 712 char buff[64];
ryood 10:a8ec7391a066 713
ryood 10:a8ec7391a066 714 gLCD->clear();
ryood 10:a8ec7391a066 715
ryood 15:646a57eb89f3 716 sprintf(buff, "Save to EEPROM?[%02d]", eepromSlot);
ryood 10:a8ec7391a066 717 gLCD->drawstring(0, 0, buff);
ryood 10:a8ec7391a066 718 gLCD->display();
ryood 10:a8ec7391a066 719
ryood 15:646a57eb89f3 720 while (1) {
ryood 15:646a57eb89f3 721 pollingExio();
ryood 15:646a57eb89f3 722 sprintf(buff, "[%02d]", eepromSlot);
ryood 15:646a57eb89f3 723 gLCD->drawstring(90, 0, buff);
ryood 15:646a57eb89f3 724 gLCD->display();
ryood 16:566ddb132ef8 725 //ToDo: flagEepromCancel スイッチを増やして割り当てる
ryood 17:5c8c173008cf 726 if (loadSaveFlag & flagEepromCancel) {
ryood 16:566ddb132ef8 727 gLCD->drawstring(0, 1, " Cancel");
ryood 16:566ddb132ef8 728 gLCD->display();
ryood 16:566ddb132ef8 729 return;
ryood 16:566ddb132ef8 730 }
ryood 17:5c8c173008cf 731 //printf("loadSaveFlag: %2d\r\n", loadSaveFlag);
ryood 16:566ddb132ef8 732 if (loadSaveFlag & flagEepromOK) {
ryood 15:646a57eb89f3 733 break;
ryood 15:646a57eb89f3 734 }
ryood 15:646a57eb89f3 735 }
ryood 15:646a57eb89f3 736
ryood 15:646a57eb89f3 737 gLCD->drawstring(0, 1, " Saving...");
ryood 15:646a57eb89f3 738 gLCD->display();
ryood 15:646a57eb89f3 739
ryood 10:a8ec7391a066 740 #if (UART_TRACE_EEPROM)
ryood 10:a8ec7391a066 741 printf("*** Save Sequences to EEPROM ***\r\n");
ryood 11:a2a51191ebe4 742 for (int j = 0; j < PATTERN_N; j++) {
ryood 15:646a57eb89f3 743 printf("eepromSlot: %d\r\n", eepromSlot);
ryood 11:a2a51191ebe4 744 printf("sequencePattern: %d\r\n", j);
ryood 11:a2a51191ebe4 745 for (int i = 0; i < SEQUENCE_N; i++) {
ryood 11:a2a51191ebe4 746 printf("%d %d %03d %d %d\r\n",
ryood 11:a2a51191ebe4 747 i,
ryood 11:a2a51191ebe4 748 sequences[j][i].isNoteOn(),
ryood 11:a2a51191ebe4 749 sequences[j][i].getPitch(),
ryood 11:a2a51191ebe4 750 sequences[j][i].isTie(),
ryood 11:a2a51191ebe4 751 sequences[j][i].isAccent()
ryood 11:a2a51191ebe4 752 );
ryood 11:a2a51191ebe4 753 }
ryood 10:a8ec7391a066 754 }
ryood 10:a8ec7391a066 755 #endif
ryood 10:a8ec7391a066 756
ryood 10:a8ec7391a066 757 uint8_t eep_buff[258];
ryood 11:a2a51191ebe4 758 for (int j = 0; j < PATTERN_N; j++) {
ryood 11:a2a51191ebe4 759 uint8_t cnt = 0;
ryood 11:a2a51191ebe4 760 for (int i = 0; i < SEQUENCE_N; i++) {
ryood 11:a2a51191ebe4 761 eep_buff[cnt++] = sequences[j][i].isNoteOn();
ryood 11:a2a51191ebe4 762 eep_buff[cnt++] = ((sequences[j][i].getPitch() & 0xff00) >> 8); // MSB
ryood 11:a2a51191ebe4 763 eep_buff[cnt++] = sequences[j][i].getPitch() & 0xff; // LSB
ryood 11:a2a51191ebe4 764 eep_buff[cnt++] = sequences[j][i].isTie();
ryood 11:a2a51191ebe4 765 eep_buff[cnt++] = sequences[j][i].isAccent();
ryood 11:a2a51191ebe4 766 }
ryood 11:a2a51191ebe4 767 #if (UART_TRACE_EEPROM)
ryood 11:a2a51191ebe4 768 printf("size: %d\r\n", cnt);
ryood 11:a2a51191ebe4 769 #endif
ryood 11:a2a51191ebe4 770 /*
ryood 11:a2a51191ebe4 771 for (int i = 0; i < cnt; i++) {
ryood 11:a2a51191ebe4 772 printf("%d: %d\r\n", i, eep_buff[i]);
ryood 11:a2a51191ebe4 773 }
ryood 11:a2a51191ebe4 774 */
ryood 15:646a57eb89f3 775 uint32_t addr_page_top = (eepromSlot * PATTERN_N + j) << 8;
ryood 12:d4e5feab3a2d 776 #if (UART_TRACE_EEPROM)
ryood 12:d4e5feab3a2d 777 printf("address: %x\r\n", addr_page_top);
ryood 12:d4e5feab3a2d 778 #endif
ryood 11:a2a51191ebe4 779 AT24C_STATUS status = At24c1024->write_page(
ryood 11:a2a51191ebe4 780 addr_page_top,
ryood 11:a2a51191ebe4 781 eep_buff,
ryood 11:a2a51191ebe4 782 sizeof(eep_buff)
ryood 11:a2a51191ebe4 783 );
ryood 15:646a57eb89f3 784 Thread::wait(5);
ryood 15:646a57eb89f3 785
ryood 11:a2a51191ebe4 786 #if (UART_TRACE_EEPROM)
ryood 11:a2a51191ebe4 787 printf("status: %d\r\n", status);
ryood 11:a2a51191ebe4 788 #endif
ryood 10:a8ec7391a066 789 }
ryood 10:a8ec7391a066 790
ryood 15:646a57eb89f3 791 gLCD->drawstring(0, 2, " Done");
ryood 10:a8ec7391a066 792 gLCD->display();
ryood 10:a8ec7391a066 793 }
ryood 10:a8ec7391a066 794
ryood 16:566ddb132ef8 795 void loadFromEeprom()
ryood 10:a8ec7391a066 796 {
ryood 10:a8ec7391a066 797 char buff[64];
ryood 10:a8ec7391a066 798
ryood 10:a8ec7391a066 799 gLCD->clear();
ryood 10:a8ec7391a066 800
ryood 15:646a57eb89f3 801 sprintf(buff, "Load From EEPROM?[%02d]", eepromSlot);
ryood 10:a8ec7391a066 802 gLCD->drawstring(0, 0, buff);
ryood 10:a8ec7391a066 803 gLCD->display();
ryood 10:a8ec7391a066 804
ryood 15:646a57eb89f3 805 while (1) {
ryood 15:646a57eb89f3 806 pollingExio();
ryood 15:646a57eb89f3 807 sprintf(buff, "[%02d]", eepromSlot);
ryood 15:646a57eb89f3 808 gLCD->drawstring(102, 0, buff);
ryood 15:646a57eb89f3 809 gLCD->display();
ryood 16:566ddb132ef8 810 //ToDo: flagEepromCancel スイッチを増やして割り当てる
ryood 17:5c8c173008cf 811 if (loadSaveFlag & flagEepromCancel) {
ryood 16:566ddb132ef8 812 gLCD->drawstring(0, 1, " Cancel");
ryood 16:566ddb132ef8 813 gLCD->display();
ryood 16:566ddb132ef8 814 return;
ryood 16:566ddb132ef8 815 }
ryood 16:566ddb132ef8 816 if (loadSaveFlag &= flagEepromOK) {
ryood 15:646a57eb89f3 817 break;
ryood 15:646a57eb89f3 818 }
ryood 15:646a57eb89f3 819 }
ryood 15:646a57eb89f3 820
ryood 15:646a57eb89f3 821 gLCD->drawstring(0, 1, " Loading...");
ryood 15:646a57eb89f3 822 gLCD->display();
ryood 15:646a57eb89f3 823
ryood 10:a8ec7391a066 824 #if (UART_TRACE_EEPROM)
ryood 10:a8ec7391a066 825 printf("*** Load Sequences from EEPROM ***\r\n");
ryood 10:a8ec7391a066 826 #endif
ryood 10:a8ec7391a066 827
ryood 10:a8ec7391a066 828 uint8_t eep_buff[258];
ryood 10:a8ec7391a066 829
ryood 11:a2a51191ebe4 830 for (int j = 0; j < PATTERN_N; j++) {
ryood 15:646a57eb89f3 831 uint32_t addr_page_top = (eepromSlot * PATTERN_N + j) << 8;
ryood 15:646a57eb89f3 832
ryood 15:646a57eb89f3 833 #if (UART_TRACE_EEPROM)
ryood 15:646a57eb89f3 834 printf("address: %x\r\n", addr_page_top);
ryood 15:646a57eb89f3 835 #endif
ryood 15:646a57eb89f3 836
ryood 11:a2a51191ebe4 837 AT24C_STATUS status = At24c1024->read_page(
ryood 11:a2a51191ebe4 838 addr_page_top,
ryood 11:a2a51191ebe4 839 eep_buff,
ryood 11:a2a51191ebe4 840 sizeof(eep_buff)
ryood 11:a2a51191ebe4 841 );
ryood 11:a2a51191ebe4 842
ryood 11:a2a51191ebe4 843 #if (UART_TRACE_EEPROM)
ryood 11:a2a51191ebe4 844 printf("status: %d\r\n", status);
ryood 11:a2a51191ebe4 845 #endif
ryood 10:a8ec7391a066 846
ryood 11:a2a51191ebe4 847 /*
ryood 11:a2a51191ebe4 848 for (int i = 0; i < 80; i++) {
ryood 11:a2a51191ebe4 849 printf("%d: %d\r\n", i, eep_buff[i]);
ryood 11:a2a51191ebe4 850 }
ryood 11:a2a51191ebe4 851 */
ryood 10:a8ec7391a066 852
ryood 11:a2a51191ebe4 853 uint8_t cnt = 0;
ryood 11:a2a51191ebe4 854 for (int i = 0; i < SEQUENCE_N; i++) {
ryood 11:a2a51191ebe4 855 sequences[j][i].setNoteOn(eep_buff[cnt++]);
ryood 11:a2a51191ebe4 856 int pitch = eep_buff[cnt++] << 8; // MSB
ryood 11:a2a51191ebe4 857 pitch |= eep_buff[cnt++]; // LSB
ryood 11:a2a51191ebe4 858 sequences[j][i].setPitch(pitch);
ryood 11:a2a51191ebe4 859 sequences[j][i].setTie(eep_buff[cnt++]);
ryood 11:a2a51191ebe4 860 sequences[j][i].setAccent(eep_buff[cnt++]);
ryood 11:a2a51191ebe4 861 }
ryood 11:a2a51191ebe4 862
ryood 11:a2a51191ebe4 863 #if (UART_TRACE_EEPROM)
ryood 11:a2a51191ebe4 864 printf("size: %d\r\n", cnt);
ryood 15:646a57eb89f3 865 printf("eepromSlot: %d\r\n", eepromSlot);
ryood 11:a2a51191ebe4 866 printf("sequencePattern: %d\r\n", j);
ryood 11:a2a51191ebe4 867 #endif
ryood 10:a8ec7391a066 868 }
ryood 10:a8ec7391a066 869 // syncronize sequence value & Rotary Encoder's value
ryood 10:a8ec7391a066 870 RotEncPitch->setVal(sequences[sequencePattern][editingStep].getPitch());
ryood 10:a8ec7391a066 871
ryood 10:a8ec7391a066 872 #if (UART_TRACE_EEPROM)
ryood 11:a2a51191ebe4 873 for (int j = 0; j < PATTERN_N; j++) {
ryood 11:a2a51191ebe4 874 for (int i = 0; i < SEQUENCE_N; i++) {
ryood 11:a2a51191ebe4 875 printf("%d %d %03d %d %d\r\n",
ryood 11:a2a51191ebe4 876 i,
ryood 11:a2a51191ebe4 877 sequences[j][i].isNoteOn(),
ryood 11:a2a51191ebe4 878 sequences[j][i].getPitch(),
ryood 11:a2a51191ebe4 879 sequences[j][i].isTie(),
ryood 11:a2a51191ebe4 880 sequences[j][i].isAccent()
ryood 11:a2a51191ebe4 881 );
ryood 11:a2a51191ebe4 882 }
ryood 10:a8ec7391a066 883 }
ryood 10:a8ec7391a066 884 #endif
ryood 10:a8ec7391a066 885
ryood 15:646a57eb89f3 886 gLCD->drawstring(0, 2, " Done");
ryood 10:a8ec7391a066 887 gLCD->display();
ryood 10:a8ec7391a066 888 }
ryood 12:d4e5feab3a2d 889
ryood 12:d4e5feab3a2d 890 void copyToClipBoard()
ryood 12:d4e5feab3a2d 891 {
ryood 15:646a57eb89f3 892 gLCD->clear();
ryood 15:646a57eb89f3 893 gLCD->drawstring(0, 0, "Copy");
ryood 15:646a57eb89f3 894 gLCD->display();
ryood 15:646a57eb89f3 895
ryood 12:d4e5feab3a2d 896 for (int i = 0; i < SEQUENCE_N; i++) {
ryood 12:d4e5feab3a2d 897 sequenceClipBoard[i].setNoteOn(sequences[sequencePattern][i].isNoteOn());
ryood 12:d4e5feab3a2d 898 sequenceClipBoard[i].setPitch(sequences[sequencePattern][i].getPitch());
ryood 12:d4e5feab3a2d 899 sequenceClipBoard[i].setTie(sequences[sequencePattern][i].isTie());
ryood 12:d4e5feab3a2d 900 sequenceClipBoard[i].setAccent(sequences[sequencePattern][i].isAccent());
ryood 12:d4e5feab3a2d 901 }
ryood 12:d4e5feab3a2d 902 isClipBoardEmpty = false;
ryood 12:d4e5feab3a2d 903
ryood 12:d4e5feab3a2d 904 #if (UART_TRACE_CLIPBOARD)
ryood 12:d4e5feab3a2d 905 printf("copyToClipBoard\r\n");
ryood 12:d4e5feab3a2d 906 printf("sequencePattern: %d\r\n", sequencePattern);
ryood 12:d4e5feab3a2d 907 for (int i = 0; i < SEQUENCE_N; i++) {
ryood 12:d4e5feab3a2d 908 printf("%d %d %03d %d %d\r\n",
ryood 12:d4e5feab3a2d 909 i,
ryood 12:d4e5feab3a2d 910 sequenceClipBoard[i].isNoteOn(),
ryood 12:d4e5feab3a2d 911 sequenceClipBoard[i].getPitch(),
ryood 12:d4e5feab3a2d 912 sequenceClipBoard[i].isTie(),
ryood 12:d4e5feab3a2d 913 sequenceClipBoard[i].isAccent()
ryood 12:d4e5feab3a2d 914 );
ryood 12:d4e5feab3a2d 915 }
ryood 12:d4e5feab3a2d 916 #endif
ryood 12:d4e5feab3a2d 917 }
ryood 12:d4e5feab3a2d 918
ryood 12:d4e5feab3a2d 919 void pasteFromClipBoard()
ryood 12:d4e5feab3a2d 920 {
ryood 15:646a57eb89f3 921 gLCD->clear();
ryood 15:646a57eb89f3 922 gLCD->drawstring(0, 0, "Paste");
ryood 15:646a57eb89f3 923 gLCD->display();
ryood 15:646a57eb89f3 924
ryood 12:d4e5feab3a2d 925 #if (UART_TRACE_CLIPBOARD)
ryood 12:d4e5feab3a2d 926 printf("pasteFromClipBoard\r\n");
ryood 12:d4e5feab3a2d 927 printf("isClipBoardEmpty: %d\r\n", isClipBoardEmpty);
ryood 12:d4e5feab3a2d 928 printf("sequencePattern: %d\r\n", sequencePattern);
ryood 12:d4e5feab3a2d 929 for (int i = 0; i < SEQUENCE_N; i++) {
ryood 12:d4e5feab3a2d 930 printf("%d %d %03d %d %d\r\n",
ryood 12:d4e5feab3a2d 931 i,
ryood 12:d4e5feab3a2d 932 sequenceClipBoard[i].isNoteOn(),
ryood 12:d4e5feab3a2d 933 sequenceClipBoard[i].getPitch(),
ryood 12:d4e5feab3a2d 934 sequenceClipBoard[i].isTie(),
ryood 12:d4e5feab3a2d 935 sequenceClipBoard[i].isAccent()
ryood 12:d4e5feab3a2d 936 );
ryood 12:d4e5feab3a2d 937 }
ryood 12:d4e5feab3a2d 938 #endif
ryood 12:d4e5feab3a2d 939
ryood 12:d4e5feab3a2d 940 for (int i = 0; i < SEQUENCE_N; i++) {
ryood 12:d4e5feab3a2d 941 if (!isClipBoardEmpty) {
ryood 12:d4e5feab3a2d 942 sequences[sequencePattern][i].setNoteOn(sequenceClipBoard[i].isNoteOn());
ryood 12:d4e5feab3a2d 943 sequences[sequencePattern][i].setPitch(sequenceClipBoard[i].getPitch());
ryood 12:d4e5feab3a2d 944 sequences[sequencePattern][i].setTie(sequenceClipBoard[i].isTie());
ryood 12:d4e5feab3a2d 945 sequences[sequencePattern][i].setAccent(sequenceClipBoard[i].isAccent());
ryood 12:d4e5feab3a2d 946 }
ryood 12:d4e5feab3a2d 947 }
ryood 12:d4e5feab3a2d 948 // syncronize sequence value & Rotary Encoder's value
ryood 12:d4e5feab3a2d 949 RotEncPitch->setVal(sequences[sequencePattern][editingStep].getPitch());
ryood 12:d4e5feab3a2d 950 }
ryood 0:5bc618f6d862 951 };
ryood 0:5bc618f6d862 952
ryood 0:5bc618f6d862 953 #endif //_UICONTROLLER_H_