BaseMachine UI Controllerに分離

Dependencies:   AverageAnalogIn PinDetect RotaryEncoder Sequence SequencerDisplay mbed-rtos mbed st7567LCD BaseMachineComon

Fork of BaseMachine_Sequencer by Ryo Od

Committer:
ryood
Date:
Tue Aug 23 10:29:06 2016 +0000
Revision:
17:557658db3e81
Parent:
16:b0419e3c9079
Child:
18:309f794eba74
Add: SequencerDisplay Library

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 0:21e39bc75e31 12
ryood 6:fc10eac60b91 13 #define UART_TRACE (0)
ryood 6:fc10eac60b91 14 #include "SpiSequenceSender.h"
ryood 9:3e4e08578e1c 15 #include "EnvelopeGenerator.h"
ryood 9:3e4e08578e1c 16 #include "SpiAmpController.h"
ryood 12:c248781608af 17 #include "SpiFilterController.h"
ryood 17:557658db3e81 18 #include "ST7565_SequencerDisplay.h"
ryood 0:21e39bc75e31 19
ryood 16:b0419e3c9079 20 #define TITLE_STR1 ("BaseMachine Sequencer")
ryood 16:b0419e3c9079 21 #define TITLE_STR2 ("20160823")
ryood 16:b0419e3c9079 22
ryood 6:fc10eac60b91 23 #define SEQUENCE_N (16)
ryood 6:fc10eac60b91 24 #define SPI_RATE (8000000)
ryood 0:21e39bc75e31 25
ryood 14:c173e03ee3ad 26 const int samplingPeriod = 1; // ms
ryood 10:fb04f9959fd9 27 const int bpm = 120;
ryood 10:fb04f9959fd9 28 const int envelopeLength = (60 * 1000 / (bpm * 4)) / samplingPeriod;
ryood 14:c173e03ee3ad 29 const int waveShape = SpiSequenceSender::WAVESHAPE_SAW;
ryood 14:c173e03ee3ad 30 const int baseNoteNumber = 48;
ryood 14:c173e03ee3ad 31
ryood 14:c173e03ee3ad 32 // Initial Sequence
ryood 14:c173e03ee3ad 33 const int noteOn[SEQUENCE_N] = { 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0 };
ryood 14:c173e03ee3ad 34 const int octave[SEQUENCE_N] = {-1,-1,-1, 0, 0,-1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 };
ryood 14:c173e03ee3ad 35 const int pitch[SEQUENCE_N] = { 9, 7, 3, 0, 0, 3, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0 };
ryood 14:c173e03ee3ad 36 const int tie[SEQUENCE_N] = { 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0 };
ryood 10:fb04f9959fd9 37
ryood 16:b0419e3c9079 38 // Devices
ryood 16:b0419e3c9079 39 //
ryood 16:b0419e3c9079 40 //SPI (PinName mosi, PinName miso, PinName sclk, PinName ssel=NC)
ryood 16:b0419e3c9079 41 //SPI spiMaster(PA_7, PA_6, PA_5);
ryood 16:b0419e3c9079 42 SPI spiMaster(SPI_MOSI, SPI_MISO, SPI_SCK);
ryood 16:b0419e3c9079 43
ryood 16:b0419e3c9079 44 //ST7565(PinName mosi, PinName sclk, PinName cs, PinName rst, PinName a0);
ryood 16:b0419e3c9079 45 ST7565 gLCD(PB_15, PB_13, PB_12, PB_2, PB_1);
ryood 16:b0419e3c9079 46
ryood 13:b0f988a239df 47 //AnalogIn levelIn(A0);
ryood 13:b0f988a239df 48 AnalogIn durationIn(A2);
ryood 13:b0f988a239df 49 AnalogIn decayIn(A1);
ryood 13:b0f988a239df 50 AnalogIn sustainIn(A0);
ryood 13:b0f988a239df 51 AnalogIn cutoffIn(A3);
ryood 13:b0f988a239df 52 AnalogIn resonanceIn(A4);
ryood 10:fb04f9959fd9 53
ryood 16:b0419e3c9079 54 // Grobal Variables
ryood 16:b0419e3c9079 55 //
ryood 16:b0419e3c9079 56 Sequence sequences[SEQUENCE_N];
ryood 16:b0419e3c9079 57 SpiSequenceSender sequenceSender(&spiMaster, D9, sequences, SEQUENCE_N, samplingPeriod, bpm);
ryood 6:fc10eac60b91 58
ryood 10:fb04f9959fd9 59 Envelope envelope(4095, envelopeLength, envelopeLength*3/4, envelopeLength/2, 2047);
ryood 9:3e4e08578e1c 60 EnvelopeGenerator envelopeGenerator;
ryood 9:3e4e08578e1c 61 SpiAmpController ampController(&spiMaster, D8, D7);
ryood 6:fc10eac60b91 62
ryood 12:c248781608af 63 SpiFilterController filterController(&spiMaster, D10);
ryood 0:21e39bc75e31 64
ryood 17:557658db3e81 65 ST7565_SequencerDisplay sequencerDisplay(&gLCD, sequences, SEQUENCE_N);
ryood 17:557658db3e81 66
ryood 16:b0419e3c9079 67 volatile int currentStep = 0;
ryood 16:b0419e3c9079 68 volatile bool isRunning = false;
ryood 16:b0419e3c9079 69 volatile bool isDirty = false;
ryood 16:b0419e3c9079 70 volatile uint8_t pinFlag = 0x00;
ryood 16:b0419e3c9079 71
ryood 16:b0419e3c9079 72 enum PinBit {
ryood 16:b0419e3c9079 73 bWaveShape = 0x01,
ryood 16:b0419e3c9079 74 bModNumber = 0x02,
ryood 16:b0419e3c9079 75 bOctaveUp = 0x04,
ryood 16:b0419e3c9079 76 bOctaveDown = 0x08,
ryood 16:b0419e3c9079 77 bNoteOnOff = 0x10,
ryood 16:b0419e3c9079 78 bTie = 0x20,
ryood 16:b0419e3c9079 79 bAccent = 0x40,
ryood 16:b0419e3c9079 80 bRunStop = 0x80
ryood 16:b0419e3c9079 81 };
ryood 16:b0419e3c9079 82
ryood 16:b0419e3c9079 83 // とりあえずの変数(後でClassのメンバ変数に格納)
ryood 16:b0419e3c9079 84 #define MOD_NUMBER_MAX 1
ryood 16:b0419e3c9079 85 volatile int modNumber = 0;
ryood 16:b0419e3c9079 86 volatile uint8_t cutOff;
ryood 16:b0419e3c9079 87 volatile uint8_t resonance;
ryood 16:b0419e3c9079 88 volatile uint8_t envMod;
ryood 16:b0419e3c9079 89 volatile uint8_t level;
ryood 16:b0419e3c9079 90 volatile uint8_t duration;
ryood 16:b0419e3c9079 91 volatile uint8_t decay;
ryood 16:b0419e3c9079 92 volatile uint8_t sustain;
ryood 16:b0419e3c9079 93
ryood 16:b0419e3c9079 94 //------------------------------------------------------------------------
ryood 16:b0419e3c9079 95 // Callback functions
ryood 16:b0419e3c9079 96 //------------------------------------------------------------------------
ryood 16:b0419e3c9079 97 void updateFunction(int ticks)
ryood 8:de409197ff95 98 {
ryood 8:de409197ff95 99 if (ticks == 0) {
ryood 9:3e4e08578e1c 100 envelopeGenerator.init(envelope);
ryood 8:de409197ff95 101 }
ryood 14:c173e03ee3ad 102
ryood 15:9813d8eaf57e 103 if (sequenceSender.getSequences()[sequenceSender.getStep()].isNoteOn()) {
ryood 14:c173e03ee3ad 104 uint16_t level = envelopeGenerator.getModLevel();
ryood 14:c173e03ee3ad 105 ampController.outDca(level);
ryood 14:c173e03ee3ad 106 } else {
ryood 14:c173e03ee3ad 107 ampController.outDca(0);
ryood 14:c173e03ee3ad 108 }
ryood 9:3e4e08578e1c 109 envelopeGenerator.update();
ryood 12:c248781608af 110
ryood 15:9813d8eaf57e 111 filterController.outDcf();
ryood 17:557658db3e81 112
ryood 17:557658db3e81 113 // ToDo: 再生中のLCD表示を検討→SPI1とSPI2の信号のタイミングを調査
ryood 17:557658db3e81 114 //sequencerDisplay.update(SequencerDisplay::stop, sequenceSender.getStep());
ryood 8:de409197ff95 115 }
ryood 8:de409197ff95 116
ryood 16:b0419e3c9079 117 //------------------------------------------------------------------------
ryood 16:b0419e3c9079 118 // Functions
ryood 16:b0419e3c9079 119 //------------------------------------------------------------------------
ryood 16:b0419e3c9079 120 void dumpToLCD()
ryood 16:b0419e3c9079 121 {
ryood 16:b0419e3c9079 122 char buff[64];
ryood 16:b0419e3c9079 123 int col = 0;
ryood 16:b0419e3c9079 124
ryood 16:b0419e3c9079 125 gLCD.clear();
ryood 16:b0419e3c9079 126
ryood 16:b0419e3c9079 127 sprintf(buff, "Run: %d", isRunning);
ryood 16:b0419e3c9079 128 gLCD.drawstring(0, col++, buff);
ryood 16:b0419e3c9079 129 sprintf(buff, "BPM: %d", sequenceSender.getBpm());
ryood 16:b0419e3c9079 130 gLCD.drawstring(0, col++, buff);
ryood 16:b0419e3c9079 131
ryood 16:b0419e3c9079 132 sprintf(buff, "Step: %d", currentStep);
ryood 16:b0419e3c9079 133 gLCD.drawstring(0, col++, buff);
ryood 16:b0419e3c9079 134 sprintf(buff, "NoteOn: %d", sequences[currentStep].isNoteOn());
ryood 16:b0419e3c9079 135 gLCD.drawstring(0, col++, buff);
ryood 16:b0419e3c9079 136 sprintf(buff, "Pitch: %d", sequences[currentStep].getPitch());
ryood 16:b0419e3c9079 137 gLCD.drawstring(0, col++, buff);
ryood 16:b0419e3c9079 138 sprintf(buff, "Octave: %d", sequences[currentStep].getOctave());
ryood 16:b0419e3c9079 139 gLCD.drawstring(0, col++, buff);
ryood 16:b0419e3c9079 140 sprintf(buff, "Tie: %d", sequences[currentStep].isTie());
ryood 16:b0419e3c9079 141 gLCD.drawstring(0, col++, buff);
ryood 16:b0419e3c9079 142 sprintf(buff, "Accent: %d", sequences[currentStep].isAccent());
ryood 16:b0419e3c9079 143 gLCD.drawstring(0, col++, buff);
ryood 16:b0419e3c9079 144
ryood 16:b0419e3c9079 145 col = 0;
ryood 16:b0419e3c9079 146 sprintf(buff, "WavS: %d", sequenceSender.getWaveShape());
ryood 16:b0419e3c9079 147 gLCD.drawstring(64, col++, buff);
ryood 16:b0419e3c9079 148 sprintf(buff, "ModN: %d", modNumber);
ryood 16:b0419e3c9079 149 gLCD.drawstring(64, col++, buff);
ryood 16:b0419e3c9079 150
ryood 16:b0419e3c9079 151 col = 2;
ryood 16:b0419e3c9079 152 sprintf(buff, "PW%3d CO%3d", sequenceSender.getPulseWidth(), cutOff);
ryood 16:b0419e3c9079 153 gLCD.drawstring(60, col++, buff);
ryood 16:b0419e3c9079 154 sprintf(buff, "RS%3d EV%3d", resonance, envMod);
ryood 16:b0419e3c9079 155 gLCD.drawstring(60, col++, buff);
ryood 16:b0419e3c9079 156 sprintf(buff, "LV%3d DR%3d", level, duration);
ryood 16:b0419e3c9079 157 gLCD.drawstring(60, col++, buff);
ryood 16:b0419e3c9079 158 sprintf(buff, "DC%3d ST%3d", decay, sustain);
ryood 16:b0419e3c9079 159 gLCD.drawstring(60, col++, buff);
ryood 16:b0419e3c9079 160
ryood 16:b0419e3c9079 161 gLCD.display();
ryood 16:b0419e3c9079 162 }
ryood 16:b0419e3c9079 163
ryood 16:b0419e3c9079 164 //------------------------------------------------------------------------
ryood 16:b0419e3c9079 165 // Main routine
ryood 16:b0419e3c9079 166 //------------------------------------------------------------------------
ryood 0:21e39bc75e31 167 int main()
ryood 0:21e39bc75e31 168 {
ryood 16:b0419e3c9079 169 // Setup Devices
ryood 16:b0419e3c9079 170 //
ryood 0:21e39bc75e31 171 spiMaster.format(8, 0);
ryood 0:21e39bc75e31 172 spiMaster.frequency(SPI_RATE);
ryood 0:21e39bc75e31 173
ryood 16:b0419e3c9079 174 gLCD.begin(0x12);
ryood 16:b0419e3c9079 175 gLCD.clear();
ryood 16:b0419e3c9079 176 gLCD.drawstring(0, 0, TITLE_STR1);
ryood 16:b0419e3c9079 177 gLCD.drawstring(0, 1, TITLE_STR2);
ryood 16:b0419e3c9079 178 gLCD.display();
ryood 16:b0419e3c9079 179 Thread::wait(1000);
ryood 16:b0419e3c9079 180
ryood 17:557658db3e81 181 dumpToLCD();
ryood 17:557658db3e81 182 Thread::wait(1000);
ryood 17:557658db3e81 183
ryood 17:557658db3e81 184 sequencerDisplay.update(SequencerDisplay::stop, 0);
ryood 17:557658db3e81 185
ryood 0:21e39bc75e31 186 // Test SequencerSender Run
ryood 0:21e39bc75e31 187 //
ryood 15:9813d8eaf57e 188 Sequence::setBaseNoteNumber(baseNoteNumber);
ryood 10:fb04f9959fd9 189 sequenceSender.setBpm(bpm);
ryood 14:c173e03ee3ad 190
ryood 0:21e39bc75e31 191 for (int i = 0; i < SEQUENCE_N; i++) {
ryood 0:21e39bc75e31 192 Sequence& seq = sequenceSender.getSequences()[i];
ryood 14:c173e03ee3ad 193 seq.setPitch(pitch[i]);
ryood 14:c173e03ee3ad 194 seq.setOctave(octave[i]);
ryood 15:9813d8eaf57e 195 seq.setNoteOn(noteOn[i]);
ryood 15:9813d8eaf57e 196 seq.setTie(tie[i]);
ryood 0:21e39bc75e31 197 }
ryood 6:fc10eac60b91 198
ryood 9:3e4e08578e1c 199 envelopeGenerator.init(envelope);
ryood 12:c248781608af 200
ryood 16:b0419e3c9079 201 sequenceSender.attachUpdate(&updateFunction);
ryood 14:c173e03ee3ad 202 sequenceSender.setWaveShape(waveShape);
ryood 0:21e39bc75e31 203 sequenceSender.run(0);
ryood 5:4abac408b827 204
ryood 5:4abac408b827 205 for (;;) {
ryood 10:fb04f9959fd9 206 /*
ryood 5:4abac408b827 207 sequenceSender.setPulseWidth(sequenceSender.getPulseWidth() + 4);
ryood 6:fc10eac60b91 208 Thread::wait(500);
ryood 6:fc10eac60b91 209 sequenceSender.setWaveShape(SpiSequenceSender::WAVESHAPE_SAW);
ryood 6:fc10eac60b91 210 Thread::wait(500);
ryood 6:fc10eac60b91 211 sequenceSender.setWaveShape(SpiSequenceSender::WAVESHAPE_SQUARE);
ryood 10:fb04f9959fd9 212 */
ryood 13:b0f988a239df 213 //envelope.setLevel(levelIn * 4095);
ryood 13:b0f988a239df 214 envelope.setLevel(4095);
ryood 10:fb04f9959fd9 215 envelope.setDuration(durationIn * envelopeLength);
ryood 10:fb04f9959fd9 216 envelope.setDecay(decayIn * envelopeLength);
ryood 10:fb04f9959fd9 217 envelope.setSustain(sustainIn * 4095);
ryood 12:c248781608af 218
ryood 12:c248781608af 219 filterController.setCutoff(cutoffIn * 255);
ryood 12:c248781608af 220 filterController.setResonance(resonanceIn * 255);
ryood 12:c248781608af 221
ryood 14:c173e03ee3ad 222 #if(UART_TRACE)
ryood 12:c248781608af 223 printf("%d\t%d\t%d\t%d\t%d\t%d\r\n",
ryood 12:c248781608af 224 filterController.getCutoff(),
ryood 12:c248781608af 225 filterController.getResonance(),
ryood 12:c248781608af 226 envelope.getLevel(),
ryood 12:c248781608af 227 envelope.getDuration(),
ryood 12:c248781608af 228 envelope.getDecay(),
ryood 12:c248781608af 229 envelope.getSustain()
ryood 12:c248781608af 230 );
ryood 14:c173e03ee3ad 231 #endif
ryood 5:4abac408b827 232 }
ryood 0:21e39bc75e31 233 }