forked from japhillips87/player_piano
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathplayer_piano.ino
116 lines (104 loc) · 4.62 KB
/
player_piano.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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include <BLEMIDI_Transport.h>
#include <hardware/BLEMIDI_ESP32_NimBLE.h>
#include "piano.h"
#include "sustain.h"
#include "command.h"
#include "PCA9635.h"
#include <stdint.h>
Piano piano;
Sustain sustain;
PCA9635 board1(0x40);
PCA9635 board2(0x41);
PCA9635 board3(0x42);
PCA9635 board4(0x43);
PCA9635 board5(0x44);
PCA9635 board6(0x45);
PCA9635 board7(0x46);
BLEMIDI_CREATE_INSTANCE("Amadeus", MIDI)
void setup() {
Serial.begin(115200);
MIDI.begin(MIDI_CHANNEL_OMNI);
// BLEMIDI.setHandleConnected([]() { schedule.connected(); });
// BLEMIDI.setHandleDisconnected([]() { schedule.disconnected(); });
piano.initialize();
// schedule.poweredOn();
// UPDATE: this needs to use the addToSchedule function
MIDI.setHandleNoteOn([](uint8_t _, uint8_t noteId, uint8_t velocity) { piano.scheduleNote(noteId, velocity); });
MIDI.setHandleNoteOff([](uint8_t _, uint8_t noteId, uint8_t velocity) { piano.scheduleNote(noteId, 0); });
MIDI.setHandleControlChange([](uint8_t channel, uint8_t number, uint8_t value) { piano.scheduleSustain(channel, number, value); });
Wire.begin(SDA_PIN, SCL_PIN);
board1.begin(PCA9635_MODE1_NONE, PCA9635_MODE2_INVERT | PCA9635_MODE2_TOTEMPOLE);
for (int channel = 0; channel < board1.channelCount(); channel++) {
board1.setLedDriverMode(channel, PCA9635_LEDPWM);
board1.write1(channel, 0);
}
board2.begin(PCA9635_MODE1_NONE, PCA9635_MODE2_INVERT | PCA9635_MODE2_TOTEMPOLE);
for (int channel = 0; channel < board2.channelCount(); channel++) {
board2.setLedDriverMode(channel, PCA9635_LEDPWM);
board2.write1(channel, 0);
}
board3.begin(PCA9635_MODE1_NONE, PCA9635_MODE2_INVERT | PCA9635_MODE2_TOTEMPOLE);
for (int channel = 0; channel < board3.channelCount(); channel++) {
board3.setLedDriverMode(channel, PCA9635_LEDPWM);
board3.write1(channel, 0);
}
board4.begin(PCA9635_MODE1_NONE, PCA9635_MODE2_INVERT | PCA9635_MODE2_TOTEMPOLE);
for (int channel = 0; channel < board4.channelCount(); channel++) {
board4.setLedDriverMode(channel, PCA9635_LEDPWM);
board4.write1(channel, 0);
}
board5.begin(PCA9635_MODE1_NONE, PCA9635_MODE2_INVERT | PCA9635_MODE2_TOTEMPOLE);
for (int channel = 0; channel < board5.channelCount(); channel++) {
board5.setLedDriverMode(channel, PCA9635_LEDPWM);
board5.write1(channel, 0);
}
board6.begin(PCA9635_MODE1_NONE, PCA9635_MODE2_INVERT | PCA9635_MODE2_TOTEMPOLE);
for (int channel = 0; channel < board6.channelCount(); channel++) {
board6.setLedDriverMode(channel, PCA9635_LEDPWM);
board6.write1(channel, 0);
}
board7.begin(PCA9635_MODE1_NONE, PCA9635_MODE2_INVERT | PCA9635_MODE2_TOTEMPOLE);
for (int channel = 0; channel < board7.channelCount(); channel++) {
board7.setLedDriverMode(channel, PCA9635_LEDPWM);
board7.write1(channel, 0);
}
}
void loop() {
MIDI.read();
// loop through the notes and and see if their schedule needs to be adjusted
// Serial.println("Looping through notes");
for (auto it = piano.notes.begin(); it != piano.notes.end(); it++) {
it->processSchedule();
it->checkForErrors();
}
sustain.processSchedule();
sustain.checkForErrors();
// loop through the commands and find which ones need to run
for (auto it = piano.commands.begin(); it != piano.commands.end(); it++) {
int midiId = it->getMidiId();
if (midiId >= BOARD_1_MIN_ID && midiId <= BOARD_1_MAX_ID) {
board1.write1(midiId - BOARD_1_MIN_ID, it->getPwm());
} else if (midiId >= BOARD_2_MIN_ID && midiId <= BOARD_2_MAX_ID) {
board2.write1(midiId - BOARD_2_MIN_ID, it->getPwm());
} else if (midiId >= BOARD_3_MIN_ID && midiId <= BOARD_3_MAX_ID) {
board3.write1(midiId - BOARD_3_MIN_ID, it->getPwm());
} else if (midiId >= BOARD_4_MIN_ID && midiId <= BOARD_4_MAX_ID) {
board4.write1(midiId - BOARD_4_MIN_ID, it->getPwm());
} else if (midiId >= BOARD_5_MIN_ID && midiId <= BOARD_5_MAX_ID) {
board5.write1(midiId - BOARD_5_MIN_ID, it->getPwm());
} else if (midiId >= BOARD_6_MIN_ID && midiId <= BOARD_6_MAX_ID) {
board6.write1(midiId - BOARD_6_MIN_ID, it->getPwm());
} else if (midiId >= BOARD_7_MIN_ID && midiId <= BOARD_7_MAX_ID) {
board7.write1(midiId - BOARD_7_MIN_ID, it->getPwm());
} else if (midiId == 109) { // sustain
board7.write1(SUSTAIN_1_INDEX, it->getPwm());
board7.write1(SUSTAIN_2_INDEX, it->getPwm());
}
// Serial.print("RUNNING COMMAND: ");
// Serial.print("Midi Id: ");
// Serial.print(it->getMidiId());
// Serial.print(", PWM: ");
// Serial.println(it->getPwm());
piano.commands.erase(it--);
}
}