Source code for a MIDI controller built from parts and designed to be extensible

Dependencies:   USBMIDI mbed

Fork of USBMIDI_HelloWorld by Simon Ford

Committer:
earlz
Date:
Mon Jan 04 05:01:04 2016 +0000
Revision:
2:012e56772666
Parent:
1:1e34feaa7774
clean up code

Who changed what in which revision?

UserRevisionLine numberNew contents of line
simon 0:4b55d56b6b61 1 // Hello World example for the USBMIDI library
simon 0:4b55d56b6b61 2
simon 0:4b55d56b6b61 3 #include "mbed.h"
simon 0:4b55d56b6b61 4 #include "USBMIDI.h"
simon 0:4b55d56b6b61 5
simon 0:4b55d56b6b61 6 void show_message(MIDIMessage msg) {
simon 0:4b55d56b6b61 7 switch (msg.type()) {
simon 0:4b55d56b6b61 8 case MIDIMessage::NoteOnType:
simon 0:4b55d56b6b61 9 printf("NoteOn key:%d, velocity: %d, channel: %d\n", msg.key(), msg.velocity(), msg.channel());
simon 0:4b55d56b6b61 10 break;
simon 0:4b55d56b6b61 11 case MIDIMessage::NoteOffType:
simon 0:4b55d56b6b61 12 printf("NoteOff key:%d, velocity: %d, channel: %d\n", msg.key(), msg.velocity(), msg.channel());
simon 0:4b55d56b6b61 13 break;
simon 0:4b55d56b6b61 14 case MIDIMessage::ControlChangeType:
simon 0:4b55d56b6b61 15 printf("ControlChange controller: %d, data: %d\n", msg.controller(), msg.value());
simon 0:4b55d56b6b61 16 break;
simon 0:4b55d56b6b61 17 case MIDIMessage::PitchWheelType:
simon 0:4b55d56b6b61 18 printf("PitchWheel channel: %d, pitch: %d\n", msg.channel(), msg.pitch());
simon 0:4b55d56b6b61 19 break;
simon 0:4b55d56b6b61 20 default:
simon 0:4b55d56b6b61 21 printf("Another message\n");
simon 0:4b55d56b6b61 22 }
simon 0:4b55d56b6b61 23 }
simon 0:4b55d56b6b61 24
earlz 1:1e34feaa7774 25 static const int MIDI_MAX_VALUE = 16384;
earlz 1:1e34feaa7774 26 static const float MIDI_MAX_VALUE_F = 16384.0f;
earlz 1:1e34feaa7774 27
earlz 1:1e34feaa7774 28
earlz 1:1e34feaa7774 29 static const float TOLERANCE = 0.01f;
earlz 1:1e34feaa7774 30 static const int NOISE_FLOOR = 600;
earlz 1:1e34feaa7774 31
earlz 1:1e34feaa7774 32 static const float LOWER_TOLERANCE = 0.016f;
earlz 1:1e34feaa7774 33 static const float LOWER_TOLERANCE_BEGIN = 0.34f;
earlz 1:1e34feaa7774 34
simon 0:4b55d56b6b61 35 USBMIDI midi;
earlz 1:1e34feaa7774 36 AnalogIn pot1(p20);
earlz 1:1e34feaa7774 37 Serial pc(USBTX, USBRX); // tx, rx
earlz 1:1e34feaa7774 38
earlz 1:1e34feaa7774 39 void write_full_cc(int controlmsb, int controllsb, int channel, int value){
earlz 1:1e34feaa7774 40 int lsb = value / 128; //value & 0x7F;
earlz 1:1e34feaa7774 41 int msb = value % 128; //value & 0x7F80 >> 7;
earlz 1:1e34feaa7774 42 midi.write(MIDIMessage::ControlChange(controlmsb, msb, channel));
earlz 1:1e34feaa7774 43 midi.write(MIDIMessage::ControlChange(controllsb, lsb, channel));
earlz 1:1e34feaa7774 44 }
earlz 1:1e34feaa7774 45
earlz 1:1e34feaa7774 46 #define SMOOTHING_AMOUNT 500
simon 0:4b55d56b6b61 47
earlz 2:012e56772666 48 int main() {
simon 0:4b55d56b6b61 49 midi.attach(show_message); // call back for messages received
earlz 1:1e34feaa7774 50
earlz 1:1e34feaa7774 51 float last_value = 0.0f;
earlz 1:1e34feaa7774 52 while (1) {
earlz 1:1e34feaa7774 53 float counter=0.0f;
earlz 1:1e34feaa7774 54 for(int i=0;i<SMOOTHING_AMOUNT;i++){
earlz 1:1e34feaa7774 55 wait_us(10);
earlz 1:1e34feaa7774 56 counter+=pot1;
earlz 1:1e34feaa7774 57 }
earlz 1:1e34feaa7774 58 float value = counter / SMOOTHING_AMOUNT;
earlz 1:1e34feaa7774 59 int midi_value = (int)(MIDI_MAX_VALUE_F * value);
earlz 1:1e34feaa7774 60
earlz 1:1e34feaa7774 61 //at low voltage noise takes over..
earlz 1:1e34feaa7774 62 if(midi_value < NOISE_FLOOR){
earlz 1:1e34feaa7774 63 value = 0.0f;
earlz 1:1e34feaa7774 64 midi_value = 0;
earlz 1:1e34feaa7774 65 }
earlz 1:1e34feaa7774 66 if(value - last_value > TOLERANCE || value - last_value < -TOLERANCE){
earlz 1:1e34feaa7774 67 //as we approach noise floor, things get noisey..
earlz 1:1e34feaa7774 68 if(value < LOWER_TOLERANCE_BEGIN && !(value - last_value > LOWER_TOLERANCE || value - last_value < -LOWER_TOLERANCE)){
earlz 1:1e34feaa7774 69 continue;
earlz 1:1e34feaa7774 70 }
earlz 1:1e34feaa7774 71 pc.printf("sent: %f, %i\r\n", value, midi_value);
earlz 1:1e34feaa7774 72 last_value = value;
earlz 1:1e34feaa7774 73 write_full_cc(20, 52, 0, midi_value);
earlz 1:1e34feaa7774 74 }
earlz 1:1e34feaa7774 75
simon 0:4b55d56b6b61 76 }
simon 0:4b55d56b6b61 77 }