PFont f10;
PFont f11;
PFont f14;
PFont f18;
PFont f20;
PFont f40;
MText katapult;
MLine mline;
String state = "nothing";
String mousestate = "nothing";
String menustate = "nothing";
String device = "Launchpad";
int mselection = 0;
int mselout = 0;
int mselmax = 0;
int menuAnswer = 0;

void menus() {
  //if (NETWORK) lpdetect = true;
  if (HEADLESS) { lpdetect = true; NOSEND = true; }
  if (state.equals("splash")) {
    background(#000000);
    if (katapult != null) katapult.draw();
    if (mline != null) mline.draw();
    if (mline.isDone() && katapult.isDone() && katapult.y > 35) {
      katapult.y -= 3;
      mline.y -= 3;
      mline.starty -= 3;
    }
    if (mline.isDone() && katapult.isDone() && katapult.y <= 35) {
      if (delay > 0) {
          delay--;
      } else {
        if (lpdetect && menustate.equals("midiout")) {
          if (mselection != MFINAL && !DEVICECONFIG) {
            fill(#FFFFFF);
            textFont(f18, 18);
            textAlign(CENTER);
            smooth();
            text(device+" connected", WINDOWSIZE/2, 65);
            textFont(f14, 14);
            textAlign(LEFT);
            int ii = 0;
            int[] midilist = new int[256];
            String midiliststr = "What MIDI port should Katapult send MIDI data to?\n\n";
            for (int i = 0; i < launchpad.infos.length; i++) {
              try {
                if ((MidiSystem.getMidiDevice(launchpad.infos[i]).getMaxReceivers() > 0 || MidiSystem.getMidiDevice(launchpad.infos[i]).getMaxReceivers() == -1) && !(launchpad.infos[i].getName().equals("Launchpad"))) {
                  midilist[ii] = i;
                  ii++;
                }
              } catch (MidiUnavailableException e) {
                println("MIDI error while enumerating devices");
              }
            }
            for (int i = 0; i < ii; i++) {
              midiliststr = midiliststr + "     " + (i+1) + ": " + launchpad.infos[midilist[i]].getName() + "\n";
            }
            midiliststr = midiliststr+"\nThis should be set to your software's input port.\nUse the arrow keys and enter to select.";
            mselmax = ii;
            text(midiliststr, 5, 105);
            ellipse(15, 134+(17.5*mselection), 5, 5);
            SOFTWARESEL = launchpad.infos[midilist[mselection]].getName();
          } else {
            SOFTWARE = SOFTWARESEL;
            menustate = "midiin";
            mselection = 0;
          }
        } else if (lpdetect && menustate.equals("midiin")) {
          if (mselection != MFINAL && !DEVICECONFIG) {
            fill(#FFFFFF);
            textFont(f18, 18);
            textAlign(CENTER);
            smooth();
            text("Launchpad connected", WINDOWSIZE/2, 65);
            textFont(f14, 14);
            textAlign(LEFT);
            int ii = 0;
            int[] midilist = new int[256];
            String midiliststr = "What device should Katapult listen for MIDI data on?\n\n";
            for (int i = 0; i < launchpad.infos.length; i++) {
              try {
                if ((MidiSystem.getMidiDevice(launchpad.infos[i]).getMaxTransmitters() > 0 || MidiSystem.getMidiDevice(launchpad.infos[i]).getMaxReceivers() == -1) && !(launchpad.infos[i].getName().equals("Launchpad"))) {
                  midilist[ii] = i;
                  ii++;
                }
              } catch (MidiUnavailableException e) {
                println("MIDI error while enumerating devices");
              }
            }
            for (int i = 0; i < ii; i++) {
              midiliststr = midiliststr + "     " + (i+1) + ": " + launchpad.infos[midilist[i]].getName() + "\n";
            }
            midiliststr = midiliststr+"\nThis should be set to your software's output port.\nUse the arrow keys and enter to select.";
            mselmax = ii;
            text(midiliststr, 5, 105);
            ellipse(15, 134+(17.5*mselection), 5, 5);
            SOFTWAREINSEL = launchpad.infos[midilist[mselection]].getName();
          } else {
            SOFTWAREIN = SOFTWAREINSEL;
            menustate = "saveconfig";
            mselection = 0;
          }
          
          } else if (lpdetect && menustate.equals("saveconfig")) {
          if (mselection != MFINAL && !DEVICECONFIG) {
            fill(#FFFFFF);
            textFont(f18, 18);
            textAlign(CENTER);
            smooth();
            text("Launchpad connected", WINDOWSIZE/2, 65);
            textFont(f14, 14);
            textAlign(LEFT);
            int ii = 0;
            int[] midilist = new int[256];
            String midiliststr = "Save devices choices?\n\n     Yes\n     No\n\n";
            midiliststr += "If you choose 'yes', your choices will be written\nto the configuration file, and this menu\nwill not be displayed at startup.\n\n";
            midiliststr += "If you want to edit your devices at a later point\nyou must remove the in/out lines from the\nconfiguration file.";
            mselmax = 2;
            text(midiliststr, 5, 105);
            ellipse(15, 134+(17.5*mselection), 5, 5);
            menuAnswer = mselection;
          } else {
            if (menuAnswer == 0) { saveConfig(); }
            menustate = "nothing";
            mselection = 0;
            DEMO = false;
            state = "run";
            noStroke();
            noFill();
            background(0);
            initMidiSystem();
          }
          
        } else if (!lpdetect) {
          fill(#FFFFFF);
          textFont(f18, 18);
          textAlign(CENTER);
          smooth();
          text("No Launchpad detected via USB\nWaiting for network connection...", WINDOWSIZE/2, WINDOWSIZE/2);
          if (!online) {
            initServer();
            NETWORK = true;
            NOSEND = true;
          }
          if (slaveConnected) {
            mousestate = "hold";
            menustate = "nothing";
            mselection = 0;
            device = "iPad";
            DEMO = false;
            //HEADLESS = true;
            NOSEND = false;
            state = "run";
            noStroke();
            noFill();
            background(0);
            //initMidiSystem();
            splash(true);
          }
          if (mousestate.equals("hold")) {
            mousestate = "nothing";
          } else {
            mousestate = "quit";
          }
        }
      }
    }
    fill(#FFFFFF);
    textFont(f11, 11);
    textAlign(RIGHT);
    smooth();
    text(UNLICENSED+" v:"+VERSION, WINDOWSIZE-2, WINDOWSIZE-2);
  }
}