https://github.com/kanaya/midi-timer
Dependencies: MIDI mbed-rtos mbed
main.cpp@1:cb68a764ab9d, 2013-10-23 (annotated)
- Committer:
- kanaya
- Date:
- Wed Oct 23 04:45:03 2013 +0000
- Revision:
- 1:cb68a764ab9d
- Parent:
- 0:12da9c671126
Now all notes are sent to channel 1.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kanaya | 0:12da9c671126 | 1 | // Wire |
kanaya | 0:12da9c671126 | 2 | // 09 I2C |
kanaya | 0:12da9c671126 | 3 | // 10 I2C |
kanaya | 0:12da9c671126 | 4 | // 11 Analog Switch A (on-intervals) |
kanaya | 0:12da9c671126 | 5 | // 12 Analog Switch B (off-intervals) |
kanaya | 0:12da9c671126 | 6 | // 13 TX (MIDI OUT) |
kanaya | 0:12da9c671126 | 7 | // 15 VR A1/B1 |
kanaya | 0:12da9c671126 | 8 | // 16 VR A2/B2 |
kanaya | 0:12da9c671126 | 9 | // 17 VR A3/B3 |
kanaya | 0:12da9c671126 | 10 | // 18 VR A4/B4 |
kanaya | 0:12da9c671126 | 11 | // 19 VR C1 |
kanaya | 0:12da9c671126 | 12 | |
kanaya | 0:12da9c671126 | 13 | #include "mbed.h" |
kanaya | 0:12da9c671126 | 14 | #include "rtos.h" |
kanaya | 0:12da9c671126 | 15 | #include "MIDI.h" |
kanaya | 0:12da9c671126 | 16 | |
kanaya | 0:12da9c671126 | 17 | #define MILISECOND 1000 |
kanaya | 0:12da9c671126 | 18 | #define INTERVAL 5 |
kanaya | 0:12da9c671126 | 19 | #define RANDOMNESS 10 |
kanaya | 0:12da9c671126 | 20 | |
kanaya | 0:12da9c671126 | 21 | #define MIN_OFF_INTERVAL 100 |
kanaya | 0:12da9c671126 | 22 | #define MIN_ON_INTERVAL 10 |
kanaya | 0:12da9c671126 | 23 | |
kanaya | 0:12da9c671126 | 24 | Serial pc(USBTX, USBRX); |
kanaya | 0:12da9c671126 | 25 | |
kanaya | 0:12da9c671126 | 26 | int notes[4] = { 60, 64, 67, 71 }; |
kanaya | 0:12da9c671126 | 27 | |
kanaya | 0:12da9c671126 | 28 | Mutex midiMutex; |
kanaya | 0:12da9c671126 | 29 | Mutex vrSelectorMutex; |
kanaya | 0:12da9c671126 | 30 | |
kanaya | 0:12da9c671126 | 31 | MIDI midi(p13, p14); |
kanaya | 0:12da9c671126 | 32 | |
kanaya | 0:12da9c671126 | 33 | DigitalOut vrSelectorA(p11); |
kanaya | 0:12da9c671126 | 34 | DigitalOut vrSelectorB(p12); |
kanaya | 0:12da9c671126 | 35 | |
kanaya | 0:12da9c671126 | 36 | AnalogIn vr1(p15); |
kanaya | 0:12da9c671126 | 37 | AnalogIn vr2(p16); |
kanaya | 0:12da9c671126 | 38 | AnalogIn vr3(p17); |
kanaya | 0:12da9c671126 | 39 | AnalogIn vr4(p18); |
kanaya | 0:12da9c671126 | 40 | AnalogIn vr5(p19); |
kanaya | 0:12da9c671126 | 41 | |
kanaya | 0:12da9c671126 | 42 | AnalogIn vrs[4] = { vr1, vr2, vr3, vr4 }; |
kanaya | 0:12da9c671126 | 43 | |
kanaya | 0:12da9c671126 | 44 | DigitalOut led1(LED1); |
kanaya | 0:12da9c671126 | 45 | DigitalOut led2(LED2); |
kanaya | 0:12da9c671126 | 46 | DigitalOut led3(LED3); |
kanaya | 0:12da9c671126 | 47 | DigitalOut led4(LED4); |
kanaya | 0:12da9c671126 | 48 | |
kanaya | 0:12da9c671126 | 49 | DigitalOut leds[4] = { led1, led2, led3, led4 }; |
kanaya | 0:12da9c671126 | 50 | |
kanaya | 0:12da9c671126 | 51 | void led_thread(void const *args) { |
kanaya | 0:12da9c671126 | 52 | int num = *(int *)args; |
kanaya | 0:12da9c671126 | 53 | while (true) { |
kanaya | 0:12da9c671126 | 54 | // Send MIDI note off |
kanaya | 0:12da9c671126 | 55 | leds[num] = 0; |
kanaya | 0:12da9c671126 | 56 | midiMutex.lock(); |
kanaya | 0:12da9c671126 | 57 | midi.sendNoteOn(notes[num], 0, num + 1); |
kanaya | 0:12da9c671126 | 58 | midiMutex.unlock(); |
kanaya | 0:12da9c671126 | 59 | // Read parameters |
kanaya | 0:12da9c671126 | 60 | vrSelectorMutex.lock(); |
kanaya | 0:12da9c671126 | 61 | vrSelectorA = 1; vrSelectorB = 0; |
kanaya | 0:12da9c671126 | 62 | Thread::wait(1); |
kanaya | 0:12da9c671126 | 63 | float a = vrs[num]; |
kanaya | 0:12da9c671126 | 64 | vrSelectorA = 0; vrSelectorB = 1; |
kanaya | 0:12da9c671126 | 65 | Thread::wait(1); |
kanaya | 0:12da9c671126 | 66 | float b = vrs[num]; |
kanaya | 0:12da9c671126 | 67 | vrSelectorMutex.unlock(); |
kanaya | 0:12da9c671126 | 68 | float c = vr5; |
kanaya | 0:12da9c671126 | 69 | float randomness1 = ((float)rand() / (float)RAND_MAX * RANDOMNESS * 2.0 - RANDOMNESS) * c; |
kanaya | 0:12da9c671126 | 70 | float randomness2 = ((float)rand() / (float)RAND_MAX * RANDOMNESS * 2.0 - RANDOMNESS) * c; |
kanaya | 0:12da9c671126 | 71 | int interval1 = (a * 60 + randomness1) * MILISECOND; |
kanaya | 0:12da9c671126 | 72 | int interval2 = (b * 60 + randomness2) * MILISECOND; |
kanaya | 0:12da9c671126 | 73 | if (interval1 <= 0) { |
kanaya | 0:12da9c671126 | 74 | interval1 = 0; |
kanaya | 0:12da9c671126 | 75 | } |
kanaya | 0:12da9c671126 | 76 | if (interval2 <= 0) { |
kanaya | 0:12da9c671126 | 77 | interval2 = 0; |
kanaya | 0:12da9c671126 | 78 | } |
kanaya | 0:12da9c671126 | 79 | pc.printf("ch.%d: off_interval=%d, on_interval=%d\n", num + 1, interval2, interval1); |
kanaya | 0:12da9c671126 | 80 | // Off-interval |
kanaya | 0:12da9c671126 | 81 | Thread::wait(interval2 + MIN_OFF_INTERVAL); |
kanaya | 0:12da9c671126 | 82 | // Send MIDI note on |
kanaya | 0:12da9c671126 | 83 | leds[num] = 1; |
kanaya | 0:12da9c671126 | 84 | midiMutex.lock(); |
kanaya | 1:cb68a764ab9d | 85 | midi.sendNoteOn(notes[num], 127, 1); |
kanaya | 0:12da9c671126 | 86 | midiMutex.unlock(); |
kanaya | 0:12da9c671126 | 87 | // On-interval |
kanaya | 0:12da9c671126 | 88 | Thread::wait(interval1 + MIN_ON_INTERVAL); |
kanaya | 0:12da9c671126 | 89 | } |
kanaya | 0:12da9c671126 | 90 | } |
kanaya | 0:12da9c671126 | 91 | |
kanaya | 0:12da9c671126 | 92 | int main() { |
kanaya | 0:12da9c671126 | 93 | pc.printf("Hello.\n"); |
kanaya | 0:12da9c671126 | 94 | |
kanaya | 0:12da9c671126 | 95 | srand(1); |
kanaya | 0:12da9c671126 | 96 | midi.begin(); |
kanaya | 0:12da9c671126 | 97 | // readVRs(); |
kanaya | 0:12da9c671126 | 98 | int one = 0, two = 1, three = 2, four = 3; |
kanaya | 0:12da9c671126 | 99 | Thread thread1(led_thread, &one); |
kanaya | 0:12da9c671126 | 100 | Thread thread2(led_thread, &two); |
kanaya | 0:12da9c671126 | 101 | Thread thread3(led_thread, &three); |
kanaya | 0:12da9c671126 | 102 | Thread thread4(led_thread, &four); |
kanaya | 0:12da9c671126 | 103 | while (true) { |
kanaya | 0:12da9c671126 | 104 | Thread::wait(INTERVAL * MILISECOND); |
kanaya | 0:12da9c671126 | 105 | } |
kanaya | 0:12da9c671126 | 106 | } |