liushengqiang 2 năm trước cách đây
mục cha
commit
1c3a9add03

+ 72 - 32
src/helpers/formateMusic.ts

@@ -2,7 +2,16 @@ import dayjs from "dayjs";
 import duration from "dayjs/plugin/duration";
 import state from "../state";
 import { browser } from "../utils/index";
-import { isSpecialMark, isSpeedKeyword, Fraction, SourceMeasure, isGradientWords, GRADIENT_SPEED_RESET_TAG, StringUtil, OpenSheetMusicDisplay } from "/osmd-extended/src";
+import {
+	isSpecialMark,
+	isSpeedKeyword,
+	Fraction,
+	SourceMeasure,
+	isGradientWords,
+	GRADIENT_SPEED_RESET_TAG,
+	StringUtil,
+	OpenSheetMusicDisplay,
+} from "/osmd-extended/src";
 import { GradualChange, speedInfo } from "./calcSpeed";
 const browserInfo = browser();
 dayjs.extend(duration);
@@ -26,7 +35,6 @@ export const getFixTime = (speed: number) => {
 	return state.isOpenMetronome ? (60 / speed) * formatBeatUnit(beatUnit) * (numerator / denominator) : 0;
 };
 
-
 export const retain = (time: number) => {
 	return Math.ceil(time * 1000000) / 1000000;
 };
@@ -52,7 +60,6 @@ export const getMeasureDurationDiff = (measure: any) => {
 	return SRealValue - RRealValue;
 };
 
-
 /** 按照dorico的渐快渐慢生成对应的速度 */
 export const createSpeedInfo = (gradualChange: GradualChange | undefined, speed: number) => {
 	if (gradualChange && speedInfo[gradualChange.startWord?.toLocaleLowerCase()]) {
@@ -114,7 +121,6 @@ export const getParentNote = (note: any) => {
 	return parentNote;
 };
 
-
 export type FractionDefault = {
 	numerator: number;
 	denominator: number;
@@ -321,7 +327,23 @@ export const isRepeatWord = (text: string): boolean => {
 		const dsRegEx: string = "d\\s?\\.s\\.";
 		const dcRegEx: string = "d\\.\\s?c\\.";
 
-		return innerText === "@" || StringUtil.StringContainsSeparatedWord(innerText, dsRegEx + " al fine", true) || StringUtil.StringContainsSeparatedWord(innerText, dsRegEx + " al coda", true) || StringUtil.StringContainsSeparatedWord(innerText, dcRegEx + " al fine", true) || StringUtil.StringContainsSeparatedWord(innerText, dcRegEx + " al coda", true) || StringUtil.StringContainsSeparatedWord(innerText, dcRegEx) || StringUtil.StringContainsSeparatedWord(innerText, "da\\s?capo", true) || StringUtil.StringContainsSeparatedWord(innerText, dsRegEx, true) || StringUtil.StringContainsSeparatedWord(innerText, "dal\\s?segno", true) || StringUtil.StringContainsSeparatedWord(innerText, "al\\s?coda", true) || StringUtil.StringContainsSeparatedWord(innerText, "to\\s?coda", true) || StringUtil.StringContainsSeparatedWord(innerText, "a (la )?coda", true) || StringUtil.StringContainsSeparatedWord(innerText, "fine", true) || StringUtil.StringContainsSeparatedWord(innerText, "coda", true) || StringUtil.StringContainsSeparatedWord(innerText, "segno", true);
+		return (
+			innerText === "@" ||
+			StringUtil.StringContainsSeparatedWord(innerText, dsRegEx + " al fine", true) ||
+			StringUtil.StringContainsSeparatedWord(innerText, dsRegEx + " al coda", true) ||
+			StringUtil.StringContainsSeparatedWord(innerText, dcRegEx + " al fine", true) ||
+			StringUtil.StringContainsSeparatedWord(innerText, dcRegEx + " al coda", true) ||
+			StringUtil.StringContainsSeparatedWord(innerText, dcRegEx) ||
+			StringUtil.StringContainsSeparatedWord(innerText, "da\\s?capo", true) ||
+			StringUtil.StringContainsSeparatedWord(innerText, dsRegEx, true) ||
+			StringUtil.StringContainsSeparatedWord(innerText, "dal\\s?segno", true) ||
+			StringUtil.StringContainsSeparatedWord(innerText, "al\\s?coda", true) ||
+			StringUtil.StringContainsSeparatedWord(innerText, "to\\s?coda", true) ||
+			StringUtil.StringContainsSeparatedWord(innerText, "a (la )?coda", true) ||
+			StringUtil.StringContainsSeparatedWord(innerText, "fine", true) ||
+			StringUtil.StringContainsSeparatedWord(innerText, "coda", true) ||
+			StringUtil.StringContainsSeparatedWord(innerText, "segno", true)
+		);
 	}
 	return false;
 };
@@ -646,8 +668,8 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 	let gradualSpeed;
 	let gradualChange: GradualChange | undefined;
 	let gradualChangeIndex = 0;
-	let totalMultipleRestMeasures = 0
-	let multipleRestMeasures = 0
+	let totalMultipleRestMeasures = 0;
+	let multipleRestMeasures = 0;
 	const _notes = [] as any[];
 
 	if (state.gradualTimes) {
@@ -716,11 +738,10 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 		currentTimes.push(iterator.currentTimeStamp.realValue - currentTimeStamp);
 		currentTimeStamp = iterator.currentTimeStamp.realValue;
 		for (const v of voiceEntries) {
-			
 			let note = v.notes[0];
-			if (note.IsGraceNote){
+			if (note.IsGraceNote) {
 				// 如果是装饰音, 取不是装饰音的时值
-				const voice = note.parentStaffEntry.voiceEntries.find((_v: any) => !_v.isGrace)
+				const voice = note.parentStaffEntry.voiceEntries.find((_v: any) => !_v.isGrace);
 				note = voice.notes[0];
 			}
 			note.fixedKey = note.ParentVoiceEntry.ParentVoice.Parent.SubInstruments[0].fixedKey || 0;
@@ -774,7 +795,10 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 			// console.log([...activeVerticalMeasureList])
 			const { realValue } = iterator.currentTimeStamp;
 			// console.log({...iterator}, i)
-			const { RealValue: vRealValue, Denominator: vDenominator } = formatDuration(iterator.currentMeasure.activeTimeSignature, iterator.currentMeasure.duration);
+			const { RealValue: vRealValue, Denominator: vDenominator } = formatDuration(
+				iterator.currentMeasure.activeTimeSignature,
+				iterator.currentMeasure.duration
+			);
 			let { wholeValue, numerator, denominator, realValue: NoteRealValue } = note.length;
 			// 管乐迷
 			// if (i === 0 && ["2670"].includes(detailId)) {
@@ -803,7 +827,7 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 			// 如果有节拍器,需要将节拍器的时间算出来
 			if (i === 0) {
 				fixtime += getFixTime(beatSpeed);
-				console.log("🚀 ~ fixtime:", fixtime, beatSpeed)
+				console.log("🚀 ~ fixtime:", fixtime, beatSpeed);
 			}
 			// console.log(getTimeByBeatUnit(beatUnit, measureSpeed, iterator.currentMeasure.activeTimeSignature.Denominator))
 			let gradualLength = 0;
@@ -819,7 +843,11 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 			if (state.gradualTimes && Object.keys(state.gradualTimes).length > 0) {
 				const withInRangeNote = state.gradual.find((item, index) => {
 					const nextItem: any = state.gradual[index + 1];
-					return item[0].measureIndex <= measureListIndex && item[1]?.measureIndex! >= measureListIndex && (!nextItem || nextItem?.[0].measureIndex !== measureListIndex);
+					return (
+						item[0].measureIndex <= measureListIndex &&
+						item[1]?.measureIndex! >= measureListIndex &&
+						(!nextItem || nextItem?.[0].measureIndex !== measureListIndex)
+					);
 				});
 				if (!withInRangeNote) {
 					useGradualTime = 0;
@@ -845,7 +873,7 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 						}
 					}
 				}
-			} else if (state.appName === 'GYM' && gradualChange && gradualSpeed && (gradualChange.startXmlNoteIndex === si || gradualChangeIndex > 0)) {
+			} else if (state.appName === "GYM" && gradualChange && gradualSpeed && (gradualChange.startXmlNoteIndex === si || gradualChangeIndex > 0)) {
 				const startSpeed = gradualSpeed[0] - (gradualSpeed[1] - gradualSpeed[0]);
 				const { resetXmlNoteIndex, endXmlNoteIndex } = gradualChange;
 				const noteDiff = endXmlNoteIndex;
@@ -863,7 +891,8 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 				} else if (resetXmlNoteIndex > gradualChangeIndex) {
 					speed = allNotes[i - 1]?.speed;
 				}
-				beatSpeed = (state.isSpecialBookCategory ? getTimeByBeatUnit(beatUnit, speed, iterator.currentMeasure.activeTimeSignature.Denominator) : baseSpeed) || 1;
+				beatSpeed =
+					(state.isSpecialBookCategory ? getTimeByBeatUnit(beatUnit, speed, iterator.currentMeasure.activeTimeSignature.Denominator) : baseSpeed) || 1;
 				const isEnd = !(gradualChangeIndex < noteDiff) && !(resetXmlNoteIndex > gradualChangeIndex);
 				gradualChangeIndex++;
 				if (isEnd) {
@@ -873,7 +902,7 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 					stepSpeeds = [];
 				}
 			}
-			const _noteLength = NoteRealValue
+			const _noteLength = NoteRealValue;
 			let noteLength = gradualLength ? gradualLength : Math.min(vRealValue, NoteRealValue) * formatBeatUnit(beatUnit) * (60 / beatSpeed);
 			const measureLength = vRealValue * vDenominator * (60 / beatSpeed);
 			// console.table({value: iterator.currentTimeStamp.realValue, vRealValue,NoteRealValue, noteLength,measureLength, MeasureNumberXML: note.sourceMeasure.MeasureNumberXML})
@@ -890,34 +919,45 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 			// console.log(iterator.currentMeasure)
 			// 如果是弱起就补齐缺省的时长
 			if (i === 0) {
-				const diff = getMeasureDurationDiff(iterator.currentMeasure);
-				if (diff > 0) {
-					difftime = diff * formatBeatUnit(beatUnit) * (60 / beatSpeed);
+				let _firstMeasureRealValue = 0;
+				const staffEntries = note.sourceMeasure.verticalMeasureList?.[0]?.staffEntries || [];
+				//计算第一个小节里面的音符时值是否等于整个小节的时值
+				staffEntries.forEach((_a: any) => {
+					if (_a?.sourceStaffEntry?.voiceEntries?.[0]?.notes?.[0]?.length?.realValue) {
+						_firstMeasureRealValue += _a.sourceStaffEntry.voiceEntries[0].notes[0].length.realValue;
+					}
+				});
+				if (_firstMeasureRealValue < vRealValue) {
+					// console.log(_firstMeasureRealValue, vRealValue)
+					// 如果是弱起,将整个小节的时值减去音符的时值,就是缺省的时值
+					difftime = measureLength - noteLength;
+				}
+				if (difftime > 0) {
 					fixtime += difftime;
 				}
-				// diff获取不准确时, 弱起补齐
+				// 管乐迷 diff获取不准确时, 弱起补齐
 				if (["2589", "2561", "2560", "2559", "2558", "2556", "2555", "2554"].includes(detailId)) {
-					difftime = iterator.currentTimeStamp.realValue * formatBeatUnit(beatUnit) * (60 / beatSpeed);
-					fixtime += difftime;
+					// difftime = iterator.currentTimeStamp.realValue * formatBeatUnit(beatUnit) * (60 / beatSpeed);
+					// fixtime += difftime;
 				}
 			}
-			let stave = activeVerticalMeasureList[0]?.stave
+			let stave = activeVerticalMeasureList[0]?.stave;
 			if (!stave && note.isRestFlag && allNotes.length) {
 				// 全休止符, 公用stave
 				// stave = allNotes[allNotes.length - 1].stave
 			}
-			
-			if(note.sourceMeasure.multipleRestMeasures) {
-				totalMultipleRestMeasures = note.sourceMeasure.multipleRestMeasures
-				multipleRestMeasures = 0
+
+			if (note.sourceMeasure.multipleRestMeasures) {
+				totalMultipleRestMeasures = note.sourceMeasure.multipleRestMeasures;
+				multipleRestMeasures = 0;
 			}
 			if (multipleRestMeasures < totalMultipleRestMeasures) {
-				multipleRestMeasures++
+				multipleRestMeasures++;
 			} else {
-				multipleRestMeasures = 0
-				totalMultipleRestMeasures = 0
+				multipleRestMeasures = 0;
+				totalMultipleRestMeasures = 0;
 			}
-			
+
 			// console.log(note.tie)
 			const nodeDetail = {
 				isStaccato: note.voiceEntry.isStaccato(),
@@ -989,7 +1029,7 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 	try {
 		osmd.cursor.reset();
 	} catch (error) {}
-	state.activeMeasureIndex = sortArray[0].MeasureNumberXML
+	state.activeMeasureIndex = sortArray[0].MeasureNumberXML;
 	return sortArray;
 };
 

+ 9 - 10
src/page-orchestra/evaluat-model/index.tsx

@@ -73,7 +73,7 @@ export default defineComponent({
 				times = state.times.filter((n: any, index: number) => {
 					return index >= startIndex && index <= endIndex;
 				});
-				starTime = times[0].sourceRelativeTime || times[0].relativeTime;
+				starTime = times[0].time;
 				console.log("🚀 ~ times", times);
 			}
 			let measureIndex = -1;
@@ -82,9 +82,8 @@ export default defineComponent({
 				const item = times[index];
 				const note = getNoteByMeasuresSlursStart(item);
 				const rate = state.speed / state.originSpeed;
-				const difftime = item.difftime;
-				const start = difftime + (item.sourceRelativeTime || item.relativeTime) - starTime;
-				const end = difftime + (item.sourceRelaEndtime || item.relaEndtime) - starTime;
+				const start = item.time - starTime;
+				const end = item.endtime - starTime;
 				const isStaccato = note.noteElement.voiceEntry.isStaccato();
 				const noteRate = isStaccato ? 0.5 : 1;
 				if (note.formatLyricsEntries.contains("Play") || note.formatLyricsEntries.contains("Play...")) {
@@ -110,19 +109,19 @@ export default defineComponent({
 				// console.log(note.measureOpenIndex, item.measureOpenIndex, note);
 				// console.log("skip", skip)
 				if (note.measureOpenIndex != recordMeasure) {
-					measureIndex++
-					recordMeasure = note.measureOpenIndex
-				  }
+					measureIndex++;
+					recordMeasure = note.measureOpenIndex;
+				}
 				const data = {
-					timeStamp: (start * 1000) / rate,
-					duration: ((end * 1000) / rate - (start * 1000) / rate) * noteRate,
+					timeStamp: start / rate,
+					duration: (end / rate - start / rate) * noteRate,
 					frequency: item.frequency,
 					nextFrequency: item.nextFrequency,
 					prevFrequency: item.prevFrequency,
 					// 重复的情况index会自然累加,render的index是谱面渲染的index
 					measureIndex: measureIndex,
 					measureRenderIndex: item.measureListIndex,
-					dontEvaluating: ListenMode || dontEvaluatingMode || item.skipMode,
+					dontEvaluating: ListenMode || dontEvaluatingMode,
 					musicalNotesIndex: index,
 					denominator: note.noteElement?.Length.denominator,
 					isOrnament: !!note?.voiceEntry?.ornamentContainer,

+ 8 - 6
src/view/evaluating/index.tsx

@@ -15,7 +15,7 @@ import {
 	startSoundCheck,
     api_openWebView,
 } from "/src/helpers/communication";
-import state, { handleStopPlay, resetPlaybackToStart, togglePlay } from "/src/state";
+import state, { clearSelection, handleStopPlay, resetPlaybackToStart, togglePlay } from "/src/state";
 import { IPostMessage } from "/src/utils/native-message";
 export const evaluatingData = reactive({
     /** 评测模块是否加载完成 */
@@ -55,11 +55,11 @@ export const handleStartEvaluat = () => {
 /** 开始播放发送延迟时间 */
 export const sendEvaluatingOffsetTime = (currentTime: number) => {
 	const nowTime = Date.now();
-	// console.log("第一次播放时间", nowTime);
+	// console.log("第一次播放时间", evaluatingData.backtime);
 	// console.log("已播放时长: ", currentTime,  currentTime * 1000);
-	// console.log("不减掉已播放时间: ", nowTime - evaluatingData.backtime);
-	const delayTime = nowTime - evaluatingData.backtime - currentTime * 1000;
-	console.log("真正播放延迟", delayTime);
+	// console.log("不减掉已播放时间: ", nowTime - evaluatingData.backtime , currentTime);
+	const delayTime = (nowTime - evaluatingData.backtime - currentTime * 1000) / 1000;
+	console.log("真正播放延迟", delayTime / 1000);
 	// 蓝牙耳机延迟一点发送消息确保在录音后面
 	setTimeout(async () => {
 		await api_proxyServiceMessage({
@@ -192,7 +192,6 @@ export const handleStartBegin = async () => {
 		return
 	}
 	await startRecording();
-	
 };
 
 /**
@@ -265,6 +264,9 @@ export default defineComponent({
             evaluatingData.checkStep = 0
             evaluatingData.rendered = true
 			sendResult(handleScoreResult);
+			if (!state.isSelectMeasureMode){
+				clearSelection()
+			}
         })
 		onUnmounted(() => {
 			removeResult(handleScoreResult)