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で。

Committer:
kb10uy
Date:
Sat Jan 17 04:00:20 2015 +0000
Revision:
15:b03677948732
Parent:
14:06785925915e
Child:
16:5cfa8b491882
??????????????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kb10uy 13:e11380ceb460 1 #include "FMOscillator.h"
kb10uy 11:62da91a1eaf1 2
kb10uy 11:62da91a1eaf1 3 char sysexData[128];
kb10uy 11:62da91a1eaf1 4
kb10uy 13:e11380ceb460 5 FMOscillator::FMOscillator() {
kb10uy 13:e11380ceb460 6
kb10uy 13:e11380ceb460 7 }
kb10uy 13:e11380ceb460 8
kb10uy 13:e11380ceb460 9 FMOscillator::FMOscillator(Timer *timer, Serial *serial, AOTTrigon *trigon) {
kb10uy 13:e11380ceb460 10
kb10uy 13:e11380ceb460 11 }
kb10uy 13:e11380ceb460 12
kb10uy 13:e11380ceb460 13 void FMOscillator::getMIDIMessage()
kb10uy 11:62da91a1eaf1 14 {
kb10uy 13:e11380ceb460 15 unsigned char st = serial->getc();
kb10uy 11:62da91a1eaf1 16 switch(st >> 4) {
kb10uy 11:62da91a1eaf1 17 case 0x8:
kb10uy 14:06785925915e 18 midiNoteOff(st & 0xf, serial->getc(), serial->getc());
kb10uy 11:62da91a1eaf1 19 break;
kb10uy 11:62da91a1eaf1 20 case 0x9:
kb10uy 14:06785925915e 21 midiNoteOn(st & 0xf, serial->getc(), serial->getc());
kb10uy 11:62da91a1eaf1 22 break;
kb10uy 11:62da91a1eaf1 23 case 0xa:
kb10uy 14:06785925915e 24 midiPolyphonicKeyPressure(st & 0xf, serial->getc(), serial->getc());
kb10uy 11:62da91a1eaf1 25 break;
kb10uy 11:62da91a1eaf1 26 case 0xb:
kb10uy 15:b03677948732 27 char b2 = serial->getc();
kb10uy 11:62da91a1eaf1 28 if (b2 >= 120) {
kb10uy 14:06785925915e 29 midiChannelMode(st & 0xf, b2, serial->getc());
kb10uy 11:62da91a1eaf1 30 } else {
kb10uy 14:06785925915e 31 midiControlChange(st & 0xf, b2, serial->getc());
kb10uy 11:62da91a1eaf1 32 }
kb10uy 11:62da91a1eaf1 33 break;
kb10uy 11:62da91a1eaf1 34 case 0xc:
kb10uy 14:06785925915e 35 midiProgramChange(st & 0xf, serial->getc());
kb10uy 11:62da91a1eaf1 36 break;
kb10uy 11:62da91a1eaf1 37 case 0xd:
kb10uy 14:06785925915e 38 midiChannelPressure(st & 0xf, serial->getc());
kb10uy 11:62da91a1eaf1 39 break;
kb10uy 11:62da91a1eaf1 40 case 0xe:
kb10uy 14:06785925915e 41 char LSB = serial->getc();
kb10uy 14:06785925915e 42 char MSB = serial->getc();
kb10uy 11:62da91a1eaf1 43 midiPitchBend(st & 0xf, ((LSB << 7) | (MSB << 7)) + 8192);
kb10uy 11:62da91a1eaf1 44 break;
kb10uy 11:62da91a1eaf1 45 case 0xf:
kb10uy 11:62da91a1eaf1 46 int t2 = st & 0xf;
kb10uy 11:62da91a1eaf1 47 if (t2 <= 7) {
kb10uy 11:62da91a1eaf1 48 getMIDISystemCommonMessage(t2);
kb10uy 11:62da91a1eaf1 49 } else {
kb10uy 11:62da91a1eaf1 50 midiSystemRealtimeMessage(st);
kb10uy 11:62da91a1eaf1 51 }
kb10uy 11:62da91a1eaf1 52 break;
kb10uy 11:62da91a1eaf1 53 }
kb10uy 11:62da91a1eaf1 54 }
kb10uy 11:62da91a1eaf1 55
kb10uy 13:e11380ceb460 56 void FMOscillator::getMIDISystemCommonMessage(char t2)
kb10uy 11:62da91a1eaf1 57 {
kb10uy 11:62da91a1eaf1 58 switch(t2) {
kb10uy 11:62da91a1eaf1 59 case 0:
kb10uy 11:62da91a1eaf1 60 //もう面倒臭いから128byteのバッファに適当に放り込んでおこう
kb10uy 11:62da91a1eaf1 61 sysexData[0] = 0xf0;
kb10uy 11:62da91a1eaf1 62 int i = 1;
kb10uy 11:62da91a1eaf1 63 char d = 0;
kb10uy 11:62da91a1eaf1 64 do {
kb10uy 13:e11380ceb460 65 d = serial->getc();
kb10uy 11:62da91a1eaf1 66 sysexData[i]=d;
kb10uy 11:62da91a1eaf1 67 i++;
kb10uy 11:62da91a1eaf1 68 } while(d != 0xf7);
kb10uy 11:62da91a1eaf1 69
kb10uy 11:62da91a1eaf1 70 break;
kb10uy 11:62da91a1eaf1 71 case 1:
kb10uy 13:e11380ceb460 72 serial->getc();
kb10uy 11:62da91a1eaf1 73 break;
kb10uy 11:62da91a1eaf1 74 case 2:
kb10uy 15:b03677948732 75 serial->getc();
kb10uy 15:b03677948732 76 serial->getc();
kb10uy 11:62da91a1eaf1 77 break;
kb10uy 11:62da91a1eaf1 78 case 3:
kb10uy 15:b03677948732 79 serial->getc();
kb10uy 11:62da91a1eaf1 80 break;
kb10uy 11:62da91a1eaf1 81 case 4:
kb10uy 11:62da91a1eaf1 82 break;
kb10uy 11:62da91a1eaf1 83 case 5:
kb10uy 11:62da91a1eaf1 84 break;
kb10uy 11:62da91a1eaf1 85 case 6:
kb10uy 11:62da91a1eaf1 86 break;
kb10uy 11:62da91a1eaf1 87 case 7:
kb10uy 11:62da91a1eaf1 88 //どうしろと
kb10uy 11:62da91a1eaf1 89 break;
kb10uy 11:62da91a1eaf1 90 }
kb10uy 11:62da91a1eaf1 91 }
kb10uy 11:62da91a1eaf1 92
kb10uy 13:e11380ceb460 93 void FMOscillator::midiSystemRealtimeMessage(char mes)
kb10uy 11:62da91a1eaf1 94 {
kb10uy 11:62da91a1eaf1 95
kb10uy 11:62da91a1eaf1 96 }
kb10uy 11:62da91a1eaf1 97
kb10uy 11:62da91a1eaf1 98
kb10uy 13:e11380ceb460 99 void FMOscillator::midiNoteOn(char ch, char note, char vel)
kb10uy 11:62da91a1eaf1 100 {
kb10uy 11:62da91a1eaf1 101 if (vel==0) {
kb10uy 13:e11380ceb460 102 //globalrelease((ch<<8)|note);
kb10uy 11:62da91a1eaf1 103 } else {
kb10uy 13:e11380ceb460 104 //globalattack((ch<<8)|note,vel);
kb10uy 11:62da91a1eaf1 105 }
kb10uy 11:62da91a1eaf1 106 }
kb10uy 11:62da91a1eaf1 107
kb10uy 13:e11380ceb460 108 void FMOscillator::midiNoteOff(char ch, char note, char vel)
kb10uy 11:62da91a1eaf1 109 {
kb10uy 13:e11380ceb460 110 //globalrelease((ch<<8)|note);
kb10uy 11:62da91a1eaf1 111 }
kb10uy 11:62da91a1eaf1 112
kb10uy 13:e11380ceb460 113 void FMOscillator::midiPolyphonicKeyPressure(char ch, char note, char vel)
kb10uy 11:62da91a1eaf1 114 {
kb10uy 11:62da91a1eaf1 115
kb10uy 11:62da91a1eaf1 116 }
kb10uy 11:62da91a1eaf1 117
kb10uy 13:e11380ceb460 118 void FMOscillator::midiControlChange(char ch, char ctrl, char data)
kb10uy 11:62da91a1eaf1 119 {
kb10uy 11:62da91a1eaf1 120
kb10uy 11:62da91a1eaf1 121 }
kb10uy 11:62da91a1eaf1 122
kb10uy 13:e11380ceb460 123 void FMOscillator::midiChannelMode(char ch, char ctrl, char data)
kb10uy 11:62da91a1eaf1 124 {
kb10uy 11:62da91a1eaf1 125
kb10uy 11:62da91a1eaf1 126 }
kb10uy 11:62da91a1eaf1 127
kb10uy 13:e11380ceb460 128 void FMOscillator::midiProgramChange(char ch, char prg)
kb10uy 11:62da91a1eaf1 129 {
kb10uy 11:62da91a1eaf1 130
kb10uy 11:62da91a1eaf1 131 }
kb10uy 11:62da91a1eaf1 132
kb10uy 13:e11380ceb460 133 void FMOscillator::midiChannelPressure(char ch, char pres)
kb10uy 11:62da91a1eaf1 134 {
kb10uy 11:62da91a1eaf1 135
kb10uy 11:62da91a1eaf1 136 }
kb10uy 11:62da91a1eaf1 137
kb10uy 13:e11380ceb460 138 void FMOscillator::midiPitchBend(char ch, short pb)
kb10uy 11:62da91a1eaf1 139 {
kb10uy 11:62da91a1eaf1 140
kb10uy 11:62da91a1eaf1 141 }
kb10uy 11:62da91a1eaf1 142
kb10uy 13:e11380ceb460 143 void FMOscillator::midiSystemExclusiveMessage()
kb10uy 11:62da91a1eaf1 144 {
kb10uy 11:62da91a1eaf1 145
kb10uy 11:62da91a1eaf1 146 }