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-09
- Revision:
- 1:87f7d2e0a123
- Parent:
- 0:1afb83a21a25
- Child:
- 2:6056b9559541
File content as of revision 1:87f7d2e0a123:
/* * main.cpp * BaseMachine Sequencer * * mbed Rev 121 / mbed-rtos Rev 117 * * 2016.11.07 UIを統合 * */ #include "mbed.h" #include "rtos.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) 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 (ticks == 0) { EnvelopeGenerator.init(envelope); playingStep = SequenceSender.getStep(); UIController.setPlayingStep(playingStep); } if (sequences[SequenceSender.getStep()].isNoteOn()) { uint16_t level = EnvelopeGenerator.getModLevel(); if (!sequences[SequenceSender.getStep()].isAccent()) { level = level * 1 / 2; } AmpController.outDca(level); } else { AmpController.outDca(0); } EnvelopeGenerator.update(); FilterController.outDcf(); } //------------------------------------------------------------------------ // 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); 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 //-------------------------------------------------------------------- // Setup Devices // SpiMaster.format(8, 0); SpiMaster.frequency(SPI1_RATE); // Mute output AmpController.outDca(0); UIController.init(); //-------------------------------------------------------------------- // Initialize objects // Sequence::setBaseNoteNumber(baseNoteNumber); for (int i = 0; i < SEQUENCE_N; i++) { Sequence& seq = SequenceSender.getSequences()[i]; seq.setPitch(pitch[i]); seq.setNoteOn(noteOn[i]); seq.setTie(tie[i]); seq.setAccent(accent[i]); } EnvelopeGenerator.init(envelope); SequenceSender.attachUpdate(&updateTicks); SequenceSender.setWaveShape(waveShape); //-------------------------------------------------------------------- // Main loop // for (;;) { UIController.update(); setParams(); } }