108 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #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");
 | |
|     }
 | |
|   }
 | |
| }
 |