parent
d744261272
commit
e745fbaef1
@ -0,0 +1,91 @@ |
||||
#include <MIDI.h> |
||||
#include <looper.h> |
||||
#include <LinkedList.h> |
||||
|
||||
#define LED 13 |
||||
#define LED_DECAY_MS 50 |
||||
#define MIDI_EVENT_SCHED_MS 100 |
||||
|
||||
#define TEST_NOTE_MIN 40 |
||||
#define TEST_NOTE_MAX 110 |
||||
#define TEST_VEL_MIN 60 |
||||
#define TEST_VEL_MAX 120 |
||||
#define TEST_DUR_MIN 150 |
||||
#define TEST_DUR_MAX 1000 |
||||
|
||||
class midi_event { |
||||
public: |
||||
int8_t note; |
||||
int8_t chan; |
||||
uint32_t dur; |
||||
}; |
||||
|
||||
looper sched; |
||||
MIDI_CREATE_DEFAULT_INSTANCE(); |
||||
LinkedList<midi_event*> MIDIEvents = LinkedList<midi_event*>(); |
||||
|
||||
void setup() |
||||
{ |
||||
/*Serial.begin(38400);*/ |
||||
pinMode(LED, OUTPUT); |
||||
digitalWrite(LED, LOW); |
||||
|
||||
MIDI.begin(1); |
||||
|
||||
sched.addJob(ledDecay, LED_DECAY_MS); |
||||
sched.addJob(do_midi_events, MIDI_EVENT_SCHED_MS); |
||||
|
||||
randomSeed(analogRead(A0));
|
||||
} |
||||
|
||||
void loop() |
||||
{ |
||||
if (millis() % 300 == 0) |
||||
{ |
||||
sendMIDI(random(TEST_NOTE_MIN, TEST_NOTE_MAX), random(TEST_VEL_MIN, TEST_VEL_MAX), 1, random(TEST_DUR_MIN, TEST_DUR_MAX)); |
||||
delay(1); |
||||
} |
||||
sched.scheduler(); |
||||
} |
||||
|
||||
void sendMIDI(int8_t note, int8_t vel, int8_t chan, int8_t dur) |
||||
{ |
||||
midi_event *m = new midi_event(); |
||||
m->note = note; |
||||
m->chan = chan; |
||||
m->dur = millis() + dur; |
||||
MIDIEvents.add(m); |
||||
digitalWrite(LED, HIGH); |
||||
MIDI.sendNoteOn(note, vel, chan); |
||||
/* Serial.print(F("Sending MIDI on channel "));
|
||||
Serial.print(chan); |
||||
Serial.print(F(" note ")); |
||||
Serial.print(note); |
||||
Serial.print(F(" velocity ")); |
||||
Serial.print(vel); |
||||
Serial.print(F(" duration ")); |
||||
Serial.print(dur); |
||||
Serial.println();*/ |
||||
} |
||||
|
||||
void ledDecay(void) |
||||
{ |
||||
digitalWrite(LED, LOW); |
||||
} |
||||
|
||||
void do_midi_events(void) |
||||
{ |
||||
uint8_t i; |
||||
|
||||
for (i = 0; i < MIDIEvents.size(); i++) |
||||
{ |
||||
midi_event *m = MIDIEvents.get(i); |
||||
|
||||
// If its a mammal, then print it's name
|
||||
if (m->dur < millis()) |
||||
{ |
||||
MIDI.sendNoteOff(m->note, 0, m->chan); |
||||
MIDIEvents.remove(i); |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue