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:
Tue Oct 25 13:51:53 2016 +0000
Revision:
44:c9c54537a623
Parent:
43:9039cfc027bc
#define SPI_UI_TO_SEQUENCER_MODE    (0)

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 39:ed2704cdc7aa 5 * 2016.10.10 UIを分離
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 39:ed2704cdc7aa 12
ryood 6:fc10eac60b91 13 #define UART_TRACE (0)
ryood 42:6614d19712ba 14 #include "BaseMachineCommon.h"
ryood 6:fc10eac60b91 15 #include "SpiSequenceSender.h"
ryood 9:3e4e08578e1c 16 #include "EnvelopeGenerator.h"
ryood 9:3e4e08578e1c 17 #include "SpiAmpController.h"
ryood 12:c248781608af 18 #include "SpiFilterController.h"
ryood 0:21e39bc75e31 19
ryood 16:b0419e3c9079 20 #define TITLE_STR1 ("BaseMachine Sequencer")
ryood 42:6614d19712ba 21 #define TITLE_STR2 ("20161025")
ryood 39:ed2704cdc7aa 22
ryood 42:6614d19712ba 23 #define SPI1_RATE (3000000) // Actual frequency about 2.6MHz
ryood 0:21e39bc75e31 24
ryood 14:c173e03ee3ad 25 const int samplingPeriod = 1; // ms
ryood 10:fb04f9959fd9 26 const int bpm = 120;
ryood 10:fb04f9959fd9 27 const int envelopeLength = (60 * 1000 / (bpm * 4)) / samplingPeriod;
ryood 20:00d3b6ace8c7 28 const int waveShape = SpiSequenceSender::WAVESHAPE_SQUARE;
ryood 10:fb04f9959fd9 29
ryood 16:b0419e3c9079 30 // Devices
ryood 16:b0419e3c9079 31 //
ryood 39:ed2704cdc7aa 32 //SPI1 (PinName mosi, PinName miso, PinName sclk, PinName ssel=NC)
ryood 39:ed2704cdc7aa 33 SPI SpiMaster(PA_7, PA_6, PA_5);
ryood 10:fb04f9959fd9 34
ryood 39:ed2704cdc7aa 35 //SPI2 (PinName mosi, PinName miso, PinName sclk, PinName ssel)
ryood 39:ed2704cdc7aa 36 SPISlave SpiSlave(PB_15, PB_14, PB_13, PB_12);
ryood 39:ed2704cdc7aa 37 DigitalOut StepChangePin(PB_1);
ryood 20:00d3b6ace8c7 38
ryood 39:ed2704cdc7aa 39 BusOut Leds(PA_0, PA_1, PA_4, PB_0, PC_1, PC_0, PA_10, PB_3);
ryood 34:602ee5e771e3 40
ryood 16:b0419e3c9079 41 // Grobal Variables
ryood 16:b0419e3c9079 42 //
ryood 16:b0419e3c9079 43 Sequence sequences[SEQUENCE_N];
ryood 39:ed2704cdc7aa 44 SpiSequenceSender sequenceSender(&SpiMaster, D9, sequences, SEQUENCE_N, samplingPeriod, bpm);
ryood 6:fc10eac60b91 45
ryood 10:fb04f9959fd9 46 Envelope envelope(4095, envelopeLength, envelopeLength*3/4, envelopeLength/2, 2047);
ryood 9:3e4e08578e1c 47 EnvelopeGenerator envelopeGenerator;
ryood 39:ed2704cdc7aa 48 SpiAmpController ampController(&SpiMaster, D8, D7);
ryood 17:557658db3e81 49
ryood 39:ed2704cdc7aa 50 SpiFilterController filterController(&SpiMaster, D10);
ryood 16:b0419e3c9079 51
ryood 39:ed2704cdc7aa 52 int playingStep = 0;
ryood 39:ed2704cdc7aa 53 int editingStep = 0;
ryood 39:ed2704cdc7aa 54 bool isRunning = false;
ryood 16:b0419e3c9079 55
ryood 16:b0419e3c9079 56 //------------------------------------------------------------------------
ryood 16:b0419e3c9079 57 // Callback functions
ryood 16:b0419e3c9079 58 //------------------------------------------------------------------------
ryood 35:0165b610796d 59 void updateTicks(int ticks)
ryood 8:de409197ff95 60 {
ryood 8:de409197ff95 61 if (ticks == 0) {
ryood 9:3e4e08578e1c 62 envelopeGenerator.init(envelope);
ryood 36:50ad7e0a9a95 63 playingStep = sequenceSender.getStep();
ryood 39:ed2704cdc7aa 64 // Masterにinterruptをかける。
ryood 39:ed2704cdc7aa 65 StepChangePin.write(1);
ryood 41:f3ac41366f68 66 wait_us(1);
ryood 39:ed2704cdc7aa 67 StepChangePin.write(0);
ryood 8:de409197ff95 68 }
ryood 14:c173e03ee3ad 69
ryood 27:c382689e652b 70 if (sequences[sequenceSender.getStep()].isNoteOn()) {
ryood 14:c173e03ee3ad 71 uint16_t level = envelopeGenerator.getModLevel();
ryood 27:c382689e652b 72 if (!sequences[sequenceSender.getStep()].isAccent()) {
ryood 35:0165b610796d 73 level = level * 1 / 2;
ryood 27:c382689e652b 74 }
ryood 14:c173e03ee3ad 75 ampController.outDca(level);
ryood 14:c173e03ee3ad 76 } else {
ryood 14:c173e03ee3ad 77 ampController.outDca(0);
ryood 14:c173e03ee3ad 78 }
ryood 9:3e4e08578e1c 79 envelopeGenerator.update();
ryood 12:c248781608af 80
ryood 15:9813d8eaf57e 81 filterController.outDcf();
ryood 8:de409197ff95 82 }
ryood 8:de409197ff95 83
ryood 16:b0419e3c9079 84 //------------------------------------------------------------------------
ryood 16:b0419e3c9079 85 // Functions
ryood 16:b0419e3c9079 86 //------------------------------------------------------------------------
ryood 20:00d3b6ace8c7 87
ryood 39:ed2704cdc7aa 88 void spiSlaveRecieve()
ryood 18:309f794eba74 89 {
ryood 39:ed2704cdc7aa 90 if (SpiSlave.receive()) {
ryood 39:ed2704cdc7aa 91 SpiSlave.reply(playingStep);
ryood 39:ed2704cdc7aa 92 uint16_t recievedVal = SpiSlave.read();
ryood 39:ed2704cdc7aa 93 uint8_t cmd = recievedVal >> 8;
ryood 39:ed2704cdc7aa 94 uint8_t data = recievedVal & 0xff;
ryood 40:fd75fb94898b 95
ryood 40:fd75fb94898b 96 if (cmd != CMD_RCV_PLAYING_STEP) {
ryood 40:fd75fb94898b 97 Leds.write(cmd);
ryood 40:fd75fb94898b 98 }
ryood 40:fd75fb94898b 99
ryood 39:ed2704cdc7aa 100 switch(cmd) {
ryood 39:ed2704cdc7aa 101 case CMD_RCV_PLAYING_STEP:
ryood 39:ed2704cdc7aa 102 // Do nothing
ryood 39:ed2704cdc7aa 103 break;
ryood 39:ed2704cdc7aa 104 case CMD_RUN:
ryood 39:ed2704cdc7aa 105 if (data == 0) {
ryood 39:ed2704cdc7aa 106 ampController.outDca(0);
ryood 39:ed2704cdc7aa 107 sequenceSender.stop();
ryood 39:ed2704cdc7aa 108 isRunning = false;
ryood 39:ed2704cdc7aa 109 }
ryood 39:ed2704cdc7aa 110 else {
ryood 39:ed2704cdc7aa 111 sequenceSender.run(playingStep);
ryood 39:ed2704cdc7aa 112 isRunning = true;
ryood 39:ed2704cdc7aa 113 }
ryood 39:ed2704cdc7aa 114 break;
ryood 39:ed2704cdc7aa 115 case CMD_BPM:
ryood 39:ed2704cdc7aa 116 sequenceSender.setBpm(data);
ryood 39:ed2704cdc7aa 117 break;
ryood 39:ed2704cdc7aa 118 case CMD_ACCENT_LEVEL:
ryood 39:ed2704cdc7aa 119 // ToDo: Impl. accentLevel
ryood 39:ed2704cdc7aa 120 break;
ryood 39:ed2704cdc7aa 121 case CMD_WAVE_SHAPE:
ryood 40:fd75fb94898b 122 sequenceSender.setWaveShape(data);
ryood 39:ed2704cdc7aa 123 break;
ryood 39:ed2704cdc7aa 124 case CMD_PULSE_WIDTH:
ryood 39:ed2704cdc7aa 125 sequenceSender.setPulseWidth(data << 1);
ryood 39:ed2704cdc7aa 126 break;
ryood 39:ed2704cdc7aa 127 case CMD_CUTOFF:
ryood 39:ed2704cdc7aa 128 filterController.setCutoff(data << 1);
ryood 39:ed2704cdc7aa 129 break;
ryood 39:ed2704cdc7aa 130 case CMD_RESONANCE:
ryood 39:ed2704cdc7aa 131 filterController.setResonance(data << 1);
ryood 39:ed2704cdc7aa 132 break;
ryood 39:ed2704cdc7aa 133 case CMD_LEVEL:
ryood 39:ed2704cdc7aa 134 envelope.setLevel(data << 5);
ryood 39:ed2704cdc7aa 135 break;
ryood 39:ed2704cdc7aa 136 case CMD_DURATION:
ryood 39:ed2704cdc7aa 137 envelope.setDuration((float)data / 128.0f * envelopeLength);
ryood 39:ed2704cdc7aa 138 break;
ryood 39:ed2704cdc7aa 139 case CMD_DECAY:
ryood 39:ed2704cdc7aa 140 envelope.setDecay((float)data / 128.0f * envelopeLength);
ryood 39:ed2704cdc7aa 141 break;
ryood 39:ed2704cdc7aa 142 case CMD_SUSTAIN:
ryood 39:ed2704cdc7aa 143 envelope.setSustain(data << 5);
ryood 39:ed2704cdc7aa 144 break;
ryood 39:ed2704cdc7aa 145 case CMD_NOTE:
ryood 39:ed2704cdc7aa 146 editingStep = data >> 4;
ryood 39:ed2704cdc7aa 147 sequences[editingStep].setNoteOn(data & 0x01);
ryood 39:ed2704cdc7aa 148 sequences[editingStep].setTie((data & 0x02) >> 1);
ryood 39:ed2704cdc7aa 149 sequences[editingStep].setAccent((data & 0x04) >> 2);
ryood 39:ed2704cdc7aa 150 break;
ryood 39:ed2704cdc7aa 151 case CMD_PITCH:
ryood 39:ed2704cdc7aa 152 sequences[editingStep].setPitch(data);
ryood 39:ed2704cdc7aa 153 break;
ryood 43:9039cfc027bc 154 /*
ryood 39:ed2704cdc7aa 155 default:
ryood 39:ed2704cdc7aa 156 Leds.write(cmd);
ryood 39:ed2704cdc7aa 157 error("invalid SPI cmd");
ryood 43:9039cfc027bc 158 */
ryood 18:309f794eba74 159 }
ryood 18:309f794eba74 160 }
ryood 28:d8614d2b82f9 161 }
ryood 28:d8614d2b82f9 162
ryood 16:b0419e3c9079 163 //------------------------------------------------------------------------
ryood 16:b0419e3c9079 164 // Main routine
ryood 16:b0419e3c9079 165 //------------------------------------------------------------------------
ryood 0:21e39bc75e31 166 int main()
ryood 0:21e39bc75e31 167 {
ryood 18:309f794eba74 168 #if (UART_TRACE)
ryood 18:309f794eba74 169 printf("*** BaseMachine Sequencer ***\r\n");
ryood 18:309f794eba74 170 #endif
ryood 18:309f794eba74 171
ryood 39:ed2704cdc7aa 172 // Check LED
ryood 39:ed2704cdc7aa 173 for (int i = 0; i < 8; i++) {
ryood 39:ed2704cdc7aa 174 Leds[i].write(1);
ryood 43:9039cfc027bc 175 Thread::wait(50);
ryood 39:ed2704cdc7aa 176 }
ryood 43:9039cfc027bc 177 Thread::wait(50);
ryood 39:ed2704cdc7aa 178 Leds.write(0x00);
ryood 39:ed2704cdc7aa 179
ryood 24:040cdcb2ff14 180 //--------------------------------------------------------------------
ryood 16:b0419e3c9079 181 // Setup Devices
ryood 16:b0419e3c9079 182 //
ryood 39:ed2704cdc7aa 183 SpiMaster.format(8, 0);
ryood 39:ed2704cdc7aa 184 SpiMaster.frequency(SPI1_RATE);
ryood 39:ed2704cdc7aa 185
ryood 39:ed2704cdc7aa 186 SpiSlave.format(16, 0);
ryood 42:6614d19712ba 187 SpiSlave.frequency(SPI_UI_TO_SEQUENCER_RATE);
ryood 0:21e39bc75e31 188
ryood 24:040cdcb2ff14 189 // Mute output
ryood 24:040cdcb2ff14 190 ampController.outDca(0);
ryood 24:040cdcb2ff14 191
ryood 24:040cdcb2ff14 192 //--------------------------------------------------------------------
ryood 22:82f1e7877f9f 193 // Initialize objects
ryood 0:21e39bc75e31 194 //
ryood 15:9813d8eaf57e 195 Sequence::setBaseNoteNumber(baseNoteNumber);
ryood 14:c173e03ee3ad 196
ryood 0:21e39bc75e31 197 for (int i = 0; i < SEQUENCE_N; i++) {
ryood 0:21e39bc75e31 198 Sequence& seq = sequenceSender.getSequences()[i];
ryood 14:c173e03ee3ad 199 seq.setPitch(pitch[i]);
ryood 15:9813d8eaf57e 200 seq.setNoteOn(noteOn[i]);
ryood 15:9813d8eaf57e 201 seq.setTie(tie[i]);
ryood 26:fbf48a178aeb 202 seq.setAccent(accent[i]);
ryood 0:21e39bc75e31 203 }
ryood 6:fc10eac60b91 204
ryood 9:3e4e08578e1c 205 envelopeGenerator.init(envelope);
ryood 12:c248781608af 206
ryood 35:0165b610796d 207 sequenceSender.attachUpdate(&updateTicks);
ryood 14:c173e03ee3ad 208 sequenceSender.setWaveShape(waveShape);
ryood 5:4abac408b827 209
ryood 24:040cdcb2ff14 210 //--------------------------------------------------------------------
ryood 24:040cdcb2ff14 211 // Main loop
ryood 24:040cdcb2ff14 212 //
ryood 5:4abac408b827 213 for (;;) {
ryood 39:ed2704cdc7aa 214 spiSlaveRecieve();
ryood 5:4abac408b827 215 }
ryood 39:ed2704cdc7aa 216
ryood 0:21e39bc75e31 217 }