#include <MIDI.h>
// Updated GPIO pins to 74HC595
const int dataPin = 19; // DS (Pin 14 of Shift Register 1)
const int clockPin = 18; // SH_CP (Clock Pin for all Shift Registers)
const int latchPin = 5; // ST_CP (Latch Pin for all Shift Registers)
const int numShiftRegisters = 11; // Total number of 74HC595 shift registers
// Array to hold the state of each shift register
byte shiftRegisterStates[numShiftRegisters] = {0};
void setup() {
// Initialize Serial Communication
Serial.begin(115200);
Serial.println("Hello, ESP32-S2!");
// Initialize Shift Register Control Pins
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(latchPin, OUTPUT);
// Initialize control pins to LOW
digitalWrite(dataPin, LOW);
digitalWrite(clockPin, LOW);
digitalWrite(latchPin, LOW);
}
void loop() {
playMozartMelody(); // Play the simulated Mozart melody
delay(5000); // Pause for 5 seconds before repeating
}
// Function to simulate a simple Mozart melody using MIDI Note On/Off events
void playMozartMelody() {
int melody[] = {60, 60, 67, 67, 69, 69, 67, // C4 C4 G4 G4 A4 A4 G4
65, 65, 64, 64, 62, 62, 60}; // F4 F4 E4 E4 D4 D4 C4
int noteDurations[] = {500, 500, 500, 500, 500, 500, 1000, // Durations for first phrase
500, 500, 500, 500, 500, 500, 2000}; // Durations for second phrase
int length = sizeof(melody) / sizeof(melody[0]);
for (int i = 0; i < length; i++) {
// Simulate Note On event
handleNoteOn(1, melody[i], 127); // Channel 1, velocity 127
delay(noteDurations[i]); // Hold the note for its duration
// Simulate Note Off event
handleNoteOff(1, melody[i], 0); // Channel 1, velocity 0
delay(100); // Short delay between notes
}
}
// Function to map MIDI note to LED index
int midiNoteToLED(int note) {
if (note < 21 || note > 108) return -1; // Out of range
return note - 21; // Maps MIDI note to LED index (0-87)
}
// Handle MIDI Note On Event
void handleNoteOn(byte channel, byte note, byte velocity) {
int ledNumber = midiNoteToLED(note);
if (ledNumber == -1) return; // Invalid note
// Calculate which shift register and which bit
int srIndex = ledNumber / 8; // 0 to 10
int bitIndex = ledNumber % 8; // 0 to 7
// Set the corresponding bit to turn on the LED
shiftRegisterStates[srIndex] |= (1 << bitIndex);
// Update the shift registers
shiftOutMultiple(shiftRegisterStates, numShiftRegisters);
}
// Handle MIDI Note Off Event
void handleNoteOff(byte channel, byte note, byte velocity) {
int ledNumber = midiNoteToLED(note);
if (ledNumber == -1) return; // Invalid note
// Calculate which shift register and which bit
int srIndex = ledNumber / 8; // 0 to 10
int bitIndex = ledNumber % 8; // 0 to 7
// Clear the corresponding bit to turn off the LED
shiftRegisterStates[srIndex] &= ~(1 << bitIndex);
// Update the shift registers
shiftOutMultiple(shiftRegisterStates, numShiftRegisters);
}
// Function to shift out data to multiple 74HC595s
void shiftOutMultiple(byte data[], int numRegisters) {
digitalWrite(latchPin, LOW); // Begin data transmission
// Shift out all bytes from last to first shift register
for (int i = numRegisters - 1; i >= 0; i--) {
shiftOutData(data[i]);
}
digitalWrite(latchPin, HIGH); // Update outputs
}
// Function to shift out a single byte to 74HC595
void shiftOutData(byte data) {
// Shift out the data byte, MSB first
for (int i = 7; i >= 0; i--) {
// Write bit by bit
digitalWrite(clockPin, LOW);
digitalWrite(dataPin, (data & (1 << i)) ? HIGH : LOW);
digitalWrite(clockPin, HIGH);
}
}
esp:0
esp:1
esp:2
esp:3
esp:4
esp:5
esp:6
esp:7
esp:8
esp:9
esp:10
esp:11
esp:12
esp:13
esp:14
esp:15
esp:16
esp:17
esp:18
esp:19
esp:20
esp:21
esp:26
esp:33
esp:34
esp:35
esp:36
esp:37
esp:38
esp:39
esp:40
esp:41
esp:42
esp:45
esp:46
esp:3V3
esp:5V
esp:GND.1
esp:TX
esp:RX
esp:RST
esp:GND.2
sr1:Q1
sr1:Q2
sr1:Q3
sr1:Q4
sr1:Q5
sr1:Q6
sr1:Q7
sr1:GND
sr1:Q7S
sr1:MR
sr1:SHCP
sr1:STCP
sr1:OE
sr1:DS
sr1:Q0
sr1:VCC
led1:A
led1:C
led3:A
led3:C
led4:A
led4:C
led5:A
led5:C
led6:A
led6:C
led7:A
led7:C
led8:A
led8:C
r1:1
r1:2
r3:1
r3:2
r4:1
r4:2
r5:1
r5:2
r6:1
r6:2
r7:1
r7:2
r8:1
r8:2
r2:1
r2:2
led2:A
led2:C
sr2:Q1
sr2:Q2
sr2:Q3
sr2:Q4
sr2:Q5
sr2:Q6
sr2:Q7
sr2:GND
sr2:Q7S
sr2:MR
sr2:SHCP
sr2:STCP
sr2:OE
sr2:DS
sr2:Q0
sr2:VCC
led10:A
led10:C
led11:A
led11:C
led12:A
led12:C
led13:A
led13:C
led14:A
led14:C
led15:A
led15:C
r9:1
r9:2
r10:1
r10:2
r11:1
r11:2
r12:1
r12:2
r13:1
r13:2
r14:1
r14:2
r15:1
r15:2
r16:1
r16:2
led16:A
led16:C
sr3:Q1
sr3:Q2
sr3:Q3
sr3:Q4
sr3:Q5
sr3:Q6
sr3:Q7
sr3:GND
sr3:Q7S
sr3:MR
sr3:SHCP
sr3:STCP
sr3:OE
sr3:DS
sr3:Q0
sr3:VCC
led17:A
led17:C
led18:A
led18:C
led19:A
led19:C
led20:A
led20:C
led21:A
led21:C
led22:A
led22:C
led23:A
led23:C
r17:1
r17:2
r18:1
r18:2
r19:1
r19:2
r20:1
r20:2
r21:1
r21:2
r22:1
r22:2
r23:1
r23:2
r24:1
r24:2
led24:A
led24:C
sr4:Q1
sr4:Q2
sr4:Q3
sr4:Q4
sr4:Q5
sr4:Q6
sr4:Q7
sr4:GND
sr4:Q7S
sr4:MR
sr4:SHCP
sr4:STCP
sr4:OE
sr4:DS
sr4:Q0
sr4:VCC
led25:A
led25:C
led26:A
led26:C
led27:A
led27:C
led28:A
led28:C
led29:A
led29:C
led30:A
led30:C
led31:A
led31:C
r25:1
r25:2
r26:1
r26:2
r27:1
r27:2
r28:1
r28:2
r29:1
r29:2
r30:1
r30:2
r31:1
r31:2
r32:1
r32:2
led32:A
led32:C
sr5:Q1
sr5:Q2
sr5:Q3
sr5:Q4
sr5:Q5
sr5:Q6
sr5:Q7
sr5:GND
sr5:Q7S
sr5:MR
sr5:SHCP
sr5:STCP
sr5:OE
sr5:DS
sr5:Q0
sr5:VCC
led33:A
led33:C
led34:A
led34:C
led35:A
led35:C
led36:A
led36:C
led37:A
led37:C
led38:A
led38:C
led39:A
led39:C
r33:1
r33:2
r34:1
r34:2
r35:1
r35:2
r36:1
r36:2
r37:1
r37:2
r38:1
r38:2
r39:1
r39:2
r40:1
r40:2
led40:A
led40:C
sr6:Q1
sr6:Q2
sr6:Q3
sr6:Q4
sr6:Q5
sr6:Q6
sr6:Q7
sr6:GND
sr6:Q7S
sr6:MR
sr6:SHCP
sr6:STCP
sr6:OE
sr6:DS
sr6:Q0
sr6:VCC
led41:A
led41:C
led42:A
led42:C
led43:A
led43:C
led44:A
led44:C
led45:A
led45:C
led46:A
led46:C
led47:A
led47:C
r41:1
r41:2
r42:1
r42:2
r43:1
r43:2
r44:1
r44:2
r45:1
r45:2
r46:1
r46:2
r47:1
r47:2
r48:1
r48:2
led48:A
led48:C
sr7:Q1
sr7:Q2
sr7:Q3
sr7:Q4
sr7:Q5
sr7:Q6
sr7:Q7
sr7:GND
sr7:Q7S
sr7:MR
sr7:SHCP
sr7:STCP
sr7:OE
sr7:DS
sr7:Q0
sr7:VCC
led49:A
led49:C
led50:A
led50:C
led51:A
led51:C
led52:A
led52:C
led53:A
led53:C
led54:A
led54:C
led55:A
led55:C
r49:1
r49:2
r50:1
r50:2
r51:1
r51:2
r52:1
r52:2
r53:1
r53:2
r54:1
r54:2
r55:1
r55:2
r56:1
r56:2
led56:A
led56:C
sr8:Q1
sr8:Q2
sr8:Q3
sr8:Q4
sr8:Q5
sr8:Q6
sr8:Q7
sr8:GND
sr8:Q7S
sr8:MR
sr8:SHCP
sr8:STCP
sr8:OE
sr8:DS
sr8:Q0
sr8:VCC
led57:A
led57:C
led58:A
led58:C
led59:A
led59:C
led60:A
led60:C
led61:A
led61:C
led62:A
led62:C
led63:A
led63:C
r57:1
r57:2
r58:1
r58:2
r59:1
r59:2
r60:1
r60:2
r61:1
r61:2
r62:1
r62:2
r63:1
r63:2
r64:1
r64:2
led64:A
led64:C
sr9:Q1
sr9:Q2
sr9:Q3
sr9:Q4
sr9:Q5
sr9:Q6
sr9:Q7
sr9:GND
sr9:Q7S
sr9:MR
sr9:SHCP
sr9:STCP
sr9:OE
sr9:DS
sr9:Q0
sr9:VCC
led65:A
led65:C
led66:A
led66:C
led67:A
led67:C
led68:A
led68:C
led69:A
led69:C
led70:A
led70:C
led71:A
led71:C
r65:1
r65:2
r66:1
r66:2
r67:1
r67:2
r68:1
r68:2
r69:1
r69:2
r70:1
r70:2
r71:1
r71:2
r72:1
r72:2
led72:A
led72:C
sr10:Q1
sr10:Q2
sr10:Q3
sr10:Q4
sr10:Q5
sr10:Q6
sr10:Q7
sr10:GND
sr10:Q7S
sr10:MR
sr10:SHCP
sr10:STCP
sr10:OE
sr10:DS
sr10:Q0
sr10:VCC
led73:A
led73:C
led74:A
led74:C
led75:A
led75:C
led76:A
led76:C
led77:A
led77:C
led78:A
led78:C
led79:A
led79:C
r73:1
r73:2
r74:1
r74:2
r75:1
r75:2
r76:1
r76:2
r77:1
r77:2
r78:1
r78:2
r79:1
r79:2
r80:1
r80:2
led80:A
led80:C
sr11:Q1
sr11:Q2
sr11:Q3
sr11:Q4
sr11:Q5
sr11:Q6
sr11:Q7
sr11:GND
sr11:Q7S
sr11:MR
sr11:SHCP
sr11:STCP
sr11:OE
sr11:DS
sr11:Q0
sr11:VCC
led81:A
led81:C
led82:A
led82:C
led83:A
led83:C
led84:A
led84:C
led85:A
led85:C
led86:A
led86:C
led87:A
led87:C
r81:1
r81:2
r82:1
r82:2
r83:1
r83:2
r84:1
r84:2
r85:1
r85:2
r86:1
r86:2
r87:1
r87:2
r88:1
r88:2
led88:A
led88:C
led89:A
led89:C