Nucleo Sequencer of my Base Machine

Dependencies:   Amp AverageAnalogIn Envelope FilterController Sequence BaseMachineComon mbed-rtos mbed

Fork of SpiSequenceSender_Test by Ryo Od

Committer:
ryood
Date:
Fri Sep 09 04:19:19 2016 +0000
Revision:
37:d4e50159baee
Parent:
36:50ad7e0a9a95
Child:
38:820cb3a7102b
Display LCD while run

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 15:9813d8eaf57e 5 * 2016.08.20 mbed Rev 121 / mbed-rtos Rev 117で動作確認
ryood 15:9813d8eaf57e 6 *
ryood 15:9813d8eaf57e 7 */
ryood 15:9813d8eaf57e 8
ryood 0:21e39bc75e31 9 #include "mbed.h"
ryood 5:4abac408b827 10 #include "rtos.h"
ryood 16:b0419e3c9079 11 #include "st7565LCD.h"
ryood 18:309f794eba74 12 #include "PinDetect.h"
ryood 20:00d3b6ace8c7 13 #include "RotaryEncoder.h"
ryood 19:241a4b355413 14 #include "AverageAnalogIn.h"
ryood 0:21e39bc75e31 15
ryood 6:fc10eac60b91 16 #define UART_TRACE (0)
ryood 6:fc10eac60b91 17 #include "SpiSequenceSender.h"
ryood 9:3e4e08578e1c 18 #include "EnvelopeGenerator.h"
ryood 9:3e4e08578e1c 19 #include "SpiAmpController.h"
ryood 12:c248781608af 20 #include "SpiFilterController.h"
ryood 17:557658db3e81 21 #include "ST7565_SequencerDisplay.h"
ryood 0:21e39bc75e31 22
ryood 16:b0419e3c9079 23 #define TITLE_STR1 ("BaseMachine Sequencer")
ryood 35:0165b610796d 24 #define TITLE_STR2 ("20160909")
ryood 16:b0419e3c9079 25
ryood 6:fc10eac60b91 26 #define SEQUENCE_N (16)
ryood 28:d8614d2b82f9 27 #define SPI_RATE (16000000) // Actual frequency about 5MHz
ryood 0:21e39bc75e31 28
ryood 14:c173e03ee3ad 29 const int samplingPeriod = 1; // ms
ryood 10:fb04f9959fd9 30 const int bpm = 120;
ryood 10:fb04f9959fd9 31 const int envelopeLength = (60 * 1000 / (bpm * 4)) / samplingPeriod;
ryood 20:00d3b6ace8c7 32 const int waveShape = SpiSequenceSender::WAVESHAPE_SQUARE;
ryood 20:00d3b6ace8c7 33 const int baseNoteNumber = 36;
ryood 20:00d3b6ace8c7 34 const int bpmMax = 240;
ryood 20:00d3b6ace8c7 35 const int bpmMin = 60;
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 19:241a4b355413 47 SPI spiMaster(PA_7, PA_6, PA_5);
ryood 16:b0419e3c9079 48
ryood 16:b0419e3c9079 49 //ST7565(PinName mosi, PinName sclk, PinName cs, PinName rst, PinName a0);
ryood 16:b0419e3c9079 50 ST7565 gLCD(PB_15, PB_13, PB_12, PB_2, PB_1);
ryood 16:b0419e3c9079 51
ryood 19:241a4b355413 52 AverageAnalogIn AinPulseWidth(PC_2);
ryood 19:241a4b355413 53 AverageAnalogIn AinCutOff(PB_0);
ryood 19:241a4b355413 54 AverageAnalogIn AinResonance(PC_1);
ryood 19:241a4b355413 55 AverageAnalogIn AinEnvMod(PC_3);
ryood 19:241a4b355413 56 AverageAnalogIn AinLevel(PC_0);
ryood 19:241a4b355413 57 AverageAnalogIn AinDuration(PA_4);
ryood 19:241a4b355413 58 AverageAnalogIn AinDecay(PA_1);
ryood 19:241a4b355413 59 AverageAnalogIn AinSustain(PA_0);
ryood 10:fb04f9959fd9 60
ryood 31:16d1fbf3a167 61 RotaryEncoder RotEncStep(PB_9, PB_8, 0, SEQUENCE_N - 1, 0);
ryood 26:fbf48a178aeb 62 RotaryEncoder RotEncPitch(PB_5, PB_4, 0, Sequence::getMaxPitch() - 1, 0);
ryood 31:16d1fbf3a167 63 RotaryEncoder RotEncBpm(PC_12, PC_10, bpmMin, bpmMax, 120);
ryood 20:00d3b6ace8c7 64
ryood 18:309f794eba74 65 PinDetect PinWaveShape(PD_2, PullUp);
ryood 28:d8614d2b82f9 66 PinDetect PinUIMode(PC_11, PullUp);
ryood 31:16d1fbf3a167 67 PinDetect PinOctaveUp(PB_3, PullUp);
ryood 31:16d1fbf3a167 68 PinDetect PinOctaveDown(PA_10, PullUp);
ryood 31:16d1fbf3a167 69 PinDetect PinNoteOnOff(PC_5, PullUp);
ryood 31:16d1fbf3a167 70 PinDetect PinTie(PC_6, PullUp);
ryood 31:16d1fbf3a167 71 PinDetect PinAccent(PC_8, PullUp);
ryood 31:16d1fbf3a167 72 PinDetect PinRunStop(PC_9, PullUp);
ryood 18:309f794eba74 73
ryood 34:602ee5e771e3 74 PwmOut LCDBackLight(PA_11);
ryood 34:602ee5e771e3 75
ryood 16:b0419e3c9079 76 // Grobal Variables
ryood 16:b0419e3c9079 77 //
ryood 16:b0419e3c9079 78 Sequence sequences[SEQUENCE_N];
ryood 16:b0419e3c9079 79 SpiSequenceSender sequenceSender(&spiMaster, D9, sequences, SEQUENCE_N, samplingPeriod, bpm);
ryood 6:fc10eac60b91 80
ryood 10:fb04f9959fd9 81 Envelope envelope(4095, envelopeLength, envelopeLength*3/4, envelopeLength/2, 2047);
ryood 9:3e4e08578e1c 82 EnvelopeGenerator envelopeGenerator;
ryood 9:3e4e08578e1c 83 SpiAmpController ampController(&spiMaster, D8, D7);
ryood 6:fc10eac60b91 84
ryood 12:c248781608af 85 SpiFilterController filterController(&spiMaster, D10);
ryood 0:21e39bc75e31 86
ryood 17:557658db3e81 87 ST7565_SequencerDisplay sequencerDisplay(&gLCD, sequences, SEQUENCE_N);
ryood 17:557658db3e81 88
ryood 16:b0419e3c9079 89 volatile int currentStep = 0;
ryood 36:50ad7e0a9a95 90 volatile int playingStep = 0;
ryood 16:b0419e3c9079 91 volatile bool isRunning = false;
ryood 26:fbf48a178aeb 92 volatile bool isDirty = true;
ryood 16:b0419e3c9079 93 volatile uint8_t pinFlag = 0x00;
ryood 28:d8614d2b82f9 94 volatile int UImode = 0;
ryood 16:b0419e3c9079 95
ryood 16:b0419e3c9079 96 enum PinBit {
ryood 16:b0419e3c9079 97 bWaveShape = 0x01,
ryood 28:d8614d2b82f9 98 bUIMode = 0x02,
ryood 16:b0419e3c9079 99 bOctaveUp = 0x04,
ryood 16:b0419e3c9079 100 bOctaveDown = 0x08,
ryood 16:b0419e3c9079 101 bNoteOnOff = 0x10,
ryood 16:b0419e3c9079 102 bTie = 0x20,
ryood 16:b0419e3c9079 103 bAccent = 0x40,
ryood 16:b0419e3c9079 104 bRunStop = 0x80
ryood 16:b0419e3c9079 105 };
ryood 16:b0419e3c9079 106
ryood 16:b0419e3c9079 107 // とりあえずの変数(後でClassのメンバ変数に格納)
ryood 21:c4d09aaa52b9 108 volatile uint8_t envMod = 127;
ryood 16:b0419e3c9079 109
ryood 16:b0419e3c9079 110 //------------------------------------------------------------------------
ryood 16:b0419e3c9079 111 // Callback functions
ryood 16:b0419e3c9079 112 //------------------------------------------------------------------------
ryood 35:0165b610796d 113 void updateTicks(int ticks)
ryood 8:de409197ff95 114 {
ryood 8:de409197ff95 115 if (ticks == 0) {
ryood 9:3e4e08578e1c 116 envelopeGenerator.init(envelope);
ryood 36:50ad7e0a9a95 117 // LCDにStepを表示するフラグを立てる
ryood 36:50ad7e0a9a95 118 //sequencerDisplay.update(SequencerDisplay::run, sequenceSender.getStep());
ryood 36:50ad7e0a9a95 119 playingStep = sequenceSender.getStep();
ryood 36:50ad7e0a9a95 120 isDirty = true;
ryood 8:de409197ff95 121 }
ryood 14:c173e03ee3ad 122
ryood 27:c382689e652b 123 if (sequences[sequenceSender.getStep()].isNoteOn()) {
ryood 14:c173e03ee3ad 124 uint16_t level = envelopeGenerator.getModLevel();
ryood 27:c382689e652b 125 if (!sequences[sequenceSender.getStep()].isAccent()) {
ryood 35:0165b610796d 126 level = level * 1 / 2;
ryood 27:c382689e652b 127 }
ryood 14:c173e03ee3ad 128 ampController.outDca(level);
ryood 14:c173e03ee3ad 129 } else {
ryood 14:c173e03ee3ad 130 ampController.outDca(0);
ryood 14:c173e03ee3ad 131 }
ryood 9:3e4e08578e1c 132 envelopeGenerator.update();
ryood 12:c248781608af 133
ryood 15:9813d8eaf57e 134 filterController.outDcf();
ryood 8:de409197ff95 135 }
ryood 8:de409197ff95 136
ryood 16:b0419e3c9079 137 //------------------------------------------------------------------------
ryood 18:309f794eba74 138 // PinDetect ISR
ryood 18:309f794eba74 139 //------------------------------------------------------------------------
ryood 18:309f794eba74 140 void swWaveShapePressed()
ryood 18:309f794eba74 141 {
ryood 18:309f794eba74 142 pinFlag |= bWaveShape;
ryood 18:309f794eba74 143 }
ryood 18:309f794eba74 144
ryood 28:d8614d2b82f9 145 void swUIModePressed()
ryood 18:309f794eba74 146 {
ryood 28:d8614d2b82f9 147 pinFlag |= bUIMode;
ryood 18:309f794eba74 148 }
ryood 18:309f794eba74 149
ryood 18:309f794eba74 150 void swOctaveUpPressed()
ryood 18:309f794eba74 151 {
ryood 18:309f794eba74 152 pinFlag |= bOctaveUp;
ryood 18:309f794eba74 153 }
ryood 18:309f794eba74 154
ryood 18:309f794eba74 155 void swOctaveDownPressed()
ryood 18:309f794eba74 156 {
ryood 18:309f794eba74 157 pinFlag |= bOctaveDown;
ryood 18:309f794eba74 158 }
ryood 18:309f794eba74 159
ryood 18:309f794eba74 160 void swNoteOnOffPressed()
ryood 18:309f794eba74 161 {
ryood 18:309f794eba74 162 pinFlag |= bNoteOnOff;
ryood 18:309f794eba74 163 }
ryood 18:309f794eba74 164
ryood 18:309f794eba74 165 void swTiePressed()
ryood 18:309f794eba74 166 {
ryood 18:309f794eba74 167 pinFlag |= bTie;
ryood 18:309f794eba74 168 }
ryood 18:309f794eba74 169
ryood 18:309f794eba74 170 void swAccentPressed()
ryood 18:309f794eba74 171 {
ryood 18:309f794eba74 172 pinFlag |= bAccent;
ryood 18:309f794eba74 173 }
ryood 18:309f794eba74 174
ryood 18:309f794eba74 175 void swRunStopPressed()
ryood 18:309f794eba74 176 {
ryood 18:309f794eba74 177 pinFlag |= bRunStop;
ryood 18:309f794eba74 178 }
ryood 18:309f794eba74 179
ryood 18:309f794eba74 180 //------------------------------------------------------------------------
ryood 16:b0419e3c9079 181 // Functions
ryood 16:b0419e3c9079 182 //------------------------------------------------------------------------
ryood 19:241a4b355413 183 void pollingPots()
ryood 19:241a4b355413 184 {
ryood 32:2a4554f8ad3e 185 sequenceSender.setPulseWidth(AinPulseWidth.read_u16() >> 8);
ryood 20:00d3b6ace8c7 186
ryood 19:241a4b355413 187 filterController.setCutoff(AinCutOff.read_u16() >> 8);
ryood 19:241a4b355413 188 filterController.setResonance(AinResonance.read_u16() >> 8);
ryood 34:602ee5e771e3 189
ryood 34:602ee5e771e3 190 // テスト用にバックライトの調整に使用
ryood 34:602ee5e771e3 191 LCDBackLight = AinEnvMod.read();
ryood 19:241a4b355413 192
ryood 33:a24a4c435973 193 envelope.setLevel(AinLevel.read_u16() >> 4);
ryood 19:241a4b355413 194 envelope.setDuration(AinDuration.read() * envelopeLength);
ryood 19:241a4b355413 195 envelope.setDecay(AinDecay.read() * envelopeLength);
ryood 19:241a4b355413 196 envelope.setSustain(AinSustain.read() * 4095);
ryood 20:00d3b6ace8c7 197 }
ryood 20:00d3b6ace8c7 198
ryood 20:00d3b6ace8c7 199 void pollingRotEncs()
ryood 20:00d3b6ace8c7 200 {
ryood 20:00d3b6ace8c7 201 int _bpm = RotEncBpm.getVal();
ryood 20:00d3b6ace8c7 202 if (_bpm != sequenceSender.getBpm()) {
ryood 20:00d3b6ace8c7 203 sequenceSender.setBpm(_bpm);
ryood 25:7382bc0a0329 204 sequencerDisplay.setBpm(_bpm);
ryood 20:00d3b6ace8c7 205 isDirty = true;
ryood 20:00d3b6ace8c7 206 }
ryood 20:00d3b6ace8c7 207
ryood 20:00d3b6ace8c7 208 int _step = RotEncStep.getVal();
ryood 20:00d3b6ace8c7 209 if (_step != currentStep) {
ryood 20:00d3b6ace8c7 210 currentStep = _step;
ryood 20:00d3b6ace8c7 211 // syncronize sequence value & Rotary Encoder's value
ryood 20:00d3b6ace8c7 212 RotEncPitch.setVal(sequences[currentStep].getPitch());
ryood 20:00d3b6ace8c7 213 isDirty = true;
ryood 20:00d3b6ace8c7 214 }
ryood 20:00d3b6ace8c7 215
ryood 20:00d3b6ace8c7 216 int _pitch = RotEncPitch.getVal();
ryood 20:00d3b6ace8c7 217 if (_pitch != sequences[currentStep].getPitch()) {
ryood 20:00d3b6ace8c7 218 sequences[currentStep].setPitch(_pitch);
ryood 20:00d3b6ace8c7 219 isDirty = true;
ryood 20:00d3b6ace8c7 220 }
ryood 19:241a4b355413 221 }
ryood 19:241a4b355413 222
ryood 18:309f794eba74 223 void pollingPins()
ryood 18:309f794eba74 224 {
ryood 18:309f794eba74 225 if (pinFlag & bWaveShape) {
ryood 18:309f794eba74 226 #if (UART_TRACE)
ryood 18:309f794eba74 227 printf("PinWaveShape Pushed\r\n");
ryood 18:309f794eba74 228 #endif
ryood 18:309f794eba74 229 uint8_t waveShape = sequenceSender.getWaveShape();
ryood 18:309f794eba74 230 waveShape++;
ryood 25:7382bc0a0329 231 if (waveShape == SpiSequenceSender::WAVESHAPE_N) {
ryood 25:7382bc0a0329 232 waveShape = 0;
ryood 18:309f794eba74 233 }
ryood 25:7382bc0a0329 234 sequenceSender.setWaveShape(waveShape);
ryood 25:7382bc0a0329 235 sequencerDisplay.setWaveShape(waveShape);
ryood 18:309f794eba74 236 pinFlag &= ~bWaveShape;
ryood 28:d8614d2b82f9 237 isDirty = true;
ryood 18:309f794eba74 238 }
ryood 18:309f794eba74 239
ryood 28:d8614d2b82f9 240 if (pinFlag & bUIMode) {
ryood 18:309f794eba74 241 #if (UART_TRACE)
ryood 28:d8614d2b82f9 242 printf("PinUIMode Pushed\r\n");
ryood 18:309f794eba74 243 #endif
ryood 28:d8614d2b82f9 244 UImode++;
ryood 28:d8614d2b82f9 245 if (UImode > UImodeMax) {
ryood 28:d8614d2b82f9 246 UImode = 0;
ryood 18:309f794eba74 247 }
ryood 28:d8614d2b82f9 248 pinFlag &= ~bUIMode;
ryood 28:d8614d2b82f9 249 isDirty = true;
ryood 18:309f794eba74 250 }
ryood 18:309f794eba74 251
ryood 18:309f794eba74 252 if (pinFlag & bOctaveUp) {
ryood 18:309f794eba74 253 #if (UART_TRACE)
ryood 18:309f794eba74 254 printf("PinOctaveUp Pushed\r\n");
ryood 18:309f794eba74 255 #endif
ryood 25:7382bc0a0329 256 //sequences[currentStep].setOctave(sequences[currentStep].getOctave() + 1);
ryood 25:7382bc0a0329 257 sequencerDisplay.setOctave(sequencerDisplay.getOctave() + 1);
ryood 18:309f794eba74 258 pinFlag &= ~bOctaveUp;
ryood 28:d8614d2b82f9 259 isDirty = true;
ryood 18:309f794eba74 260 }
ryood 18:309f794eba74 261
ryood 18:309f794eba74 262 if (pinFlag & bOctaveDown) {
ryood 18:309f794eba74 263 #if (UART_TRACE)
ryood 18:309f794eba74 264 printf("PinOctaveDown Pushed\r\n");
ryood 18:309f794eba74 265 #endif
ryood 25:7382bc0a0329 266 //sequences[currentStep].setOctave(sequences[currentStep].getOctave() - 1);
ryood 25:7382bc0a0329 267 sequencerDisplay.setOctave(sequencerDisplay.getOctave() - 1);
ryood 18:309f794eba74 268 pinFlag &= ~bOctaveDown;
ryood 28:d8614d2b82f9 269 isDirty = true;
ryood 18:309f794eba74 270 }
ryood 18:309f794eba74 271
ryood 18:309f794eba74 272 if (pinFlag & bNoteOnOff) {
ryood 18:309f794eba74 273 #if (UART_TRACE)
ryood 18:309f794eba74 274 printf("PinNoteOnOff Pushed\r\n");
ryood 18:309f794eba74 275 #endif
ryood 18:309f794eba74 276 sequences[currentStep].setNoteOn(!sequences[currentStep].isNoteOn());
ryood 18:309f794eba74 277 pinFlag &= ~bNoteOnOff;
ryood 28:d8614d2b82f9 278 isDirty = true;
ryood 18:309f794eba74 279 }
ryood 18:309f794eba74 280
ryood 18:309f794eba74 281 if (pinFlag & bTie) {
ryood 18:309f794eba74 282 #if (UART_TRACE)
ryood 18:309f794eba74 283 printf("PinTie Pushed\r\n");
ryood 18:309f794eba74 284 #endif
ryood 18:309f794eba74 285 sequences[currentStep].setTie(!sequences[currentStep].isTie());
ryood 18:309f794eba74 286 pinFlag &= ~bTie;
ryood 28:d8614d2b82f9 287 isDirty = true;
ryood 18:309f794eba74 288 }
ryood 18:309f794eba74 289
ryood 18:309f794eba74 290 if (pinFlag & bAccent) {
ryood 18:309f794eba74 291 #if (UART_TRACE)
ryood 18:309f794eba74 292 printf("PinAccent Pushed\r\n");
ryood 18:309f794eba74 293 #endif
ryood 18:309f794eba74 294 sequences[currentStep].setAccent(!sequences[currentStep].isAccent());
ryood 18:309f794eba74 295 pinFlag &= ~bAccent;
ryood 28:d8614d2b82f9 296 isDirty = true;
ryood 18:309f794eba74 297 }
ryood 18:309f794eba74 298
ryood 18:309f794eba74 299 if (pinFlag & bRunStop) {
ryood 18:309f794eba74 300 #if (UART_TRACE)
ryood 18:309f794eba74 301 printf("PinRunStop Pushed\r\n");
ryood 18:309f794eba74 302 #endif
ryood 18:309f794eba74 303 if (isRunning) {
ryood 22:82f1e7877f9f 304 ampController.outDca(0);
ryood 18:309f794eba74 305 sequenceSender.stop();
ryood 18:309f794eba74 306 isRunning = false;
ryood 18:309f794eba74 307 } else {
ryood 18:309f794eba74 308 sequenceSender.run(currentStep);
ryood 18:309f794eba74 309 isRunning = true;
ryood 18:309f794eba74 310 }
ryood 18:309f794eba74 311 pinFlag &= ~bRunStop;
ryood 28:d8614d2b82f9 312 isDirty = true;
ryood 18:309f794eba74 313 }
ryood 18:309f794eba74 314 }
ryood 18:309f794eba74 315
ryood 28:d8614d2b82f9 316 void dumpToLCD00()
ryood 16:b0419e3c9079 317 {
ryood 16:b0419e3c9079 318 char buff[64];
ryood 16:b0419e3c9079 319 int col = 0;
ryood 16:b0419e3c9079 320
ryood 16:b0419e3c9079 321 gLCD.clear();
ryood 16:b0419e3c9079 322
ryood 24:040cdcb2ff14 323 sprintf(buff, "Run:%d BPM:%03d", isRunning, sequenceSender.getBpm());
ryood 16:b0419e3c9079 324 gLCD.drawstring(0, col++, buff);
ryood 24:040cdcb2ff14 325
ryood 24:040cdcb2ff14 326 sprintf(buff, "Stp:%02d Nto:%d Pch:%02d",
ryood 24:040cdcb2ff14 327 currentStep, sequences[currentStep].isNoteOn(), sequences[currentStep].getPitch());
ryood 24:040cdcb2ff14 328 gLCD.drawstring(0, col++, buff);
ryood 24:040cdcb2ff14 329
ryood 24:040cdcb2ff14 330 sprintf(buff, "Oct:%-2d Tie:%d Acc:%d",
ryood 26:fbf48a178aeb 331 sequencerDisplay.getOctave(), sequences[currentStep].isTie(),sequences[currentStep].isAccent());
ryood 16:b0419e3c9079 332 gLCD.drawstring(0, col++, buff);
ryood 16:b0419e3c9079 333
ryood 28:d8614d2b82f9 334 sprintf(buff, "Wsp:%d Mod:%d", sequenceSender.getWaveShape(), UImode);
ryood 16:b0419e3c9079 335 gLCD.drawstring(0, col++, buff);
ryood 16:b0419e3c9079 336
ryood 24:040cdcb2ff14 337 sprintf(buff, "PW :%4d CO :%4d", sequenceSender.getPulseWidth(), filterController.getCutoff());
ryood 24:040cdcb2ff14 338 gLCD.drawstring(0, col++, buff);
ryood 24:040cdcb2ff14 339 sprintf(buff, "RSO:%4d ENV:%4d", filterController.getResonance(), envMod);
ryood 24:040cdcb2ff14 340 gLCD.drawstring(0, col++, buff);
ryood 24:040cdcb2ff14 341 sprintf(buff, "LVL:%4d DUR:%4d", envelope.getLevel(), envelope.getDuration());
ryood 24:040cdcb2ff14 342 gLCD.drawstring(0, col++, buff);
ryood 24:040cdcb2ff14 343 sprintf(buff, "DCY:%4d SUS:%4d", envelope.getDecay(), envelope.getSustain());
ryood 24:040cdcb2ff14 344 gLCD.drawstring(0, col++, buff);
ryood 16:b0419e3c9079 345
ryood 16:b0419e3c9079 346 gLCD.display();
ryood 16:b0419e3c9079 347 }
ryood 16:b0419e3c9079 348
ryood 28:d8614d2b82f9 349 void dumpToLCD01()
ryood 28:d8614d2b82f9 350 {
ryood 28:d8614d2b82f9 351 char buff[64];
ryood 28:d8614d2b82f9 352 int col = 0;
ryood 28:d8614d2b82f9 353
ryood 28:d8614d2b82f9 354 gLCD.clear();
ryood 28:d8614d2b82f9 355
ryood 28:d8614d2b82f9 356 sprintf(buff, "Cutoff %5d", AinCutOff.read_u16() >> 8);
ryood 28:d8614d2b82f9 357 gLCD.drawstring(0, col++, buff);
ryood 28:d8614d2b82f9 358 sprintf(buff, "Duration %5d", AinDuration.read_u16() >> 8);
ryood 28:d8614d2b82f9 359 gLCD.drawstring(0, col++, buff);
ryood 28:d8614d2b82f9 360 sprintf(buff, "Decay %5d", AinDecay.read_u16() >> 8);
ryood 28:d8614d2b82f9 361 gLCD.drawstring(0, col++, buff);
ryood 28:d8614d2b82f9 362 sprintf(buff, "Sustain %5d", AinSustain.read_u16() >> 8);
ryood 28:d8614d2b82f9 363 gLCD.drawstring(0, col++, buff);
ryood 28:d8614d2b82f9 364
ryood 28:d8614d2b82f9 365
ryood 28:d8614d2b82f9 366 sprintf(buff, "Resonance %5d", AinResonance.read_u16() >> 8);
ryood 28:d8614d2b82f9 367 gLCD.drawstring(0, col++, buff);
ryood 28:d8614d2b82f9 368 sprintf(buff, "Level %5d", AinLevel.read_u16() >> 8);
ryood 28:d8614d2b82f9 369 gLCD.drawstring(0, col++, buff);
ryood 30:0f652280d6ee 370 sprintf(buff, "PulseWidth %5d", AinPulseWidth.read_u16() >> 8);
ryood 28:d8614d2b82f9 371 gLCD.drawstring(0, col++, buff);
ryood 30:0f652280d6ee 372 sprintf(buff, "EnvMod %5d", AinEnvMod.read_u16() >> 8);
ryood 28:d8614d2b82f9 373 gLCD.drawstring(0, col++, buff);
ryood 28:d8614d2b82f9 374
ryood 28:d8614d2b82f9 375 gLCD.display();
ryood 28:d8614d2b82f9 376 }
ryood 28:d8614d2b82f9 377
ryood 16:b0419e3c9079 378 //------------------------------------------------------------------------
ryood 16:b0419e3c9079 379 // Main routine
ryood 16:b0419e3c9079 380 //------------------------------------------------------------------------
ryood 0:21e39bc75e31 381 int main()
ryood 0:21e39bc75e31 382 {
ryood 18:309f794eba74 383 #if (UART_TRACE)
ryood 18:309f794eba74 384 printf("*** BaseMachine Sequencer ***\r\n");
ryood 18:309f794eba74 385 #endif
ryood 18:309f794eba74 386
ryood 24:040cdcb2ff14 387 //--------------------------------------------------------------------
ryood 16:b0419e3c9079 388 // Setup Devices
ryood 16:b0419e3c9079 389 //
ryood 0:21e39bc75e31 390 spiMaster.format(8, 0);
ryood 0:21e39bc75e31 391 spiMaster.frequency(SPI_RATE);
ryood 0:21e39bc75e31 392
ryood 24:040cdcb2ff14 393 // Mute output
ryood 24:040cdcb2ff14 394 ampController.outDca(0);
ryood 24:040cdcb2ff14 395
ryood 34:602ee5e771e3 396 LCDBackLight.period_ms(10);
ryood 34:602ee5e771e3 397 LCDBackLight = 0.6f;
ryood 28:d8614d2b82f9 398 gLCD.set_spi_frequency(SPI_RATE);
ryood 16:b0419e3c9079 399 gLCD.begin(0x12);
ryood 16:b0419e3c9079 400 gLCD.clear();
ryood 16:b0419e3c9079 401 gLCD.drawstring(0, 0, TITLE_STR1);
ryood 16:b0419e3c9079 402 gLCD.drawstring(0, 1, TITLE_STR2);
ryood 16:b0419e3c9079 403 gLCD.display();
ryood 16:b0419e3c9079 404 Thread::wait(1000);
ryood 16:b0419e3c9079 405
ryood 20:00d3b6ace8c7 406 RotEncStep.setInterval(100);
ryood 20:00d3b6ace8c7 407 RotEncPitch.setInterval(100);
ryood 20:00d3b6ace8c7 408 RotEncBpm.setInterval(100);
ryood 17:557658db3e81 409
ryood 18:309f794eba74 410 PinWaveShape.attach_asserted(&swWaveShapePressed);
ryood 18:309f794eba74 411 PinWaveShape.setAssertValue(0);
ryood 18:309f794eba74 412 PinWaveShape.setSampleFrequency();
ryood 18:309f794eba74 413
ryood 28:d8614d2b82f9 414 PinUIMode.attach_asserted(&swUIModePressed);
ryood 28:d8614d2b82f9 415 PinUIMode.setAssertValue(0);
ryood 28:d8614d2b82f9 416 PinUIMode.setSampleFrequency();
ryood 18:309f794eba74 417
ryood 18:309f794eba74 418 PinOctaveUp.attach_asserted(&swOctaveUpPressed);
ryood 18:309f794eba74 419 PinOctaveUp.setAssertValue(0);
ryood 18:309f794eba74 420 PinOctaveUp.setSampleFrequency();
ryood 18:309f794eba74 421
ryood 18:309f794eba74 422 PinOctaveDown.attach_asserted(&swOctaveDownPressed);
ryood 18:309f794eba74 423 PinOctaveDown.setAssertValue(0);
ryood 18:309f794eba74 424 PinOctaveDown.setSampleFrequency();
ryood 18:309f794eba74 425
ryood 18:309f794eba74 426 PinNoteOnOff.attach_asserted(&swNoteOnOffPressed);
ryood 18:309f794eba74 427 PinNoteOnOff.setAssertValue(0);
ryood 18:309f794eba74 428 PinNoteOnOff.setSampleFrequency();
ryood 18:309f794eba74 429
ryood 18:309f794eba74 430 PinTie.attach_asserted(&swTiePressed);
ryood 18:309f794eba74 431 PinTie.setAssertValue(0);
ryood 18:309f794eba74 432 PinTie.setSampleFrequency();
ryood 18:309f794eba74 433
ryood 18:309f794eba74 434 PinAccent.attach_asserted(&swAccentPressed);
ryood 18:309f794eba74 435 PinAccent.setAssertValue(0);
ryood 18:309f794eba74 436 PinAccent.setSampleFrequency();
ryood 18:309f794eba74 437
ryood 18:309f794eba74 438 PinRunStop.attach_asserted(&swRunStopPressed);
ryood 18:309f794eba74 439 PinRunStop.setAssertValue(0);
ryood 18:309f794eba74 440 PinRunStop.setSampleFrequency();
ryood 18:309f794eba74 441
ryood 24:040cdcb2ff14 442 //--------------------------------------------------------------------
ryood 22:82f1e7877f9f 443 // Initialize objects
ryood 0:21e39bc75e31 444 //
ryood 15:9813d8eaf57e 445 Sequence::setBaseNoteNumber(baseNoteNumber);
ryood 14:c173e03ee3ad 446
ryood 0:21e39bc75e31 447 for (int i = 0; i < SEQUENCE_N; i++) {
ryood 0:21e39bc75e31 448 Sequence& seq = sequenceSender.getSequences()[i];
ryood 14:c173e03ee3ad 449 seq.setPitch(pitch[i]);
ryood 15:9813d8eaf57e 450 seq.setNoteOn(noteOn[i]);
ryood 15:9813d8eaf57e 451 seq.setTie(tie[i]);
ryood 26:fbf48a178aeb 452 seq.setAccent(accent[i]);
ryood 0:21e39bc75e31 453 }
ryood 26:fbf48a178aeb 454 RotEncPitch.setVal(sequences[0].getPitch());
ryood 6:fc10eac60b91 455
ryood 9:3e4e08578e1c 456 envelopeGenerator.init(envelope);
ryood 12:c248781608af 457
ryood 35:0165b610796d 458 sequenceSender.attachUpdate(&updateTicks);
ryood 14:c173e03ee3ad 459 sequenceSender.setWaveShape(waveShape);
ryood 5:4abac408b827 460
ryood 24:040cdcb2ff14 461 //--------------------------------------------------------------------
ryood 24:040cdcb2ff14 462 // Main loop
ryood 24:040cdcb2ff14 463 //
ryood 5:4abac408b827 464 for (;;) {
ryood 20:00d3b6ace8c7 465 pollingPots();
ryood 20:00d3b6ace8c7 466 pollingRotEncs();
ryood 18:309f794eba74 467 pollingPins();
ryood 23:5fe70293e34c 468 if (!isRunning) {
ryood 25:7382bc0a0329 469 if (isDirty) {
ryood 28:d8614d2b82f9 470 switch (UImode) {
ryood 28:d8614d2b82f9 471 case 0:
ryood 37:d4e50159baee 472 sequencerDisplay.update(SequencerDisplay::stop, currentStep, playingStep);
ryood 28:d8614d2b82f9 473 break;
ryood 28:d8614d2b82f9 474 case 1:
ryood 28:d8614d2b82f9 475 dumpToLCD00();
ryood 28:d8614d2b82f9 476 break;
ryood 28:d8614d2b82f9 477 }
ryood 28:d8614d2b82f9 478 isDirty = false;
ryood 28:d8614d2b82f9 479 }
ryood 28:d8614d2b82f9 480 if (UImode == 2) {
ryood 28:d8614d2b82f9 481 dumpToLCD01();
ryood 28:d8614d2b82f9 482 }
ryood 28:d8614d2b82f9 483 } else {
ryood 28:d8614d2b82f9 484 if (isDirty) {
ryood 37:d4e50159baee 485 sequencerDisplay.update(SequencerDisplay::run, currentStep, playingStep);
ryood 35:0165b610796d 486 /*
ryood 28:d8614d2b82f9 487 static int cnt = 0;
ryood 28:d8614d2b82f9 488 char buffer[32];
ryood 28:d8614d2b82f9 489 sprintf(buffer, "%d", cnt);
ryood 28:d8614d2b82f9 490 cnt++;
ryood 28:d8614d2b82f9 491 gLCD.clear();
ryood 28:d8614d2b82f9 492 gLCD.drawstring(0, 0, buffer);
ryood 28:d8614d2b82f9 493 gLCD.display();
ryood 35:0165b610796d 494 */
ryood 35:0165b610796d 495 //gLCD.fillrect((currentStep-1) * 7, 1, 7, 1, 0);
ryood 35:0165b610796d 496 //gLCD.clear();
ryood 35:0165b610796d 497 //gLCD.fillrect(currentStep * 7, 1, 7, 3, 1);
ryood 35:0165b610796d 498 //gLCD.display();
ryood 35:0165b610796d 499
ryood 36:50ad7e0a9a95 500 isDirty = false;
ryood 25:7382bc0a0329 501 }
ryood 23:5fe70293e34c 502 }
ryood 5:4abac408b827 503 }
ryood 0:21e39bc75e31 504 }