https://github.com/kanaya/midi-timer
Dependencies: MIDI mbed-rtos mbed
Diff: main.cpp
- Revision:
- 0:12da9c671126
- Child:
- 1:cb68a764ab9d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon Oct 14 05:41:11 2013 +0000 @@ -0,0 +1,106 @@ +// 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, num + 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); + } +}