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

Dependencies:   AOTTrigon I2CEEPROM MCP4922 mbed

Main.cpp

Committer:
kb10uy
Date:
2014-12-29
Revision:
11:62da91a1eaf1
Parent:
10:0ffdefe75566

File content as of revision 11:62da91a1eaf1:

#include "Main.h"

Ticker sampler;
MCP4922 output(PA_7, PA_5, PA_8);

AOTTrigon t;
const int operators = 32;
FMOperator op[operators];

Timer master;
Serial midis(USBTX,USBRX);

const double smpps = 40000.0;
const double smpus = 1000000.0 / smpps;

double ntime = 0.0;
volatile double freq = 0;

float out = 0.0f;

void tick_sampling();
void midiReceived();

int state[operators];

int main()
{
    //DAC setting
    output.referenceMode(MCP4922::DAC_A, MCP4922::REF_UNBUFFERED);
    output.gainMode(MCP4922::DAC_A, MCP4922::GAIN_1X);
    output.powerMode(MCP4922::DAC_A, MCP4922::POWER_NORMAL);
    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);
    midis.attach(&midiReceived);

    master.start();
    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()
{
    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;
    }
}