Nucleo F401REでFM音源を実装するやつ の実装途中で32ポリ音源にしたやつ 外部DACとオペアンプを利用 現在はMCP4922とNJM2737
Dependencies: AOTTrigon I2CEEPROM MCP4922 mbed
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 }
Generated on Sat Jul 16 2022 07:34:51 by 1.7.2