Source code for a MIDI controller built from parts and designed to be extensible
Fork of USBMIDI_HelloWorld by
main.cpp@2:012e56772666, 2016-01-04 (annotated)
- 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?
User | Revision | Line number | New 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 | } |