BaseMachine Sequencer V2
Dependencies: AT24C1024 Amp AverageAnalogIn BaseMachineUIController Envelope ExioBufferdController FilterController MCP23S17 OscController PinDetect RotaryEncoder Sequence SequencerDisplay mbed-rtos mbed st7567LCD
Fork of BaseMachine by
main.cpp
- Committer:
- ryood
- Date:
- 2017-02-13
- Revision:
- 21:0bbca9e3ba30
- Parent:
- 20:bc7bd7faa8d5
- Child:
- 22:4b8cfeae6623
File content as of revision 21:0bbca9e3ba30:
/* * main.cpp * BaseMachine Sequencer * * mbed Rev 135 / mbed-rtos Rev 123 * * 2017.02.14 mbed Rev 135 / mbed-rtos Rev 123に変更 * 2016.11.07 UIを統合 * */ #include "mbed.h" #include "rtos.h" #include "AT24C1024.h" #define UART_TRACE (0) #include "BaseMachineCommon.h" #include "BaseMachineUIController.h" #include "SequenceSender.h" #include "EnvelopeGenerator.h" #include "SpiOscController.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; // Devices // BaseMachineUIController UIController; //SPI1 (PinName mosi, PinName miso, PinName sclk, PinName ssel=NC) SPI SpiMaster(PA_7, PA_6, PA_5); DigitalOut SpiMasterReset(PB_10, 0); Sequence sequences[SEQUENCE_N]; SequenceSender SequenceSender(sequences, SEQUENCE_N, samplingPeriod, bpm); Envelope envelope(4095, envelopeLength, envelopeLength*3/4, envelopeLength/2, 2047); EnvelopeGenerator EnvelopeGenerator; SpiOscController OscController(&SpiMaster, D9); 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()) { // Todo: 小数点演算を整数に level *= 1.0f + ((float)UIController.getAccentLevel()) / 128.0f; } AmpController.outDca(level); //printf("%d %d %d\r\n", playingStep, ticks, level); } else { AmpController.outDca(0); } OscController.setFrequency10(SequenceSender.getFrequency10()); OscController.outDco(); 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); OscController.setWaveShape(osc.waveShape); OscController.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 // SpiMasterReset = 1; SpiMaster.format(8, 0); SpiMaster.frequency(SPI1_RATE); // Mute output AmpController.outDca(0); UIController.init(); setParams(); EnvelopeGenerator.init(envelope); SequenceSender.attachUpdate(&updateTicks); //-------------------------------------------------------------------- // Main loop // for (;;) { UIController.update(); setParams(); Thread::wait(10); } }