import { TheoryINote } from "../interface/TheoryINote"; import { TheoryChord } from "./TheoryChord"; /** * 主要针对算法的具体要求定制 */ export class TheoryAINote { public static addAIFirstNote(noteList_: TheoryINote[]) { let chordNoRestTie = TheoryChord.classifyNoteByOnsetKey2ChordForAIFirstNote(noteList_).both; for (const measureKey in chordNoRestTie) { if (chordNoRestTie.hasOwnProperty(measureKey)) { const sameMeasureOnsetsObj = chordNoRestTie[measureKey]; let onsets = Object.keys(sameMeasureOnsetsObj).sort((a, b) => parseFloat(a) - parseFloat(b)); let init = 0; for (let i = 0; i < onsets.length; i++) { let onset = onsets[i]; const sameOnsetArray = sameMeasureOnsetsObj[onset.toString()]; sameOnsetArray.forEach((note) => { if (init === 0) { note.isAIFirstNote = true; } else { note.isAIFirstNote = false; } }); init++; } } } // 单手的 efficientMeasureStart // 先获得单手的 和弦 let chordNoRestTieStaff1 = TheoryChord.classifyNoteByOnsetKey2ChordForAIFirstNote(noteList_).staff1; for (const measureKey in chordNoRestTieStaff1) { if (chordNoRestTieStaff1.hasOwnProperty(measureKey)) { const sameMeasureOnsetsObj = chordNoRestTieStaff1[measureKey]; let onsets = Object.keys(sameMeasureOnsetsObj).sort((a, b) => parseFloat(a) - parseFloat(b)); let init = 0; for (let i = 0; i < onsets.length; i++) { let onset = onsets[i]; const sameOnsetArray = sameMeasureOnsetsObj[onset.toString()]; sameOnsetArray.forEach((note) => { if (init === 0) { note.isMeasureEfficientStart = true; } else { note.isMeasureEfficientStart = false; } }); init++; } } } // 单手的 efficientMeasureStart // 先获得单手的 和弦 let chordNoRestTieStaff2 = TheoryChord.classifyNoteByOnsetKey2ChordForAIFirstNote(noteList_).staff2; for (const measureKey in chordNoRestTieStaff2) { if (chordNoRestTieStaff2.hasOwnProperty(measureKey)) { const sameMeasureOnsetsObj = chordNoRestTieStaff2[measureKey]; let onsets = Object.keys(sameMeasureOnsetsObj).sort((a, b) => parseFloat(a) - parseFloat(b)); let init = 0; for (let i = 0; i < onsets.length; i++) { let onset = onsets[i]; const sameOnsetArray = sameMeasureOnsetsObj[onset.toString()]; sameOnsetArray.forEach((note) => { if (init === 0) { note.isMeasureEfficientStart = true; } else { note.isMeasureEfficientStart = false; } }); init++; } } } } }