How can i Start....?
Break it up into manageable smaller chunks.
One aspect is MIDI output, actually sending the notes/chords. As you've found, that's relatively easy using the NoteChordButton class. It might be worthwhile to learn how to send the MIDI notes yourself, without relying on that class.
Have a look at the
Send-MIDI-Notes.ino example.
Sending chords is very similar, a chord is just a collection of intervals relative to a root note:
#include <Control_Surface.h>
USBMIDI_Interface midi;
using namespace MIDI_Notes;
// Note and chord to send
MIDIAddress rootnote = note(C, 4);
auto chord = Chords::Major;
uint8_t velocity = 0x7F;
Button btn {2}; // push button between ground and pin 2
void setup() {
midi.begin();
btn.begin();
}
void loop() {
midi.update();
btn.update();
if (btn.getState() == Button::Falling) { // if button is pressed
midi.sendNoteOn(rootnote, velocity);
for (int8_t interval : chord)
midi.sendNoteOn(rootnote + interval, velocity);
} else if (btn.getState() == Button::Rising) { // if button is released
midi.sendNoteOff(rootnote, velocity);
for (int8_t interval : chord)
midi.sendNoteOff(rootnote + interval, velocity);
}
}
This example also shows you how to read input from a push button, which will come in handy when programming the user interface later.
Next, you could look at how to handle MIDI input, for instance using the
MIDI-Input.ino example.
Then learn how to write text to your display, use the examples that come with the library for your specific display.
Finally, you can start programming the actual logic for the menu system. This is most likely the hardest part, and you'll have to watch out not to end up with a huge pile of spaghetti code. Start with simple, smaller user interfaces first. Try to plan out the architecture in advance, and regularly take some time to refactor the code you already have.