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

Dependencies:   AOTTrigon I2CEEPROM MCP4922 mbed

MIDI.cpp

Committer:
kb10uy
Date:
2014-12-29
Revision:
11:62da91a1eaf1

File content as of revision 11:62da91a1eaf1:

#include "MIDI.h"

char sysexData[128];

void getMIDIMessage()
{
    unsigned char st = midis.getc();
    switch(st >> 4) {
        case 0x8:
            midiNoteOff(st & 0xf, midis.getc(), midis.getc());
            break;
        case 0x9:
            midiNoteOn(st & 0xf, midis.getc(), midis.getc());
            break;
        case 0xa:
            midiPolyphonicKeyPressure(st & 0xf, midis.getc(), midis.getc());
            break;
        case 0xb:
            char b2 = midis.getc();
            if (b2 >= 120) {
                midiChannelMode(st & 0xf, b2, midis.getc());
            } else {
                midiControlChange(st & 0xf, b2, midis.getc());
            }
            break;
        case 0xc:
            midiProgramChange(st & 0xf, midis.getc());
            break;
        case 0xd:
            midiChannelPressure(st & 0xf, midis.getc());
            break;
        case 0xe:
            char LSB = midis.getc();
            char MSB = midis.getc();
            midiPitchBend(st & 0xf, ((LSB << 7) | (MSB << 7)) + 8192);
            break;
        case 0xf:
            int t2 = st & 0xf;
            if (t2 <= 7) {
                getMIDISystemCommonMessage(t2);
            } else {
                midiSystemRealtimeMessage(st);
            }
            break;
    }
}

void getMIDISystemCommonMessage(char t2)
{
    switch(t2) {
        case 0:
            //もう面倒臭いから128byteのバッファに適当に放り込んでおこう
            sysexData[0] = 0xf0;
            int i = 1;
            char d = 0;
            do {
                d = midis.getc();
                sysexData[i]=d;
                i++;
            } while(d != 0xf7);

            break;
        case 1:
            midis.getc();
            break;
        case 2:
            midis.getc();
            midis.getc();
            break;
        case 3:
            midis.getc();
            break;
        case 4:
            break;
        case 5:
            break;
        case 6:
            break;
        case 7:
            //どうしろと
            break;
    }
}

void midiSystemRealtimeMessage(char mes)
{

}


void midiNoteOn(char ch, char note, char vel)
{
    if (vel==0) {
        globalrelease((ch<<8)|note);
    } else {
        globalattack((ch<<8)|note,vel);
    }
}

void midiNoteOff(char ch, char note, char vel)
{
    globalrelease((ch<<8)|note);
}

void midiPolyphonicKeyPressure(char ch, char note, char vel)
{

}

void midiControlChange(char ch, char ctrl, char data)
{

}

void midiChannelMode(char ch, char ctrl, char data)
{

}

void midiProgramChange(char ch, char prg)
{

}

void midiChannelPressure(char ch, char pres)
{

}

void midiPitchBend(char ch, short pb)
{

}

void midiSystemExclusiveMessage()
{

}