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 Ryo Od

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 /*
00002  * main.cpp
00003  * BaseMachine Sequencer
00004  *
00005  * mbed Rev 135 / mbed-rtos Rev 123
00006  *
00007  * 2017.02.14 mbed Rev 135 / mbed-rtos Rev 123に変更
00008  * 2016.11.07 UIを統合
00009  *
00010  */
00011 
00012 #include "mbed.h"
00013 #include "rtos.h"
00014 
00015 #define UART_TRACE  (0)
00016 #include "BaseMachineCommon.h"
00017 #include "BaseMachineUIController.h"
00018 #include "SequenceSender.h"
00019 #include "EnvelopeGenerator.h"
00020 #include "SpiOscController.h"
00021 #include "SpiAmpController.h"
00022 #include "SpiFilterController.h"
00023 #include "SpiVcvsLpfController.h"
00024 #include "SpiSvfController.h"
00025 
00026 #define SPI1_RATE   (1000000)
00027 #define I2C1_RATE   (100000)
00028 
00029 const int samplingPeriod = 1;   // ms
00030 const int bpm = 120;
00031 const int envelopeLength = (60 * 1000 / (bpm * 4)) / samplingPeriod;
00032 
00033 // Devices
00034 //
00035 BaseMachineUIController UIController;
00036 
00037 //SPI1 (PinName mosi, PinName miso, PinName sclk, PinName ssel=NC)
00038 SPI SpiMaster(PA_7, PA_6, PA_5);
00039 DigitalOut SpiMasterReset(PB_10, 0);
00040 
00041 Sequence sequences[SEQUENCE_N];
00042 SequenceSender SequenceSender(sequences, SEQUENCE_N, samplingPeriod, bpm);
00043 
00044 Envelope envelope(4095, envelopeLength, envelopeLength*3/4, envelopeLength/2, 2047);
00045 EnvelopeGenerator EnvelopeGenerator;
00046 
00047 SpiOscController OscController(&SpiMaster, D9);
00048 SpiAmpController AmpController(&SpiMaster, D8, D7);
00049 
00050 #if USE_VCVS
00051     SpiVcvsLpfController FilterController(&SpiMaster, D10);
00052 #elif USE_SVF
00053     SpiSvfController FilterController(&SpiMaster, D10);
00054 #endif
00055 
00056 InterruptIn SyncIn(PC_4);
00057 //DigitalOut led(D13);
00058 
00059 // Grobal Variables
00060 //
00061 int playingStep = 0;
00062 int editingStep = 0;
00063 bool isRunning = false;
00064 
00065 //------------------------------------------------------------------------
00066 // Callback functions
00067 //------------------------------------------------------------------------
00068 void updateTicks(int ticks)
00069 {
00070     uint16_t level = EnvelopeGenerator.update(sequences[SequenceSender.getStep()].isTie());
00071     
00072     // Amp
00073     uint16_t ampLevel = level;
00074     if (sequences[SequenceSender.getStep()].isNoteOn())
00075     {
00076         ampLevel = ampLevel >> 1;
00077         if (sequences[SequenceSender.getStep()].isAccent())
00078         {
00079             ampLevel = ampLevel * (1.0f + ((float)UIController.getAccentLevel()) / 128.0f);
00080         }
00081     }
00082     else
00083     {
00084         ampLevel = 0;
00085     }
00086     AmpController.outDca(ampLevel);
00087     
00088     // Oscillator
00089     OscController.setFrequency10(SequenceSender.getFrequency10());
00090     OscController.outDco();
00091     
00092     // Filter Env Mod
00093     uint16_t cutoff16 = FilterController.getCutoff();
00094     uint8_t resonance = FilterController.getResonance();
00095     uint8_t mod = FilterController.getModLevel();
00096     float modCoeff = (float)mod / (float)(cutoff16 << 1);
00097     cutoff16 = cutoff16 * (1.0f + ((float)level / 0x8000) * modCoeff);
00098     if (cutoff16 > 255) {
00099         cutoff16 = 255;
00100     }
00101     FilterController.outDcf(cutoff16, resonance);
00102     
00103     if (ticks == 0)
00104     {
00105         EnvelopeGenerator.init(envelope);
00106         playingStep = SequenceSender.getStep();
00107         UIController.setPlayingStep(playingStep);
00108     }
00109 }
00110 
00111 //------------------------------------------------------------------------
00112 // Functions
00113 //------------------------------------------------------------------------
00114 void setParams()
00115 {
00116     UIController.getSequences(&sequences);
00117 
00118     SequenceSender.setBpm(UIController.getBpm());
00119 
00120     OscillatorParam osc;
00121     UIController.getOscillatorParam(&osc);
00122     OscController.setWaveShape(osc.waveShape);
00123     OscController.setPulseWidth(osc.pulseWidth << 1);
00124 
00125     FilterParam flt;
00126     UIController.getFilterParam(&flt);
00127     FilterController.setCutoff(flt.cutoff << 1);
00128     FilterController.setResonance(flt.resonance << 1);
00129 
00130     EnvelopeParam env;
00131     UIController.getEnvelopeParam(&env);
00132     //envelope.setLevel(env.level << 5);
00133     FilterController.setModLevel(env.level << 1);
00134     //ToDo: Impl. envelope length
00135     envelope.setLength(envelopeLength);
00136     envelope.setDuration((float)env.duration / 128.0f * envelopeLength);
00137     envelope.setDecay((float)env.decay / 128.0f * envelopeLength);
00138     envelope.setSustain(env.sustain << 5);
00139 
00140     bool _isRunning = UIController.getIsRunning();
00141     if (_isRunning != isRunning)
00142     {
00143         isRunning = _isRunning;
00144         if (isRunning)
00145         {
00146             playingStep = 0;
00147             SequenceSender.run(playingStep);
00148         }
00149         else
00150         {
00151             AmpController.outDca(0);
00152             SequenceSender.stop();
00153         }
00154     }
00155 }
00156 
00157 void syncFunction()
00158 {
00159     //led = !led;
00160     SequenceSender.sync();
00161 }
00162 
00163 //------------------------------------------------------------------------
00164 // Main routine
00165 //------------------------------------------------------------------------
00166 int main()
00167 {
00168     #if (UART_TRACE)
00169     printf("*** BaseMachine Sequencer ***\r\n");
00170     #endif
00171 
00172     //--------------------------------------------------------------------
00173     // Initialize objects
00174     //
00175     Sequence::setBaseNoteNumber(baseNoteNumber);
00176     
00177     //--------------------------------------------------------------------
00178     // Setup Devices
00179     //
00180     SpiMasterReset = 1;
00181     SpiMaster.format(8, 0);
00182     SpiMaster.frequency(SPI1_RATE);
00183     
00184     // Mute output
00185     AmpController.outDca(0);
00186     
00187     UIController.init();
00188     setParams();
00189     
00190     EnvelopeGenerator.init(envelope);
00191     
00192     // Sync Interrupt
00193     SyncIn.rise(&syncFunction);
00194 
00195     SequenceSender.attachUpdate(&updateTicks);
00196 
00197     //--------------------------------------------------------------------
00198     // Main loop
00199     //
00200     for (;;)
00201     {
00202         UIController.update();
00203         setParams();
00204         
00205         Thread::wait(10);
00206     }
00207 }