Integrated version

Committer:
ryood
Date:
Sun Nov 27 23:44:13 2016 +0000
Revision:
15:646a57eb89f3
Parent:
14:73d3546d92fd
Child:
16:566ddb132ef8
impl. a EEPROM Slot

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