liushengqiang 2 년 전
부모
커밋
2f46a5924e
4개의 변경된 파일33개의 추가작업 그리고 12개의 파일을 삭제
  1. 6 1
      src/helpers/communication.ts
  2. 1 0
      src/helpers/formateMusic.ts
  3. 11 9
      src/page-orchestra/evaluat-model/index.tsx
  4. 15 2
      src/view/evaluating/index.tsx

+ 6 - 1
src/helpers/communication.ts

@@ -54,10 +54,15 @@ export const cancelEvaluating = () => {
 };
 };
 
 
 /** 评测开始录音 */
 /** 评测开始录音 */
-export const startRecording = (): Promise<IPostMessage | undefined> => {
+export const api_startRecording = (): Promise<IPostMessage | undefined> => {
 	if (!storeData.isApp) return Promise.resolve({} as any);
 	if (!storeData.isApp) return Promise.resolve({} as any);
 	return promisefiyPostMessage({ api: "startRecording" });
 	return promisefiyPostMessage({ api: "startRecording" });
 };
 };
+/** 评测结束录音 */
+export const api_stopRecording = (): Promise<IPostMessage | undefined> => {
+	if (!storeData.isApp) return Promise.resolve({} as any);
+	return promisefiyPostMessage({ api: "stopRecording" });
+};
 
 
 /** 和websocket通信 */
 /** 和websocket通信 */
 export const api_proxyServiceMessage = (content: any): Promise<IPostMessage | undefined> => {
 export const api_proxyServiceMessage = (content: any): Promise<IPostMessage | undefined> => {

+ 1 - 0
src/helpers/formateMusic.ts

@@ -827,6 +827,7 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 			// 如果有节拍器,需要将节拍器的时间算出来
 			// 如果有节拍器,需要将节拍器的时间算出来
 			if (i === 0) {
 			if (i === 0) {
 				fixtime += getFixTime(beatSpeed);
 				fixtime += getFixTime(beatSpeed);
+				state.fixtime = fixtime;
 				console.log("🚀 ~ fixtime:", fixtime, beatSpeed);
 				console.log("🚀 ~ fixtime:", fixtime, beatSpeed);
 			}
 			}
 			// console.log(getTimeByBeatUnit(beatUnit, measureSpeed, iterator.currentMeasure.activeTimeSignature.Denominator))
 			// console.log(getTimeByBeatUnit(beatUnit, measureSpeed, iterator.currentMeasure.activeTimeSignature.Denominator))

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

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

+ 15 - 2
src/view/evaluating/index.tsx

@@ -11,12 +11,14 @@ import {
 	removeResult,
 	removeResult,
 	sendResult,
 	sendResult,
 	startEvaluating,
 	startEvaluating,
-	startRecording,
 	startSoundCheck,
 	startSoundCheck,
     api_openWebView,
     api_openWebView,
+	api_startRecording,
+	api_stopRecording,
 } from "/src/helpers/communication";
 } from "/src/helpers/communication";
 import state, { clearSelection, handleStopPlay, resetPlaybackToStart, togglePlay } from "/src/state";
 import state, { clearSelection, handleStopPlay, resetPlaybackToStart, togglePlay } from "/src/state";
 import { IPostMessage } from "/src/utils/native-message";
 import { IPostMessage } from "/src/utils/native-message";
+import { usePageVisibility } from "@vant/use";
 export const evaluatingData = reactive({
 export const evaluatingData = reactive({
     /** 评测模块是否加载完成 */
     /** 评测模块是否加载完成 */
     rendered: false,
     rendered: false,
@@ -191,7 +193,8 @@ export const handleStartBegin = async () => {
 		evaluatingData.startBegin = false;
 		evaluatingData.startBegin = false;
 		return
 		return
 	}
 	}
-	await startRecording();
+	// 开始录音
+	api_startRecording();
 };
 };
 
 
 /**
 /**
@@ -202,6 +205,9 @@ export const handleEndEvaluat = () => {
 	// 没有开始评测 , 不是评测模式 , 不评分
 	// 没有开始评测 , 不是评测模式 , 不评分
 	if (!evaluatingData.startBegin || state.modeType !== 'evaluating') return
 	if (!evaluatingData.startBegin || state.modeType !== 'evaluating') return
 	evaluatingData.startBegin = false;
 	evaluatingData.startBegin = false;
+	// 结束录音
+	api_stopRecording();
+	// 结束评测
 	endEvaluating({
 	endEvaluating({
 		musicScoreId: state.examSongId,
 		musicScoreId: state.examSongId,
 	});
 	});
@@ -255,6 +261,13 @@ export const handleViewReport = () => {
 export default defineComponent({
 export default defineComponent({
 	name: "evaluating",
 	name: "evaluating",
 	setup() {
 	setup() {
+		const pageVisibility = usePageVisibility();
+
+		watch(pageVisibility, (value) => {
+			if (value == 'hidden' && evaluatingData.startBegin){
+				handleEndBegin()
+			}
+		});
         onMounted(() => {
         onMounted(() => {
 			evaluatingData.resultData = {}
 			evaluatingData.resultData = {}
             // evaluatingData.resultData = {...getLeveByScore(90), score: 30, intonation: 10, cadence: 30, integrity: 40}
             // evaluatingData.resultData = {...getLeveByScore(90), score: 30, intonation: 10, cadence: 30, integrity: 40}