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:
11:62da91a1eaf1
Parent:
10:0ffdefe75566
Child:
13:e11380ceb460
diff -r 0ffdefe75566 -r 62da91a1eaf1 Main.cpp
--- a/Main.cpp	Mon Dec 29 09:01:10 2014 +0000
+++ b/Main.cpp	Mon Dec 29 12:48:44 2014 +0000
@@ -14,13 +14,15 @@
 const double smpus = 1000000.0 / smpps;
 
 double ntime = 0.0;
-double freq = 2.5f;
+volatile double freq = 0;
 
 float out = 0.0f;
 
 void tick_sampling();
 void midiReceived();
 
+int state[operators];
+
 int main()
 {
     //DAC setting
@@ -30,26 +32,50 @@
     output.referenceMode(MCP4922::DAC_B, MCP4922::REF_UNBUFFERED);
     output.gainMode(MCP4922::DAC_B, MCP4922::GAIN_1X);
     output.powerMode(MCP4922::DAC_B, MCP4922::POWER_NORMAL);
-    
+
     //MIDI Serial setting
     midis.baud(256000);
     midis.format();
-    
+
     //for(int i = 0; i < operators; i++) new(op + i) FMOperator(&master, &t);
-    sampler.attach_us(&tick_sampling, smpus);
     midis.attach(&midiReceived);
-    
+
     master.start();
-    while(true);
-}
-
-void tick_sampling()
-{
-    ntime = master.read_us()/1000000.0;
-    output.write(MCP4922::DAC_A, out);
+    while(true) {
+        ntime = master.read_us()/1000000.0;
+        float out = 0;
+        int oc=0;
+        for(int i=0;i<operators;i++) {
+            if (state[i]!=0) {
+                oc++;
+                out += t.sin(M_PI * 2.0 * ntime * getNoteNumberFrequency(state[i]&0x7f));
+            }
+        }
+        output.write(MCP4922::DAC_A,out/oc+0.5);
+    }
 }
 
 void midiReceived()
 {
-    out = 1.0f - out;
+    getMIDIMessage();
+    while(midis.readable()) midis.getc();
+}
+
+void setDebugFrequency(double f)
+{
+    freq = f;
+}
+
+void globalattack(unsigned short st,char vel) {
+    int to=0;
+    for(int i = 0; i < operators; i++) {
+        if (state[i]==0) to=i;
+    }
+    state[to] = st | vel << 16;
+}
+
+void globalrelease(unsigned short st) {
+    for(int i = 0; i < operators; i++) {
+        if ((state[i]&0xffff)==st) state[i]=0;
+    }
 }
\ No newline at end of file