static getNoteDetails(value) {

    if (Number.isInteger(value)) value = this.toNoteIdentifier(value);

    const matches = value.match(/^([CDEFGAB])(#{0,2}|b{0,2})(-?\d+)$/i);
    if (!matches) throw new TypeError("Invalid note identifier");

    const name = matches[1].toUpperCase();
    const octave = parseInt(matches[3]);
    let accidental = matches[2].toLowerCase();
    accidental = accidental === "" ? undefined : accidental;

    const fragments = {
      accidental: accidental,
      identifier: name + (accidental || "") + octave,
      name: name,
      octave: octave
    };

    return fragments;

  }
Given a proper note identifier (`C#4`, `Gb-1`, etc.) or a valid MIDI note number (0-127), this
method returns an object containing broken down details about the specified note (uppercase
letter, accidental and octave).

When a number is specified, the translation to note is done using a value of 60 for middle C
(C4 = middle C).

@param value {string|number} A note identifier A  atring ("C#4", "Gb-1", etc.) or a MIDI note
number (0-127).

@returns {{accidental: string, identifier: string, name: string, octave: number }}

@throws TypeError Invalid note identifier

@since 3.0.0
@static