Integrated version

Committer:
ryood
Date:
Fri Nov 25 17:53:47 2016 +0000
Revision:
12:d4e5feab3a2d
Parent:
11:a2a51191ebe4
Child:
13:d3ee2ba4efaf
impl. Copy/Paste a seaquence.

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