Nucleo Sequencer of my Base Machine
Dependencies: Amp AverageAnalogIn Envelope FilterController Sequence BaseMachineComon mbed-rtos mbed
Fork of SpiSequenceSender_Test by
main.cpp@43:9039cfc027bc, 2016-10-23 (annotated)
- Committer:
- ryood
- Date:
- Sun Oct 23 05:48:47 2016 +0000
- Revision:
- 43:9039cfc027bc
- Parent:
- 42:6614d19712ba
Add a slave reset sequence at init.
Who changed what in which revision?
User | Revision | Line number | New 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 | } |