Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: MIDI mbed-rtos mbed
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 }
Generated on Fri Jul 15 2022 22:05:16 by
1.7.2