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:
18:b20fdf1da8f8
Parent:
17:2e577c6000cf
Child:
19:f0dcf591c5dd
diff -r 2e577c6000cf -r b20fdf1da8f8 FMOscillator/FMOscillator.cpp
--- a/FMOscillator/FMOscillator.cpp	Tue Jan 27 12:56:33 2015 +0000
+++ b/FMOscillator/FMOscillator.cpp	Tue Jan 27 13:25:14 2015 +0000
@@ -32,7 +32,27 @@
     master->start();
 
     lcd->cls();
+    lcd->printf("Welcome\n   to   ");
+    wait_ms(1000);
+
+    lcd->cls();
     lcd->printf("NuFM401\nFMDriver");
+    wait_ms(1000);
+
+    lcd->cls();
+    lcd->printf("FMOpe\n%dbytes",sizeof(FMOperator)*opcount);
+    wait_ms(1000);
+
+    lcd->cls();
+    lcd->printf("FMOsc\n%dbytes",sizeof(FMOscillator));
+    wait_ms(1000);
+
+    lcd->cls();
+    lcd->printf("MIDICh\n%dbytes",sizeof(MIDIChannel)*16);
+    wait_ms(1000);
+
+    lcd->cls();
+    lcd->printf("NuFM401\nSTAND BY");
 }
 
 FMOscillator::~FMOscillator()
@@ -172,6 +192,9 @@
 
             //modulation
         case 0x01:
+            lcd->cls();
+            lcd->printf("CC:MODUL\nCh%1x:  %2x", ch, data);
+
             channels[ch]->setModulationMSB(data);
             break;
         case 0x21:
@@ -180,52 +203,69 @@
 
             //portamento time
         case 0x05:
+            lcd->cls();
+            lcd->printf("CC:PORTM\nCh%1x:  %2x", ch, data);
+
             channels[ch]->setPortamentoTime(data);
             break;
         case 0x25:
             break;
-            
+
             //Volume
         case 0x07:
+            lcd->cls();
+            lcd->printf("CC:VOL\nCh%1x:  %2x", ch, data);
+        
             channels[ch]->setVolume(data);
             break;
         case 0x37:
             break;
-            
+
             //balance
         case 0x08:
             break;
         case 0x28:
             break;
-            
+
             //panpot
         case 0x0a:
+            lcd->cls();
+            lcd->printf("CC:PANPT\nCh%1x:  %2x", ch, data);
             channels[ch]->setPanpot(data);
             break;
         case 0x2a:
             break;
-            
+
             //expression
         case 0x0b:
+            lcd->cls();
+            lcd->printf("CC:EXPRS\nCh%1x:  %2x", ch, data);
+            
             channels[ch]->setExpression(data);
             break;
         case 0x2b:
             break;
-            
+
             //hold1
         case 0x40:
+            lcd->cls();
+            lcd->printf("CC:HOLD1\nCh%1x:  %2x", ch, data);
+            
             if (data > 0x40) {
                 channels[ch]->startHold1();
             } else {
-                channels[ch]->endHold1();    
+                channels[ch]->endHold1();
             }
             break;
-            
+
             //portamento
         case 0x41:
+            lcd->cls();
+            lcd->printf("CC:PORTS\nCh%1x:  %2x", ch, data);
+            
             channels[ch]->setPortamentoSwitch(data > 0x40);
             break;
-            
+
             //data entry
         case 0x06:
             channels[ch]->setDataEntryMSB(data);
@@ -233,7 +273,7 @@
         case 0x26:
             channels[ch]->setDataEntryLSB(data);
             break;
-            
+
             //nrpn
         case 0x63:
             channels[ch]->setNRPNMSB(data);
@@ -241,7 +281,7 @@
         case 0x62:
             channels[ch]->setNRPNLSB(data);
             break;
-            
+
             //rpn
         case 0x65:
             channels[ch]->setRPNMSB(data);
@@ -258,7 +298,7 @@
         case 0x78:
             channels[ch]->allSoundOff();
             break;
-            
+
         case 0x7b:
         case 0x7c:
         case 0x7d: