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 Aug 26 07:24:48 2016 +0000
Revision:
26:fbf48a178aeb
Parent:
25:7382bc0a0329
Child:
27:c382689e652b
?????????????

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 25:7382bc0a0329 24 #define TITLE_STR2 ("20160826")
ryood 16:b0419e3c9079 25
ryood 6:fc10eac60b91 26 #define SEQUENCE_N (16)
ryood 6:fc10eac60b91 27 #define SPI_RATE (8000000)
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 14:c173e03ee3ad 36
ryood 14:c173e03ee3ad 37 // Initial Sequence
ryood 26:fbf48a178aeb 38 const int noteOn[SEQUENCE_N] = { 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0 };
ryood 26:fbf48a178aeb 39 const int pitch[SEQUENCE_N] = {36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36 };
ryood 26:fbf48a178aeb 40 const int tie[SEQUENCE_N] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
ryood 26:fbf48a178aeb 41 const int accent[SEQUENCE_N] = { 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 };
ryood 10:fb04f9959fd9 42
ryood 16:b0419e3c9079 43 // Devices
ryood 16:b0419e3c9079 44 //
ryood 16:b0419e3c9079 45 //SPI (PinName mosi, PinName miso, PinName sclk, PinName ssel=NC)
ryood 19:241a4b355413 46 SPI spiMaster(PA_7, PA_6, PA_5);
ryood 16:b0419e3c9079 47
ryood 16:b0419e3c9079 48 //ST7565(PinName mosi, PinName sclk, PinName cs, PinName rst, PinName a0);
ryood 16:b0419e3c9079 49 ST7565 gLCD(PB_15, PB_13, PB_12, PB_2, PB_1);
ryood 16:b0419e3c9079 50
ryood 19:241a4b355413 51 AverageAnalogIn AinPulseWidth(PC_2);
ryood 19:241a4b355413 52 AverageAnalogIn AinCutOff(PB_0);
ryood 19:241a4b355413 53 AverageAnalogIn AinResonance(PC_1);
ryood 19:241a4b355413 54 AverageAnalogIn AinEnvMod(PC_3);
ryood 19:241a4b355413 55 AverageAnalogIn AinLevel(PC_0);
ryood 19:241a4b355413 56 AverageAnalogIn AinDuration(PA_4);
ryood 19:241a4b355413 57 AverageAnalogIn AinDecay(PA_1);
ryood 19:241a4b355413 58 AverageAnalogIn AinSustain(PA_0);
ryood 10:fb04f9959fd9 59
ryood 26:fbf48a178aeb 60 RotaryEncoder RotEncStep(PA_10, PB_3, 0, SEQUENCE_N - 1, 0);
ryood 26:fbf48a178aeb 61 RotaryEncoder RotEncPitch(PB_5, PB_4, 0, Sequence::getMaxPitch() - 1, 0);
ryood 26:fbf48a178aeb 62 RotaryEncoder RotEncBpm(PB_9, PB_8, bpmMin, bpmMax, 120);
ryood 20:00d3b6ace8c7 63
ryood 18:309f794eba74 64 PinDetect PinWaveShape(PD_2, PullUp);
ryood 18:309f794eba74 65 PinDetect PinModNumber(PC_11, PullUp);
ryood 18:309f794eba74 66 PinDetect PinOctaveUp(PC_10, PullUp);
ryood 18:309f794eba74 67 PinDetect PinOctaveDown(PC_12, PullUp);
ryood 18:309f794eba74 68 PinDetect PinNoteOnOff(PA_13, PullUp);
ryood 18:309f794eba74 69 PinDetect PinTie(PA_14, PullUp);
ryood 18:309f794eba74 70 PinDetect PinAccent(PA_15, PullUp);
ryood 18:309f794eba74 71 PinDetect PinRunStop(PB_7, PullUp);
ryood 18:309f794eba74 72
ryood 16:b0419e3c9079 73 // Grobal Variables
ryood 16:b0419e3c9079 74 //
ryood 16:b0419e3c9079 75 Sequence sequences[SEQUENCE_N];
ryood 16:b0419e3c9079 76 SpiSequenceSender sequenceSender(&spiMaster, D9, sequences, SEQUENCE_N, samplingPeriod, bpm);
ryood 6:fc10eac60b91 77
ryood 10:fb04f9959fd9 78 Envelope envelope(4095, envelopeLength, envelopeLength*3/4, envelopeLength/2, 2047);
ryood 9:3e4e08578e1c 79 EnvelopeGenerator envelopeGenerator;
ryood 9:3e4e08578e1c 80 SpiAmpController ampController(&spiMaster, D8, D7);
ryood 6:fc10eac60b91 81
ryood 12:c248781608af 82 SpiFilterController filterController(&spiMaster, D10);
ryood 0:21e39bc75e31 83
ryood 17:557658db3e81 84 ST7565_SequencerDisplay sequencerDisplay(&gLCD, sequences, SEQUENCE_N);
ryood 17:557658db3e81 85
ryood 16:b0419e3c9079 86 volatile int currentStep = 0;
ryood 16:b0419e3c9079 87 volatile bool isRunning = false;
ryood 26:fbf48a178aeb 88 volatile bool isDirty = true;
ryood 16:b0419e3c9079 89 volatile uint8_t pinFlag = 0x00;
ryood 16:b0419e3c9079 90
ryood 16:b0419e3c9079 91 enum PinBit {
ryood 16:b0419e3c9079 92 bWaveShape = 0x01,
ryood 16:b0419e3c9079 93 bModNumber = 0x02,
ryood 16:b0419e3c9079 94 bOctaveUp = 0x04,
ryood 16:b0419e3c9079 95 bOctaveDown = 0x08,
ryood 16:b0419e3c9079 96 bNoteOnOff = 0x10,
ryood 16:b0419e3c9079 97 bTie = 0x20,
ryood 16:b0419e3c9079 98 bAccent = 0x40,
ryood 16:b0419e3c9079 99 bRunStop = 0x80
ryood 16:b0419e3c9079 100 };
ryood 16:b0419e3c9079 101
ryood 16:b0419e3c9079 102 // とりあえずの変数(後でClassのメンバ変数に格納)
ryood 16:b0419e3c9079 103 #define MOD_NUMBER_MAX 1
ryood 16:b0419e3c9079 104 volatile int modNumber = 0;
ryood 21:c4d09aaa52b9 105 volatile uint8_t envMod = 127;
ryood 16:b0419e3c9079 106
ryood 16:b0419e3c9079 107 //------------------------------------------------------------------------
ryood 16:b0419e3c9079 108 // Callback functions
ryood 16:b0419e3c9079 109 //------------------------------------------------------------------------
ryood 16:b0419e3c9079 110 void updateFunction(int ticks)
ryood 8:de409197ff95 111 {
ryood 8:de409197ff95 112 if (ticks == 0) {
ryood 9:3e4e08578e1c 113 envelopeGenerator.init(envelope);
ryood 8:de409197ff95 114 }
ryood 14:c173e03ee3ad 115
ryood 15:9813d8eaf57e 116 if (sequenceSender.getSequences()[sequenceSender.getStep()].isNoteOn()) {
ryood 14:c173e03ee3ad 117 uint16_t level = envelopeGenerator.getModLevel();
ryood 14:c173e03ee3ad 118 ampController.outDca(level);
ryood 14:c173e03ee3ad 119 } else {
ryood 14:c173e03ee3ad 120 ampController.outDca(0);
ryood 14:c173e03ee3ad 121 }
ryood 9:3e4e08578e1c 122 envelopeGenerator.update();
ryood 12:c248781608af 123
ryood 15:9813d8eaf57e 124 filterController.outDcf();
ryood 17:557658db3e81 125
ryood 17:557658db3e81 126 // ToDo: 再生中のLCD表示を検討→SPI1とSPI2の信号のタイミングを調査
ryood 17:557658db3e81 127 //sequencerDisplay.update(SequencerDisplay::stop, sequenceSender.getStep());
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 18:309f794eba74 138 void swModNumberPressed()
ryood 18:309f794eba74 139 {
ryood 18:309f794eba74 140 pinFlag |= bModNumber;
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 20:00d3b6ace8c7 178 //pulseWidth = AinPulseWidth.read_u16() >> 8;
ryood 20:00d3b6ace8c7 179
ryood 19:241a4b355413 180 filterController.setCutoff(AinCutOff.read_u16() >> 8);
ryood 19:241a4b355413 181 filterController.setResonance(AinResonance.read_u16() >> 8);
ryood 24:040cdcb2ff14 182 //envMod = AinEnvMod.read_u16() >> 8;
ryood 19:241a4b355413 183
ryood 19:241a4b355413 184 //envelope.setLevel(AinLevel.read_u16() >> 4);
ryood 19:241a4b355413 185 envelope.setLevel(4095);
ryood 19:241a4b355413 186 envelope.setDuration(AinDuration.read() * envelopeLength);
ryood 19:241a4b355413 187 envelope.setDecay(AinDecay.read() * envelopeLength);
ryood 19:241a4b355413 188 envelope.setSustain(AinSustain.read() * 4095);
ryood 20:00d3b6ace8c7 189 }
ryood 20:00d3b6ace8c7 190
ryood 20:00d3b6ace8c7 191 void pollingRotEncs()
ryood 20:00d3b6ace8c7 192 {
ryood 20:00d3b6ace8c7 193 int _bpm = RotEncBpm.getVal();
ryood 20:00d3b6ace8c7 194 if (_bpm != sequenceSender.getBpm()) {
ryood 20:00d3b6ace8c7 195 sequenceSender.setBpm(_bpm);
ryood 25:7382bc0a0329 196 sequencerDisplay.setBpm(_bpm);
ryood 20:00d3b6ace8c7 197 isDirty = true;
ryood 20:00d3b6ace8c7 198 }
ryood 20:00d3b6ace8c7 199
ryood 20:00d3b6ace8c7 200 int _step = RotEncStep.getVal();
ryood 20:00d3b6ace8c7 201 if (_step != currentStep) {
ryood 20:00d3b6ace8c7 202 currentStep = _step;
ryood 20:00d3b6ace8c7 203 // syncronize sequence value & Rotary Encoder's value
ryood 20:00d3b6ace8c7 204 RotEncPitch.setVal(sequences[currentStep].getPitch());
ryood 20:00d3b6ace8c7 205 isDirty = true;
ryood 20:00d3b6ace8c7 206 }
ryood 20:00d3b6ace8c7 207
ryood 20:00d3b6ace8c7 208 int _pitch = RotEncPitch.getVal();
ryood 20:00d3b6ace8c7 209 if (_pitch != sequences[currentStep].getPitch()) {
ryood 20:00d3b6ace8c7 210 sequences[currentStep].setPitch(_pitch);
ryood 20:00d3b6ace8c7 211 isDirty = true;
ryood 20:00d3b6ace8c7 212 }
ryood 19:241a4b355413 213 }
ryood 19:241a4b355413 214
ryood 18:309f794eba74 215 void pollingPins()
ryood 18:309f794eba74 216 {
ryood 18:309f794eba74 217 if (pinFlag & bWaveShape) {
ryood 18:309f794eba74 218 #if (UART_TRACE)
ryood 18:309f794eba74 219 printf("PinWaveShape Pushed\r\n");
ryood 18:309f794eba74 220 #endif
ryood 18:309f794eba74 221 uint8_t waveShape = sequenceSender.getWaveShape();
ryood 18:309f794eba74 222 waveShape++;
ryood 25:7382bc0a0329 223 if (waveShape == SpiSequenceSender::WAVESHAPE_N) {
ryood 25:7382bc0a0329 224 waveShape = 0;
ryood 18:309f794eba74 225 }
ryood 25:7382bc0a0329 226 sequenceSender.setWaveShape(waveShape);
ryood 25:7382bc0a0329 227 sequencerDisplay.setWaveShape(waveShape);
ryood 18:309f794eba74 228 pinFlag &= ~bWaveShape;
ryood 18:309f794eba74 229 }
ryood 18:309f794eba74 230
ryood 18:309f794eba74 231 if (pinFlag & bModNumber) {
ryood 18:309f794eba74 232 #if (UART_TRACE)
ryood 18:309f794eba74 233 printf("PinModNumber Pushed\r\n");
ryood 18:309f794eba74 234 #endif
ryood 18:309f794eba74 235 modNumber++;
ryood 18:309f794eba74 236 if (modNumber > MOD_NUMBER_MAX) {
ryood 18:309f794eba74 237 modNumber = 0;
ryood 18:309f794eba74 238 }
ryood 25:7382bc0a0329 239 sequencerDisplay.setModNumber(modNumber);
ryood 18:309f794eba74 240 pinFlag &= ~bModNumber;
ryood 18:309f794eba74 241 }
ryood 18:309f794eba74 242
ryood 18:309f794eba74 243 if (pinFlag & bOctaveUp) {
ryood 18:309f794eba74 244 #if (UART_TRACE)
ryood 18:309f794eba74 245 printf("PinOctaveUp Pushed\r\n");
ryood 18:309f794eba74 246 #endif
ryood 25:7382bc0a0329 247 //sequences[currentStep].setOctave(sequences[currentStep].getOctave() + 1);
ryood 25:7382bc0a0329 248 sequencerDisplay.setOctave(sequencerDisplay.getOctave() + 1);
ryood 18:309f794eba74 249 pinFlag &= ~bOctaveUp;
ryood 18:309f794eba74 250 }
ryood 18:309f794eba74 251
ryood 18:309f794eba74 252 if (pinFlag & bOctaveDown) {
ryood 18:309f794eba74 253 #if (UART_TRACE)
ryood 18:309f794eba74 254 printf("PinOctaveDown 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 &= ~bOctaveDown;
ryood 18:309f794eba74 259 }
ryood 18:309f794eba74 260
ryood 18:309f794eba74 261 if (pinFlag & bNoteOnOff) {
ryood 18:309f794eba74 262 #if (UART_TRACE)
ryood 18:309f794eba74 263 printf("PinNoteOnOff Pushed\r\n");
ryood 18:309f794eba74 264 #endif
ryood 18:309f794eba74 265 sequences[currentStep].setNoteOn(!sequences[currentStep].isNoteOn());
ryood 18:309f794eba74 266 pinFlag &= ~bNoteOnOff;
ryood 18:309f794eba74 267 }
ryood 18:309f794eba74 268
ryood 18:309f794eba74 269 if (pinFlag & bTie) {
ryood 18:309f794eba74 270 #if (UART_TRACE)
ryood 18:309f794eba74 271 printf("PinTie Pushed\r\n");
ryood 18:309f794eba74 272 #endif
ryood 18:309f794eba74 273 sequences[currentStep].setTie(!sequences[currentStep].isTie());
ryood 18:309f794eba74 274 pinFlag &= ~bTie;
ryood 18:309f794eba74 275 }
ryood 18:309f794eba74 276
ryood 18:309f794eba74 277 if (pinFlag & bAccent) {
ryood 18:309f794eba74 278 #if (UART_TRACE)
ryood 18:309f794eba74 279 printf("PinAccent Pushed\r\n");
ryood 18:309f794eba74 280 #endif
ryood 18:309f794eba74 281 sequences[currentStep].setAccent(!sequences[currentStep].isAccent());
ryood 18:309f794eba74 282 pinFlag &= ~bAccent;
ryood 18:309f794eba74 283 }
ryood 18:309f794eba74 284
ryood 18:309f794eba74 285 if (pinFlag & bRunStop) {
ryood 18:309f794eba74 286 #if (UART_TRACE)
ryood 18:309f794eba74 287 printf("PinRunStop Pushed\r\n");
ryood 18:309f794eba74 288 #endif
ryood 18:309f794eba74 289 if (isRunning) {
ryood 22:82f1e7877f9f 290 ampController.outDca(0);
ryood 18:309f794eba74 291 sequenceSender.stop();
ryood 18:309f794eba74 292 isRunning = false;
ryood 18:309f794eba74 293 } else {
ryood 18:309f794eba74 294 sequenceSender.run(currentStep);
ryood 18:309f794eba74 295 isRunning = true;
ryood 18:309f794eba74 296 }
ryood 18:309f794eba74 297 pinFlag &= ~bRunStop;
ryood 18:309f794eba74 298 }
ryood 18:309f794eba74 299 }
ryood 18:309f794eba74 300
ryood 16:b0419e3c9079 301 void dumpToLCD()
ryood 16:b0419e3c9079 302 {
ryood 16:b0419e3c9079 303 char buff[64];
ryood 16:b0419e3c9079 304 int col = 0;
ryood 16:b0419e3c9079 305
ryood 16:b0419e3c9079 306 gLCD.clear();
ryood 16:b0419e3c9079 307
ryood 24:040cdcb2ff14 308 sprintf(buff, "Run:%d BPM:%03d", isRunning, sequenceSender.getBpm());
ryood 16:b0419e3c9079 309 gLCD.drawstring(0, col++, buff);
ryood 24:040cdcb2ff14 310
ryood 24:040cdcb2ff14 311 sprintf(buff, "Stp:%02d Nto:%d Pch:%02d",
ryood 24:040cdcb2ff14 312 currentStep, sequences[currentStep].isNoteOn(), sequences[currentStep].getPitch());
ryood 24:040cdcb2ff14 313 gLCD.drawstring(0, col++, buff);
ryood 24:040cdcb2ff14 314
ryood 24:040cdcb2ff14 315 sprintf(buff, "Oct:%-2d Tie:%d Acc:%d",
ryood 26:fbf48a178aeb 316 sequencerDisplay.getOctave(), sequences[currentStep].isTie(),sequences[currentStep].isAccent());
ryood 16:b0419e3c9079 317 gLCD.drawstring(0, col++, buff);
ryood 16:b0419e3c9079 318
ryood 24:040cdcb2ff14 319 sprintf(buff, "Wsp:%d Mdn:%d", sequenceSender.getWaveShape(), modNumber);
ryood 16:b0419e3c9079 320 gLCD.drawstring(0, col++, buff);
ryood 16:b0419e3c9079 321
ryood 24:040cdcb2ff14 322 sprintf(buff, "PW :%4d CO :%4d", sequenceSender.getPulseWidth(), filterController.getCutoff());
ryood 24:040cdcb2ff14 323 gLCD.drawstring(0, col++, buff);
ryood 24:040cdcb2ff14 324 sprintf(buff, "RSO:%4d ENV:%4d", filterController.getResonance(), envMod);
ryood 24:040cdcb2ff14 325 gLCD.drawstring(0, col++, buff);
ryood 24:040cdcb2ff14 326 sprintf(buff, "LVL:%4d DUR:%4d", envelope.getLevel(), envelope.getDuration());
ryood 24:040cdcb2ff14 327 gLCD.drawstring(0, col++, buff);
ryood 24:040cdcb2ff14 328 sprintf(buff, "DCY:%4d SUS:%4d", envelope.getDecay(), envelope.getSustain());
ryood 24:040cdcb2ff14 329 gLCD.drawstring(0, col++, buff);
ryood 16:b0419e3c9079 330
ryood 16:b0419e3c9079 331 gLCD.display();
ryood 16:b0419e3c9079 332 }
ryood 16:b0419e3c9079 333
ryood 16:b0419e3c9079 334 //------------------------------------------------------------------------
ryood 16:b0419e3c9079 335 // Main routine
ryood 16:b0419e3c9079 336 //------------------------------------------------------------------------
ryood 0:21e39bc75e31 337 int main()
ryood 0:21e39bc75e31 338 {
ryood 18:309f794eba74 339 #if (UART_TRACE)
ryood 18:309f794eba74 340 printf("*** BaseMachine Sequencer ***\r\n");
ryood 18:309f794eba74 341 #endif
ryood 18:309f794eba74 342
ryood 24:040cdcb2ff14 343 //--------------------------------------------------------------------
ryood 16:b0419e3c9079 344 // Setup Devices
ryood 16:b0419e3c9079 345 //
ryood 0:21e39bc75e31 346 spiMaster.format(8, 0);
ryood 0:21e39bc75e31 347 spiMaster.frequency(SPI_RATE);
ryood 0:21e39bc75e31 348
ryood 24:040cdcb2ff14 349 // Mute output
ryood 24:040cdcb2ff14 350 ampController.outDca(0);
ryood 24:040cdcb2ff14 351
ryood 16:b0419e3c9079 352 gLCD.begin(0x12);
ryood 16:b0419e3c9079 353 gLCD.clear();
ryood 16:b0419e3c9079 354 gLCD.drawstring(0, 0, TITLE_STR1);
ryood 16:b0419e3c9079 355 gLCD.drawstring(0, 1, TITLE_STR2);
ryood 16:b0419e3c9079 356 gLCD.display();
ryood 16:b0419e3c9079 357 Thread::wait(1000);
ryood 16:b0419e3c9079 358
ryood 20:00d3b6ace8c7 359 RotEncStep.setInterval(100);
ryood 20:00d3b6ace8c7 360 RotEncPitch.setInterval(100);
ryood 20:00d3b6ace8c7 361 RotEncBpm.setInterval(100);
ryood 17:557658db3e81 362
ryood 18:309f794eba74 363 PinWaveShape.attach_asserted(&swWaveShapePressed);
ryood 18:309f794eba74 364 PinWaveShape.setAssertValue(0);
ryood 18:309f794eba74 365 PinWaveShape.setSampleFrequency();
ryood 18:309f794eba74 366
ryood 18:309f794eba74 367 PinModNumber.attach_asserted(&swModNumberPressed);
ryood 18:309f794eba74 368 PinModNumber.setAssertValue(0);
ryood 18:309f794eba74 369 PinModNumber.setSampleFrequency();
ryood 18:309f794eba74 370
ryood 18:309f794eba74 371 PinOctaveUp.attach_asserted(&swOctaveUpPressed);
ryood 18:309f794eba74 372 PinOctaveUp.setAssertValue(0);
ryood 18:309f794eba74 373 PinOctaveUp.setSampleFrequency();
ryood 18:309f794eba74 374
ryood 18:309f794eba74 375 PinOctaveDown.attach_asserted(&swOctaveDownPressed);
ryood 18:309f794eba74 376 PinOctaveDown.setAssertValue(0);
ryood 18:309f794eba74 377 PinOctaveDown.setSampleFrequency();
ryood 18:309f794eba74 378
ryood 18:309f794eba74 379 PinNoteOnOff.attach_asserted(&swNoteOnOffPressed);
ryood 18:309f794eba74 380 PinNoteOnOff.setAssertValue(0);
ryood 18:309f794eba74 381 PinNoteOnOff.setSampleFrequency();
ryood 18:309f794eba74 382
ryood 18:309f794eba74 383 PinTie.attach_asserted(&swTiePressed);
ryood 18:309f794eba74 384 PinTie.setAssertValue(0);
ryood 18:309f794eba74 385 PinTie.setSampleFrequency();
ryood 18:309f794eba74 386
ryood 18:309f794eba74 387 PinAccent.attach_asserted(&swAccentPressed);
ryood 18:309f794eba74 388 PinAccent.setAssertValue(0);
ryood 18:309f794eba74 389 PinAccent.setSampleFrequency();
ryood 18:309f794eba74 390
ryood 18:309f794eba74 391 PinRunStop.attach_asserted(&swRunStopPressed);
ryood 18:309f794eba74 392 PinRunStop.setAssertValue(0);
ryood 18:309f794eba74 393 PinRunStop.setSampleFrequency();
ryood 18:309f794eba74 394
ryood 24:040cdcb2ff14 395 //--------------------------------------------------------------------
ryood 22:82f1e7877f9f 396 // Initialize objects
ryood 0:21e39bc75e31 397 //
ryood 15:9813d8eaf57e 398 Sequence::setBaseNoteNumber(baseNoteNumber);
ryood 14:c173e03ee3ad 399
ryood 0:21e39bc75e31 400 for (int i = 0; i < SEQUENCE_N; i++) {
ryood 0:21e39bc75e31 401 Sequence& seq = sequenceSender.getSequences()[i];
ryood 14:c173e03ee3ad 402 seq.setPitch(pitch[i]);
ryood 15:9813d8eaf57e 403 seq.setNoteOn(noteOn[i]);
ryood 15:9813d8eaf57e 404 seq.setTie(tie[i]);
ryood 26:fbf48a178aeb 405 seq.setAccent(accent[i]);
ryood 0:21e39bc75e31 406 }
ryood 26:fbf48a178aeb 407 RotEncPitch.setVal(sequences[0].getPitch());
ryood 6:fc10eac60b91 408
ryood 9:3e4e08578e1c 409 envelopeGenerator.init(envelope);
ryood 12:c248781608af 410
ryood 16:b0419e3c9079 411 sequenceSender.attachUpdate(&updateFunction);
ryood 14:c173e03ee3ad 412 sequenceSender.setWaveShape(waveShape);
ryood 5:4abac408b827 413
ryood 24:040cdcb2ff14 414 //--------------------------------------------------------------------
ryood 24:040cdcb2ff14 415 // Main loop
ryood 24:040cdcb2ff14 416 //
ryood 5:4abac408b827 417 for (;;) {
ryood 20:00d3b6ace8c7 418 pollingPots();
ryood 20:00d3b6ace8c7 419 pollingRotEncs();
ryood 18:309f794eba74 420 pollingPins();
ryood 23:5fe70293e34c 421 if (!isRunning) {
ryood 25:7382bc0a0329 422 if (isDirty) {
ryood 25:7382bc0a0329 423 sequencerDisplay.update(SequencerDisplay::stop, currentStep);
ryood 26:fbf48a178aeb 424 //dumpToLCD();
ryood 25:7382bc0a0329 425 }
ryood 23:5fe70293e34c 426 }
ryood 5:4abac408b827 427 }
ryood 0:21e39bc75e31 428 }