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/MIDIChannel.h

Committer:
kb10uy
Date:
2015-01-31
Revision:
22:500b4f2953fa
Parent:
21:e3014c1bdf9c
Child:
23:deb76bdf6f03

File content as of revision 22:500b4f2953fa:

#pragma once
#include "mbed.h"
#include "AQM0802A.h"
#include "FMOperator.h"
#include "MIDIUtil.h"
#include "FMAlgorithm.h"

class MIDIChannel
{
public:
    MIDIChannel();
    MIDIChannel(AQM0802A *l);
    ~MIDIChannel();

    inline void setModulationMSB(char msb) {
        modulation = msb;
    }
    inline void setModulationLSB(char lsb) {
        //modulation = lsb | (modulation & 0x3f80);
    }
    inline void setPortamentoTime(char val) {
        portamentoTime = val;
    }
    inline void setPortamentoSwitch(bool val) {
        portamento = val;
    }
    inline void setVolume(char val) {
        volume = val;
    }
    inline void setExpression(char val) {
        expression = val;
    }
    inline void setPanpot(char val) {
        panpot = val;
    }
    inline void startHold1() {
        hold1 = true;
    }
    inline void endHold1() {
        hold1 = false;
    }

    void setDataEntryMSB(char msb);
    void setDataEntryLSB(char lsb);
    void setNRPNMSB(char msb);
    void setNRPNLSB(char lsb);
    void setRPNMSB(char msb);
    void setRPNLSB(char lsb);
    void allSoundOff();
    void allNoteOff();
    void noteOn(char key, char vel, double time);
    void noteOff(char key, double time);

private:
    enum DataState {
        Undefined = 0,
        RPNDoubleData,
        RPNSingleData,
        RPNNoData,
        NRPNDoubleData,
        NRPNSingleData,
        NRPNNoData,
    };
    char prkey;
    char dataEntryMSB;
    char dataEntryLSB;
    char nrpnMSB;
    char nrpnLSB;
    char rpnMSB;
    char rpnLSB;
    DataState state;
    char modulation;
    char portamentoTime;
    bool portamento;
    char volume;
    char panpot;
    char expression;
    bool hold1;
    FMAlgorithm *algo;
    AQM0802A *lcd;
    
    FunctionPointer nrpnStateSetter;
    FunctionPointer nrpnStateProcessor;
    
    void processRPNFunction();
    void setNRPNFunctions();
    void nrpnUndefined();
    void setStateNRPNUndefined();
    void nrpnAlgorithm();
    void setStateNRPNAlgorithm();
    void nrpnOperator();
    void setStateNRPNOperator();
};