Nucleo F401REでFM音源を実装するやつ 外部DACとオペアンプを利用 現在はMCP4922とNJM2737

Dependencies:   AOTTrigon I2CEEPROM MCP4922 AQM0802A mbed

Fork of NuMidi401 by Yuu Kobayashi

NuFM401

Nucleo F401用の自作ソフトウェアMIDI音源

概要

だいたいそんなもんです。

特徴

  • ブレッドボードの上で組める程度には簡単な回路構成
  • 外部のDACにMCP4922を採用
  • 念のためのボルテージフォロアとしてNJM2737Dを採用
  • バンク用EEPROMに24FC1025を採用
  • シリアル経由でMIDIデータを受信することで操作

補足

シリアル <=> MIDI のドライバにはHairless-MIDISerialをオススメします。 仮想MIDIケーブルはとりあえずMIDI Yokeで。

FMOscillator/FMAlgorithm.cpp

Committer:
kb10uy
Date:
2015-01-31
Revision:
23:deb76bdf6f03
Parent:
21:e3014c1bdf9c

File content as of revision 23:deb76bdf6f03:

#include "FMAlgorithm.h"

FMAlgorithm::FMAlgorithm()
{
    opcount = 0;
    cncount = 0;
    cni = 0;
    operators = NULL;
    connections = NULL;
}

FMAlgorithm::FMAlgorithm(int opc, int cnc, Timer *tm, AOTTrigon *tri)
{
    opcount = opc;
    cncount = cnc;
    operators = new FMOperator*[opcount];
    for(int i = 0; i < opcount; i++) operators[i] = new FMOperator(tm, tri);
    connections = new FMAlgorithmConnection[cncount];
}

FMAlgorithm::~FMAlgorithm()
{
    if (operators != NULL) {
        for(int i = 0; i < opcount; i++) delete operators[i];
        delete[] operators;
    }
    if (connections != NULL) delete[] connections;
}

void FMAlgorithm::setConnection(int t, int s)
{
    if (cni >= cncount) return;
    connections[cni].target = t;
    connections[cni].source = s;
    connections[cni].allocated = true;
    cni++;
}

void FMAlgorithm::setConnectionIndex(int id) { 
    if (id >= cncount) return;
    cni = id;
}

void FMAlgorithm::enableCurrentConnection() {
    if (cni >= cncount) return;
    connections[cni].allocated = true;
}

void FMAlgorithm::disableCurrentConnection() {
    if (cni >= cncount) return;
    connections[cni].allocated = false;
}

void FMAlgorithm::noteOn(float freq, double time) {
    for(int i = 0; i < opcount; i++) {
        if (operators[i] != NULL) operators[i]->attackNote(freq, time);
    }
}

void FMAlgorithm::noteOff(double time) {
    for(int i = 0; i < opcount; i++) {
        if (operators[i] != NULL) operators[i]->releaseNote(time);
    }
}

float FMAlgorithm::calculate() {
    return calculate(0);
}

float FMAlgorithm::calculate(int opn) {
    float sum = 0;
    for(int i = 0; i < cncount; i++) {
        if (connections[i].allocated && connections[i].target == opn) {
            sum += calculate(connections[i].source);
        }
    }
    return operators[opn]->calculate(sum);
}