Nucleo F401REでFM音源を実装するやつ 外部DACとオペアンプを利用 現在はMCP4922とNJM2737
Dependencies: AOTTrigon I2CEEPROM MCP4922 AQM0802A mbed
Fork of NuMidi401 by
NuFM401
Nucleo F401用の自作ソフトウェアMIDI音源
概要
だいたいそんなもんです。
特徴
- ブレッドボードの上で組める程度には簡単な回路構成
- 外部のDACにMCP4922を採用
- 念のためのボルテージフォロアとしてNJM2737Dを採用
- バンク用EEPROMに24FC1025を採用
- シリアル経由でMIDIデータを受信することで操作
補足
シリアル <=> MIDI のドライバにはHairless-MIDISerialをオススメします。 仮想MIDIケーブルはとりあえずMIDI Yokeで。
Diff: FMOscillator/FMOscillator.cpp
- 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: