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:
21:e3014c1bdf9c
Parent:
20:8278e607a687
Child:
22:500b4f2953fa
--- a/FMOscillator/MIDIChannel.cpp	Thu Jan 29 11:09:56 2015 +0000
+++ b/FMOscillator/MIDIChannel.cpp	Thu Jan 29 12:27:21 2015 +0000
@@ -2,6 +2,11 @@
 
 MIDIChannel::MIDIChannel()
 {
+
+}
+
+MIDIChannel::MIDIChannel(AQM0802A *l)
+{
     modulation = 0;
     portamentoTime = 0;
     portamento = false;
@@ -17,6 +22,7 @@
     rpnLSB = 0;
     algo = NULL;
     state = Undefined;
+    lcd = l;
 }
 
 MIDIChannel::~MIDIChannel()
@@ -24,10 +30,19 @@
     if (algo != NULL) delete algo;
 }
 
+void MIDIChannel::noteOn(char key, char vel, double time) {
+    prkey = key;
+    algo->noteOn(getNoteNumberFrequency(prkey), time);
+}
+
+void MIDIChannel::noteOff(char key, double time) {
+    if (prkey != key) return;
+    algo->noteOff(time);
+}
+
 void MIDIChannel::setDataEntryMSB(char msb)
 {
     dataEntryMSB = msb;
-    
 }
 
 void MIDIChannel::setDataEntryLSB(char lsb)
@@ -54,10 +69,10 @@
 void MIDIChannel::setRPNMSB(char msb)
 {
     rpnMSB = msb;
-    if (msb == 0x7f){
+    if (msb == 0x7f) {
         state = RPNNoData;
     } else {
-        state = RPNSingleData;    
+        state = RPNSingleData;
     }
 }
 
@@ -75,14 +90,16 @@
 {
 }
 
-void MIDIChannel::processNRPNFunction() {
+void MIDIChannel::processNRPNFunction()
+{
     switch(nrpnMSB) {
-        
+
     }
     state = Undefined;
 }
 
-void MIDIChannel::processRPNFunction() {
+void MIDIChannel::processRPNFunction()
+{
     switch(rpnMSB) {
         case 0x00:
             //LSB 0~2全部実装できないですから
@@ -94,6 +111,8 @@
                 nrpnMSB = 0;
                 nrpnLSB = 0;
             }
+            lcd->cls();
+            lcd->printf("RPN/NRPN\nNULL");
             break;
     }
     state = Undefined;