// // MidiVox: Diagnostic tests (MIDI, LEDs, reset button, DAC) // // Author: P.J. Drongowski // Date: 28 April 2015 // Copyright (c) 2015 Paul J. Drongowski #include "SPI.h" // // Pin definitions // // SPI pins: // D13: SCK Slave Clock // D12: MISO Master In, Slave Out // D11: MOSI Master Out, Slave In // D9: SS Slave Select int ResetButton = 6 ; int DataLED = 7 ; int SlaveSelect = 9 ; // // Blink the data LED on the MidiVox board // void blinkDataLED() { digitalWrite(DataLED, HIGH) ; delay(500) ; digitalWrite(DataLED, LOW) ; delay(500) ; } void setup() { int i ; // Set up pin modes pinMode(ResetButton, INPUT_PULLUP) ; pinMode(DataLED, OUTPUT) ; pinMode(SlaveSelect, OUTPUT) ; // Turn the data LED off digitalWrite(DataLED, LOW) ; // Initialize the SPI interface SPI.begin() ; SPI.setBitOrder(MSBFIRST) ; // Initialize the MIDI interface Serial.begin(31250) ; // Blink data LED on and off four times at start-up for (i = 4 ; i > 0 ; i--) { blinkDataLED() ; } } // // Use this loop to test the MidiVox data LED. The data LED // will flash rapidly until a new sketch is loaded. // void ledloop() { digitalWrite(DataLED, LOW) ; delay(100) ; digitalWrite(DataLED, HIGH) ; delay(100) ; } // // Use this loop to test the reset button. // void buttonloop() { int button ; button = digitalRead(ResetButton) ; if (button == LOW) { digitalWrite(DataLED, HIGH) ; } if (button == HIGH) { digitalWrite(DataLED, LOW) ; } } // // Write a 16-bit value to the MCP 4921 DAC. // void writeDac(word dacValue) { byte data ; digitalWrite(SlaveSelect, LOW) ; data = highByte(dacValue) ; data = 0x0F & data ; data = 0x30 | data ; SPI.transfer(data) ; data = lowByte(dacValue) ; SPI.transfer(data) ; digitalWrite(SlaveSelect, HIGH) ; } // // Play one cycle of a sawtooth tone. The step size determines // frequency. // void playCycle(int stepSize) { int i ; for (i = 2048 ; i > 0 ; i = i - stepSize) { writeDac(i) ; delay(0) ; } } // // Play a short-duration tone through the DAC. // void playTone(int stepSize, int duration) { int i ; for (i = duration ; i > 0 ; i--) { playCycle(stepSize) ; } } // // Use this loop to test the DAC audio output. Connect the // audio output to an amplifier and speaker. You should hear // a continuous tone (a sawtooth wave). Make sure that you // have turned up the on-board volume control (trimpot). // void toneloop() { playCycle(32) ; } #define MIDI_NOTE_ON 0x90 #define MIDI_NOTE_OFF 0x80 // // Use this loop to test MIDI input. Read a short (3 byte) // MIDI note ON/OFF message. Play a tone for note ON. Zero // out the DAC for note OFF. // void loop() { byte cmdByte, note, velocity ; if (Serial.available() > 0) { cmdByte = Serial.read() ; if ((cmdByte & 0xF0) == MIDI_NOTE_ON) { // Read the rest of the note ON message note = Serial.read() ; velocity = Serial.read() ; if (velocity == 0) { writeDac(0) ; } else { playTone(8, 256) ; } } else if ((cmdByte & 0xF0) == MIDI_NOTE_OFF) { // Read the rest of the note OFF message note = Serial.read() ; velocity = Serial.read() ; writeDac(0) ; } } }