/* * MIDIUSB_buzzer.ino * * Author: Paulo Costa */ #include #include #include #include // oscillator template #include // sine table for oscillator #include #include // use: Oscil oscilName (wavetable), look in .h file of table #included above Oscil aSin(SIN2048_DATA); ADSR envelope; const char* pitch_name(byte pitch) { static const char* names[] = {"C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"}; return names[pitch % 12]; } int pitch_octave(byte pitch) { return (pitch / 12) - 1; } void noteOn(byte channel, byte pitch, byte velocity) { aSin.setFreq(pitchFrequency[pitch]); envelope.noteOn(); Serial.print("Note On: "); Serial.print(pitch_name(pitch)); Serial.print(pitch_octave(pitch)); Serial.print(", channel="); Serial.print(channel); Serial.print(", velocity="); Serial.println(velocity); } void noteOff(byte channel, byte pitch, byte velocity) { //aSin.setFreq(0); envelope.noteOff(); Serial.print("Note Off: "); Serial.print(pitch_name(pitch)); Serial.print(pitch_octave(pitch)); Serial.print(", channel="); Serial.print(channel); Serial.print(", velocity="); Serial.println(velocity); } void controlChange(byte channel, byte control, byte value) { Serial.print("Control change: control="); Serial.print(control); Serial.print(", value="); Serial.print(value); Serial.print(", channel="); Serial.println(channel); } void setup() { Serial.begin(115200); envelope.setADLevels(255,48); envelope.setTimes(150,200,700,200); // 700 is so the note will sustain 0.7 seconds unless a noteOff comes aSin.setFreq(440); // default frequency startMozzi(CONTROL_RATE); } void updateControl(){ envelope.update(); } AudioOutput_t updateAudio(){ return MonoOutput::from16Bit(envelope.next() * aSin.next()); // return an int signal centred around 0 } void loop() { audioHook(); midiEventPacket_t rx = MidiUSB.read(); switch (rx.header) { case 0: break; //No pending events case 0x9: noteOn( rx.byte1 & 0xF, //channel rx.byte2, //pitch rx.byte3 //velocity ); break; case 0x8: noteOff( rx.byte1 & 0xF, //channel rx.byte2, //pitch rx.byte3 //velocity ); break; case 0xB: controlChange( rx.byte1 & 0xF, //channel rx.byte2, //control rx.byte3 //value ); break; default: Serial.print("Unhandled MIDI message: "); Serial.print(rx.header, HEX); Serial.print("-"); Serial.print(rx.byte1, HEX); Serial.print("-"); Serial.print(rx.byte2, HEX); Serial.print("-"); Serial.println(rx.byte3, HEX); } }