![](/media/cache/profiles/4cd5792cc3ccd04bcd11a0ed7b114410.jpg.50x50_q85.png)
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で。
FMOscillator/FMAlgorithm.cpp@21:e3014c1bdf9c, 2015-01-29 (annotated)
- Committer:
- kb10uy
- Date:
- Thu Jan 29 12:27:21 2015 +0000
- Revision:
- 21:e3014c1bdf9c
- Parent:
- 20:8278e607a687
- Child:
- 23:deb76bdf6f03
noteOn/Off????????
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kb10uy | 19:f0dcf591c5dd | 1 | #include "FMAlgorithm.h" |
kb10uy | 19:f0dcf591c5dd | 2 | |
kb10uy | 19:f0dcf591c5dd | 3 | FMAlgorithm::FMAlgorithm() |
kb10uy | 19:f0dcf591c5dd | 4 | { |
kb10uy | 19:f0dcf591c5dd | 5 | opcount = 0; |
kb10uy | 19:f0dcf591c5dd | 6 | cncount = 0; |
kb10uy | 19:f0dcf591c5dd | 7 | operators = NULL; |
kb10uy | 19:f0dcf591c5dd | 8 | connections = NULL; |
kb10uy | 19:f0dcf591c5dd | 9 | } |
kb10uy | 19:f0dcf591c5dd | 10 | |
kb10uy | 19:f0dcf591c5dd | 11 | FMAlgorithm::FMAlgorithm(int opc, int cnc) |
kb10uy | 19:f0dcf591c5dd | 12 | { |
kb10uy | 19:f0dcf591c5dd | 13 | opcount = opc; |
kb10uy | 19:f0dcf591c5dd | 14 | cncount = cnc; |
kb10uy | 19:f0dcf591c5dd | 15 | operators = new FMOperator*[opcount]; |
kb10uy | 21:e3014c1bdf9c | 16 | for(int i = 0; i < opcount; i++) operators[i] = NULL; |
kb10uy | 19:f0dcf591c5dd | 17 | connections = new FMAlgorithmConnection[cncount]; |
kb10uy | 19:f0dcf591c5dd | 18 | } |
kb10uy | 19:f0dcf591c5dd | 19 | |
kb10uy | 19:f0dcf591c5dd | 20 | FMAlgorithm::~FMAlgorithm() |
kb10uy | 19:f0dcf591c5dd | 21 | { |
kb10uy | 19:f0dcf591c5dd | 22 | if (operators != NULL) delete[] operators; |
kb10uy | 19:f0dcf591c5dd | 23 | if (connections != NULL) delete[] connections; |
kb10uy | 19:f0dcf591c5dd | 24 | } |
kb10uy | 19:f0dcf591c5dd | 25 | |
kb10uy | 19:f0dcf591c5dd | 26 | void FMAlgorithm::setOperator(int num, FMOperator *op) |
kb10uy | 19:f0dcf591c5dd | 27 | { |
kb10uy | 19:f0dcf591c5dd | 28 | if (num >= opcount) return; |
kb10uy | 19:f0dcf591c5dd | 29 | operators[num] = op; |
kb10uy | 19:f0dcf591c5dd | 30 | } |
kb10uy | 19:f0dcf591c5dd | 31 | |
kb10uy | 19:f0dcf591c5dd | 32 | void FMAlgorithm::setConnection(int num, int t, int s) |
kb10uy | 19:f0dcf591c5dd | 33 | { |
kb10uy | 19:f0dcf591c5dd | 34 | if (num >= cncount) return; |
kb10uy | 19:f0dcf591c5dd | 35 | connections[num].target = t; |
kb10uy | 19:f0dcf591c5dd | 36 | connections[num].source = s; |
kb10uy | 21:e3014c1bdf9c | 37 | connections[num].allocated = true; |
kb10uy | 20:8278e607a687 | 38 | } |
kb10uy | 21:e3014c1bdf9c | 39 | |
kb10uy | 21:e3014c1bdf9c | 40 | void FMAlgorithm::noteOn(float freq, double time) { |
kb10uy | 21:e3014c1bdf9c | 41 | for(int i = 0; i < opcount; i++) { |
kb10uy | 21:e3014c1bdf9c | 42 | if (operators[i] != NULL) operators[i]->attackNote(freq, time); |
kb10uy | 21:e3014c1bdf9c | 43 | } |
kb10uy | 21:e3014c1bdf9c | 44 | } |
kb10uy | 21:e3014c1bdf9c | 45 | |
kb10uy | 21:e3014c1bdf9c | 46 | void FMAlgorithm::noteOff(double time) { |
kb10uy | 21:e3014c1bdf9c | 47 | for(int i = 0; i < opcount; i++) { |
kb10uy | 21:e3014c1bdf9c | 48 | if (operators[i] != NULL) operators[i]->releaseNote(time); |
kb10uy | 21:e3014c1bdf9c | 49 | } |
kb10uy | 21:e3014c1bdf9c | 50 | } |
kb10uy | 21:e3014c1bdf9c | 51 | |
kb10uy | 21:e3014c1bdf9c | 52 | float FMAlgorithm::calculate() { |
kb10uy | 21:e3014c1bdf9c | 53 | return calculate(0); |
kb10uy | 21:e3014c1bdf9c | 54 | } |
kb10uy | 21:e3014c1bdf9c | 55 | |
kb10uy | 21:e3014c1bdf9c | 56 | float FMAlgorithm::calculate(int opn) { |
kb10uy | 21:e3014c1bdf9c | 57 | float sum = 0; |
kb10uy | 21:e3014c1bdf9c | 58 | for(int i = 0; i < cncount; i++) { |
kb10uy | 21:e3014c1bdf9c | 59 | if (connections[i].allocated && connections[i].target == opn) { |
kb10uy | 21:e3014c1bdf9c | 60 | sum += calculate(connections[i].source); |
kb10uy | 21:e3014c1bdf9c | 61 | } |
kb10uy | 21:e3014c1bdf9c | 62 | } |
kb10uy | 21:e3014c1bdf9c | 63 | return operators[opn]->calculate(sum); |
kb10uy | 21:e3014c1bdf9c | 64 | } |