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);
    }
}