Quellcode durchsuchen

Merge branch 'feature-tianyong-newVersion' into ktyq-online-new

TIANYONG vor 6 Tagen
Ursprung
Commit
c1a47b274f

+ 2 - 1
src/helpers/formateMusic.ts

@@ -1467,7 +1467,8 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 				trackIndex: note.trackIndex, // 当前的音符属于第几条分轨
 				isStaccato: note.voiceEntry.isStaccato(),
 				isRestFlag: note.isRestFlag,
-				noteId: note.NoteToGraphicalNoteObjectId,
+				// noteId: note.NoteToGraphicalNoteObjectId,
+				noteId: note.NoteToGraphicalNoteObjectId === undefined ? `restNote${note.sourceMeasure.MeasureNumberXML}` : note.NoteToGraphicalNoteObjectId,
 				measureListIndex: note.sourceMeasure.measureListIndex,
 				MeasureNumberXML: note.sourceMeasure.MeasureNumberXML, // 当前的小节数,(从1开始)
 				_noteLength: _noteLength,

+ 3 - 1
src/helpers/midiPlay.tsx

@@ -97,11 +97,13 @@ export const cloudToggleState = async (type: "play" | "paused") => {
     if (state.isSelectMeasureMode) {
       audioData.progress = state.midiSectionStart
     }
+    console.log('midi速度',state.originSpeed,state.speed)
     await api_cloudPlay({
       songID: state.examSongId,
       startTime: audioData.progress * 1000,
       originalSpeed: state.originSpeed, // midi初始速度
-      speed: state.modeType === "evaluating" ? state.originSpeed : state.speed,
+      // speed: state.modeType === "evaluating" ? state.originSpeed : state.speed,
+      speed: state.speed,
       hertz: 440, //SettingState.sett.hertz,
     })
     // startCapture()

+ 8 - 3
src/page-instrument/custom-plugins/guide-driver/index.tsx

@@ -1444,13 +1444,18 @@ export const EvaluatingReportDriver = defineComponent({
             title: "",
             description: "",
             popoverClass: "popoverClass popoverClassReport3 popoverClose",
-            align: "start",
+            align: "end",
             side: "bottom",
             prevBtnText: "再看一遍",
             doneBtnText: "完成",
             showButtons: ["next", "previous"],
             onPopoverRender: (popover: PopoverDOM, options: { config: Config; state: State }) => {
-              driverInitialPosition(popover, options);
+              options.config.stageRadius = 8;
+              options.config.stagePadding = 5;
+              try {
+                const rect = options.state.activeElement?.getBoundingClientRect();
+                popover.wrapper.style.marginLeft = ((rect?.width || 0) / 2) * -1 + 4 + "px";
+              } catch {}
             },
             onPrevClick: () => {
               driverObj.drive(0);
@@ -1552,4 +1557,4 @@ export const EvaluatingReportDriver = defineComponent({
       </Teleport>
     );
   },
-});
+});

+ 2 - 0
src/page-instrument/custom-plugins/recording-time/index.tsx

@@ -16,6 +16,8 @@ const handleRecord = () => {
 	recordData.starTime = Date.now();
 	if (total < 0) total = 0;
 	const totalTime = total / 1000;
+	// 练习时长不足1秒,不提交记录
+	if (totalTime < 1) return; 
 	const rate = state.basePlayRate * state.originAudioPlayRate; // 播放倍率    
 	// 如果是选段,则选选段开头小节的速度
 	const currentSpeed = state.sectionStatus && state.section.length === 2 && state.section[0].measureSpeed ? state.section[0].measureSpeed * state.basePlayRate : state.speed;

+ 3 - 0
src/page-instrument/custom-plugins/work-ealuating/index.tsx

@@ -106,6 +106,9 @@ export default defineComponent({
 						evaluatingData.showOpenCameraPop = true
 					}
 				}
+			},
+			{
+				immediate: true
 			}
 		);
 		onMounted(() => {

+ 2 - 0
src/page-instrument/custom-plugins/work-home/index.tsx

@@ -87,6 +87,8 @@ export default defineComponent({
 		/** 添加作业记录 */
 		const addHomeworkRecored = async (extraType?: string) => {
 			let total = extraType === 'save' ? training.realThisTimeTotal : Math.floor((Date.now() - training.starTime) / 1000);
+			// 作业时长不足1秒,不提交记录
+			if (total < 1) return;
 			try {
 				let params: any = {
 					id: props.workeData.id,

+ 4 - 0
src/page-instrument/evaluat-model/evaluat-result/index.tsx

@@ -41,6 +41,10 @@ export default defineComponent({
     };
     /** 添加评测记录 */
     const handleAddRecord = async () => {
+      // 评测时长不足1秒,不生成记录
+      if (evaluatingData.resultData.playTime / 1000 < 1) {
+        return;
+      }
       console.log("结束", evaluatingData.resultData);
       /** 生成评测记录的时候,记录当前评测的谱面类型,用于评测报告默认展示的谱面类型 */
       evaluatingData.resultData.scoreData.musicType = state.musicRenderType;

+ 11 - 3
src/page-instrument/evaluat-model/index.tsx

@@ -10,7 +10,7 @@ import { getNoteByMeasuresSlursStart } from "/src/helpers/formateMusic";
 import { Icon, Popup, showToast, closeToast, showLoadingToast } from "vant";
 import EvaluatResult from "./evaluat-result";
 import EvaluatAudio from "./evaluat-audio";
-import { api_getDeviceDelay, api_openAdjustRecording, api_proxyServiceMessage, api_videoUpdate, getEarphone, api_back, api_startDelayCheck, api_cancelDelayCheck, api_remove_cancelDelayCheck, api_closeDelayCheck, api_finishDelayCheck, api_retryEvaluating, api_remove_finishDelayCheck, api_workUpdate } from "/src/helpers/communication";
+import { api_getDeviceDelay, api_openAdjustRecording, api_proxyServiceMessage, api_videoUpdate, getEarphone, api_back, api_startDelayCheck, api_cancelDelayCheck, api_remove_cancelDelayCheck, api_closeDelayCheck, api_finishDelayCheck, api_retryEvaluating, api_remove_finishDelayCheck, api_workUpdate, api_cloudSuspend } from "/src/helpers/communication";
 import EvaluatShare from "./evaluat-share";
 import { Vue3Lottie } from "vue3-lottie";
 import startData from "./data/start.json";
@@ -230,7 +230,8 @@ export default defineComponent({
       if (preTimes.length) {
         for (let index = preTimes.length-1; index >= 0; index--) {
           const item = preTimes[index]
-          const note = getNoteByMeasuresSlursStart(item)
+          // const note = getNoteByMeasuresSlursStart(item)
+          const note = item
           if (note.formatLyricsEntries.contains('Play') || note.formatLyricsEntries.contains('Play...')) {
             preLyricsContent = 'Play'
             break
@@ -244,7 +245,8 @@ export default defineComponent({
       }      
       for (let index = 0; index < selectTimes.length; index++) {
         const item = selectTimes[index];
-        const note = getNoteByMeasuresSlursStart(item);
+        // const note = getNoteByMeasuresSlursStart(item);
+        const note = item;
         // #8701 bug: 评测模式,是以曲谱本身的速度进行评测,所以rate取1,不需要转换
         // const rate = state.speed / state.originSpeed;
         const rate = state.basePlayRate * state.originAudioPlayRate; // 播放倍率
@@ -392,6 +394,12 @@ export default defineComponent({
          */
         // startBtnHandle();
       } else if (type === "selfCancel") {
+        // 如果是midi的曲子,需要暂停midi播放
+        if (state.isAppPlay) {
+          api_cloudSuspend({
+            songID: state.examSongId,
+          })
+        }        
         // 再来一次,需要手动取消评测,不生成评测记录,不显示评测结果弹窗
         evaluatingData.oneselfCancleEvaluating = true;
         // handleCancelEvaluat();

+ 1 - 1
src/page-instrument/header-top/index.module.less

@@ -346,7 +346,7 @@
 
 .disabled {
     pointer-events: none;
-    opacity: .5;
+    opacity: .5 !important;
 }
 
 .playBtn {

+ 21 - 5
src/state.ts

@@ -425,7 +425,13 @@ export const onPlay = () => {
 const autoResetPlay = () => {
   // 作业模式,出现作业提交弹窗时,不进行自动重播逻辑
   if (state.modeType !== "practise" || state.showWorkDonePop) return;
-  skipNotePlay(0, true);
+  // 如果是midi的曲子,并且有选段,重置到预备小节的位置
+  if (state.isAppPlay && state.section.length === 2) {
+    const startItemINdex = state.sectionFirst ? state.sectionFirst.i : state.section[1].i;
+    skipNotePlay(startItemINdex, true);
+  } else {
+    skipNotePlay(0, true);
+  }
   // 没有开启自动重播, 不是练习模式
   if (!state.setting.repeatAutoPlay) return;
   offsetTop = 0;
@@ -584,12 +590,17 @@ const handlePlaying = () => {
 
 };
 /** 跳转到指定音符开始播放 */
-export const skipNotePlay = async (itemIndex: number, isStart = false) => {
+export const skipNotePlay = async (itemIndex: number, isStart = false, handType?: string) => {
   if (state.isPreView) return;
-  console.log('点击音符')
   // 点击或者重播的时候清除一行谱的时间信息
   state.isSingleLine && (smoothAnimationState.oldCurrentTime = 0)
+  if (handType === 'manual' && (query.workRecord)) return;
   const item = state.times[itemIndex];
+  // 如果是选段状态,可以点击段落范围内的音符,从当前音符开始播放,如果不是段落内的音符,直接return
+  if (handType === 'manual' && state.section.length === 2 && !(item.MeasureNumberXML >= state.section[0].MeasureNumberXML && item.MeasureNumberXML <= state.section[1].MeasureNumberXML)) {
+    return;
+  }  
+  console.log('点击音符')
   let itemTime = item.time;
   if (isStart) {
     itemTime = 0;
@@ -656,7 +667,8 @@ export const togglePlay = async (playState: "play" | "paused", isForceCLoseToast
     }
     skipNotePlay(state.activeNoteIndex, false);
     await api_cloudChangeSpeed({
-      speed: state.modeType === "evaluating" ? state.originSpeed : state.speed,
+      // speed: state.modeType === "evaluating" ? state.originSpeed : state.speed,
+      speed: state.speed,
       originalSpeed: state.originSpeed,
       songID: state.examSongId,
     });
@@ -1444,7 +1456,7 @@ function initMusicSource(data: any, tracks: string[], partIndex: number, workRec
     state.partListNames = tracks
   }
   // 当没有任何曲目的时候报错
-  if (!musicObj?.audioFileUrl && !accompanyObj?.audioFileUrl && !fanSongObj?.audioFileUrl && !banSongObj?.audioFileUrl && !fanSongObj?.solmizationFileUrl && !fanSongObj?.femaleSolmizationFileUrl) {
+  if (!musicObj?.audioFileUrl && !accompanyObj?.audioFileUrl && !fanSongObj?.audioFileUrl && !banSongObj?.audioFileUrl && !fanSongObj?.solmizationFileUrl && !fanSongObj?.femaleSolmizationFileUrl && data.playMode !== 'MIDI') {
     state.noMusicSource = true // 没有音源文件
     // 独奏的时候
     if(musicSheetType === "SINGLE"){
@@ -1609,6 +1621,10 @@ const setState = (data: any, index: number) => {
   state.isShowFingering = data.isShowFingering ? true : false;
   // 设置曲谱的播放模式, APP播放(midi音频是app播放) | h5播放
   state.isAppPlay = data.playMode === 'MIDI';
+  if (state.isAppPlay) {
+    state.isOpenMetronome = false
+    state.isSingOpenMetronome = false
+  }
   state.midiUrl = data.midiFileUrl;
   state.parentCategoriesId = data.musicTag;
   state.musicSheetCategoriesId = data.musicCategoryId;

+ 1 - 1
src/view/audio-list/index.tsx

@@ -395,7 +395,7 @@ export async function changeCombineAudio (combineIndex: string){
 		// 当开启节拍器的时候,切为伴奏的时候合成节拍器1
 		await handleLoadBeatMusic()
 		// 当没有背景音文件的时候
-		if(!state.accompany && !state.fanSong && !state.banSong) {
+		if(!state.accompany && !state.fanSong && !state.banSong && !state.isAppPlay) {
 			state.noMusicSource = true
 		}
 		//设置进度

+ 9 - 1
src/view/evaluating/index.tsx

@@ -347,6 +347,14 @@ const handleScoreResult = (res?: IPostMessage) => {
           evaluatingData.hideResultModal = true;
         }
         evaluatingData.resulstMode = evaluatingData.isErrorState ? false : true;
+        // 评测不足1秒,不保存记录,不显示评测结果弹窗
+        console.log('评测时长',evaluatingData.resultData.playTime)
+        if (evaluatingData.resultData.playTime / 1000 < 1) {
+          evaluatingData.resulstMode = false
+          showToast({
+            message: "评测时间过短,无法生成评分",
+          });
+        }
         evaluatingData.startBegin = false;
         evaluatingData.evaluatResultLoading = false;
       }, 200);
@@ -462,7 +470,7 @@ export const handleStartBegin = async (preTimes?: number) => {
 	// 如果是midi音频评测,需要调用cloudPlay
 	if (state.isAppPlay) {
 		await api_cloudChangeSpeed({
-			speed: state.originSpeed,
+			speed: state.speed,
 			originalSpeed: state.originSpeed,
 			songID: state.examSongId,
 		});

+ 2 - 0
src/view/follow-practice/index.tsx

@@ -32,6 +32,8 @@ const handleRecord = (total: number) => {
 	if (query.isCbs) return
 	if (total < 0) total = 0;
 	const totalTime = total / 1000;
+	// 跟练时长不足1秒,不生成记录
+	if (totalTime < 1) return; 
 	const rate = state.basePlayRate * state.originAudioPlayRate; // 播放倍率    
 	// 如果是选段,则选选段开头小节的速度
 	const currentSpeed = state.sectionStatus && state.section.length === 2 && state.section[0].measureSpeed ? state.section[0].measureSpeed * state.basePlayRate : state.speed;

+ 2 - 2
src/view/selection/index.module.less

@@ -83,9 +83,9 @@
 
 .scoreItem {
     position: absolute;
-    left: 80%;
+    right: 10px;
     top: -45px;
-    transform: translateX(-50%);
+    // transform: translateX(-50%);
     font-size: 18px;
     font-family: "Roboto", sans-serif;
     font-weight: bold;

+ 2 - 2
src/view/selection/index.tsx

@@ -220,7 +220,7 @@ export default defineComponent({
 		};
 		/** 是否可以点击音符 */
 		const disableClickNote = computed(() => {
-			return state.sectionStatus || (state.modeType === "evaluating");
+			return (state.sectionStatus && state.section.length != 2) || (state.modeType === "evaluating");
 		});
 		// 选段符号
 		const sectionPosData = computed(() => {
@@ -364,7 +364,7 @@ export default defineComponent({
 							<div
 								class={[styles.position, disableClickNote.value && styles.disable, styles.note, `noteIndex_${item.index}`]}
 								style={item.bbox}
-								onClick={() => skipNotePlay(item.index)}
+								onClick={() => skipNotePlay(item.index, false, 'manual')}
 							>
 								{/* <div class={styles.noteFollow} data-vf={"vf" + item.id}>
 									<Icon name="success" />