https://github.com/kanaya/midi-timer

Dependencies:   MIDI mbed-rtos mbed

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?

UserRevisionLine numberNew 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 }