BaseMachine UI Controllerに分離

Dependencies:   AverageAnalogIn PinDetect RotaryEncoder Sequence SequencerDisplay mbed-rtos mbed st7567LCD BaseMachineComon

Fork of BaseMachine_Sequencer by Ryo Od

Committer:
ryood
Date:
Thu Oct 13 09:27:45 2016 +0000
Revision:
50:0a06df15c784
Parent:
49:22e651444533
Child:
51:7bbf15d6d7ec
Display params on the LCD while runnig

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ryood 15:9813d8eaf57e 1 /*
ryood 15:9813d8eaf57e 2 * main.cpp
ryood 15:9813d8eaf57e 3 * SpiSequencerSender_test
ryood 15:9813d8eaf57e 4 *
ryood 38:cafa2fff5565 5 * 2016.10.02 UI Controllerに分割
ryood 15:9813d8eaf57e 6 * 2016.08.20 mbed Rev 121 / mbed-rtos Rev 117で動作確認
ryood 15:9813d8eaf57e 7 *
ryood 15:9813d8eaf57e 8 */
ryood 15:9813d8eaf57e 9
ryood 0:21e39bc75e31 10 #include "mbed.h"
ryood 5:4abac408b827 11 #include "rtos.h"
ryood 16:b0419e3c9079 12 #include "st7565LCD.h"
ryood 18:309f794eba74 13 #include "PinDetect.h"
ryood 20:00d3b6ace8c7 14 #include "RotaryEncoder.h"
ryood 19:241a4b355413 15 #include "AverageAnalogIn.h"
ryood 0:21e39bc75e31 16
ryood 38:cafa2fff5565 17 #define UART_TRACE (1)
ryood 38:cafa2fff5565 18 #include "Sequence.h"
ryood 17:557658db3e81 19 #include "ST7565_SequencerDisplay.h"
ryood 0:21e39bc75e31 20
ryood 38:cafa2fff5565 21 #define TITLE_STR1 ("BaseMachine UI Controller")
ryood 49:22e651444533 22 #define TITLE_STR2 ("20161011")
ryood 16:b0419e3c9079 23
ryood 6:fc10eac60b91 24 #define SEQUENCE_N (16)
ryood 44:b1bdccdbf67e 25 #define SPI1_RATE (3000000)
ryood 38:cafa2fff5565 26 #define SPI2_RATE (1000000)
ryood 47:f4c16d1e4207 27 #define POT_RESOLUTION (7) // bit
ryood 47:f4c16d1e4207 28 #define AIN_AVERAGE (32) // AnalogInを移動平均する要素数
ryood 50:0a06df15c784 29 #define POLLING_POTS_WAIT (5) // POT読み取りThreadのWait値(ミリ秒)
ryood 0:21e39bc75e31 30
ryood 44:b1bdccdbf67e 31 enum SequencerCmd {
ryood 44:b1bdccdbf67e 32 CMD_RCV_PLAYING_STEP = 0x01,
ryood 44:b1bdccdbf67e 33 CMD_RUN = 0x11,
ryood 44:b1bdccdbf67e 34 CMD_BPM = 0x12,
ryood 44:b1bdccdbf67e 35 CMD_ACCENT_LEVEL = 0x13,
ryood 44:b1bdccdbf67e 36 CMD_WAVE_SHAPE = 0x21,
ryood 44:b1bdccdbf67e 37 CMD_PULSE_WIDTH = 0x22,
ryood 44:b1bdccdbf67e 38 CMD_CUTOFF = 0x31,
ryood 44:b1bdccdbf67e 39 CMD_RESONANCE = 0x32,
ryood 44:b1bdccdbf67e 40 CMD_LEVEL = 0x41,
ryood 44:b1bdccdbf67e 41 CMD_DURATION = 0x42,
ryood 44:b1bdccdbf67e 42 CMD_DECAY = 0x43,
ryood 44:b1bdccdbf67e 43 CMD_SUSTAIN = 0x44,
ryood 44:b1bdccdbf67e 44 CMD_NOTE = 0x51,
ryood 44:b1bdccdbf67e 45 CMD_PITCH = 0x52,
ryood 44:b1bdccdbf67e 46 };
ryood 44:b1bdccdbf67e 47
ryood 20:00d3b6ace8c7 48 const int baseNoteNumber = 36;
ryood 20:00d3b6ace8c7 49 const int bpmMax = 240;
ryood 20:00d3b6ace8c7 50 const int bpmMin = 60;
ryood 40:2f9616bdcf65 51 const int octaveMax = 2;
ryood 40:2f9616bdcf65 52 const int octaveMin = -2;
ryood 38:cafa2fff5565 53 const int waveShapeMax = 1;
ryood 28:d8614d2b82f9 54 const int UImodeMax = 2;
ryood 14:c173e03ee3ad 55
ryood 14:c173e03ee3ad 56 // Initial Sequence
ryood 26:fbf48a178aeb 57 const int noteOn[SEQUENCE_N] = { 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0 };
ryood 26:fbf48a178aeb 58 const int pitch[SEQUENCE_N] = {36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36 };
ryood 26:fbf48a178aeb 59 const int tie[SEQUENCE_N] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
ryood 26:fbf48a178aeb 60 const int accent[SEQUENCE_N] = { 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 };
ryood 10:fb04f9959fd9 61
ryood 16:b0419e3c9079 62 // Devices
ryood 16:b0419e3c9079 63 //
ryood 16:b0419e3c9079 64 //SPI (PinName mosi, PinName miso, PinName sclk, PinName ssel=NC)
ryood 41:48864f5f5424 65 SPI SpiMaster(PA_7, PA_6, PA_5);
ryood 41:48864f5f5424 66 DigitalOut SpiMasterCs(PB_6);
ryood 38:cafa2fff5565 67 InterruptIn stepChangeInterrupt(PC_7);
ryood 16:b0419e3c9079 68
ryood 16:b0419e3c9079 69 //ST7565(PinName mosi, PinName sclk, PinName cs, PinName rst, PinName a0);
ryood 16:b0419e3c9079 70 ST7565 gLCD(PB_15, PB_13, PB_12, PB_2, PB_1);
ryood 16:b0419e3c9079 71
ryood 42:3c71f925a47b 72 AverageAnalogIn AinPulseWidth(PC_2, AIN_AVERAGE);
ryood 42:3c71f925a47b 73 AverageAnalogIn AinCutOff(PB_0, AIN_AVERAGE);
ryood 42:3c71f925a47b 74 AverageAnalogIn AinResonance(PC_1, AIN_AVERAGE);
ryood 42:3c71f925a47b 75 AverageAnalogIn AinLevel(PC_0, AIN_AVERAGE);
ryood 42:3c71f925a47b 76 AverageAnalogIn AinDuration(PA_4, AIN_AVERAGE);
ryood 42:3c71f925a47b 77 AverageAnalogIn AinDecay(PA_1, AIN_AVERAGE);
ryood 42:3c71f925a47b 78 AverageAnalogIn AinSustain(PA_0, AIN_AVERAGE);
ryood 42:3c71f925a47b 79 AverageAnalogIn AinAccentLevel(PC_3, AIN_AVERAGE);
ryood 10:fb04f9959fd9 80
ryood 31:16d1fbf3a167 81 RotaryEncoder RotEncStep(PB_9, PB_8, 0, SEQUENCE_N - 1, 0);
ryood 26:fbf48a178aeb 82 RotaryEncoder RotEncPitch(PB_5, PB_4, 0, Sequence::getMaxPitch() - 1, 0);
ryood 31:16d1fbf3a167 83 RotaryEncoder RotEncBpm(PC_12, PC_10, bpmMin, bpmMax, 120);
ryood 20:00d3b6ace8c7 84
ryood 18:309f794eba74 85 PinDetect PinWaveShape(PD_2, PullUp);
ryood 28:d8614d2b82f9 86 PinDetect PinUIMode(PC_11, PullUp);
ryood 31:16d1fbf3a167 87 PinDetect PinOctaveUp(PB_3, PullUp);
ryood 31:16d1fbf3a167 88 PinDetect PinOctaveDown(PA_10, PullUp);
ryood 31:16d1fbf3a167 89 PinDetect PinNoteOnOff(PC_5, PullUp);
ryood 31:16d1fbf3a167 90 PinDetect PinTie(PC_6, PullUp);
ryood 31:16d1fbf3a167 91 PinDetect PinAccent(PC_8, PullUp);
ryood 31:16d1fbf3a167 92 PinDetect PinRunStop(PC_9, PullUp);
ryood 18:309f794eba74 93
ryood 16:b0419e3c9079 94 // Grobal Variables
ryood 16:b0419e3c9079 95 //
ryood 16:b0419e3c9079 96 Sequence sequences[SEQUENCE_N];
ryood 17:557658db3e81 97 ST7565_SequencerDisplay sequencerDisplay(&gLCD, sequences, SEQUENCE_N);
ryood 17:557658db3e81 98
ryood 38:cafa2fff5565 99 struct OscillatorParam {
ryood 38:cafa2fff5565 100 uint8_t waveShape;
ryood 38:cafa2fff5565 101 uint8_t pulseWidth;
ryood 38:cafa2fff5565 102 } oscillatorParam;
ryood 38:cafa2fff5565 103
ryood 38:cafa2fff5565 104 struct FilterParam {
ryood 38:cafa2fff5565 105 uint8_t cutoff;
ryood 38:cafa2fff5565 106 uint8_t resonance;
ryood 38:cafa2fff5565 107 } filterParam;
ryood 38:cafa2fff5565 108
ryood 38:cafa2fff5565 109 struct EnvelopeParam {
ryood 43:12d11507c077 110 uint8_t level;
ryood 43:12d11507c077 111 uint8_t length;
ryood 43:12d11507c077 112 uint8_t duration;
ryood 43:12d11507c077 113 uint8_t decay;
ryood 43:12d11507c077 114 uint8_t sustain;
ryood 38:cafa2fff5565 115 } envelopeParam;
ryood 38:cafa2fff5565 116
ryood 38:cafa2fff5565 117 uint8_t bpm = 120;
ryood 38:cafa2fff5565 118 uint8_t accentLevel = 127;
ryood 38:cafa2fff5565 119
ryood 38:cafa2fff5565 120 int currentStep = 0;
ryood 38:cafa2fff5565 121 int playingStep = 0;
ryood 38:cafa2fff5565 122 bool isRunning = false;
ryood 38:cafa2fff5565 123 bool isDirty = true;
ryood 38:cafa2fff5565 124 int UImode = 0;
ryood 38:cafa2fff5565 125
ryood 38:cafa2fff5565 126 volatile bool isStepChanged = false;
ryood 16:b0419e3c9079 127 volatile uint8_t pinFlag = 0x00;
ryood 16:b0419e3c9079 128
ryood 16:b0419e3c9079 129 enum PinBit {
ryood 16:b0419e3c9079 130 bWaveShape = 0x01,
ryood 38:cafa2fff5565 131 bUIMode = 0x02,
ryood 16:b0419e3c9079 132 bOctaveUp = 0x04,
ryood 16:b0419e3c9079 133 bOctaveDown = 0x08,
ryood 16:b0419e3c9079 134 bNoteOnOff = 0x10,
ryood 16:b0419e3c9079 135 bTie = 0x20,
ryood 16:b0419e3c9079 136 bAccent = 0x40,
ryood 16:b0419e3c9079 137 bRunStop = 0x80
ryood 16:b0419e3c9079 138 };
ryood 16:b0419e3c9079 139
ryood 16:b0419e3c9079 140 //------------------------------------------------------------------------
ryood 38:cafa2fff5565 141 // InterruptIn ISR
ryood 16:b0419e3c9079 142 //------------------------------------------------------------------------
ryood 38:cafa2fff5565 143 void updateStep()
ryood 8:de409197ff95 144 {
ryood 38:cafa2fff5565 145 isStepChanged = true;
ryood 8:de409197ff95 146 }
ryood 8:de409197ff95 147
ryood 16:b0419e3c9079 148 //------------------------------------------------------------------------
ryood 18:309f794eba74 149 // PinDetect ISR
ryood 18:309f794eba74 150 //------------------------------------------------------------------------
ryood 18:309f794eba74 151 void swWaveShapePressed()
ryood 18:309f794eba74 152 {
ryood 18:309f794eba74 153 pinFlag |= bWaveShape;
ryood 18:309f794eba74 154 }
ryood 18:309f794eba74 155
ryood 28:d8614d2b82f9 156 void swUIModePressed()
ryood 18:309f794eba74 157 {
ryood 28:d8614d2b82f9 158 pinFlag |= bUIMode;
ryood 18:309f794eba74 159 }
ryood 18:309f794eba74 160
ryood 18:309f794eba74 161 void swOctaveUpPressed()
ryood 18:309f794eba74 162 {
ryood 18:309f794eba74 163 pinFlag |= bOctaveUp;
ryood 18:309f794eba74 164 }
ryood 18:309f794eba74 165
ryood 18:309f794eba74 166 void swOctaveDownPressed()
ryood 18:309f794eba74 167 {
ryood 18:309f794eba74 168 pinFlag |= bOctaveDown;
ryood 18:309f794eba74 169 }
ryood 18:309f794eba74 170
ryood 18:309f794eba74 171 void swNoteOnOffPressed()
ryood 18:309f794eba74 172 {
ryood 18:309f794eba74 173 pinFlag |= bNoteOnOff;
ryood 18:309f794eba74 174 }
ryood 18:309f794eba74 175
ryood 18:309f794eba74 176 void swTiePressed()
ryood 18:309f794eba74 177 {
ryood 18:309f794eba74 178 pinFlag |= bTie;
ryood 18:309f794eba74 179 }
ryood 18:309f794eba74 180
ryood 18:309f794eba74 181 void swAccentPressed()
ryood 18:309f794eba74 182 {
ryood 18:309f794eba74 183 pinFlag |= bAccent;
ryood 18:309f794eba74 184 }
ryood 18:309f794eba74 185
ryood 18:309f794eba74 186 void swRunStopPressed()
ryood 18:309f794eba74 187 {
ryood 18:309f794eba74 188 pinFlag |= bRunStop;
ryood 18:309f794eba74 189 }
ryood 18:309f794eba74 190
ryood 18:309f794eba74 191 //------------------------------------------------------------------------
ryood 16:b0419e3c9079 192 // Functions
ryood 16:b0419e3c9079 193 //------------------------------------------------------------------------
ryood 49:22e651444533 194 uint8_t getNoteData(uint8_t step)
ryood 49:22e651444533 195 {
ryood 49:22e651444533 196 uint8_t noteData = 0;
ryood 49:22e651444533 197
ryood 49:22e651444533 198 noteData |= (step << 4);
ryood 49:22e651444533 199 noteData |= (sequences[step].isAccent() ? 4 : 0);
ryood 49:22e651444533 200 noteData |= (sequences[step].isTie() ? 2 : 0);
ryood 49:22e651444533 201 noteData |= (sequences[step].isNoteOn() ? 1 : 0);
ryood 49:22e651444533 202
ryood 49:22e651444533 203 return noteData;
ryood 49:22e651444533 204 }
ryood 49:22e651444533 205
ryood 44:b1bdccdbf67e 206 uint16_t SpiSendParams(uint8_t cmd, uint8_t data)
ryood 44:b1bdccdbf67e 207 {
ryood 44:b1bdccdbf67e 208 uint16_t sendVal = ((uint16_t)cmd << 8) | data;
ryood 44:b1bdccdbf67e 209
ryood 44:b1bdccdbf67e 210 SpiMasterCs = 0;
ryood 44:b1bdccdbf67e 211 uint16_t recievedVal = SpiMaster.write(sendVal);
ryood 44:b1bdccdbf67e 212 SpiMasterCs = 1;
ryood 44:b1bdccdbf67e 213 //Thread::wait(1);
ryood 44:b1bdccdbf67e 214
ryood 44:b1bdccdbf67e 215 return recievedVal;
ryood 44:b1bdccdbf67e 216 }
ryood 44:b1bdccdbf67e 217
ryood 49:22e651444533 218 uint16_t SpiSendAllParams()
ryood 45:3c7143da38d1 219 {
ryood 49:22e651444533 220 SpiSendParams(CMD_BPM, bpm);
ryood 49:22e651444533 221 SpiSendParams(CMD_ACCENT_LEVEL, accentLevel);
ryood 49:22e651444533 222 SpiSendParams(CMD_WAVE_SHAPE , oscillatorParam.waveShape);
ryood 49:22e651444533 223 SpiSendParams(CMD_PULSE_WIDTH, oscillatorParam.pulseWidth);
ryood 49:22e651444533 224 SpiSendParams(CMD_CUTOFF, filterParam.cutoff);
ryood 49:22e651444533 225 SpiSendParams(CMD_RESONANCE, filterParam.resonance);
ryood 49:22e651444533 226 SpiSendParams(CMD_LEVEL, envelopeParam.level);
ryood 49:22e651444533 227 SpiSendParams(CMD_DURATION, envelopeParam.duration);
ryood 49:22e651444533 228 SpiSendParams(CMD_DECAY, envelopeParam.decay);
ryood 49:22e651444533 229 SpiSendParams(CMD_SUSTAIN, envelopeParam.sustain);
ryood 49:22e651444533 230
ryood 49:22e651444533 231 for (int i = 0; i < SEQUENCE_N; i++) {
ryood 49:22e651444533 232 SpiSendParams(CMD_NOTE, getNoteData(i));
ryood 49:22e651444533 233 SpiSendParams(CMD_PITCH, sequences[i].getPitch());
ryood 49:22e651444533 234 }
ryood 49:22e651444533 235
ryood 49:22e651444533 236 uint16_t retVal = SpiSendParams(CMD_RCV_PLAYING_STEP, 0xaa); // Send dummy data
ryood 45:3c7143da38d1 237
ryood 49:22e651444533 238 return retVal;
ryood 45:3c7143da38d1 239 }
ryood 45:3c7143da38d1 240
ryood 20:00d3b6ace8c7 241 void pollingRotEncs()
ryood 20:00d3b6ace8c7 242 {
ryood 20:00d3b6ace8c7 243 int _bpm = RotEncBpm.getVal();
ryood 38:cafa2fff5565 244 if (_bpm != bpm) {
ryood 38:cafa2fff5565 245 bpm = _bpm;
ryood 25:7382bc0a0329 246 sequencerDisplay.setBpm(_bpm);
ryood 46:0fb579ecdd77 247 SpiSendParams(CMD_BPM, _bpm);
ryood 20:00d3b6ace8c7 248 isDirty = true;
ryood 20:00d3b6ace8c7 249 }
ryood 20:00d3b6ace8c7 250
ryood 20:00d3b6ace8c7 251 int _step = RotEncStep.getVal();
ryood 20:00d3b6ace8c7 252 if (_step != currentStep) {
ryood 20:00d3b6ace8c7 253 currentStep = _step;
ryood 20:00d3b6ace8c7 254 // syncronize sequence value & Rotary Encoder's value
ryood 20:00d3b6ace8c7 255 RotEncPitch.setVal(sequences[currentStep].getPitch());
ryood 46:0fb579ecdd77 256 SpiSendParams(CMD_NOTE, getNoteData(_step));
ryood 46:0fb579ecdd77 257 SpiSendParams(CMD_PITCH, sequences[_step].getPitch());
ryood 20:00d3b6ace8c7 258 isDirty = true;
ryood 20:00d3b6ace8c7 259 }
ryood 20:00d3b6ace8c7 260
ryood 20:00d3b6ace8c7 261 int _pitch = RotEncPitch.getVal();
ryood 20:00d3b6ace8c7 262 if (_pitch != sequences[currentStep].getPitch()) {
ryood 20:00d3b6ace8c7 263 sequences[currentStep].setPitch(_pitch);
ryood 46:0fb579ecdd77 264 SpiSendParams(CMD_NOTE, getNoteData(currentStep));
ryood 46:0fb579ecdd77 265 SpiSendParams(CMD_PITCH, _pitch);
ryood 20:00d3b6ace8c7 266 isDirty = true;
ryood 20:00d3b6ace8c7 267 }
ryood 19:241a4b355413 268 }
ryood 19:241a4b355413 269
ryood 18:309f794eba74 270 void pollingPins()
ryood 18:309f794eba74 271 {
ryood 18:309f794eba74 272 if (pinFlag & bWaveShape) {
ryood 18:309f794eba74 273 #if (UART_TRACE)
ryood 18:309f794eba74 274 printf("PinWaveShape Pushed\r\n");
ryood 18:309f794eba74 275 #endif
ryood 38:cafa2fff5565 276 uint8_t _waveShape = oscillatorParam.waveShape;
ryood 38:cafa2fff5565 277 _waveShape++;
ryood 40:2f9616bdcf65 278 if (_waveShape > waveShapeMax) {
ryood 38:cafa2fff5565 279 _waveShape = 0;
ryood 18:309f794eba74 280 }
ryood 38:cafa2fff5565 281 oscillatorParam.waveShape = _waveShape;
ryood 38:cafa2fff5565 282 sequencerDisplay.setWaveShape(_waveShape);
ryood 18:309f794eba74 283 pinFlag &= ~bWaveShape;
ryood 45:3c7143da38d1 284 SpiSendParams(CMD_WAVE_SHAPE, _waveShape);
ryood 28:d8614d2b82f9 285 isDirty = true;
ryood 18:309f794eba74 286 }
ryood 18:309f794eba74 287
ryood 28:d8614d2b82f9 288 if (pinFlag & bUIMode) {
ryood 18:309f794eba74 289 #if (UART_TRACE)
ryood 28:d8614d2b82f9 290 printf("PinUIMode Pushed\r\n");
ryood 18:309f794eba74 291 #endif
ryood 28:d8614d2b82f9 292 UImode++;
ryood 28:d8614d2b82f9 293 if (UImode > UImodeMax) {
ryood 28:d8614d2b82f9 294 UImode = 0;
ryood 18:309f794eba74 295 }
ryood 28:d8614d2b82f9 296 pinFlag &= ~bUIMode;
ryood 28:d8614d2b82f9 297 isDirty = true;
ryood 18:309f794eba74 298 }
ryood 18:309f794eba74 299
ryood 18:309f794eba74 300 if (pinFlag & bOctaveUp) {
ryood 18:309f794eba74 301 #if (UART_TRACE)
ryood 18:309f794eba74 302 printf("PinOctaveUp Pushed\r\n");
ryood 18:309f794eba74 303 #endif
ryood 43:12d11507c077 304 if (sequencerDisplay.getOctave() < octaveMax) {
ryood 40:2f9616bdcf65 305 sequencerDisplay.setOctave(sequencerDisplay.getOctave() + 1);
ryood 40:2f9616bdcf65 306 isDirty = true;
ryood 40:2f9616bdcf65 307 }
ryood 18:309f794eba74 308 pinFlag &= ~bOctaveUp;
ryood 18:309f794eba74 309 }
ryood 18:309f794eba74 310
ryood 18:309f794eba74 311 if (pinFlag & bOctaveDown) {
ryood 18:309f794eba74 312 #if (UART_TRACE)
ryood 18:309f794eba74 313 printf("PinOctaveDown Pushed\r\n");
ryood 18:309f794eba74 314 #endif
ryood 40:2f9616bdcf65 315 if (sequencerDisplay.getOctave () > octaveMin) {
ryood 40:2f9616bdcf65 316 sequencerDisplay.setOctave(sequencerDisplay.getOctave() - 1);
ryood 40:2f9616bdcf65 317 isDirty = true;
ryood 40:2f9616bdcf65 318 }
ryood 18:309f794eba74 319 pinFlag &= ~bOctaveDown;
ryood 18:309f794eba74 320 }
ryood 18:309f794eba74 321
ryood 18:309f794eba74 322 if (pinFlag & bNoteOnOff) {
ryood 18:309f794eba74 323 #if (UART_TRACE)
ryood 18:309f794eba74 324 printf("PinNoteOnOff Pushed\r\n");
ryood 18:309f794eba74 325 #endif
ryood 18:309f794eba74 326 sequences[currentStep].setNoteOn(!sequences[currentStep].isNoteOn());
ryood 18:309f794eba74 327 pinFlag &= ~bNoteOnOff;
ryood 45:3c7143da38d1 328 SpiSendParams(CMD_NOTE, getNoteData(currentStep));
ryood 28:d8614d2b82f9 329 isDirty = true;
ryood 18:309f794eba74 330 }
ryood 18:309f794eba74 331
ryood 18:309f794eba74 332 if (pinFlag & bTie) {
ryood 18:309f794eba74 333 #if (UART_TRACE)
ryood 18:309f794eba74 334 printf("PinTie Pushed\r\n");
ryood 18:309f794eba74 335 #endif
ryood 18:309f794eba74 336 sequences[currentStep].setTie(!sequences[currentStep].isTie());
ryood 18:309f794eba74 337 pinFlag &= ~bTie;
ryood 45:3c7143da38d1 338 SpiSendParams(CMD_NOTE, getNoteData(currentStep));
ryood 28:d8614d2b82f9 339 isDirty = true;
ryood 18:309f794eba74 340 }
ryood 18:309f794eba74 341
ryood 18:309f794eba74 342 if (pinFlag & bAccent) {
ryood 18:309f794eba74 343 #if (UART_TRACE)
ryood 18:309f794eba74 344 printf("PinAccent Pushed\r\n");
ryood 18:309f794eba74 345 #endif
ryood 18:309f794eba74 346 sequences[currentStep].setAccent(!sequences[currentStep].isAccent());
ryood 18:309f794eba74 347 pinFlag &= ~bAccent;
ryood 45:3c7143da38d1 348 SpiSendParams(CMD_NOTE, getNoteData(currentStep));
ryood 28:d8614d2b82f9 349 isDirty = true;
ryood 18:309f794eba74 350 }
ryood 18:309f794eba74 351
ryood 18:309f794eba74 352 if (pinFlag & bRunStop) {
ryood 18:309f794eba74 353 #if (UART_TRACE)
ryood 18:309f794eba74 354 printf("PinRunStop Pushed\r\n");
ryood 18:309f794eba74 355 #endif
ryood 18:309f794eba74 356 if (isRunning) {
ryood 18:309f794eba74 357 isRunning = false;
ryood 18:309f794eba74 358 } else {
ryood 18:309f794eba74 359 isRunning = true;
ryood 18:309f794eba74 360 }
ryood 18:309f794eba74 361 pinFlag &= ~bRunStop;
ryood 45:3c7143da38d1 362 SpiSendParams(CMD_RUN, isRunning);
ryood 28:d8614d2b82f9 363 isDirty = true;
ryood 18:309f794eba74 364 }
ryood 18:309f794eba74 365 }
ryood 18:309f794eba74 366
ryood 28:d8614d2b82f9 367 void dumpToLCD00()
ryood 16:b0419e3c9079 368 {
ryood 16:b0419e3c9079 369 char buff[64];
ryood 16:b0419e3c9079 370 int col = 0;
ryood 16:b0419e3c9079 371
ryood 16:b0419e3c9079 372 gLCD.clear();
ryood 16:b0419e3c9079 373
ryood 38:cafa2fff5565 374 sprintf(buff, "Run:%d BPM:%03d", isRunning, bpm);
ryood 16:b0419e3c9079 375 gLCD.drawstring(0, col++, buff);
ryood 24:040cdcb2ff14 376
ryood 24:040cdcb2ff14 377 sprintf(buff, "Stp:%02d Nto:%d Pch:%02d",
ryood 24:040cdcb2ff14 378 currentStep, sequences[currentStep].isNoteOn(), sequences[currentStep].getPitch());
ryood 24:040cdcb2ff14 379 gLCD.drawstring(0, col++, buff);
ryood 24:040cdcb2ff14 380
ryood 24:040cdcb2ff14 381 sprintf(buff, "Oct:%-2d Tie:%d Acc:%d",
ryood 26:fbf48a178aeb 382 sequencerDisplay.getOctave(), sequences[currentStep].isTie(),sequences[currentStep].isAccent());
ryood 16:b0419e3c9079 383 gLCD.drawstring(0, col++, buff);
ryood 16:b0419e3c9079 384
ryood 41:48864f5f5424 385 sprintf(buff, "Wsp:%d Mod:%d pStp:%d", oscillatorParam.waveShape, UImode, playingStep);
ryood 16:b0419e3c9079 386 gLCD.drawstring(0, col++, buff);
ryood 16:b0419e3c9079 387
ryood 38:cafa2fff5565 388 sprintf(buff, "PW :%4d CO :%4d", oscillatorParam.pulseWidth, filterParam.cutoff);
ryood 24:040cdcb2ff14 389 gLCD.drawstring(0, col++, buff);
ryood 38:cafa2fff5565 390 sprintf(buff, "RSO:%4d ACL:%4d", filterParam.resonance, accentLevel);
ryood 24:040cdcb2ff14 391 gLCD.drawstring(0, col++, buff);
ryood 38:cafa2fff5565 392 sprintf(buff, "LVL:%4d DUR:%4d", envelopeParam.level, envelopeParam.duration);
ryood 24:040cdcb2ff14 393 gLCD.drawstring(0, col++, buff);
ryood 38:cafa2fff5565 394 sprintf(buff, "DCY:%4d SUS:%4d", envelopeParam.decay, envelopeParam.sustain);
ryood 24:040cdcb2ff14 395 gLCD.drawstring(0, col++, buff);
ryood 16:b0419e3c9079 396
ryood 16:b0419e3c9079 397 gLCD.display();
ryood 16:b0419e3c9079 398 }
ryood 16:b0419e3c9079 399
ryood 28:d8614d2b82f9 400 void dumpToLCD01()
ryood 28:d8614d2b82f9 401 {
ryood 42:3c71f925a47b 402 static int errCutoff = 0;
ryood 42:3c71f925a47b 403 static int errDuration = 0;
ryood 42:3c71f925a47b 404 static int errDecay = 0;
ryood 42:3c71f925a47b 405 static int errSustain = 0;
ryood 42:3c71f925a47b 406 static int errResonace = 0;
ryood 42:3c71f925a47b 407 static int errLevel = 0;
ryood 42:3c71f925a47b 408 static int errPulseWidth = 0;
ryood 42:3c71f925a47b 409 static int errAccentLevel = 0;
ryood 42:3c71f925a47b 410
ryood 42:3c71f925a47b 411 uint8_t v;
ryood 28:d8614d2b82f9 412 char buff[64];
ryood 42:3c71f925a47b 413
ryood 42:3c71f925a47b 414 v = AinCutOff.read_u16() >> (16 - POT_RESOLUTION);
ryood 42:3c71f925a47b 415 if (v != filterParam.cutoff) {
ryood 42:3c71f925a47b 416 errCutoff++;
ryood 42:3c71f925a47b 417 filterParam.cutoff = v;
ryood 42:3c71f925a47b 418 }
ryood 42:3c71f925a47b 419 v = AinDuration.read_u16() >> (16 - POT_RESOLUTION);
ryood 42:3c71f925a47b 420 if (v != envelopeParam.duration) {
ryood 42:3c71f925a47b 421 errDuration++;
ryood 42:3c71f925a47b 422 envelopeParam.duration = v;
ryood 42:3c71f925a47b 423 }
ryood 42:3c71f925a47b 424 v = AinDecay.read_u16() >> (16 - POT_RESOLUTION);
ryood 42:3c71f925a47b 425 if (v != envelopeParam.decay) {
ryood 42:3c71f925a47b 426 errDecay++;
ryood 42:3c71f925a47b 427 envelopeParam.decay = v;
ryood 42:3c71f925a47b 428 }
ryood 42:3c71f925a47b 429 v = AinSustain.read_u16() >> (16 - POT_RESOLUTION);
ryood 42:3c71f925a47b 430 if (v != envelopeParam.sustain) {
ryood 42:3c71f925a47b 431 errSustain++;
ryood 42:3c71f925a47b 432 envelopeParam.sustain = v;
ryood 42:3c71f925a47b 433 }
ryood 42:3c71f925a47b 434
ryood 42:3c71f925a47b 435 v = AinResonance.read_u16() >> (16 - POT_RESOLUTION);
ryood 42:3c71f925a47b 436 if (v != filterParam.resonance) {
ryood 42:3c71f925a47b 437 errResonace++;
ryood 42:3c71f925a47b 438 filterParam.resonance = v;
ryood 42:3c71f925a47b 439 }
ryood 42:3c71f925a47b 440 v = AinLevel.read_u16() >> (16 - POT_RESOLUTION);
ryood 42:3c71f925a47b 441 if (v != envelopeParam.level) {
ryood 42:3c71f925a47b 442 errLevel++;
ryood 42:3c71f925a47b 443 envelopeParam.level = v;
ryood 42:3c71f925a47b 444 }
ryood 42:3c71f925a47b 445 v = AinPulseWidth.read_u16() >> (16 - POT_RESOLUTION);
ryood 42:3c71f925a47b 446 if (v != oscillatorParam.pulseWidth) {
ryood 42:3c71f925a47b 447 errPulseWidth++;
ryood 42:3c71f925a47b 448 oscillatorParam.pulseWidth = v;
ryood 42:3c71f925a47b 449 }
ryood 42:3c71f925a47b 450 v = AinAccentLevel.read_u16() >> (16 - POT_RESOLUTION);
ryood 42:3c71f925a47b 451 if (v != accentLevel) {
ryood 42:3c71f925a47b 452 errAccentLevel++;
ryood 42:3c71f925a47b 453 accentLevel = v;
ryood 42:3c71f925a47b 454 }
ryood 28:d8614d2b82f9 455
ryood 28:d8614d2b82f9 456 gLCD.clear();
ryood 28:d8614d2b82f9 457
ryood 42:3c71f925a47b 458 sprintf(buff, "Cutoff %3d %5d", filterParam.cutoff, errCutoff);
ryood 42:3c71f925a47b 459 gLCD.drawstring(0, 0, buff);
ryood 42:3c71f925a47b 460 sprintf(buff, "Duration %3d %5d", envelopeParam.duration, errDuration);
ryood 42:3c71f925a47b 461 gLCD.drawstring(0, 1, buff);
ryood 42:3c71f925a47b 462 sprintf(buff, "Decay %3d %5d", envelopeParam.decay, errDecay);
ryood 42:3c71f925a47b 463 gLCD.drawstring(0, 2, buff);
ryood 42:3c71f925a47b 464 sprintf(buff, "Sustain %3d %5d", envelopeParam.sustain, errSustain);
ryood 42:3c71f925a47b 465 gLCD.drawstring(0, 3, buff);
ryood 42:3c71f925a47b 466 sprintf(buff, "Resonance %3d %5d", filterParam.resonance, errResonace);
ryood 42:3c71f925a47b 467 gLCD.drawstring(0, 4, buff);
ryood 42:3c71f925a47b 468 sprintf(buff, "Level %3d %5d", envelopeParam.level, errLevel);
ryood 42:3c71f925a47b 469 gLCD.drawstring(0, 5, buff);
ryood 42:3c71f925a47b 470 sprintf(buff, "PulseWidth %3d %5d", oscillatorParam.pulseWidth, errPulseWidth);
ryood 42:3c71f925a47b 471 gLCD.drawstring(0, 6, buff);
ryood 42:3c71f925a47b 472 sprintf(buff, "AccentLvl %3d %5d", accentLevel, errAccentLevel);
ryood 42:3c71f925a47b 473 gLCD.drawstring(0, 7, buff);
ryood 28:d8614d2b82f9 474
ryood 28:d8614d2b82f9 475 gLCD.display();
ryood 42:3c71f925a47b 476 Thread::wait(10);
ryood 28:d8614d2b82f9 477 }
ryood 28:d8614d2b82f9 478
ryood 16:b0419e3c9079 479 //------------------------------------------------------------------------
ryood 47:f4c16d1e4207 480 // Threads
ryood 47:f4c16d1e4207 481 //------------------------------------------------------------------------
ryood 47:f4c16d1e4207 482
ryood 47:f4c16d1e4207 483 void pollingPots(void const *args)
ryood 47:f4c16d1e4207 484 {
ryood 47:f4c16d1e4207 485 for (;;)
ryood 47:f4c16d1e4207 486 {
ryood 47:f4c16d1e4207 487 uint8_t pulseWidth = AinPulseWidth.read_u16() >> (16 - POT_RESOLUTION);
ryood 47:f4c16d1e4207 488 if (pulseWidth != oscillatorParam.pulseWidth) {
ryood 47:f4c16d1e4207 489 oscillatorParam.pulseWidth = pulseWidth;
ryood 47:f4c16d1e4207 490 SpiSendParams(CMD_PULSE_WIDTH, pulseWidth);
ryood 47:f4c16d1e4207 491 isDirty = true;
ryood 47:f4c16d1e4207 492 }
ryood 47:f4c16d1e4207 493
ryood 47:f4c16d1e4207 494 uint8_t cutoff = AinCutOff.read_u16() >> (16 - POT_RESOLUTION);
ryood 47:f4c16d1e4207 495 if (cutoff != filterParam.cutoff) {
ryood 47:f4c16d1e4207 496 filterParam.cutoff = cutoff;
ryood 47:f4c16d1e4207 497 SpiSendParams(CMD_CUTOFF, cutoff);
ryood 47:f4c16d1e4207 498 isDirty = true;
ryood 47:f4c16d1e4207 499 }
ryood 47:f4c16d1e4207 500
ryood 47:f4c16d1e4207 501 uint8_t resonance = AinResonance.read_u16() >> (16 - POT_RESOLUTION);
ryood 47:f4c16d1e4207 502 if (resonance != filterParam.resonance) {
ryood 47:f4c16d1e4207 503 filterParam.resonance = resonance;
ryood 47:f4c16d1e4207 504 SpiSendParams(CMD_RESONANCE, resonance);
ryood 47:f4c16d1e4207 505 isDirty = true;
ryood 47:f4c16d1e4207 506 }
ryood 47:f4c16d1e4207 507
ryood 47:f4c16d1e4207 508 uint8_t level = AinLevel.read_u16() >> (16 - POT_RESOLUTION);
ryood 47:f4c16d1e4207 509 if (level != envelopeParam.level) {
ryood 47:f4c16d1e4207 510 envelopeParam.level = level;
ryood 47:f4c16d1e4207 511 SpiSendParams(CMD_LEVEL, level);
ryood 47:f4c16d1e4207 512 isDirty = true;
ryood 47:f4c16d1e4207 513 }
ryood 47:f4c16d1e4207 514
ryood 47:f4c16d1e4207 515 uint8_t duration = AinDuration.read_u16() >> (16 - POT_RESOLUTION);
ryood 47:f4c16d1e4207 516 if (duration != envelopeParam.duration) {
ryood 47:f4c16d1e4207 517 envelopeParam.duration = duration;
ryood 47:f4c16d1e4207 518 SpiSendParams(CMD_DURATION, duration);
ryood 47:f4c16d1e4207 519 isDirty = true;
ryood 47:f4c16d1e4207 520 }
ryood 47:f4c16d1e4207 521
ryood 47:f4c16d1e4207 522 uint8_t decay = AinDecay.read_u16() >> (16 - POT_RESOLUTION);
ryood 47:f4c16d1e4207 523 if (decay != envelopeParam.decay) {
ryood 47:f4c16d1e4207 524 envelopeParam.decay = decay;
ryood 47:f4c16d1e4207 525 SpiSendParams(CMD_DECAY, decay);
ryood 47:f4c16d1e4207 526 isDirty = true;
ryood 47:f4c16d1e4207 527 }
ryood 47:f4c16d1e4207 528
ryood 47:f4c16d1e4207 529 uint8_t sustain = AinSustain.read_u16() >> (16 - POT_RESOLUTION);
ryood 47:f4c16d1e4207 530 if (sustain != envelopeParam.sustain) {
ryood 47:f4c16d1e4207 531 envelopeParam.sustain = sustain;
ryood 47:f4c16d1e4207 532 SpiSendParams(CMD_SUSTAIN, sustain);
ryood 47:f4c16d1e4207 533 isDirty = true;
ryood 47:f4c16d1e4207 534 }
ryood 47:f4c16d1e4207 535
ryood 47:f4c16d1e4207 536 uint8_t _accentLevel = AinAccentLevel.read_u16() >> (16 - POT_RESOLUTION);
ryood 47:f4c16d1e4207 537 if (_accentLevel != accentLevel) {
ryood 47:f4c16d1e4207 538 accentLevel = _accentLevel;
ryood 47:f4c16d1e4207 539 SpiSendParams(CMD_ACCENT_LEVEL, accentLevel);
ryood 47:f4c16d1e4207 540 isDirty = true;
ryood 47:f4c16d1e4207 541 }
ryood 47:f4c16d1e4207 542
ryood 47:f4c16d1e4207 543 Thread::wait(POLLING_POTS_WAIT);
ryood 47:f4c16d1e4207 544 }
ryood 47:f4c16d1e4207 545 }
ryood 47:f4c16d1e4207 546
ryood 47:f4c16d1e4207 547 //------------------------------------------------------------------------
ryood 16:b0419e3c9079 548 // Main routine
ryood 16:b0419e3c9079 549 //------------------------------------------------------------------------
ryood 0:21e39bc75e31 550 int main()
ryood 0:21e39bc75e31 551 {
ryood 18:309f794eba74 552 #if (UART_TRACE)
ryood 38:cafa2fff5565 553 printf("*** BaseMachine UI Controller ***\r\n");
ryood 18:309f794eba74 554 #endif
ryood 18:309f794eba74 555
ryood 24:040cdcb2ff14 556 //--------------------------------------------------------------------
ryood 16:b0419e3c9079 557 // Setup Devices
ryood 16:b0419e3c9079 558 //
ryood 38:cafa2fff5565 559 gLCD.set_spi_frequency(SPI2_RATE);
ryood 16:b0419e3c9079 560 gLCD.begin(0x12);
ryood 16:b0419e3c9079 561 gLCD.clear();
ryood 16:b0419e3c9079 562 gLCD.drawstring(0, 0, TITLE_STR1);
ryood 16:b0419e3c9079 563 gLCD.drawstring(0, 1, TITLE_STR2);
ryood 16:b0419e3c9079 564 gLCD.display();
ryood 16:b0419e3c9079 565 Thread::wait(1000);
ryood 16:b0419e3c9079 566
ryood 20:00d3b6ace8c7 567 RotEncStep.setInterval(100);
ryood 20:00d3b6ace8c7 568 RotEncPitch.setInterval(100);
ryood 20:00d3b6ace8c7 569 RotEncBpm.setInterval(100);
ryood 17:557658db3e81 570
ryood 18:309f794eba74 571 PinWaveShape.attach_asserted(&swWaveShapePressed);
ryood 18:309f794eba74 572 PinWaveShape.setAssertValue(0);
ryood 18:309f794eba74 573 PinWaveShape.setSampleFrequency();
ryood 18:309f794eba74 574
ryood 28:d8614d2b82f9 575 PinUIMode.attach_asserted(&swUIModePressed);
ryood 28:d8614d2b82f9 576 PinUIMode.setAssertValue(0);
ryood 28:d8614d2b82f9 577 PinUIMode.setSampleFrequency();
ryood 18:309f794eba74 578
ryood 18:309f794eba74 579 PinOctaveUp.attach_asserted(&swOctaveUpPressed);
ryood 18:309f794eba74 580 PinOctaveUp.setAssertValue(0);
ryood 18:309f794eba74 581 PinOctaveUp.setSampleFrequency();
ryood 18:309f794eba74 582
ryood 18:309f794eba74 583 PinOctaveDown.attach_asserted(&swOctaveDownPressed);
ryood 18:309f794eba74 584 PinOctaveDown.setAssertValue(0);
ryood 18:309f794eba74 585 PinOctaveDown.setSampleFrequency();
ryood 18:309f794eba74 586
ryood 18:309f794eba74 587 PinNoteOnOff.attach_asserted(&swNoteOnOffPressed);
ryood 18:309f794eba74 588 PinNoteOnOff.setAssertValue(0);
ryood 18:309f794eba74 589 PinNoteOnOff.setSampleFrequency();
ryood 18:309f794eba74 590
ryood 18:309f794eba74 591 PinTie.attach_asserted(&swTiePressed);
ryood 18:309f794eba74 592 PinTie.setAssertValue(0);
ryood 18:309f794eba74 593 PinTie.setSampleFrequency();
ryood 18:309f794eba74 594
ryood 18:309f794eba74 595 PinAccent.attach_asserted(&swAccentPressed);
ryood 18:309f794eba74 596 PinAccent.setAssertValue(0);
ryood 18:309f794eba74 597 PinAccent.setSampleFrequency();
ryood 18:309f794eba74 598
ryood 18:309f794eba74 599 PinRunStop.attach_asserted(&swRunStopPressed);
ryood 18:309f794eba74 600 PinRunStop.setAssertValue(0);
ryood 41:48864f5f5424 601 PinRunStop.setSampleFrequency();
ryood 41:48864f5f5424 602
ryood 41:48864f5f5424 603 //--------------------------------------------------------------------
ryood 41:48864f5f5424 604 // Initialize SPI Master
ryood 41:48864f5f5424 605 //
ryood 41:48864f5f5424 606 SpiMasterCs = 1;
ryood 44:b1bdccdbf67e 607 SpiMaster.format(16, 0);
ryood 41:48864f5f5424 608 SpiMaster.frequency(SPI1_RATE);
ryood 41:48864f5f5424 609
ryood 41:48864f5f5424 610 stepChangeInterrupt.fall(&updateStep);
ryood 18:309f794eba74 611
ryood 24:040cdcb2ff14 612 //--------------------------------------------------------------------
ryood 22:82f1e7877f9f 613 // Initialize objects
ryood 0:21e39bc75e31 614 //
ryood 15:9813d8eaf57e 615 Sequence::setBaseNoteNumber(baseNoteNumber);
ryood 14:c173e03ee3ad 616
ryood 0:21e39bc75e31 617 for (int i = 0; i < SEQUENCE_N; i++) {
ryood 38:cafa2fff5565 618 Sequence& seq = sequences[i];
ryood 14:c173e03ee3ad 619 seq.setPitch(pitch[i]);
ryood 15:9813d8eaf57e 620 seq.setNoteOn(noteOn[i]);
ryood 15:9813d8eaf57e 621 seq.setTie(tie[i]);
ryood 26:fbf48a178aeb 622 seq.setAccent(accent[i]);
ryood 0:21e39bc75e31 623 }
ryood 26:fbf48a178aeb 624 RotEncPitch.setVal(sequences[0].getPitch());
ryood 6:fc10eac60b91 625
ryood 24:040cdcb2ff14 626 //--------------------------------------------------------------------
ryood 47:f4c16d1e4207 627 // Initialize threads
ryood 47:f4c16d1e4207 628 //
ryood 47:f4c16d1e4207 629 Thread thPollingPots(pollingPots);
ryood 49:22e651444533 630
ryood 49:22e651444533 631 //--------------------------------------------------------------------
ryood 49:22e651444533 632 // Synchronize with Slave
ryood 49:22e651444533 633 //
ryood 49:22e651444533 634 Thread::wait(100);
ryood 49:22e651444533 635 SpiSendAllParams();
ryood 47:f4c16d1e4207 636
ryood 47:f4c16d1e4207 637 //--------------------------------------------------------------------
ryood 24:040cdcb2ff14 638 // Main loop
ryood 24:040cdcb2ff14 639 //
ryood 5:4abac408b827 640 for (;;) {
ryood 41:48864f5f5424 641 // Polling Devices
ryood 47:f4c16d1e4207 642 /*
ryood 42:3c71f925a47b 643 if (UImode != 2) {
ryood 42:3c71f925a47b 644 pollingPots();
ryood 42:3c71f925a47b 645 }
ryood 47:f4c16d1e4207 646 */
ryood 20:00d3b6ace8c7 647 pollingRotEncs();
ryood 18:309f794eba74 648 pollingPins();
ryood 41:48864f5f5424 649
ryood 44:b1bdccdbf67e 650 // Recieve playing step from SPI slave
ryood 44:b1bdccdbf67e 651 if (isStepChanged) {
ryood 44:b1bdccdbf67e 652 uint16_t recievedVal = SpiSendParams(CMD_RCV_PLAYING_STEP, 0x55); // Send dummy data
ryood 44:b1bdccdbf67e 653 playingStep = (uint8_t)(recievedVal & 0xff);
ryood 44:b1bdccdbf67e 654 isStepChanged = false;
ryood 44:b1bdccdbf67e 655 isDirty = true;
ryood 44:b1bdccdbf67e 656 }
ryood 41:48864f5f5424 657
ryood 41:48864f5f5424 658 // Display
ryood 50:0a06df15c784 659 /*
ryood 23:5fe70293e34c 660 if (!isRunning) {
ryood 50:0a06df15c784 661 */
ryood 25:7382bc0a0329 662 if (isDirty) {
ryood 28:d8614d2b82f9 663 switch (UImode) {
ryood 28:d8614d2b82f9 664 case 0:
ryood 37:d4e50159baee 665 sequencerDisplay.update(SequencerDisplay::stop, currentStep, playingStep);
ryood 28:d8614d2b82f9 666 break;
ryood 28:d8614d2b82f9 667 case 1:
ryood 28:d8614d2b82f9 668 dumpToLCD00();
ryood 28:d8614d2b82f9 669 break;
ryood 28:d8614d2b82f9 670 }
ryood 28:d8614d2b82f9 671 isDirty = false;
ryood 28:d8614d2b82f9 672 }
ryood 28:d8614d2b82f9 673 if (UImode == 2) {
ryood 28:d8614d2b82f9 674 dumpToLCD01();
ryood 28:d8614d2b82f9 675 }
ryood 50:0a06df15c784 676 /*
ryood 28:d8614d2b82f9 677 } else {
ryood 50:0a06df15c784 678 */
ryood 28:d8614d2b82f9 679 if (isDirty) {
ryood 37:d4e50159baee 680 sequencerDisplay.update(SequencerDisplay::run, currentStep, playingStep);
ryood 36:50ad7e0a9a95 681 isDirty = false;
ryood 25:7382bc0a0329 682 }
ryood 50:0a06df15c784 683 /*
ryood 23:5fe70293e34c 684 }
ryood 50:0a06df15c784 685 */
ryood 5:4abac408b827 686 }
ryood 0:21e39bc75e31 687 }