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
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 }
Generated on Sun Jul 24 2022 16:24:47 by 1.7.2