Browse Source

feat: midi播放1.3

TIANYONG 1 year ago
parent
commit
97b4876774

+ 8 - 0
src/helpers/communication.ts

@@ -448,4 +448,12 @@ export const api_remove_cloudTimeUpdae = (callback: any) => {
 /** midi播放结束回调 */
 export const api_cloudplayed = (callback: any) => {
 	listenerMessage("cloudplayed", callback);
+};
+
+/** midi评测传offsetTime和micDelay */
+export const api_midiMicDelay = (content: any) => {
+	postMessage({
+		api: "proxyServiceMessage",
+		content,
+	});
 };

+ 7 - 10
src/helpers/midiPlay.tsx

@@ -23,15 +23,12 @@ export const initMidi = (durationNum: number, midiUrl?: string) => {
     api_cloudDestroy();
     // 发送初始化信息
     api_cloudDetail({
-      api: 'cloudDetail',
-      content: {
-        midi: midiUrl,
-        denominator: duration.denominator,
-        numerator: duration.numerator,
-        originalSpeed: state.originSpeed,
-        interval: 50,
-        duration: durationNum * 1000,
-      }
+      midi: midiUrl,
+      denominator: duration.denominator,
+      numerator: duration.numerator,
+      originalSpeed: state.originSpeed,
+      interval: 50,
+      duration: durationNum * 1000,
     }, () => {
       state.midiPlayIniting = false
       initial.value = false
@@ -112,6 +109,6 @@ export const cloudToggleState = async () => {
     // endCapture()
   }
   const cloudGetMediaStatused = await api_cloudGetMediaStatus()
-  state.playState = cloudGetMediaStatused?.content.status === "suspend" ? "play" : "paused"
+  state.playState = cloudGetMediaStatused?.content.status === "suspend" ? "paused" : "play"
   console.log(cloudGetMediaStatused, 'cloudGetMediaStatused')
 }

+ 7 - 1
src/state.ts

@@ -446,6 +446,7 @@ export const customData = reactive({
 });
 /** 在渲染前后计算光标应该走到的音符 */
 const setStep = () => {
+  // console.log('播放状态',state.playState)
   if (state.playState !== "play") {
     console.log("暂停播放");
     return;
@@ -595,6 +596,7 @@ export const skipNotePlay = (itemIndex: number, isStart = false) => {
 export const togglePlay = async (playState?: "play" | "paused") => {
   // midi播放
   if (state.isAppPlay) {
+    if( playState === "paused" ) return
     await api_cloudChangeSpeed({
       speed: state.speed,
       originalSpeed: state.originSpeed,
@@ -1021,7 +1023,11 @@ const setState = (data: any, index: number) => {
   const track = data.code || data.track;
   state.track = track ? track.replace(/ /g, "").toLocaleLowerCase() : "";
   // 能否评测,根据当前声轨有无伴奏判断
-  state.enableEvaluation = state.accompany ? true : false
+  if (state.isAppPlay) {
+    state.enableEvaluation = state.midiUrl ? true : false
+  } else {
+    state.enableEvaluation = state.accompany ? true : false
+  }
   state.isConcert = data.musicSheetType === "CONCERT" ? true : false;
   // multiTracksSelection 返回为空,默认代表全部分轨
   state.canSelectTracks = data.multiTracksSelection === "null" || data.multiTracksSelection === "" || data.multiTracksSelection === null ? [] : data.multiTracksSelection?.split(',');

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

@@ -171,7 +171,7 @@ export default defineComponent({
 
 		// midi播放进度回调
 		const midiProgress = (res: any) => {
-			console.log('api',res)
+			// console.log('api',res)
 			const currentTime = res?.currentTime || res?.content?.currentTime;
 			const total = res?.totalDuration || res?.content?.totalDuration;
 			const time = currentTime / 1000;

+ 24 - 3
src/view/evaluating/index.tsx

@@ -28,6 +28,7 @@ import {
 	addSocketStatus,
 	removeSocketStatus,
 	api_disconnectSocket,
+	api_midiMicDelay,
 } from "/src/helpers/communication";
 import state, {
 	IPlayState,
@@ -40,7 +41,7 @@ import state, {
 import { IPostMessage } from "/src/utils/native-message";
 import { usePageVisibility } from "@vant/use";
 import { browser } from "/src/utils";
-import { getAudioCurrentTime, toggleMutePlayAudio } from "../audio-list";
+import { getAudioCurrentTime, toggleMutePlayAudio, audioListStart } from "../audio-list";
 import { handleStartTick, tickData } from "../tick";
 import AbnormalPop from "../abnormal-pop";
 import { storeData } from "../../store";
@@ -102,6 +103,20 @@ export const evaluatingData = reactive({
 	isAudioPlayEnd: false,
 });
 
+const sendOffsetTime = async (offsetTime: number) => {
+	const delayData = await api_getDeviceDelay();
+	api_midiMicDelay({
+		header: {
+			commond: 'audioPlayStart',
+			type: 'SOUND_COMPARE',
+		  },
+		  body: {
+			offsetTime,
+			micDelay: delayData?.content?.value
+		  },
+	})
+  }
+
 /** 点击开始评测按钮 */
 export const handleStartEvaluat = async () => {
 	if (state.modeType === "evaluating") {
@@ -348,11 +363,17 @@ export const handleStartBegin = async (preTimes?: number) => {
 		accompanimentState: state.setting.enableAccompaniment ? 1 : 0,
 		firstNoteTime: preTimes || 0,
 	});
-
+	if (state.isAppPlay) {
+		sendOffsetTime(0)
+	}
 	// 如果开启了摄像头, 开启录制视频
 	if (state.setting.camera) {
 		console.log("开始录制视频");
-		api_startCapture();
+		await api_startCapture();
+	}
+	// 如果是midi音频评测,需要调用cloudPlay
+	if (state.isAppPlay) {
+		audioListStart(state.playState);
 	}
 };