https://github.com/kanaya/midi-timer
Dependencies: MIDI mbed-rtos mbed
main.cpp
- Committer:
- kanaya
- Date:
- 2013-10-23
- Revision:
- 1:cb68a764ab9d
- Parent:
- 0:12da9c671126
File content as of revision 1:cb68a764ab9d:
// Wire // 09 I2C // 10 I2C // 11 Analog Switch A (on-intervals) // 12 Analog Switch B (off-intervals) // 13 TX (MIDI OUT) // 15 VR A1/B1 // 16 VR A2/B2 // 17 VR A3/B3 // 18 VR A4/B4 // 19 VR C1 #include "mbed.h" #include "rtos.h" #include "MIDI.h" #define MILISECOND 1000 #define INTERVAL 5 #define RANDOMNESS 10 #define MIN_OFF_INTERVAL 100 #define MIN_ON_INTERVAL 10 Serial pc(USBTX, USBRX); int notes[4] = { 60, 64, 67, 71 }; Mutex midiMutex; Mutex vrSelectorMutex; MIDI midi(p13, p14); DigitalOut vrSelectorA(p11); DigitalOut vrSelectorB(p12); AnalogIn vr1(p15); AnalogIn vr2(p16); AnalogIn vr3(p17); AnalogIn vr4(p18); AnalogIn vr5(p19); AnalogIn vrs[4] = { vr1, vr2, vr3, vr4 }; DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); DigitalOut led4(LED4); DigitalOut leds[4] = { led1, led2, led3, led4 }; void led_thread(void const *args) { int num = *(int *)args; while (true) { // Send MIDI note off leds[num] = 0; midiMutex.lock(); midi.sendNoteOn(notes[num], 0, num + 1); midiMutex.unlock(); // Read parameters vrSelectorMutex.lock(); vrSelectorA = 1; vrSelectorB = 0; Thread::wait(1); float a = vrs[num]; vrSelectorA = 0; vrSelectorB = 1; Thread::wait(1); float b = vrs[num]; vrSelectorMutex.unlock(); float c = vr5; float randomness1 = ((float)rand() / (float)RAND_MAX * RANDOMNESS * 2.0 - RANDOMNESS) * c; float randomness2 = ((float)rand() / (float)RAND_MAX * RANDOMNESS * 2.0 - RANDOMNESS) * c; int interval1 = (a * 60 + randomness1) * MILISECOND; int interval2 = (b * 60 + randomness2) * MILISECOND; if (interval1 <= 0) { interval1 = 0; } if (interval2 <= 0) { interval2 = 0; } pc.printf("ch.%d: off_interval=%d, on_interval=%d\n", num + 1, interval2, interval1); // Off-interval Thread::wait(interval2 + MIN_OFF_INTERVAL); // Send MIDI note on leds[num] = 1; midiMutex.lock(); midi.sendNoteOn(notes[num], 127, 1); midiMutex.unlock(); // On-interval Thread::wait(interval1 + MIN_ON_INTERVAL); } } int main() { pc.printf("Hello.\n"); srand(1); midi.begin(); // readVRs(); int one = 0, two = 1, three = 2, four = 3; Thread thread1(led_thread, &one); Thread thread2(led_thread, &two); Thread thread3(led_thread, &three); Thread thread4(led_thread, &four); while (true) { Thread::wait(INTERVAL * MILISECOND); } }