Add NeoPixels to the mix and get them all lighting up. The colour of the octave buttons should be that of their respective octave, unless there isn't one, in which case it should go dark. The note buttons should then have the colour of the current ocatve, but with a low brightness. then a note is pressed the buttons should switch to full brightness.
When a note button is pressed, the button should fade in from the default brightness to full brightness and hold that as long as the button is pressed. When the button is released, the button should fade back to the default brightness. If a button hasn't reached full brightness before being released, it should start to fade out. Similarly, if a button is fading out and is pressed again, it should start fading in.
Rather than outputting the button press to the MicroPython REPL, we should now generate a MIDI note and output that instead. Once we've managed to assign a MIDI note to a button and have it output in the REPL, we should switch to having the MIDI note output via UART. This should then enable us to interface with the Module Tester and confirm that it's receiving the correct MIDI notes.
Outputting MIDI notes is all well and good, but not very useful if we can't change octave. Support 5 octave range with two further buttons, pressing one will result in going down an octave, while pressing the other will go up and octave. If there are no more octaves, then the button should do nothing. When the RPi Pico boots up, it should be in an octave that makes sense, so default to the middle octave, i.e. 3. Confirm that the MIDI notes that are output now change octave.