BaseMachine Sequencer
Dependencies: Amp AverageAnalogIn BaseMachineUIController Envelope ExioBufferdController FilterController MCP23S17 PinDetect RotaryEncoder Sequence SequencerDisplay mbed-rtos mbed st7567LCD AT24C1024 OscController
main.cpp
- Committer:
- ryood
- Date:
- 2016-11-25
- Revision:
- 11:eb9e72bf529c
- Parent:
- 10:0b7f4eb37197
- Child:
- 14:16d53ac0a61a
File content as of revision 11:eb9e72bf529c:
/* * main.cpp * BaseMachine Sequencer * * mbed Rev 121 / mbed-rtos Rev 117 * * 2016.11.07 UIを統合 * */ #include "mbed.h" #include "rtos.h" #include "AT24C1024.h" #define UART_TRACE (0) #include "BaseMachineCommon.h" #include "BaseMachineUIController.h" #include "SpiSequenceSender.h" #include "EnvelopeGenerator.h" #include "SpiAmpController.h" #include "SpiFilterController.h" #define SPI1_RATE (1000000) #define I2C1_RATE (100000) const int samplingPeriod = 1; // ms const int bpm = 120; const int envelopeLength = (60 * 1000 / (bpm * 4)) / samplingPeriod; const int waveShape = SpiSequenceSender::WAVESHAPE_SQUARE; // Devices // BaseMachineUIController UIController; //SPI1 (PinName mosi, PinName miso, PinName sclk, PinName ssel=NC) SPI SpiMaster(PA_7, PA_6, PA_5); Sequence sequences[SEQUENCE_N]; SpiSequenceSender SequenceSender(&SpiMaster, D9, sequences, SEQUENCE_N, samplingPeriod, bpm); Envelope envelope(4095, envelopeLength, envelopeLength*3/4, envelopeLength/2, 2047); EnvelopeGenerator EnvelopeGenerator; SpiAmpController AmpController(&SpiMaster, D8, D7); SpiFilterController FilterController(&SpiMaster, D10); // Grobal Variables // int playingStep = 0; int editingStep = 0; bool isRunning = false; //------------------------------------------------------------------------ // Callback functions //------------------------------------------------------------------------ void updateTicks(int ticks) { if (sequences[SequenceSender.getStep()].isNoteOn()) { uint16_t level = EnvelopeGenerator.update(); level = level >> 1; if (sequences[SequenceSender.getStep()].isAccent()) { level += (UIController.getAccentLevel() << 4); } AmpController.outDca(level); //printf("%d %d %d\r\n", playingStep, ticks, level); } else { AmpController.outDca(0); } FilterController.outDcf(); if (ticks == 0) { EnvelopeGenerator.init(envelope); playingStep = SequenceSender.getStep(); UIController.setPlayingStep(playingStep); } } //------------------------------------------------------------------------ // Functions //------------------------------------------------------------------------ void setParams() { UIController.getSequences(&sequences); SequenceSender.setBpm(UIController.getBpm()); // ToDo: Impl. accentLevel OscillatorParam osc; UIController.getOscillatorParam(&osc); SequenceSender.setWaveShape(osc.waveShape); SequenceSender.setPulseWidth(osc.pulseWidth << 1); FilterParam flt; UIController.getFilterParam(&flt); FilterController.setCutoff(flt.cutoff << 1); FilterController.setResonance(flt.resonance << 1); EnvelopeParam env; UIController.getEnvelopeParam(&env); envelope.setLevel(env.level << 5); //ToDo: Impl. envelope length envelope.setLength(envelopeLength); envelope.setDuration((float)env.duration / 128.0f * envelopeLength); envelope.setDecay((float)env.decay / 128.0f * envelopeLength); envelope.setSustain(env.sustain << 5); bool _isRunning = UIController.getIsRunning(); if (_isRunning != isRunning) { isRunning = _isRunning; if (isRunning) { SequenceSender.run(playingStep); } else { AmpController.outDca(0); SequenceSender.stop(); } } } //------------------------------------------------------------------------ // Main routine //------------------------------------------------------------------------ int main() { #if (UART_TRACE) printf("*** BaseMachine Sequencer ***\r\n"); #endif //-------------------------------------------------------------------- // Initialize objects // Sequence::setBaseNoteNumber(baseNoteNumber); //-------------------------------------------------------------------- // Setup Devices // SpiMaster.format(8, 0); SpiMaster.frequency(SPI1_RATE); // Mute output AmpController.outDca(0); UIController.init(); setParams(); EnvelopeGenerator.init(envelope); SequenceSender.attachUpdate(&updateTicks); SequenceSender.setWaveShape(waveShape); //-------------------------------------------------------------------- // Main loop // for (;;) { UIController.update(); setParams(); Thread::wait(10); } }