dsp: add midi synth program
This commit is contained in:
parent
ef9a154681
commit
57984c093d
107
dsp/synth.c
Normal file
107
dsp/synth.c
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
#include "sys.h"
|
||||||
|
|
||||||
|
void init() {
|
||||||
|
square0->output_address = pdmout0;
|
||||||
|
square0->high_val = 0xafff;
|
||||||
|
square0->low_val = 0x0000;
|
||||||
|
square0->flags = SQUARE_FLAG_ENABLE_msk;
|
||||||
|
// will set the period later
|
||||||
|
}
|
||||||
|
|
||||||
|
int strlen(const char* str) {
|
||||||
|
int i = 0;
|
||||||
|
while(str[i] != '\0') {
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
void log(const char* stuff) {
|
||||||
|
uart_writen(uart0, stuff, strlen(stuff));
|
||||||
|
}
|
||||||
|
|
||||||
|
void dump(uint8_t a) {
|
||||||
|
uint8_t hi = a >> 4;
|
||||||
|
uint8_t lo = a & 0xf;
|
||||||
|
|
||||||
|
const char* letters = "0123456789abcdef";
|
||||||
|
|
||||||
|
uart_write(uart0, letters[hi]);
|
||||||
|
uart_write(uart0, letters[lo]);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define midi_uart uart1
|
||||||
|
|
||||||
|
#define MODE_IDLE 0
|
||||||
|
#define MODE_DOWN 1
|
||||||
|
#define MODE_UP 2
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
const int periods[] = {
|
||||||
|
1493,
|
||||||
|
0,
|
||||||
|
1330,
|
||||||
|
0,
|
||||||
|
1185,
|
||||||
|
1119,
|
||||||
|
0,
|
||||||
|
996,
|
||||||
|
0,
|
||||||
|
887,
|
||||||
|
0,
|
||||||
|
791,
|
||||||
|
};
|
||||||
|
|
||||||
|
init();
|
||||||
|
|
||||||
|
led0->output = 42;
|
||||||
|
|
||||||
|
int keydown = 0;
|
||||||
|
int mode = MODE_IDLE;
|
||||||
|
|
||||||
|
while(1) {
|
||||||
|
uint8_t c = uart_read(midi_uart);
|
||||||
|
|
||||||
|
if (c == 0xfe) {
|
||||||
|
// nothing
|
||||||
|
} else if (c == 0x90) {
|
||||||
|
mode = MODE_DOWN;
|
||||||
|
} else if (c == 0x80) {
|
||||||
|
mode = MODE_UP;
|
||||||
|
} else if ((c & 0x80) == 0) {
|
||||||
|
if (mode == MODE_DOWN) {
|
||||||
|
int period = 0;
|
||||||
|
|
||||||
|
keydown = c;
|
||||||
|
|
||||||
|
log("dn ");
|
||||||
|
dump(c);
|
||||||
|
log("\r\n");
|
||||||
|
|
||||||
|
if (c > 0x3b) {
|
||||||
|
if (c < 0x48) {
|
||||||
|
period = periods[c - 0x3c];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uart_read(midi_uart);
|
||||||
|
|
||||||
|
square0->period = period;
|
||||||
|
} else if (mode == MODE_UP) {
|
||||||
|
log("up ");
|
||||||
|
dump(c);
|
||||||
|
log("\r\n");
|
||||||
|
|
||||||
|
uart_read(midi_uart);
|
||||||
|
|
||||||
|
if (keydown == c) {
|
||||||
|
square0->period = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log("weird: ");
|
||||||
|
dump(c);
|
||||||
|
log("\r\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user