BaseMachine Sequencer

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

Branch:
FilterEnvelope
Revision:
29:5ca5aef9e7ca
Parent:
27:173ad2312d03
--- a/main.cpp	Mon May 22 14:26:31 2017 +0000
+++ b/main.cpp	Mon May 22 23:00:08 2017 +0000
@@ -49,7 +49,7 @@
 
 #if USE_VCVS
     SpiVcvsLpfController FilterController(&SpiMaster, D10);
-#else if USE_SVF
+#elif USE_SVF
     SpiSvfController FilterController(&SpiMaster, D10);
 #endif
 
@@ -67,26 +67,38 @@
 //------------------------------------------------------------------------
 void updateTicks(int ticks)
 {
+    uint16_t level = EnvelopeGenerator.update(sequences[SequenceSender.getStep()].isTie());
+    
+    // Amp
+    uint16_t ampLevel = level;
     if (sequences[SequenceSender.getStep()].isNoteOn())
     {
-        uint16_t level = EnvelopeGenerator.update(sequences[SequenceSender.getStep()].isTie());
-        level = level >> 1;
+        ampLevel = ampLevel >> 1;
         if (sequences[SequenceSender.getStep()].isAccent())
         {
-            // Todo: 小数点演算を整数に
-            level *= 1.0f + ((float)UIController.getAccentLevel()) / 128.0f;
+            ampLevel = ampLevel * (1.0f + ((float)UIController.getAccentLevel()) / 128.0f);
         }
-        AmpController.outDca(level);
     }
     else
     {
-        AmpController.outDca(0);
+        ampLevel = 0;
     }
+    AmpController.outDca(ampLevel);
     
+    // Oscillator
     OscController.setFrequency10(SequenceSender.getFrequency10());
     OscController.outDco();
     
-    FilterController.outDcf();
+    // Filter Env Mod
+    uint16_t cutoff16 = FilterController.getCutoff();
+    uint8_t resonance = FilterController.getResonance();
+    uint8_t mod = FilterController.getModLevel();
+    float modCoeff = (float)mod / (float)(cutoff16 << 1);
+    cutoff16 = cutoff16 * (1.0f + ((float)level / 0x8000) * modCoeff);
+    if (cutoff16 > 255) {
+        cutoff16 = 255;
+    }
+    FilterController.outDcf(cutoff16, resonance);
     
     if (ticks == 0)
     {
@@ -117,7 +129,8 @@
 
     EnvelopeParam env;
     UIController.getEnvelopeParam(&env);
-    envelope.setLevel(env.level << 5);
+    //envelope.setLevel(env.level << 5);
+    FilterController.setModLevel(env.level << 1);
     //ToDo: Impl. envelope length
     envelope.setLength(envelopeLength);
     envelope.setDuration((float)env.duration / 128.0f * envelopeLength);