Example #1
0
  /**
   * Returns the index with which to start parsing the next part of the string, once this method is
   * done with its part
   */
  private int parseChordInversion(String s, int index, NoteContext context) {
    if (!context.isChord) {
      return index;
    }

    int inversionCount = 0;
    boolean bassNote = false;

    int startIndex = index;
    boolean checkForInversion = true;
    while (checkForInversion) {
      if (index < s.length()) {
        switch (s.charAt(index)) {
          case '^':
            index++;
            inversionCount++;
            break;
          case 'C':
            index++;
            bassNote = true;
            break;
          case 'D':
            index++;
            bassNote = true;
            break;
          case 'E':
            index++;
            bassNote = true;
            break;
          case 'F':
            index++;
            bassNote = true;
            break;
          case 'G':
            index++;
            bassNote = true;
            break;
          case 'A':
            index++;
            bassNote = true;
            break;
          case 'B':
            index++;
            bassNote = true;
            break;
          case '#':
            index++;
            break; // presumably the sharp mark followed a note
            // For '0', need to differentiate between initial 0 and 0 as a second digit (i.e., 10)
          case '0':
            index++;
            inversionCount = (inversionCount == -1) ? 0 : inversionCount + 10;
            break;
          case '1':
            index++;
            inversionCount = 1;
            break;
          case '2':
            index++;
            inversionCount = 2;
            break;
          case '3':
            index++;
            inversionCount = 3;
            break;
          case '4':
            index++;
            inversionCount = 4;
            break;
          case '5':
            index++;
            inversionCount = 5;
            break;
          case '6':
            index++;
            inversionCount = 6;
            break;
          case '7':
            index++;
            inversionCount = 7;
            break;
          case '8':
            index++;
            inversionCount = 8;
            break;
          case '9':
            index++;
            inversionCount = 9;
            break;
            // For '[', we're checking for a note number after the inversion marker
          case '[':
            int indexEndBracket = s.indexOf(']', index);
            context.inversionBassNote =
                Note.getToneString(Byte.parseByte(s.substring(index + 1, indexEndBracket - 1)));
            index = indexEndBracket + 1;
            break;
          default:
            checkForInversion = false;
            break;
        }
      } else {
        checkForInversion = false;
      }
    }

    // Modify the note values based on the inversion
    if (bassNote) {
      context.inversionBassNote = context.inversionBassNote = s.substring(startIndex + 1, index);
    } else if (inversionCount > 0) {
      context.inversionCount = inversionCount;
    }
    return index;
  }