import { TheoryINote } from "../interface/TheoryINote"; // 这个就是 同一个 onset 的音 组成的 object 数组 也就是 chord 和弦 export class TheoryChord { public static classifyNoteByOnsetKey2ChordForAIFirstNote( noteList_: TheoryINote[] ): { [key: string]: { [measureKey: string]: { [onsetKey: string]: TheoryINote[] } } } { let finalObject: { [measureKey: string]: { [onsetKey: string]: TheoryINote[] } } = {}; let finalObject1: { [measureKey: string]: { [onsetKey: string]: TheoryINote[] } } = {}; let finalObject2: { [measureKey: string]: { [onsetKey: string]: TheoryINote[] } } = {}; let measureIndexRecorder = -1; let measureIndexRecorder1 = -1; let measureIndexRecorder2 = -1; noteList_.forEach((note) => { if (note.isRest || note.isTie) { note.isAIFirstNote = false; } else { // keys 返回返回值, 把 onset 推入, 便造成重复 let onsetKey = String(note.onset); let measureIndexKey = String(note.measureIndex); if (measureIndexRecorder !== note.measureIndex) { if (Object.keys(finalObject).indexOf(measureIndexKey) < 0) { finalObject[measureIndexKey] = {}; } measureIndexRecorder = note.measureIndex; } if (Object.keys(finalObject[measureIndexKey]).indexOf(onsetKey) < 0) { // 说明此前没有存过这个onset finalObject[measureIndexKey][onsetKey] = []; } // 那么找到这个onset所在的数组 finalObject[measureIndexKey][onsetKey].push(note); } if (note.staff === 1) { // keys 返回返回值, 把 onset 推入, 便造成重复 if (note.isRest || note.isTie) { note.isMeasureEfficientStart = false; } else { let onsetKey = String(note.onset); let measureIndexKey = String(note.measureIndex); if (measureIndexRecorder1 !== note.measureIndex) { if (Object.keys(finalObject1).indexOf(measureIndexKey) < 0) { finalObject1[measureIndexKey] = {}; } measureIndexRecorder1 = note.measureIndex; } if (Object.keys(finalObject1[measureIndexKey]).indexOf(onsetKey) < 0) { // 说明此前没有存过这个onset finalObject1[measureIndexKey][onsetKey] = []; } // 那么找到这个onset所在的数组 finalObject1[measureIndexKey][onsetKey].push(note); } } else { if (note.isRest || note.isTie) { note.isMeasureEfficientStart = false; } else { // keys 返回返回值, 把 onset 推入, 便造成重复 let onsetKey = String(note.onset); let measureIndexKey = String(note.measureIndex); if (measureIndexRecorder2 !== note.measureIndex) { if (Object.keys(finalObject2).indexOf(measureIndexKey) < 0) { finalObject2[measureIndexKey] = {}; } measureIndexRecorder2 = note.measureIndex; } if (Object.keys(finalObject2[measureIndexKey]).indexOf(onsetKey) < 0) { // 说明此前没有存过这个onset finalObject2[measureIndexKey][onsetKey] = []; } // 那么找到这个onset所在的数组 finalObject2[measureIndexKey][onsetKey].push(note); } } }); return { both: finalObject, staff1: finalObject1, staff2: finalObject2, }; } }