-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmidi.cpp
98 lines (80 loc) · 1.65 KB
/
midi.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include "midi.h"
#include "dr110.h"
#include <Arduino.h>
namespace Midi {
uint8_t channel = 0;
bool listen_for_note = false;
int8_t note = -1;
uint8_t midi_data;
uint8_t received_channel;
bool started = false;
void setup() {
Serial1.begin(31250);
}
void process_messages() {
while (Serial1.available() > 0) {
midi_data = Serial1.read();
switch (midi_data) {
case MIDI_START:
case MIDI_CONTINUE:
start();
break;
case MIDI_STOP:
stop();
break;
case MIDI_CLOCK:
clock();
break;
}
if (note != -1) {
if (midi_data > 0) {
trigger_drum(note);
}
note = -1;
} else if (listen_for_note) {
note = midi_data;
listen_for_note = false;
} else if ((midi_data & 0b11110000) == MIDI_NOTE_ON) {
received_channel = midi_data & 0b00001111;
if (received_channel == channel) {
listen_for_note = true;
}
}
}
}
void start() {
started = true;
Dr110::start();
}
void stop() {
started = false;
Dr110::stop();
}
void clock() {
if (started) {
Dr110::iterate_clock();
}
}
void trigger_drum(uint8_t note) {
switch(note) {
case MIDI_BD_NOTE:
Dr110::bd();
break;
case MIDI_SD_NOTE:
Dr110::sd();
break;
case MIDI_OH_NOTE:
Dr110::oh();
break;
case MIDI_CH_NOTE:
Dr110::ch();
break;
case MIDI_CY_NOTE:
Dr110::cy();
break;
case MIDI_HCP_NOTE:
Dr110::hcp();
break;
}
}
}