BaseMachine UI Controllerに分離

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

Fork of BaseMachine_Sequencer by Ryo Od

Committer:
ryood
Date:
Fri Oct 07 07:48:22 2016 +0000
Revision:
43:12d11507c077
Parent:
42:3c71f925a47b
Child:
44:b1bdccdbf67e
pollingPot(): POT??????????????

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