import { TheoryINote } from "../interface/TheoryINote"; export class Grace { /** * * 添加 grace 信息到 note 上, 给算法发答案 * @static addGraceInformation * @param {INote[]} noteList_ * @memberof GraceNote */ public static addGraceInformation(noteList_: TheoryINote[]) { // 记录下有几个voice在这个曲子中, 要循环几遍 let voiceRecorderArray: number[] = []; for (let i = 0; i < noteList_.length; i++) { const noteVoice = noteList_[i].voice; if (voiceRecorderArray.indexOf(noteVoice) < 0) { voiceRecorderArray.push(noteVoice); } } // 开始先把同一个voice的都放在一个Array中 let graceAccumulation = 0; for (let j = 0; j < voiceRecorderArray.length; j++) { let sameVoiceNoteArray: TheoryINote[] = []; for (let i = 0; i < noteList_.length; i++) { if (noteList_[i].voice === voiceRecorderArray[j]) { sameVoiceNoteArray.push(noteList_[i]); } } // 遍历该同voice的Note object array for (let m = 0; m < sameVoiceNoteArray.length; m++) { if (sameVoiceNoteArray[m].isGrace) { graceAccumulation++; sameVoiceNoteArray[m].hasGraceGroup = false; } else { // 如果是非grace note, 有两种, 一种是 grace note的主音 or 普通音符 (不用考虑 普通音符后面是否是和弦音) if (graceAccumulation > 0) { // 说明这个是主音 sameVoiceNoteArray[m].hasGraceGroup = true; sameVoiceNoteArray[m].graceAccumulation = graceAccumulation; sameVoiceNoteArray[m].graceNotesPitch = []; for (let k = graceAccumulation; k >= 1; k--) { // // 把grace 信息打包到主音上, 发给 AI用 // const gracePitch = TheoryPitch.calculatePitch( // sameVoiceNoteArray[m - k].step!, // sameVoiceNoteArray[m - k].pitchOctave!, // sameVoiceNoteArray[m - k].alter // ); sameVoiceNoteArray[m].graceNotesPitch.push(sameVoiceNoteArray[m - k].pitch); } } else { // 说明这个是普通音 sameVoiceNoteArray[m].graceAccumulation = 0; sameVoiceNoteArray[m].hasGraceGroup = false; } // graceAccumulation 需要清空变成 0 graceAccumulation = 0; } } } } }