import { TheoryINote } from "../interface/TheoryINote"; export class TheoryFirstLastNote { // 添加音符, isGeometryFistNote // WQQ 添加音符, isMeasureEfficientStart 是否是该收 staff(以后都会换成手) 的第一个音 public static addFirstLastNote(noteList_: TheoryINote[]) { let measureRecorder = -1; let rMeasureRecorder = -1; let staffVoiceRecorder = -1; let rStaffVoiceRecorder = -1; let firstNoteForChordFlag = false; let lastNoteForChordFlag = false; // 用来记录当前的 默认值 let lastNoteDefaultX: number | null; for (let i = 0; i < noteList_.length; i++) { // 存储first note // 正向的音 let temp = noteList_[i]; // 反向的音 let reverseTemp = noteList_[noteList_.length - 1 - i]; let reverseTempVoice = reverseTemp.voice; // 排除grace note的这个音 if (!temp.isGrace) { if (measureRecorder !== temp.measureIndex || staffVoiceRecorder !== temp.voice) { // 如果是小节第一个音, 存储物理意义上的第一个音符 temp.isGeometryFirstNoteOfMeasure = true; firstNoteForChordFlag = true; measureRecorder = temp.measureIndex; staffVoiceRecorder = temp.voice; } else if (temp.isChord && firstNoteForChordFlag) { // 又或者, 同一个音符杆上的,多个音符 temp.isGeometryFirstNoteOfMeasure = true; } else { temp.isGeometryFirstNoteOfMeasure = false; firstNoteForChordFlag = false; } } if (!reverseTemp.isGrace) { if (rMeasureRecorder !== reverseTemp.measureIndex || rStaffVoiceRecorder !== reverseTempVoice) { // 如果是小节末尾音 reverseTemp.isGeometryLastNoteOfMeasure = true; if (reverseTemp.isChord) { lastNoteForChordFlag = true; } lastNoteDefaultX = reverseTemp.defaultX; rMeasureRecorder = reverseTemp.measureIndex; rStaffVoiceRecorder = reverseTempVoice; } else if (lastNoteForChordFlag) { reverseTemp.isGeometryLastNoteOfMeasure = true; if ( Math.abs(reverseTemp.defaultX! - lastNoteDefaultX!) <= 13 && !reverseTemp.isRest && !reverseTemp.isChord ) { lastNoteForChordFlag = false; lastNoteDefaultX = (lastNoteDefaultX! + reverseTemp.defaultX!) / 2; } } else { reverseTemp.isGeometryLastNoteOfMeasure = false; lastNoteForChordFlag = false; } } } } }