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: Main.cpp
- Revision:
- 11:62da91a1eaf1
- Parent:
- 10:0ffdefe75566
- Child:
- 13:e11380ceb460
--- a/Main.cpp Mon Dec 29 09:01:10 2014 +0000 +++ b/Main.cpp Mon Dec 29 12:48:44 2014 +0000 @@ -14,13 +14,15 @@ const double smpus = 1000000.0 / smpps; double ntime = 0.0; -double freq = 2.5f; +volatile double freq = 0; float out = 0.0f; void tick_sampling(); void midiReceived(); +int state[operators]; + int main() { //DAC setting @@ -30,26 +32,50 @@ output.referenceMode(MCP4922::DAC_B, MCP4922::REF_UNBUFFERED); output.gainMode(MCP4922::DAC_B, MCP4922::GAIN_1X); output.powerMode(MCP4922::DAC_B, MCP4922::POWER_NORMAL); - + //MIDI Serial setting midis.baud(256000); midis.format(); - + //for(int i = 0; i < operators; i++) new(op + i) FMOperator(&master, &t); - sampler.attach_us(&tick_sampling, smpus); midis.attach(&midiReceived); - + master.start(); - while(true); -} - -void tick_sampling() -{ - ntime = master.read_us()/1000000.0; - output.write(MCP4922::DAC_A, out); + while(true) { + ntime = master.read_us()/1000000.0; + float out = 0; + int oc=0; + for(int i=0;i<operators;i++) { + if (state[i]!=0) { + oc++; + out += t.sin(M_PI * 2.0 * ntime * getNoteNumberFrequency(state[i]&0x7f)); + } + } + output.write(MCP4922::DAC_A,out/oc+0.5); + } } void midiReceived() { - out = 1.0f - out; + getMIDIMessage(); + while(midis.readable()) midis.getc(); +} + +void setDebugFrequency(double f) +{ + freq = f; +} + +void globalattack(unsigned short st,char vel) { + int to=0; + for(int i = 0; i < operators; i++) { + if (state[i]==0) to=i; + } + state[to] = st | vel << 16; +} + +void globalrelease(unsigned short st) { + for(int i = 0; i < operators; i++) { + if ((state[i]&0xffff)==st) state[i]=0; + } } \ No newline at end of file