Nucleo F401REでFM音源を実装するやつ 外部DACとオペアンプを利用 現在はMCP4922とNJM2737

Dependencies:   AOTTrigon I2CEEPROM MCP4922 AQM0802A mbed

Fork of NuMidi401 by Yuu Kobayashi

NuFM401

Nucleo F401用の自作ソフトウェアMIDI音源

概要

だいたいそんなもんです。

特徴

  • ブレッドボードの上で組める程度には簡単な回路構成
  • 外部のDACにMCP4922を採用
  • 念のためのボルテージフォロアとしてNJM2737Dを採用
  • バンク用EEPROMに24FC1025を採用
  • シリアル経由でMIDIデータを受信することで操作

補足

シリアル <=> MIDI のドライバにはHairless-MIDISerialをオススメします。 仮想MIDIケーブルはとりあえずMIDI Yokeで。

Revision:
12:7408b85fba39
Parent:
10:0ffdefe75566
--- a/Operator.h	Mon Dec 29 12:48:44 2014 +0000
+++ b/Operator.h	Tue Dec 30 05:53:06 2014 +0000
@@ -8,18 +8,41 @@
 public:
     FMOperator();
     FMOperator(Timer *tm, AOTTrigon *t);
-    float calculate(float fmIn);
-    void attackNote(float freq);
-    void releaseNote();
-
-    float attack;
-    float delay;
-    float sustain;
-    float sustainRate;
-    float release;
-
-    float frequencyMultiple;
-    float totalLevel;
+    float calculate(double time, float fmIn);
+    void attackNote(float freq, double time);
+    void releaseNote(double time);
+    
+    inline void setAttack(char x) {
+        attack = 0.0078125f * x;
+    }
+    inline void setDecay(char x) {
+        decay = 0.0078125f * x;
+    }
+    inline void setSustain(char x) {
+        sustain = 0.0078125f * (x + 1);
+    }
+    inline void setSustainRate(char x) {
+        sustainRate = 0.0078125f * x;
+    }
+    inline void setRelease(char x) {
+        release = 0.0078125f * x;
+    }
+    
+    inline void setFrequencyMultiple(char x) {
+        frequencyMultiple = x;
+    }
+    
+    inline void setFrequencyMultipleFloating(char x) {
+        frequencyMultiple *= 0.0078125f * (x + 1);
+    }
+    
+    inline void setTotalLevel(char x) {
+        totalLevel = 0.0078125f * (x + 1);
+    }
+    
+    inline void setFeedback(char x) {
+        feedback = 0.0078125f * x;
+    } 
 
 private:
     Timer *master;
@@ -27,5 +50,24 @@
     //時間だけdouble確保
     double startTime;
     double releaseTime;
+    bool released;
     double baseFrequency;
+    
+    float attack;
+    float decay;
+    float sustain;
+    float sustainRate;
+    float release;
+    float frequencyMultiple;
+    float totalLevel;
+    float modulation;
+    float feedback;
+    float prev;
+    
+    float getEnvelopeRate(double t);
+    float getEnvelopeReleaseRate(double rlst, float orate);
+    
+    inline float getCeilingFloatRate(char cr) {
+        return 0.0078125f * (cr + 1);
+    }
 };
\ No newline at end of file