BaseMachine Sequencer

Dependencies:   Amp AverageAnalogIn BaseMachineUIController Envelope ExioBufferdController FilterController MCP23S17 PinDetect RotaryEncoder Sequence SequencerDisplay mbed-rtos mbed st7567LCD AT24C1024 OscController

Committer:
ryood
Date:
Wed Nov 09 05:43:04 2016 +0000
Revision:
0:1afb83a21a25
Child:
1:87f7d2e0a123
Check VCO out

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ryood 0:1afb83a21a25 1 /*
ryood 0:1afb83a21a25 2 * main.cpp
ryood 0:1afb83a21a25 3 * BaseMachine Sequencer
ryood 0:1afb83a21a25 4 *
ryood 0:1afb83a21a25 5 * mbed Rev 121 / mbed-rtos Rev 117
ryood 0:1afb83a21a25 6 *
ryood 0:1afb83a21a25 7 * 2016.11.07 UIを統合
ryood 0:1afb83a21a25 8 *
ryood 0:1afb83a21a25 9 */
ryood 0:1afb83a21a25 10
ryood 0:1afb83a21a25 11 #include "mbed.h"
ryood 0:1afb83a21a25 12 #include "rtos.h"
ryood 0:1afb83a21a25 13
ryood 0:1afb83a21a25 14 #define UART_TRACE (0)
ryood 0:1afb83a21a25 15 #include "BaseMachineCommon.h"
ryood 0:1afb83a21a25 16 #include "BaseMachineUIController.h"
ryood 0:1afb83a21a25 17 #include "SpiSequenceSender.h"
ryood 0:1afb83a21a25 18 #include "EnvelopeGenerator.h"
ryood 0:1afb83a21a25 19 #include "SpiAmpController.h"
ryood 0:1afb83a21a25 20 #include "SpiFilterController.h"
ryood 0:1afb83a21a25 21
ryood 0:1afb83a21a25 22 #define SPI1_RATE (1000000)
ryood 0:1afb83a21a25 23
ryood 0:1afb83a21a25 24 const int samplingPeriod = 1; // ms
ryood 0:1afb83a21a25 25 const int bpm = 120;
ryood 0:1afb83a21a25 26 const int envelopeLength = (60 * 1000 / (bpm * 4)) / samplingPeriod;
ryood 0:1afb83a21a25 27 const int waveShape = SpiSequenceSender::WAVESHAPE_SQUARE;
ryood 0:1afb83a21a25 28
ryood 0:1afb83a21a25 29 // Devices
ryood 0:1afb83a21a25 30 //
ryood 0:1afb83a21a25 31 BaseMachineUIController UIController;
ryood 0:1afb83a21a25 32
ryood 0:1afb83a21a25 33 //SPI1 (PinName mosi, PinName miso, PinName sclk, PinName ssel=NC)
ryood 0:1afb83a21a25 34 SPI SpiMaster(PA_7, PA_6, PA_5);
ryood 0:1afb83a21a25 35
ryood 0:1afb83a21a25 36 Sequence sequences[SEQUENCE_N];
ryood 0:1afb83a21a25 37 SpiSequenceSender SequenceSender(&SpiMaster, D9, sequences, SEQUENCE_N, samplingPeriod, bpm);
ryood 0:1afb83a21a25 38
ryood 0:1afb83a21a25 39 Envelope envelope(4095, envelopeLength, envelopeLength*3/4, envelopeLength/2, 2047);
ryood 0:1afb83a21a25 40 EnvelopeGenerator EnvelopeGenerator;
ryood 0:1afb83a21a25 41 SpiAmpController AmpController(&SpiMaster, D8, D7);
ryood 0:1afb83a21a25 42
ryood 0:1afb83a21a25 43 SpiFilterController FilterController(&SpiMaster, D10);
ryood 0:1afb83a21a25 44
ryood 0:1afb83a21a25 45 // Grobal Variables
ryood 0:1afb83a21a25 46 //
ryood 0:1afb83a21a25 47 int playingStep = 0;
ryood 0:1afb83a21a25 48 int editingStep = 0;
ryood 0:1afb83a21a25 49 bool isRunning = false;
ryood 0:1afb83a21a25 50
ryood 0:1afb83a21a25 51 //------------------------------------------------------------------------
ryood 0:1afb83a21a25 52 // Callback functions
ryood 0:1afb83a21a25 53 //------------------------------------------------------------------------
ryood 0:1afb83a21a25 54 void updateTicks(int ticks)
ryood 0:1afb83a21a25 55 {
ryood 0:1afb83a21a25 56 if (ticks == 0)
ryood 0:1afb83a21a25 57 {
ryood 0:1afb83a21a25 58 EnvelopeGenerator.init(envelope);
ryood 0:1afb83a21a25 59 playingStep = SequenceSender.getStep();
ryood 0:1afb83a21a25 60 UIController.setPlayingStep(playingStep);
ryood 0:1afb83a21a25 61 }
ryood 0:1afb83a21a25 62
ryood 0:1afb83a21a25 63 if (sequences[SequenceSender.getStep()].isNoteOn())
ryood 0:1afb83a21a25 64 {
ryood 0:1afb83a21a25 65 uint16_t level = EnvelopeGenerator.getModLevel();
ryood 0:1afb83a21a25 66 if (!sequences[SequenceSender.getStep()].isAccent())
ryood 0:1afb83a21a25 67 {
ryood 0:1afb83a21a25 68 level = level * 1 / 2;
ryood 0:1afb83a21a25 69 }
ryood 0:1afb83a21a25 70 AmpController.outDca(level);
ryood 0:1afb83a21a25 71 }
ryood 0:1afb83a21a25 72 else
ryood 0:1afb83a21a25 73 {
ryood 0:1afb83a21a25 74 AmpController.outDca(0);
ryood 0:1afb83a21a25 75 }
ryood 0:1afb83a21a25 76 EnvelopeGenerator.update();
ryood 0:1afb83a21a25 77
ryood 0:1afb83a21a25 78 FilterController.outDcf();
ryood 0:1afb83a21a25 79 }
ryood 0:1afb83a21a25 80
ryood 0:1afb83a21a25 81 //------------------------------------------------------------------------
ryood 0:1afb83a21a25 82 // Functions
ryood 0:1afb83a21a25 83 //------------------------------------------------------------------------
ryood 0:1afb83a21a25 84
ryood 0:1afb83a21a25 85
ryood 0:1afb83a21a25 86
ryood 0:1afb83a21a25 87 //------------------------------------------------------------------------
ryood 0:1afb83a21a25 88 // Main routine
ryood 0:1afb83a21a25 89 //------------------------------------------------------------------------
ryood 0:1afb83a21a25 90 int main()
ryood 0:1afb83a21a25 91 {
ryood 0:1afb83a21a25 92 #if (UART_TRACE)
ryood 0:1afb83a21a25 93 printf("*** BaseMachine Sequencer ***\r\n");
ryood 0:1afb83a21a25 94 #endif
ryood 0:1afb83a21a25 95
ryood 0:1afb83a21a25 96 //--------------------------------------------------------------------
ryood 0:1afb83a21a25 97 // Setup Devices
ryood 0:1afb83a21a25 98 //
ryood 0:1afb83a21a25 99 SpiMaster.format(8, 0);
ryood 0:1afb83a21a25 100 SpiMaster.frequency(SPI1_RATE);
ryood 0:1afb83a21a25 101
ryood 0:1afb83a21a25 102 // Mute output
ryood 0:1afb83a21a25 103 AmpController.outDca(0);
ryood 0:1afb83a21a25 104
ryood 0:1afb83a21a25 105 UIController.init();
ryood 0:1afb83a21a25 106
ryood 0:1afb83a21a25 107 //--------------------------------------------------------------------
ryood 0:1afb83a21a25 108 // Initialize objects
ryood 0:1afb83a21a25 109 //
ryood 0:1afb83a21a25 110 Sequence::setBaseNoteNumber(baseNoteNumber);
ryood 0:1afb83a21a25 111
ryood 0:1afb83a21a25 112 for (int i = 0; i < SEQUENCE_N; i++)
ryood 0:1afb83a21a25 113 {
ryood 0:1afb83a21a25 114 Sequence& seq = SequenceSender.getSequences()[i];
ryood 0:1afb83a21a25 115 seq.setPitch(pitch[i]);
ryood 0:1afb83a21a25 116 seq.setNoteOn(noteOn[i]);
ryood 0:1afb83a21a25 117 seq.setTie(tie[i]);
ryood 0:1afb83a21a25 118 seq.setAccent(accent[i]);
ryood 0:1afb83a21a25 119 }
ryood 0:1afb83a21a25 120
ryood 0:1afb83a21a25 121 EnvelopeGenerator.init(envelope);
ryood 0:1afb83a21a25 122
ryood 0:1afb83a21a25 123 SequenceSender.attachUpdate(&updateTicks);
ryood 0:1afb83a21a25 124 SequenceSender.setWaveShape(waveShape);
ryood 0:1afb83a21a25 125
ryood 0:1afb83a21a25 126 //--------------------------------------------------------------------
ryood 0:1afb83a21a25 127 // Main loop
ryood 0:1afb83a21a25 128 //
ryood 0:1afb83a21a25 129 for (;;)
ryood 0:1afb83a21a25 130 {
ryood 0:1afb83a21a25 131 UIController.update();
ryood 0:1afb83a21a25 132
ryood 0:1afb83a21a25 133 UIController.getSequences(&sequences);
ryood 0:1afb83a21a25 134
ryood 0:1afb83a21a25 135 SequenceSender.setBpm(UIController.getBpm());
ryood 0:1afb83a21a25 136
ryood 0:1afb83a21a25 137 // ToDo: Impl. accentLevel
ryood 0:1afb83a21a25 138
ryood 0:1afb83a21a25 139 OscillatorParam osc;
ryood 0:1afb83a21a25 140 UIController.getOscillatorParam(&osc);
ryood 0:1afb83a21a25 141 SequenceSender.setWaveShape(osc.waveShape);
ryood 0:1afb83a21a25 142 SequenceSender.setPulseWidth(osc.waveShape);
ryood 0:1afb83a21a25 143
ryood 0:1afb83a21a25 144 bool _isRunning = UIController.getIsRunning();
ryood 0:1afb83a21a25 145 if (_isRunning != isRunning)
ryood 0:1afb83a21a25 146 {
ryood 0:1afb83a21a25 147 isRunning = _isRunning;
ryood 0:1afb83a21a25 148 if (isRunning)
ryood 0:1afb83a21a25 149 {
ryood 0:1afb83a21a25 150 SequenceSender.run(playingStep);
ryood 0:1afb83a21a25 151 }
ryood 0:1afb83a21a25 152 else
ryood 0:1afb83a21a25 153 {
ryood 0:1afb83a21a25 154 AmpController.outDca(0);
ryood 0:1afb83a21a25 155 SequenceSender.stop();
ryood 0:1afb83a21a25 156 }
ryood 0:1afb83a21a25 157 }
ryood 0:1afb83a21a25 158 }
ryood 0:1afb83a21a25 159 }