BaseMachine Sequencer UI Test

Dependencies:   AverageAnalogIn PinDetect RotaryEncoder Sequence SequencerDisplay mbed-rtos mbed st7565LCD

Fork of CH12864F-SPI2_Test by Ryo Od

Committer:
ryood
Date:
Wed Aug 17 12:46:21 2016 +0000
Revision:
2:29f0fe703d39
Parent:
1:23bc297e8bfe
Child:
3:6d89fd15e299
Impl. PinDetect

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ryood 1:23bc297e8bfe 1 /*
ryood 1:23bc297e8bfe 2 * main.cpp
ryood 1:23bc297e8bfe 3 * BaseMachine Sequencer
ryood 1:23bc297e8bfe 4 *
ryood 1:23bc297e8bfe 5 * 2016.08.17
ryood 1:23bc297e8bfe 6 *
ryood 1:23bc297e8bfe 7 */
ryood 2:29f0fe703d39 8
ryood 2:29f0fe703d39 9 #define UART_TRACE (1)
ryood 2:29f0fe703d39 10
ryood 0:cbc508b7ebff 11 #include "mbed.h"
ryood 1:23bc297e8bfe 12 #include "rtos.h"
ryood 0:cbc508b7ebff 13 #include "st7565LCD.h"
ryood 2:29f0fe703d39 14 #include "PinDetect.h"
ryood 2:29f0fe703d39 15 //#include "RotaryEncoder.h"
ryood 2:29f0fe703d39 16 #include "Sequence.h"
ryood 2:29f0fe703d39 17 #include "ST7565_SequencerDisplay.h"
ryood 1:23bc297e8bfe 18
ryood 1:23bc297e8bfe 19 #define TITLE_STR1 ("BaseMachine Sequencer")
ryood 1:23bc297e8bfe 20 #define TITLE_STR2 ("20160817")
ryood 1:23bc297e8bfe 21
ryood 1:23bc297e8bfe 22 const int SEQUENCE_N = 16;
ryood 1:23bc297e8bfe 23 const int PITCH_MAX = 12;
ryood 1:23bc297e8bfe 24 const int BPM_MIN = 60;
ryood 1:23bc297e8bfe 25 const int BPM_MAX = 240;
ryood 1:23bc297e8bfe 26
ryood 2:29f0fe703d39 27 // Devices
ryood 2:29f0fe703d39 28 //
ryood 0:cbc508b7ebff 29 //ST7565(PinName mosi, PinName sclk, PinName cs, PinName rst, PinName a0);
ryood 1:23bc297e8bfe 30 ST7565 gLCD(PB_15, PB_13, PB_12, PB_2, PB_1);
ryood 1:23bc297e8bfe 31
ryood 1:23bc297e8bfe 32 AnalogIn AinPulseWidth(PC_2);
ryood 1:23bc297e8bfe 33 AnalogIn AinCutOff(PB_0);
ryood 1:23bc297e8bfe 34 AnalogIn AinResonance(PC_1);
ryood 1:23bc297e8bfe 35 AnalogIn AinEnvMod(PC_3);
ryood 1:23bc297e8bfe 36 AnalogIn AinLevel(PC_0);
ryood 1:23bc297e8bfe 37 AnalogIn AinDuration(PA_4);
ryood 1:23bc297e8bfe 38 AnalogIn AinDecay(PA_1);
ryood 1:23bc297e8bfe 39 AnalogIn AinSustain(PA_0);
ryood 2:29f0fe703d39 40 /*
ryood 2:29f0fe703d39 41 RotaryEncoder RotEncStep(D2, D3, 0, SEQUENCE_N - 1, 0);
ryood 2:29f0fe703d39 42 RotaryEncoder RotEncPitch(D4, D5, 0, PITCH_MAX, 0);
ryood 2:29f0fe703d39 43 RotaryEncoder RotEncBpm(D14, D15, BPM_MIN, BPM_MAX, 120);
ryood 2:29f0fe703d39 44 */
ryood 2:29f0fe703d39 45 PinDetect PinWaveShape(PD_2, PullUp);
ryood 2:29f0fe703d39 46 PinDetect PinModNumber(PC_11, PullUp);
ryood 2:29f0fe703d39 47 PinDetect PinOctaveUp(PC_10, PullUp);
ryood 2:29f0fe703d39 48 PinDetect PinOctaveDown(PC_12, PullUp);
ryood 2:29f0fe703d39 49 PinDetect PinNoteOnOff(PA_13, PullUp);
ryood 2:29f0fe703d39 50 PinDetect PinTie(PA_14, PullUp);
ryood 2:29f0fe703d39 51 PinDetect PinAccent(PA_15, PullUp);
ryood 2:29f0fe703d39 52 PinDetect PinRunStop(PB_7, PullUp);
ryood 2:29f0fe703d39 53
ryood 2:29f0fe703d39 54 // Grobal Variables
ryood 2:29f0fe703d39 55 //
ryood 2:29f0fe703d39 56 Sequence sequences[SEQUENCE_N];
ryood 2:29f0fe703d39 57 ST7565_SequencerDisplay sequencerDisplay(&gLCD, sequences, SEQUENCE_N);
ryood 2:29f0fe703d39 58
ryood 2:29f0fe703d39 59 int currentStep = 0;
ryood 2:29f0fe703d39 60 bool isRunning = false;
ryood 2:29f0fe703d39 61 bool isDirty = false;
ryood 2:29f0fe703d39 62 int bpm = 120;
ryood 2:29f0fe703d39 63
ryood 2:29f0fe703d39 64 volatile uint8_t pinFlag = 0x00;
ryood 2:29f0fe703d39 65
ryood 2:29f0fe703d39 66 enum {
ryood 2:29f0fe703d39 67 bWaveShape = 0x01,
ryood 2:29f0fe703d39 68 bModNumber = 0x02,
ryood 2:29f0fe703d39 69 bOctaveUp = 0x04,
ryood 2:29f0fe703d39 70 bOctaveDown = 0x08,
ryood 2:29f0fe703d39 71 bNoteOnOff = 0x10,
ryood 2:29f0fe703d39 72 bTie = 0x20,
ryood 2:29f0fe703d39 73 bAccent = 0x40,
ryood 2:29f0fe703d39 74 bRunStop = 0x80
ryood 2:29f0fe703d39 75 };
ryood 1:23bc297e8bfe 76
ryood 1:23bc297e8bfe 77 // とりあえずの変数(後でClassのメンバ変数に格納)
ryood 1:23bc297e8bfe 78 int waveShape = 0;
ryood 1:23bc297e8bfe 79 int modNumber = 0;
ryood 1:23bc297e8bfe 80 #define WAVESHAPE_N 2
ryood 1:23bc297e8bfe 81 #define MOD_NUMBER_MAX 1
ryood 1:23bc297e8bfe 82 uint8_t pulseWidth;
ryood 1:23bc297e8bfe 83 uint8_t cutOff;
ryood 1:23bc297e8bfe 84 uint8_t resonance;
ryood 1:23bc297e8bfe 85 uint8_t envMod;
ryood 1:23bc297e8bfe 86 uint8_t level;
ryood 1:23bc297e8bfe 87 uint8_t duration;
ryood 1:23bc297e8bfe 88 uint8_t decay;
ryood 1:23bc297e8bfe 89 uint8_t sustain;
ryood 1:23bc297e8bfe 90
ryood 1:23bc297e8bfe 91 //------------------------------------------------------------------------
ryood 2:29f0fe703d39 92 // PinDetect ISR
ryood 2:29f0fe703d39 93 //------------------------------------------------------------------------
ryood 2:29f0fe703d39 94 void swWaveShapePressed()
ryood 2:29f0fe703d39 95 {
ryood 2:29f0fe703d39 96 pinFlag |= bWaveShape;
ryood 2:29f0fe703d39 97 }
ryood 2:29f0fe703d39 98
ryood 2:29f0fe703d39 99 void swModNumberPressed()
ryood 2:29f0fe703d39 100 {
ryood 2:29f0fe703d39 101 pinFlag |= bModNumber;
ryood 2:29f0fe703d39 102 }
ryood 2:29f0fe703d39 103
ryood 2:29f0fe703d39 104 void swOctaveUpPressed()
ryood 2:29f0fe703d39 105 {
ryood 2:29f0fe703d39 106 pinFlag |= bOctaveUp;
ryood 2:29f0fe703d39 107 }
ryood 2:29f0fe703d39 108
ryood 2:29f0fe703d39 109 void swOctaveDownPressed()
ryood 2:29f0fe703d39 110 {
ryood 2:29f0fe703d39 111 pinFlag |= bOctaveDown;
ryood 2:29f0fe703d39 112 }
ryood 2:29f0fe703d39 113
ryood 2:29f0fe703d39 114 void swNoteOnOffPressed()
ryood 2:29f0fe703d39 115 {
ryood 2:29f0fe703d39 116 pinFlag |= bNoteOnOff;
ryood 2:29f0fe703d39 117 }
ryood 2:29f0fe703d39 118
ryood 2:29f0fe703d39 119 void swTiePressed()
ryood 2:29f0fe703d39 120 {
ryood 2:29f0fe703d39 121 pinFlag |= bTie;
ryood 2:29f0fe703d39 122 }
ryood 2:29f0fe703d39 123
ryood 2:29f0fe703d39 124 void swAccentPressed()
ryood 2:29f0fe703d39 125 {
ryood 2:29f0fe703d39 126 pinFlag |= bAccent;
ryood 2:29f0fe703d39 127 }
ryood 2:29f0fe703d39 128
ryood 2:29f0fe703d39 129 void swRunStopPressed()
ryood 2:29f0fe703d39 130 {
ryood 2:29f0fe703d39 131 pinFlag |= bRunStop;
ryood 2:29f0fe703d39 132 }
ryood 2:29f0fe703d39 133
ryood 2:29f0fe703d39 134 //------------------------------------------------------------------------
ryood 1:23bc297e8bfe 135 // Functions
ryood 1:23bc297e8bfe 136 //------------------------------------------------------------------------
ryood 1:23bc297e8bfe 137 void pollingPots()
ryood 1:23bc297e8bfe 138 {
ryood 1:23bc297e8bfe 139 //pulseWidth = AinPulseWidth.read_u16() >> 8;
ryood 1:23bc297e8bfe 140 cutOff = AinCutOff.read_u16() >> 8;
ryood 1:23bc297e8bfe 141 resonance = AinResonance.read_u16() >> 8;
ryood 1:23bc297e8bfe 142 //envMod = AinEnvMod.read_u16() >> 8;
ryood 1:23bc297e8bfe 143 //level = AinLevel.read_u16() >> 8;
ryood 1:23bc297e8bfe 144 duration = AinDuration.read_u16() >> 8;
ryood 1:23bc297e8bfe 145 decay = AinDecay.read_u16() >> 8;
ryood 1:23bc297e8bfe 146 sustain = AinSustain.read_u16() >> 8;
ryood 1:23bc297e8bfe 147 }
ryood 1:23bc297e8bfe 148
ryood 2:29f0fe703d39 149 void pollingPins()
ryood 2:29f0fe703d39 150 {
ryood 2:29f0fe703d39 151 if (pinFlag & bWaveShape) {
ryood 2:29f0fe703d39 152 #if (UART_TRACE)
ryood 2:29f0fe703d39 153 printf("PinWaveShape Pushed\r\n");
ryood 2:29f0fe703d39 154 #endif
ryood 2:29f0fe703d39 155 waveShape++;
ryood 2:29f0fe703d39 156 if (waveShape == WAVESHAPE_N) {
ryood 2:29f0fe703d39 157 waveShape = 0;
ryood 2:29f0fe703d39 158 }
ryood 2:29f0fe703d39 159 pinFlag &= ~bWaveShape;
ryood 2:29f0fe703d39 160 }
ryood 2:29f0fe703d39 161
ryood 2:29f0fe703d39 162 if (pinFlag & bModNumber) {
ryood 2:29f0fe703d39 163 #if (UART_TRACE)
ryood 2:29f0fe703d39 164 printf("PinModNumber Pushed\r\n");
ryood 2:29f0fe703d39 165 #endif
ryood 2:29f0fe703d39 166 modNumber++;
ryood 2:29f0fe703d39 167 if (modNumber > MOD_NUMBER_MAX) {
ryood 2:29f0fe703d39 168 modNumber = 0;
ryood 2:29f0fe703d39 169 }
ryood 2:29f0fe703d39 170 pinFlag &= ~bModNumber;
ryood 2:29f0fe703d39 171 }
ryood 2:29f0fe703d39 172
ryood 2:29f0fe703d39 173 if (pinFlag & bOctaveUp) {
ryood 2:29f0fe703d39 174 #if (UART_TRACE)
ryood 2:29f0fe703d39 175 printf("PinOctaveUp Pushed\r\n");
ryood 2:29f0fe703d39 176 #endif
ryood 2:29f0fe703d39 177 sequences[currentStep].setOctave(sequences[currentStep].getOctave() + 1);
ryood 2:29f0fe703d39 178 pinFlag &= ~bOctaveUp;
ryood 2:29f0fe703d39 179 }
ryood 2:29f0fe703d39 180
ryood 2:29f0fe703d39 181 if (pinFlag & bOctaveDown) {
ryood 2:29f0fe703d39 182 #if (UART_TRACE)
ryood 2:29f0fe703d39 183 printf("PinOctaveDown Pushed\r\n");
ryood 2:29f0fe703d39 184 #endif
ryood 2:29f0fe703d39 185 sequences[currentStep].setOctave(sequences[currentStep].getOctave() - 1);
ryood 2:29f0fe703d39 186 pinFlag &= ~bOctaveDown;
ryood 2:29f0fe703d39 187 }
ryood 2:29f0fe703d39 188
ryood 2:29f0fe703d39 189 if (pinFlag & bNoteOnOff) {
ryood 2:29f0fe703d39 190 #if (UART_TRACE)
ryood 2:29f0fe703d39 191 printf("PinNoteOnOff Pushed\r\n");
ryood 2:29f0fe703d39 192 #endif
ryood 2:29f0fe703d39 193 sequences[currentStep].noteOn = !sequences[currentStep].noteOn;
ryood 2:29f0fe703d39 194 pinFlag &= ~bNoteOnOff;
ryood 2:29f0fe703d39 195 }
ryood 2:29f0fe703d39 196
ryood 2:29f0fe703d39 197 if (pinFlag & bTie) {
ryood 2:29f0fe703d39 198 #if (UART_TRACE)
ryood 2:29f0fe703d39 199 printf("PinTie Pushed\r\n");
ryood 2:29f0fe703d39 200 #endif
ryood 2:29f0fe703d39 201 sequences[currentStep].tie = !sequences[currentStep].tie;
ryood 2:29f0fe703d39 202 pinFlag &= ~bTie;
ryood 2:29f0fe703d39 203 }
ryood 2:29f0fe703d39 204
ryood 2:29f0fe703d39 205 if (pinFlag & bAccent) {
ryood 2:29f0fe703d39 206 #if (UART_TRACE)
ryood 2:29f0fe703d39 207 printf("PinAccent Pushed\r\n");
ryood 2:29f0fe703d39 208 #endif
ryood 2:29f0fe703d39 209 sequences[currentStep].accent = !sequences[currentStep].accent;
ryood 2:29f0fe703d39 210 pinFlag &= ~bAccent;
ryood 2:29f0fe703d39 211 }
ryood 2:29f0fe703d39 212
ryood 2:29f0fe703d39 213 if (pinFlag & bRunStop) {
ryood 2:29f0fe703d39 214 #if (UART_TRACE)
ryood 2:29f0fe703d39 215 printf("PinRunStop Pushed\r\n");
ryood 2:29f0fe703d39 216 #endif
ryood 2:29f0fe703d39 217 isRunning = !isRunning;
ryood 2:29f0fe703d39 218 pinFlag &= ~bRunStop;
ryood 2:29f0fe703d39 219 }
ryood 2:29f0fe703d39 220 }
ryood 2:29f0fe703d39 221
ryood 1:23bc297e8bfe 222 void dumpToLCD()
ryood 1:23bc297e8bfe 223 {
ryood 1:23bc297e8bfe 224 char buff[64];
ryood 1:23bc297e8bfe 225 int col = 0;
ryood 1:23bc297e8bfe 226
ryood 1:23bc297e8bfe 227 gLCD.clear();
ryood 2:29f0fe703d39 228
ryood 1:23bc297e8bfe 229 sprintf(buff, "Run: %d", isRunning);
ryood 1:23bc297e8bfe 230 gLCD.drawstring(0, col++, buff);
ryood 1:23bc297e8bfe 231 sprintf(buff, "BPM: %d", bpm);
ryood 1:23bc297e8bfe 232 gLCD.drawstring(0, col++, buff);
ryood 1:23bc297e8bfe 233
ryood 1:23bc297e8bfe 234 sprintf(buff, "Step: %d", currentStep);
ryood 1:23bc297e8bfe 235 gLCD.drawstring(0, col++, buff);
ryood 1:23bc297e8bfe 236 sprintf(buff, "NoteOn: %d", sequences[currentStep].noteOn);
ryood 1:23bc297e8bfe 237 gLCD.drawstring(0, col++, buff);
ryood 1:23bc297e8bfe 238 sprintf(buff, "Pitch: %d", sequences[currentStep].getPitch());
ryood 1:23bc297e8bfe 239 gLCD.drawstring(0, col++, buff);
ryood 1:23bc297e8bfe 240 sprintf(buff, "Octave: %d", sequences[currentStep].getOctave());
ryood 1:23bc297e8bfe 241 gLCD.drawstring(0, col++, buff);
ryood 1:23bc297e8bfe 242 sprintf(buff, "Tie: %d", sequences[currentStep].tie);
ryood 1:23bc297e8bfe 243 gLCD.drawstring(0, col++, buff);
ryood 1:23bc297e8bfe 244 sprintf(buff, "Accent: %d", sequences[currentStep].accent);
ryood 1:23bc297e8bfe 245 gLCD.drawstring(0, col++, buff);
ryood 1:23bc297e8bfe 246
ryood 1:23bc297e8bfe 247 col = 0;
ryood 1:23bc297e8bfe 248 sprintf(buff, "WavS: %d", waveShape);
ryood 1:23bc297e8bfe 249 gLCD.drawstring(64, col++, buff);
ryood 1:23bc297e8bfe 250 sprintf(buff, "ModN: %d", modNumber);
ryood 1:23bc297e8bfe 251 gLCD.drawstring(64, col++, buff);
ryood 1:23bc297e8bfe 252
ryood 1:23bc297e8bfe 253 col = 2;
ryood 1:23bc297e8bfe 254 sprintf(buff, "PW%3d CO%3d", pulseWidth, cutOff);
ryood 1:23bc297e8bfe 255 gLCD.drawstring(60, col++, buff);
ryood 1:23bc297e8bfe 256 sprintf(buff, "RS%3d EV%3d", resonance, envMod);
ryood 1:23bc297e8bfe 257 gLCD.drawstring(60, col++, buff);
ryood 1:23bc297e8bfe 258 sprintf(buff, "LV%3d DR%3d", level, duration);
ryood 1:23bc297e8bfe 259 gLCD.drawstring(60, col++, buff);
ryood 1:23bc297e8bfe 260 sprintf(buff, "DC%3d ST%3d", decay, sustain);
ryood 1:23bc297e8bfe 261 gLCD.drawstring(60, col++, buff);
ryood 1:23bc297e8bfe 262
ryood 1:23bc297e8bfe 263 gLCD.display();
ryood 1:23bc297e8bfe 264 }
ryood 0:cbc508b7ebff 265
ryood 2:29f0fe703d39 266 //------------------------------------------------------------------------
ryood 2:29f0fe703d39 267 // Main routine
ryood 2:29f0fe703d39 268 //------------------------------------------------------------------------
ryood 0:cbc508b7ebff 269 int main()
ryood 0:cbc508b7ebff 270 {
ryood 2:29f0fe703d39 271 #if (UART_TRACE)
ryood 2:29f0fe703d39 272 printf("*** BaseMachine Sequencer ***\r\n");
ryood 2:29f0fe703d39 273 #endif
ryood 2:29f0fe703d39 274
ryood 2:29f0fe703d39 275 gLCD.begin(0x12);
ryood 2:29f0fe703d39 276 gLCD.clear();
ryood 2:29f0fe703d39 277 gLCD.drawstring(0, 0, TITLE_STR1);
ryood 2:29f0fe703d39 278 gLCD.drawstring(0, 1, TITLE_STR2);
ryood 2:29f0fe703d39 279 gLCD.display();
ryood 2:29f0fe703d39 280 Thread::wait(1000);
ryood 2:29f0fe703d39 281
ryood 2:29f0fe703d39 282 PinWaveShape.attach_asserted(&swWaveShapePressed);
ryood 2:29f0fe703d39 283 PinWaveShape.setAssertValue(0);
ryood 2:29f0fe703d39 284 PinWaveShape.setSampleFrequency();
ryood 2:29f0fe703d39 285
ryood 2:29f0fe703d39 286 PinModNumber.attach_asserted(&swModNumberPressed);
ryood 2:29f0fe703d39 287 PinModNumber.setAssertValue(0);
ryood 2:29f0fe703d39 288 PinModNumber.setSampleFrequency();
ryood 2:29f0fe703d39 289
ryood 2:29f0fe703d39 290 PinOctaveUp.attach_asserted(&swOctaveUpPressed);
ryood 2:29f0fe703d39 291 PinOctaveUp.setAssertValue(0);
ryood 2:29f0fe703d39 292 PinOctaveUp.setSampleFrequency();
ryood 2:29f0fe703d39 293
ryood 2:29f0fe703d39 294 PinOctaveDown.attach_asserted(&swOctaveDownPressed);
ryood 2:29f0fe703d39 295 PinOctaveDown.setAssertValue(0);
ryood 2:29f0fe703d39 296 PinOctaveDown.setSampleFrequency();
ryood 0:cbc508b7ebff 297
ryood 2:29f0fe703d39 298 PinNoteOnOff.attach_asserted(&swNoteOnOffPressed);
ryood 2:29f0fe703d39 299 PinNoteOnOff.setAssertValue(0);
ryood 2:29f0fe703d39 300 PinNoteOnOff.setSampleFrequency();
ryood 2:29f0fe703d39 301
ryood 2:29f0fe703d39 302 PinTie.attach_asserted(&swTiePressed);
ryood 2:29f0fe703d39 303 PinTie.setAssertValue(0);
ryood 2:29f0fe703d39 304 PinTie.setSampleFrequency();
ryood 2:29f0fe703d39 305
ryood 2:29f0fe703d39 306 PinAccent.attach_asserted(&swAccentPressed);
ryood 2:29f0fe703d39 307 PinAccent.setAssertValue(0);
ryood 2:29f0fe703d39 308 PinAccent.setSampleFrequency();
ryood 2:29f0fe703d39 309
ryood 2:29f0fe703d39 310 PinRunStop.attach_asserted(&swRunStopPressed);
ryood 2:29f0fe703d39 311 PinRunStop.setAssertValue(0);
ryood 2:29f0fe703d39 312 PinRunStop.setSampleFrequency();
ryood 2:29f0fe703d39 313
ryood 2:29f0fe703d39 314 #if (UART_TRACE)
ryood 2:29f0fe703d39 315 printf("Setup Devices OK\r\n");
ryood 2:29f0fe703d39 316 #endif
ryood 2:29f0fe703d39 317
ryood 2:29f0fe703d39 318 for (;;) {
ryood 1:23bc297e8bfe 319 pollingPots();
ryood 2:29f0fe703d39 320 pollingPins();
ryood 1:23bc297e8bfe 321 dumpToLCD();
ryood 2:29f0fe703d39 322 }
ryood 0:cbc508b7ebff 323 }