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: Operator.cpp
- Revision:
- 7:439c57c20593
- Child:
- 9:12a54d2ea8fc
diff -r 76e79bf6b571 -r 439c57c20593 Operator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Operator.cpp Mon Dec 29 02:34:12 2014 +0000 @@ -0,0 +1,38 @@ +#include "Operator.h" + +static const float pi2 = 6.283185307179586476925286766559f; + +FMOperator::FMOperator(Timer tm, AOTTrigon t) +{ + attack = 0.0f; + delay = 0.0f; + sustain = 0.0f; + sustainRate = 1.0f; + release = 0.0f; + + frequencyMultiple = 1.0f; + totalLevel = 1.0f; + + tri=t; + master = tm; + startTime = 0.0; + releaseTime = 0.0; + baseFrequency = 1.0f; +} + +float FMOperator::calculate(float fmIn) { + if (startTime == 0.0) return 0.0f; + float pos = (pi2 * baseFrequency * frequencyMultiple); + double nt = (master.read_us() / 1000000.0) - startTime; + return tri.sin(fmIn + (float)(pos * nt)); +} + +void FMOperator::attackNote(float freq) { + baseFrequency = freq; + startTime = master.read_us() / 1000000.0; +} + +void FMOperator::releaseNote() { + startTime = 0.0; + releaseTime = master.read_us() / 1000000.0; +} \ No newline at end of file