Nucleo F401REでFM音源を実装するやつ 外部DACとオペアンプを利用 現在はMCP4922とNJM2737
Dependencies: AOTTrigon I2CEEPROM MCP4922 AQM0802A mbed
Fork of NuMidi401 by
NuFM401
Nucleo F401用の自作ソフトウェアMIDI音源
概要
だいたいそんなもんです。
特徴
- ブレッドボードの上で組める程度には簡単な回路構成
- 外部のDACにMCP4922を採用
- 念のためのボルテージフォロアとしてNJM2737Dを採用
- バンク用EEPROMに24FC1025を採用
- シリアル経由でMIDIデータを受信することで操作
補足
シリアル <=> MIDI のドライバにはHairless-MIDISerialをオススメします。 仮想MIDIケーブルはとりあえずMIDI Yokeで。
MIDI.cpp@11:62da91a1eaf1, 2014-12-29 (annotated)
- Committer:
- kb10uy
- Date:
- Mon Dec 29 12:48:44 2014 +0000
- Revision:
- 11:62da91a1eaf1
32poly??????????
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kb10uy | 11:62da91a1eaf1 | 1 | #include "MIDI.h" |
kb10uy | 11:62da91a1eaf1 | 2 | |
kb10uy | 11:62da91a1eaf1 | 3 | char sysexData[128]; |
kb10uy | 11:62da91a1eaf1 | 4 | |
kb10uy | 11:62da91a1eaf1 | 5 | void getMIDIMessage() |
kb10uy | 11:62da91a1eaf1 | 6 | { |
kb10uy | 11:62da91a1eaf1 | 7 | unsigned char st = midis.getc(); |
kb10uy | 11:62da91a1eaf1 | 8 | switch(st >> 4) { |
kb10uy | 11:62da91a1eaf1 | 9 | case 0x8: |
kb10uy | 11:62da91a1eaf1 | 10 | midiNoteOff(st & 0xf, midis.getc(), midis.getc()); |
kb10uy | 11:62da91a1eaf1 | 11 | break; |
kb10uy | 11:62da91a1eaf1 | 12 | case 0x9: |
kb10uy | 11:62da91a1eaf1 | 13 | midiNoteOn(st & 0xf, midis.getc(), midis.getc()); |
kb10uy | 11:62da91a1eaf1 | 14 | break; |
kb10uy | 11:62da91a1eaf1 | 15 | case 0xa: |
kb10uy | 11:62da91a1eaf1 | 16 | midiPolyphonicKeyPressure(st & 0xf, midis.getc(), midis.getc()); |
kb10uy | 11:62da91a1eaf1 | 17 | break; |
kb10uy | 11:62da91a1eaf1 | 18 | case 0xb: |
kb10uy | 11:62da91a1eaf1 | 19 | char b2 = midis.getc(); |
kb10uy | 11:62da91a1eaf1 | 20 | if (b2 >= 120) { |
kb10uy | 11:62da91a1eaf1 | 21 | midiChannelMode(st & 0xf, b2, midis.getc()); |
kb10uy | 11:62da91a1eaf1 | 22 | } else { |
kb10uy | 11:62da91a1eaf1 | 23 | midiControlChange(st & 0xf, b2, midis.getc()); |
kb10uy | 11:62da91a1eaf1 | 24 | } |
kb10uy | 11:62da91a1eaf1 | 25 | break; |
kb10uy | 11:62da91a1eaf1 | 26 | case 0xc: |
kb10uy | 11:62da91a1eaf1 | 27 | midiProgramChange(st & 0xf, midis.getc()); |
kb10uy | 11:62da91a1eaf1 | 28 | break; |
kb10uy | 11:62da91a1eaf1 | 29 | case 0xd: |
kb10uy | 11:62da91a1eaf1 | 30 | midiChannelPressure(st & 0xf, midis.getc()); |
kb10uy | 11:62da91a1eaf1 | 31 | break; |
kb10uy | 11:62da91a1eaf1 | 32 | case 0xe: |
kb10uy | 11:62da91a1eaf1 | 33 | char LSB = midis.getc(); |
kb10uy | 11:62da91a1eaf1 | 34 | char MSB = midis.getc(); |
kb10uy | 11:62da91a1eaf1 | 35 | midiPitchBend(st & 0xf, ((LSB << 7) | (MSB << 7)) + 8192); |
kb10uy | 11:62da91a1eaf1 | 36 | break; |
kb10uy | 11:62da91a1eaf1 | 37 | case 0xf: |
kb10uy | 11:62da91a1eaf1 | 38 | int t2 = st & 0xf; |
kb10uy | 11:62da91a1eaf1 | 39 | if (t2 <= 7) { |
kb10uy | 11:62da91a1eaf1 | 40 | getMIDISystemCommonMessage(t2); |
kb10uy | 11:62da91a1eaf1 | 41 | } else { |
kb10uy | 11:62da91a1eaf1 | 42 | midiSystemRealtimeMessage(st); |
kb10uy | 11:62da91a1eaf1 | 43 | } |
kb10uy | 11:62da91a1eaf1 | 44 | break; |
kb10uy | 11:62da91a1eaf1 | 45 | } |
kb10uy | 11:62da91a1eaf1 | 46 | } |
kb10uy | 11:62da91a1eaf1 | 47 | |
kb10uy | 11:62da91a1eaf1 | 48 | void getMIDISystemCommonMessage(char t2) |
kb10uy | 11:62da91a1eaf1 | 49 | { |
kb10uy | 11:62da91a1eaf1 | 50 | switch(t2) { |
kb10uy | 11:62da91a1eaf1 | 51 | case 0: |
kb10uy | 11:62da91a1eaf1 | 52 | //もう面倒臭いから128byteのバッファに適当に放り込んでおこう |
kb10uy | 11:62da91a1eaf1 | 53 | sysexData[0] = 0xf0; |
kb10uy | 11:62da91a1eaf1 | 54 | int i = 1; |
kb10uy | 11:62da91a1eaf1 | 55 | char d = 0; |
kb10uy | 11:62da91a1eaf1 | 56 | do { |
kb10uy | 11:62da91a1eaf1 | 57 | d = midis.getc(); |
kb10uy | 11:62da91a1eaf1 | 58 | sysexData[i]=d; |
kb10uy | 11:62da91a1eaf1 | 59 | i++; |
kb10uy | 11:62da91a1eaf1 | 60 | } while(d != 0xf7); |
kb10uy | 11:62da91a1eaf1 | 61 | |
kb10uy | 11:62da91a1eaf1 | 62 | break; |
kb10uy | 11:62da91a1eaf1 | 63 | case 1: |
kb10uy | 11:62da91a1eaf1 | 64 | midis.getc(); |
kb10uy | 11:62da91a1eaf1 | 65 | break; |
kb10uy | 11:62da91a1eaf1 | 66 | case 2: |
kb10uy | 11:62da91a1eaf1 | 67 | midis.getc(); |
kb10uy | 11:62da91a1eaf1 | 68 | midis.getc(); |
kb10uy | 11:62da91a1eaf1 | 69 | break; |
kb10uy | 11:62da91a1eaf1 | 70 | case 3: |
kb10uy | 11:62da91a1eaf1 | 71 | midis.getc(); |
kb10uy | 11:62da91a1eaf1 | 72 | break; |
kb10uy | 11:62da91a1eaf1 | 73 | case 4: |
kb10uy | 11:62da91a1eaf1 | 74 | break; |
kb10uy | 11:62da91a1eaf1 | 75 | case 5: |
kb10uy | 11:62da91a1eaf1 | 76 | break; |
kb10uy | 11:62da91a1eaf1 | 77 | case 6: |
kb10uy | 11:62da91a1eaf1 | 78 | break; |
kb10uy | 11:62da91a1eaf1 | 79 | case 7: |
kb10uy | 11:62da91a1eaf1 | 80 | //どうしろと |
kb10uy | 11:62da91a1eaf1 | 81 | break; |
kb10uy | 11:62da91a1eaf1 | 82 | } |
kb10uy | 11:62da91a1eaf1 | 83 | } |
kb10uy | 11:62da91a1eaf1 | 84 | |
kb10uy | 11:62da91a1eaf1 | 85 | void midiSystemRealtimeMessage(char mes) |
kb10uy | 11:62da91a1eaf1 | 86 | { |
kb10uy | 11:62da91a1eaf1 | 87 | |
kb10uy | 11:62da91a1eaf1 | 88 | } |
kb10uy | 11:62da91a1eaf1 | 89 | |
kb10uy | 11:62da91a1eaf1 | 90 | |
kb10uy | 11:62da91a1eaf1 | 91 | void midiNoteOn(char ch, char note, char vel) |
kb10uy | 11:62da91a1eaf1 | 92 | { |
kb10uy | 11:62da91a1eaf1 | 93 | if (vel==0) { |
kb10uy | 11:62da91a1eaf1 | 94 | globalrelease((ch<<8)|note); |
kb10uy | 11:62da91a1eaf1 | 95 | } else { |
kb10uy | 11:62da91a1eaf1 | 96 | globalattack((ch<<8)|note,vel); |
kb10uy | 11:62da91a1eaf1 | 97 | } |
kb10uy | 11:62da91a1eaf1 | 98 | } |
kb10uy | 11:62da91a1eaf1 | 99 | |
kb10uy | 11:62da91a1eaf1 | 100 | void midiNoteOff(char ch, char note, char vel) |
kb10uy | 11:62da91a1eaf1 | 101 | { |
kb10uy | 11:62da91a1eaf1 | 102 | globalrelease((ch<<8)|note); |
kb10uy | 11:62da91a1eaf1 | 103 | } |
kb10uy | 11:62da91a1eaf1 | 104 | |
kb10uy | 11:62da91a1eaf1 | 105 | void midiPolyphonicKeyPressure(char ch, char note, char vel) |
kb10uy | 11:62da91a1eaf1 | 106 | { |
kb10uy | 11:62da91a1eaf1 | 107 | |
kb10uy | 11:62da91a1eaf1 | 108 | } |
kb10uy | 11:62da91a1eaf1 | 109 | |
kb10uy | 11:62da91a1eaf1 | 110 | void midiControlChange(char ch, char ctrl, char data) |
kb10uy | 11:62da91a1eaf1 | 111 | { |
kb10uy | 11:62da91a1eaf1 | 112 | |
kb10uy | 11:62da91a1eaf1 | 113 | } |
kb10uy | 11:62da91a1eaf1 | 114 | |
kb10uy | 11:62da91a1eaf1 | 115 | void midiChannelMode(char ch, char ctrl, char data) |
kb10uy | 11:62da91a1eaf1 | 116 | { |
kb10uy | 11:62da91a1eaf1 | 117 | |
kb10uy | 11:62da91a1eaf1 | 118 | } |
kb10uy | 11:62da91a1eaf1 | 119 | |
kb10uy | 11:62da91a1eaf1 | 120 | void midiProgramChange(char ch, char prg) |
kb10uy | 11:62da91a1eaf1 | 121 | { |
kb10uy | 11:62da91a1eaf1 | 122 | |
kb10uy | 11:62da91a1eaf1 | 123 | } |
kb10uy | 11:62da91a1eaf1 | 124 | |
kb10uy | 11:62da91a1eaf1 | 125 | void midiChannelPressure(char ch, char pres) |
kb10uy | 11:62da91a1eaf1 | 126 | { |
kb10uy | 11:62da91a1eaf1 | 127 | |
kb10uy | 11:62da91a1eaf1 | 128 | } |
kb10uy | 11:62da91a1eaf1 | 129 | |
kb10uy | 11:62da91a1eaf1 | 130 | void midiPitchBend(char ch, short pb) |
kb10uy | 11:62da91a1eaf1 | 131 | { |
kb10uy | 11:62da91a1eaf1 | 132 | |
kb10uy | 11:62da91a1eaf1 | 133 | } |
kb10uy | 11:62da91a1eaf1 | 134 | |
kb10uy | 11:62da91a1eaf1 | 135 | void midiSystemExclusiveMessage() |
kb10uy | 11:62da91a1eaf1 | 136 | { |
kb10uy | 11:62da91a1eaf1 | 137 | |
kb10uy | 11:62da91a1eaf1 | 138 | } |