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

Dependencies:   AOTTrigon I2CEEPROM MCP4922 mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Main.cpp Source File

Main.cpp

00001 #include "Main.h"
00002 
00003 Ticker sampler;
00004 MCP4922 output(PA_7, PA_5, PA_8);
00005 
00006 AOTTrigon t;
00007 const int operators = 32;
00008 FMOperator op[operators];
00009 
00010 Timer master;
00011 Serial midis(USBTX,USBRX);
00012 
00013 const double smpps = 40000.0;
00014 const double smpus = 1000000.0 / smpps;
00015 
00016 double ntime = 0.0;
00017 volatile double freq = 0;
00018 
00019 float out = 0.0f;
00020 
00021 void tick_sampling();
00022 void midiReceived();
00023 
00024 int state[operators];
00025 
00026 int main()
00027 {
00028     //DAC setting
00029     output.referenceMode(MCP4922::DAC_A, MCP4922::REF_UNBUFFERED);
00030     output.gainMode(MCP4922::DAC_A, MCP4922::GAIN_1X);
00031     output.powerMode(MCP4922::DAC_A, MCP4922::POWER_NORMAL);
00032     output.referenceMode(MCP4922::DAC_B, MCP4922::REF_UNBUFFERED);
00033     output.gainMode(MCP4922::DAC_B, MCP4922::GAIN_1X);
00034     output.powerMode(MCP4922::DAC_B, MCP4922::POWER_NORMAL);
00035 
00036     //MIDI Serial setting
00037     midis.baud(256000);
00038     midis.format();
00039 
00040     //for(int i = 0; i < operators; i++) new(op + i) FMOperator(&master, &t);
00041     midis.attach(&midiReceived);
00042 
00043     master.start();
00044     while(true) {
00045         ntime = master.read_us()/1000000.0;
00046         float out = 0;
00047         int oc=0;
00048         for(int i=0;i<operators;i++) {
00049             if (state[i]!=0) {
00050                 oc++;
00051                 out += t.sin(M_PI * 2.0 * ntime * getNoteNumberFrequency(state[i]&0x7f));
00052             }
00053         }
00054         output.write(MCP4922::DAC_A,out/oc+0.5);
00055     }
00056 }
00057 
00058 void midiReceived()
00059 {
00060     getMIDIMessage();
00061     while(midis.readable()) midis.getc();
00062 }
00063 
00064 void setDebugFrequency(double f)
00065 {
00066     freq = f;
00067 }
00068 
00069 void globalattack(unsigned short st,char vel) {
00070     int to=0;
00071     for(int i = 0; i < operators; i++) {
00072         if (state[i]==0) to=i;
00073     }
00074     state[to] = st | vel << 16;
00075 }
00076 
00077 void globalrelease(unsigned short st) {
00078     for(int i = 0; i < operators; i++) {
00079         if ((state[i]&0xffff)==st) state[i]=0;
00080     }
00081 }