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:
16:5cfa8b491882
Parent:
15:b03677948732
Child:
17:2e577c6000cf
--- a/FMOscillator/FMOscillator.cpp	Sat Jan 17 04:00:20 2015 +0000
+++ b/FMOscillator/FMOscillator.cpp	Mon Jan 26 13:26:34 2015 +0000
@@ -6,8 +6,39 @@
     
 }
 
-FMOscillator::FMOscillator(Timer *timer, Serial *serial, AOTTrigon *trigon) {
+FMOscillator::FMOscillator(int opc, Timer *tim, Serial *ser, AOTTrigon *tri, I2C *i2clcd) {
+    master = tim;
+    serial = ser;
+    trigon = tri;
+    opcount = opc;
+    
+    operators = new FMOperator*[opcount];
+    for(int i = 0; i < opcount; i++) {
+        operators[i] = new FMOperator(master, trigon);
+    }
+    lcd = new AQM0802A(*i2clcd);
+    
+    serial->baud(256000);
+    serial->format();
+    serial->attach(this, &FMOscillator::midiReceived);
+    master->start();
     
+    lcd->cls();
+    lcd->printf("NuFM401\nFMDriver");
+}
+
+FMOscillator::~FMOscillator() {
+    for(int i = 0; i < opcount; i++) {
+        delete operators[i];
+    }
+    delete operators;
+    delete lcd;
+}
+
+void FMOscillator::midiReceived()
+{
+    getMIDIMessage();
+    while(serial->readable()) serial->getc();
 }
 
 void FMOscillator::getMIDIMessage()
@@ -98,6 +129,9 @@
 
 void FMOscillator::midiNoteOn(char ch, char note, char vel)
 {
+    lcd->cls();
+    lcd->printf("Note On\n");
+    lcd->printf("%1x: %2x,%2x", ch, note, vel);
     if (vel==0) {
         //globalrelease((ch<<8)|note);
     } else {
@@ -107,6 +141,9 @@
 
 void FMOscillator::midiNoteOff(char ch, char note, char vel)
 {
+    lcd->cls();
+    lcd->printf("Note Off\n");
+    lcd->printf("%1x: %2x,%2x", ch, note, vel);
     //globalrelease((ch<<8)|note);
 }