Integrated version

Committer:
ryood
Date:
Fri Nov 25 12:13:01 2016 +0000
Revision:
10:a8ec7391a066
Parent:
9:70b8f9935ef7
Child:
11:a2a51191ebe4
Impl. Save/Load a sequence pattern to AT24C1024;

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