Integrated version

Committer:
ryood
Date:
Thu Nov 17 12:25:30 2016 +0000
Revision:
8:62a65664a2fb
Parent:
7:0f8efe0e1e3f
Child:
9:70b8f9935ef7
Impl. Sequence pattern change

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