BaseMachine Sequencer

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

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();
+            }
+        }
+    }
+}