From e745fbaef19d897827595b3d7a42a214eabe2e44 Mon Sep 17 00:00:00 2001 From: Holger Wirtz Date: Wed, 23 May 2018 13:08:05 +0200 Subject: [PATCH] Initial version. --- MIDITESTER.ino | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 MIDITESTER.ino diff --git a/MIDITESTER.ino b/MIDITESTER.ino new file mode 100644 index 0000000..6eaf07d --- /dev/null +++ b/MIDITESTER.ino @@ -0,0 +1,91 @@ +#include +#include +#include + +#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 MIDIEvents = LinkedList(); + +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); + } + } +}