// inslude the SPI library: #include int data[19] = {0}; byte data_max[19] = {0}; int threshold[] = {100, 100, 100, 60, 100, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210}; byte steps[19] = {0}; byte mapping[19] = {33, 35, 36, 38, 40, 42, 43, 45, 47, 48, 50, 52, 54, 55, 57, 59, 60, 62, 64}; byte note_off_flag = 0; void setup() { pinMode(A5,OUTPUT); digitalWrite(A5,HIGH); pinMode(10, OUTPUT); // SS pin pinMode(3,OUTPUT); // oscillator pin SPI.begin(); SPI.setClockDivider(SPI_CLOCK_DIV64); // 250kHz Serial.begin(31250); // midi baud rate TCCR2A = 0x12; // toggle oc2b for 50% duty cycle TCCR2B = 0x01; // T_ck = CPU_ck/1 OCR2A = 0x28; // f = T_ck/(2*OCR2A) = ~200kHz @ 0x28 // calibration code delay(10000); for (int i = 0; i < 2000; i++) { // 2000*14ms = 28s digitalWrite(10,LOW); delay(1); for (byte i = 0; i < 19; i++) { data[i] = SPI.transfer(0); // if doing 16b, change to "SPI.transfer(0)<<8;" } digitalWrite(10,HIGH); delay(12); for (byte i = 0; i < 19; i++) { if (data[i] > data_max[i]) data_max[i] = data[i]; } } for (byte i = 0; i < 19; i++) { threshold[i] = data_max[i] + 10; } Serial.write(0xb0); // send all notes off Serial.write(120); Serial.write(0); delay(3000); for (byte i = 0; i < 20; i++) data[i] = 0; } void loop() { digitalWrite(10,LOW); delay(1); for (byte i = 0; i < 19; i++) { data[i] = SPI.transfer(0); // if doing 16b, change to "SPI.transfer(0)<<8;" } digitalWrite(10,HIGH); delay(12); // just in case b/c of 8b values // this is for doing 16b values // remember to change all values to unsigned int /* delay(1); digitalWrite(10,LOW); delay(1); for (byte i = 0; i < 19; i++) { data[i] += SPI.transfer(0); } digitalWrite(10,HIGH); */ for (byte i = 0; i < 19; i++) { int k = data[i] - threshold[i]; byte j = steps[i]; if (k > 0) { //k = data[i]; //if (k > 127) k = 127; //k = (k - 64) << 1; if (j == 0) steps[i] = 1; else if (j == 1) { // note on steps[i] = 2; Serial.write(0x90); Serial.write(mapping[i]); Serial.write(70); } // else { // polyphonic aftertouch // Serial.write(0xa0); // Serial.write(mapping[i]); // Serial.write(k); // } } else { if (j == 1) steps[i] = 0; else if (j == 2) steps[i] = 3; else if (j == 3) { steps[i] = 0; Serial.write(0x80); Serial.write(mapping[i]); Serial.write(0); } } } /* byte m = 0; for (byte i = 0; i < 19; i++) { m += steps[i]; } if ((m == 0) && (note_off_flag == 0)) { note_off_flag = 1; Serial.write(0xb0); // send all notes off Serial.write(120); Serial.write(0); } else if (m != 0) note_off_flag = 0; */ } // all notes off /* Serial.write(0xb0); Serial.write(120); Serial.write(0); */