Несортированные ключи в заметке будут отсортированы - PullRequest
0 голосов
/ 22 марта 2020

Я создаю нотную запись с несколькими ключами:

const staveNote: vexflow.Flow.StaveNote = new this.VF.StaveNote({
  keys: this.renderNotesSortedByPitch(placedChord.notes),
  duration: chordDuration,
  auto_stem: true,
  clef: Clef.TREBLE
});

private renderNotesSortedByPitch(notes: Array<Note>): Array<string> {
  const vexflowNotes: Array<string> = new Array<string>();
  notes
  // this.sortNotesByPitch(notes)
  .forEach((note: Note) => {
    vexflowNotes.push(this.renderNote(note));
  });
  return vexflowNotes;
}

private sortNotesByPitch(notes: Array<Note>): Array<Note> {
  return notes.sort((noteA: Note, noteB: Note) => {
    return noteA.pitch.chroma.value - noteB.pitch.chroma.value   <--- No arithmetic operation on strings
  });
}

и получаю следующее предупреждение в консоли браузера:

Warning:  Unsorted keys in note will be sorted. See https://github.com/0xfe/vexflow/issues/104 for details. Error
    at Function.b.StackTrace (http://localhost:4200/vendor.js:93990:4976)
    at Function.b.W (http://localhost:4200/vendor.js:93990:5134)
    at http://localhost:4200/vendor.js:93990:255605
    at Array.forEach (<anonymous>)
    at e.value (http://localhost:4200/vendor.js:93990:255572)
    at new e (http://localhost:4200/vendor.js:93990:250357)
    at SheetService.vexflowRenderSoundtrack (http://localhost:4200/main.js:2083:51)
    at SheetService.createSoundtrackSheet (http://localhost:4200/main.js:2004:14)
    at SheetComponent.createSheet (http://localhost:4200/main.js:2465:35)
    at SheetComponent.ngAfterViewInit (http://localhost:4200/main.js:2452:14)

Я понимаю, что мне нужно предоставить ключи уже отсортированы, как Vexflow сортирует их.

Аналогичная проблема также описана там .

Как сортировать ключи с помощью note.pitch.chroma.value быть строкой?

Было бы неплохо иметь какой-то метод таким же образом, как:

staveNote.setKeyStyle(0, { fillStyle: 'red' });

Скажем, какой-нибудь такой метод:

staveNote.setDotted(0);

Или:

staveNote.setKeyStyle(0, { fillStyle: 'red', dotted: true });

ОБНОВЛЕНИЕ: Следуя предложению, я мог бы создать методы сортировки заметок перед добавлением их в качестве ключей в нотный стан:

  private getNoteFrequency(note: Note): number {
    return Tone.Frequency(note.renderAbc()).toFrequency();
  }

  private sortNotesByPitch(notes: Array<Note>): Array<Note> {
    return notes.sort((noteA: Note, noteB: Note) => {
      return this.getNoteFrequency(noteA) - this.getNoteFrequency(noteB);
    });
  }

Предупреждение Vexflow больше не отображался в консоли браузера.

1 Ответ

1 голос
/ 25 марта 2020

Vexflow ожидает, что ваши заметки будут отсортированы по вертикали. Вам нужно написать свою собственную функцию для сравнения двух заметок, представленных в виде строк.

вот рабочая функция сравнения строк-заметок, которая не учитывает случайности: repl.it / repls / WobblyFavorableYottabyte

отредактировано для ясности, спасибо @gristow за исправление!

...