Ichi Kanaya / Mbed 2 deprecated midi-timer

Dependencies:   MIDI mbed-rtos mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 // Wire
00002 // 09 I2C
00003 // 10 I2C
00004 // 11 Analog Switch A (on-intervals)
00005 // 12 Analog Switch B (off-intervals)
00006 // 13 TX (MIDI OUT)
00007 // 15 VR A1/B1
00008 // 16 VR A2/B2
00009 // 17 VR A3/B3
00010 // 18 VR A4/B4
00011 // 19 VR C1
00012 
00013 #include "mbed.h"
00014 #include "rtos.h"
00015 #include "MIDI.h"
00016 
00017 #define MILISECOND 1000
00018 #define INTERVAL 5
00019 #define RANDOMNESS 10
00020 
00021 #define MIN_OFF_INTERVAL 100
00022 #define MIN_ON_INTERVAL 10
00023 
00024 Serial pc(USBTX, USBRX);
00025 
00026 int notes[4] = { 60, 64, 67, 71 };
00027 
00028 Mutex midiMutex;
00029 Mutex vrSelectorMutex;
00030 
00031 MIDI midi(p13, p14);
00032 
00033 DigitalOut vrSelectorA(p11);
00034 DigitalOut vrSelectorB(p12);
00035 
00036 AnalogIn vr1(p15);
00037 AnalogIn vr2(p16);
00038 AnalogIn vr3(p17);
00039 AnalogIn vr4(p18);
00040 AnalogIn vr5(p19);
00041 
00042 AnalogIn vrs[4] = { vr1, vr2, vr3, vr4 };
00043 
00044 DigitalOut led1(LED1);
00045 DigitalOut led2(LED2);
00046 DigitalOut led3(LED3);
00047 DigitalOut led4(LED4);
00048 
00049 DigitalOut leds[4] = { led1, led2, led3, led4 };
00050 
00051 void led_thread(void const *args) {
00052     int num = *(int *)args;
00053     while (true) {
00054         // Send MIDI note off
00055         leds[num] = 0;
00056         midiMutex.lock();
00057         midi.sendNoteOn(notes[num], 0, num + 1);
00058         midiMutex.unlock();
00059         // Read parameters
00060         vrSelectorMutex.lock();
00061         vrSelectorA = 1; vrSelectorB = 0;
00062         Thread::wait(1);
00063         float a = vrs[num];
00064         vrSelectorA = 0; vrSelectorB = 1;
00065         Thread::wait(1);
00066         float b = vrs[num];
00067         vrSelectorMutex.unlock();
00068         float c = vr5;
00069         float randomness1 = ((float)rand() / (float)RAND_MAX * RANDOMNESS * 2.0 - RANDOMNESS) * c;
00070         float randomness2 = ((float)rand() / (float)RAND_MAX * RANDOMNESS * 2.0 - RANDOMNESS) * c;
00071         int interval1 = (a * 60 + randomness1) * MILISECOND;
00072         int interval2 = (b * 60 + randomness2) * MILISECOND;        
00073         if (interval1 <= 0) {
00074             interval1 = 0;
00075         }
00076         if (interval2 <= 0) {
00077             interval2 = 0;
00078         }
00079         pc.printf("ch.%d: off_interval=%d, on_interval=%d\n", num + 1, interval2, interval1); 
00080         // Off-interval
00081         Thread::wait(interval2 + MIN_OFF_INTERVAL);
00082         // Send MIDI note on
00083         leds[num] = 1;
00084         midiMutex.lock();
00085         midi.sendNoteOn(notes[num], 127, 1);
00086         midiMutex.unlock();
00087         // On-interval
00088         Thread::wait(interval1 + MIN_ON_INTERVAL);
00089     }
00090 }
00091 
00092 int main() {
00093     pc.printf("Hello.\n");
00094 
00095     srand(1);
00096     midi.begin();
00097     // readVRs();
00098     int one = 0, two = 1, three = 2, four = 3;
00099     Thread thread1(led_thread, &one);
00100     Thread thread2(led_thread, &two);
00101     Thread thread3(led_thread, &three);
00102     Thread thread4(led_thread, &four);
00103     while (true) {
00104         Thread::wait(INTERVAL * MILISECOND);
00105     }
00106 }