BaseMachine Sequencer
Dependencies: Amp AverageAnalogIn BaseMachineUIController Envelope ExioBufferdController FilterController MCP23S17 PinDetect RotaryEncoder Sequence SequencerDisplay mbed-rtos mbed st7567LCD AT24C1024 OscController
Diff: main.cpp
- Revision:
- 0:1afb83a21a25
- Child:
- 1:87f7d2e0a123
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed Nov 09 05:43:04 2016 +0000 @@ -0,0 +1,159 @@ +/* + * 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 +//------------------------------------------------------------------------ + + + +//------------------------------------------------------------------------ +// 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(); + + UIController.getSequences(&sequences); + + SequenceSender.setBpm(UIController.getBpm()); + + // ToDo: Impl. accentLevel + + OscillatorParam osc; + UIController.getOscillatorParam(&osc); + SequenceSender.setWaveShape(osc.waveShape); + SequenceSender.setPulseWidth(osc.waveShape); + + bool _isRunning = UIController.getIsRunning(); + if (_isRunning != isRunning) + { + isRunning = _isRunning; + if (isRunning) + { + SequenceSender.run(playingStep); + } + else + { + AmpController.outDca(0); + SequenceSender.stop(); + } + } + } +}