/
MultistompController.ino
80 lines (56 loc) · 1.91 KB
/
MultistompController.ino
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
#include "MultistompController.h"
#include "Log.h"
#include "MidiController.h"
#include "MidiBuffer.h"
#include "Timer.h"
#include "ZoomController.h"
#include "ZoomIf.h"
// GLOBALS
Timer Clock;
MidiController CtrlMIDI;
ZoomController CtrlZoom;
MIDI_SERIAL MIDI_STREAM = MIDI_SERIAL(MIDI_SERIAL_RX, MIDI_SERIAL_TX);
ZOOM_SERIAL ZOOM_STREAM = ZOOM_SERIAL(ZOOM_SERIAL_RX, ZOOM_SERIAL_TX);
// MAIN INIT FUNCTION
void setup() {
pinMode(SWITCH_TUNER, INPUT_PULLUP); // Tuner switch
pinMode(SWITCH_UPDATE, INPUT_PULLUP); // Update switch
MIDI_STREAM.begin(MIDI_BAUDRATE); // MIDI In/Out
MIDI_STREAM.flush();
ZOOM_STREAM.begin(ZOOM_BAUDRATE); // USB Host MIDI Out
ZOOM_STREAM.flush();
DBEGIN(DEBUG_BAUDRATE); // Debug Out
// Setup controller streams and callbacks
CtrlMIDI.Init(&MIDI_STREAM, MIDI_CHANNEL);
CtrlZoom.Init(&ZOOM_STREAM, ZOOM_CHANNEL);
ZoomIf::Init(&ZOOM_STREAM, ZOOM_CHANNEL);
}
// MAIN LOOP FUNCTION
void loop() {
// Update buffer
while ((MIDI_STREAM.available() > 0) && CtrlMIDI.RxActive) {
MidiBuffer::Push(MIDI_STREAM.read());
CtrlMIDI.Update(); CtrlZoom.Update();
}
// State check and sending routine
if (CtrlMIDI.Done() && CtrlZoom.Done()) {
ZoomIf::Tuner(false); // Tuner off message
CtrlMIDI.OnSend(); CtrlZoom.OnSend();
CtrlMIDI.Reset(); CtrlZoom.Reset();
MidiBuffer::Flush();
}
// Tuner switch handling
if ((digitalRead(SWITCH_TUNER) != HIGH) && Clock.Check(SWITCH_DEB)) {
ZoomIf::Tuner(ZoomIf::TunerState ? false : true);
Clock.Reset();
}
// Update switch handling
if ((digitalRead(SWITCH_UPDATE) != HIGH) && Clock.Check(SWITCH_DEB)) {
ZoomIf::UpdateCurrentPatch();
Clock.Reset();
}
// Handle input from Zoom
ZoomIf::HandleInput();
// Invoke Iridium custom messages
CtrlMIDI.Invoke();
}