Nucleo F401REでFM音源を実装するやつ の実装途中で32ポリ音源にしたやつ 外部DACとオペアンプを利用 現在はMCP4922とNJM2737
Dependencies: AOTTrigon I2CEEPROM MCP4922 mbed
Main.cpp@11:62da91a1eaf1, 2014-12-29 (annotated)
- Committer:
- kb10uy
- Date:
- Mon Dec 29 12:48:44 2014 +0000
- Revision:
- 11:62da91a1eaf1
- Parent:
- 10:0ffdefe75566
32poly??????????
Who changed what in which revision?
User | Revision | Line number | New 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 | } |