Nucleo F401REでFM音源を実装するやつ の実装途中で32ポリ音源にしたやつ 外部DACとオペアンプを利用 現在はMCP4922とNJM2737

Dependencies:   AOTTrigon I2CEEPROM MCP4922 mbed

Committer:
kb10uy
Date:
Mon Dec 29 12:48:44 2014 +0000
Revision:
11:62da91a1eaf1
Parent:
10:0ffdefe75566
32poly??????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kb10uy 1:cde592d8076e 1 #include "Main.h"
kb10uy 1:cde592d8076e 2
kb10uy 3:e98f2da2d3c5 3 Ticker sampler;
kb10uy 10:0ffdefe75566 4 MCP4922 output(PA_7, PA_5, PA_8);
kb10uy 10:0ffdefe75566 5
kb10uy 10:0ffdefe75566 6 AOTTrigon t;
kb10uy 10:0ffdefe75566 7 const int operators = 32;
kb10uy 10:0ffdefe75566 8 FMOperator op[operators];
kb10uy 10:0ffdefe75566 9
kb10uy 4:e300f6fd7f96 10 Timer master;
kb10uy 10:0ffdefe75566 11 Serial midis(USBTX,USBRX);
kb10uy 3:e98f2da2d3c5 12
kb10uy 3:e98f2da2d3c5 13 const double smpps = 40000.0;
kb10uy 3:e98f2da2d3c5 14 const double smpus = 1000000.0 / smpps;
kb10uy 3:e98f2da2d3c5 15
kb10uy 3:e98f2da2d3c5 16 double ntime = 0.0;
kb10uy 11:62da91a1eaf1 17 volatile double freq = 0;
kb10uy 2:658699249a81 18
kb10uy 10:0ffdefe75566 19 float out = 0.0f;
kb10uy 3:e98f2da2d3c5 20
kb10uy 10:0ffdefe75566 21 void tick_sampling();
kb10uy 10:0ffdefe75566 22 void midiReceived();
kb10uy 10:0ffdefe75566 23
kb10uy 11:62da91a1eaf1 24 int state[operators];
kb10uy 11:62da91a1eaf1 25
kb10uy 10:0ffdefe75566 26 int main()
kb10uy 10:0ffdefe75566 27 {
kb10uy 10:0ffdefe75566 28 //DAC setting
kb10uy 5:6f060709aa23 29 output.referenceMode(MCP4922::DAC_A, MCP4922::REF_UNBUFFERED);
kb10uy 5:6f060709aa23 30 output.gainMode(MCP4922::DAC_A, MCP4922::GAIN_1X);
kb10uy 5:6f060709aa23 31 output.powerMode(MCP4922::DAC_A, MCP4922::POWER_NORMAL);
kb10uy 5:6f060709aa23 32 output.referenceMode(MCP4922::DAC_B, MCP4922::REF_UNBUFFERED);
kb10uy 5:6f060709aa23 33 output.gainMode(MCP4922::DAC_B, MCP4922::GAIN_1X);
kb10uy 5:6f060709aa23 34 output.powerMode(MCP4922::DAC_B, MCP4922::POWER_NORMAL);
kb10uy 11:62da91a1eaf1 35
kb10uy 10:0ffdefe75566 36 //MIDI Serial setting
kb10uy 10:0ffdefe75566 37 midis.baud(256000);
kb10uy 10:0ffdefe75566 38 midis.format();
kb10uy 11:62da91a1eaf1 39
kb10uy 10:0ffdefe75566 40 //for(int i = 0; i < operators; i++) new(op + i) FMOperator(&master, &t);
kb10uy 10:0ffdefe75566 41 midis.attach(&midiReceived);
kb10uy 11:62da91a1eaf1 42
kb10uy 4:e300f6fd7f96 43 master.start();
kb10uy 11:62da91a1eaf1 44 while(true) {
kb10uy 11:62da91a1eaf1 45 ntime = master.read_us()/1000000.0;
kb10uy 11:62da91a1eaf1 46 float out = 0;
kb10uy 11:62da91a1eaf1 47 int oc=0;
kb10uy 11:62da91a1eaf1 48 for(int i=0;i<operators;i++) {
kb10uy 11:62da91a1eaf1 49 if (state[i]!=0) {
kb10uy 11:62da91a1eaf1 50 oc++;
kb10uy 11:62da91a1eaf1 51 out += t.sin(M_PI * 2.0 * ntime * getNoteNumberFrequency(state[i]&0x7f));
kb10uy 11:62da91a1eaf1 52 }
kb10uy 11:62da91a1eaf1 53 }
kb10uy 11:62da91a1eaf1 54 output.write(MCP4922::DAC_A,out/oc+0.5);
kb10uy 11:62da91a1eaf1 55 }
kb10uy 10:0ffdefe75566 56 }
kb10uy 10:0ffdefe75566 57
kb10uy 10:0ffdefe75566 58 void midiReceived()
kb10uy 10:0ffdefe75566 59 {
kb10uy 11:62da91a1eaf1 60 getMIDIMessage();
kb10uy 11:62da91a1eaf1 61 while(midis.readable()) midis.getc();
kb10uy 11:62da91a1eaf1 62 }
kb10uy 11:62da91a1eaf1 63
kb10uy 11:62da91a1eaf1 64 void setDebugFrequency(double f)
kb10uy 11:62da91a1eaf1 65 {
kb10uy 11:62da91a1eaf1 66 freq = f;
kb10uy 11:62da91a1eaf1 67 }
kb10uy 11:62da91a1eaf1 68
kb10uy 11:62da91a1eaf1 69 void globalattack(unsigned short st,char vel) {
kb10uy 11:62da91a1eaf1 70 int to=0;
kb10uy 11:62da91a1eaf1 71 for(int i = 0; i < operators; i++) {
kb10uy 11:62da91a1eaf1 72 if (state[i]==0) to=i;
kb10uy 11:62da91a1eaf1 73 }
kb10uy 11:62da91a1eaf1 74 state[to] = st | vel << 16;
kb10uy 11:62da91a1eaf1 75 }
kb10uy 11:62da91a1eaf1 76
kb10uy 11:62da91a1eaf1 77 void globalrelease(unsigned short st) {
kb10uy 11:62da91a1eaf1 78 for(int i = 0; i < operators; i++) {
kb10uy 11:62da91a1eaf1 79 if ((state[i]&0xffff)==st) state[i]=0;
kb10uy 11:62da91a1eaf1 80 }
kb10uy 1:cde592d8076e 81 }