/** * 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; }