|
@@ -6,10 +6,10 @@ import { GradualNote, GradualTimes, GradualVersion } from "./type";
|
|
|
import { handleEndEvaluat, handleStartEvaluat } from "./view/evaluating";
|
|
|
import { IFingering, mappingVoicePart, subjectFingering, matchVoicePart } from "/src/view/fingering/fingering-config";
|
|
|
import { handleStartTick } from "./view/tick";
|
|
|
-import { audioListStart, getAudioCurrentTime, getAudioDuration, setAudioCurrentTime, setAudioPlaybackRate } from "./view/audio-list";
|
|
|
+import { audioListStart, getAudioCurrentTime, getAudioDuration, setAudioCurrentTime, setAudioPlaybackRate, audioData } from "./view/audio-list";
|
|
|
import { toggleFollow } from "./view/follow-practice";
|
|
|
import { browser, setStorageSpeed, setGlobalData } from "./utils";
|
|
|
-import { api_createMusicPlayer } from "./helpers/communication";
|
|
|
+import { api_cloudGetMediaStatus, api_createMusicPlayer, api_cloudChangeSpeed, api_cloudSuspend, api_cloudSetCurrentTime, api_cloudDestroy } from "./helpers/communication";
|
|
|
import { verifyCanRepeat, getDuration } from "./helpers/formateMusic";
|
|
|
import { getMusicSheetDetail } from "./utils/baseApi"
|
|
|
import { getQuery } from "/src/utils/queryString";
|
|
@@ -40,6 +40,11 @@ export enum IPlatform {
|
|
|
PC = "PC",
|
|
|
}
|
|
|
|
|
|
+export type ISonges = {
|
|
|
+ background?: string
|
|
|
+ music?: string
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* 特殊教材分类id
|
|
|
*/
|
|
@@ -364,7 +369,7 @@ const state = reactive({
|
|
|
},
|
|
|
/** 后台设置的基准评测频率 */
|
|
|
baseFrequency: 440,
|
|
|
- /** 节拍器的时间 */
|
|
|
+ /** mp3节拍器的时间,统计拍数、速度计算得出 */
|
|
|
fixtime: 0,
|
|
|
/** 指法信息 */
|
|
|
fingeringInfo: {} as IFingering,
|
|
@@ -419,7 +424,17 @@ const state = reactive({
|
|
|
/** 是否为详情预览模式 */
|
|
|
isPreView: false,
|
|
|
/** 是否为评测报告模式 */
|
|
|
- isEvaluatReport: false,
|
|
|
+ isEvaluatReport: false,
|
|
|
+ /** midi播放器是否初始化中 */
|
|
|
+ midiPlayIniting: false,
|
|
|
+ /** 曲目信息 */
|
|
|
+ songs: {} as ISonges,
|
|
|
+ isAppPlay: false, // 是否midi音频,midi是app播放
|
|
|
+ /** 音频播放器实例 */
|
|
|
+ audiosInstance: null as any,
|
|
|
+ /** midi音频的时长 */
|
|
|
+ durationNum: 0,
|
|
|
+ midiSectionStart: 0,
|
|
|
});
|
|
|
const browserInfo = browser();
|
|
|
let offset_duration = 0;
|
|
@@ -432,6 +447,7 @@ export const customData = reactive({
|
|
|
});
|
|
|
/** 在渲染前后计算光标应该走到的音符 */
|
|
|
const setStep = () => {
|
|
|
+ // console.log('播放状态',state.playState)
|
|
|
if (state.playState !== "play") {
|
|
|
console.log("暂停播放");
|
|
|
return;
|
|
@@ -475,6 +491,10 @@ const autoResetPlay = () => {
|
|
|
/** 播放完成事件 */
|
|
|
export const onEnded = () => {
|
|
|
console.log("音频播放结束");
|
|
|
+ // if (state.isAppPlay) {
|
|
|
+ // // 销毁播放器
|
|
|
+ // api_cloudDestroy();
|
|
|
+ // }
|
|
|
// 修改状态为结束
|
|
|
state.playEnd = true;
|
|
|
state.playState = "paused";
|
|
@@ -535,14 +555,14 @@ const handlePlaying = () => {
|
|
|
|
|
|
// if (Math.abs(selectEndItem.endtime - currentTime) < offset_duration) {
|
|
|
if (currentTime - selectEndItem.endtime > offset_duration) {
|
|
|
- console.log("选段播放结束");
|
|
|
+ console.log("选段播放结束",state.setting.repeatAutoPlay);
|
|
|
// 如果为选段评测模式
|
|
|
if (state.modeType === "evaluating" && state.isSelectMeasureMode) {
|
|
|
onEnded();
|
|
|
return;
|
|
|
}
|
|
|
// #8698 bug修复
|
|
|
- if (state.modeType === "practise" && state.sectionStatus && !state.setting.repeatAutoPlay) {
|
|
|
+ if (state.modeType === "practise" && state.sectionStatus) {
|
|
|
onEnded();
|
|
|
resetPlaybackToStart();
|
|
|
return;
|
|
@@ -561,7 +581,7 @@ const handlePlaying = () => {
|
|
|
metronomeData.metro?.sound(currentTime);
|
|
|
};
|
|
|
/** 跳转到指定音符开始播放 */
|
|
|
-export const skipNotePlay = (itemIndex: number, isStart = false) => {
|
|
|
+export const skipNotePlay = async (itemIndex: number, isStart = false) => {
|
|
|
const item = state.times[itemIndex];
|
|
|
let itemTime = item.time;
|
|
|
if (isStart) {
|
|
@@ -571,6 +591,14 @@ export const skipNotePlay = (itemIndex: number, isStart = false) => {
|
|
|
setAudioCurrentTime(itemTime, itemIndex);
|
|
|
gotoNext(item);
|
|
|
metronomeData.metro?.sound(itemTime);
|
|
|
+ if (state.isAppPlay) {
|
|
|
+ await api_cloudSetCurrentTime({
|
|
|
+ currentTime: itemTime * 1000,
|
|
|
+ songID: state.examSongId,
|
|
|
+ })
|
|
|
+ audioData.progress = itemTime
|
|
|
+ state.midiSectionStart = itemTime
|
|
|
+ }
|
|
|
}
|
|
|
};
|
|
|
|
|
@@ -579,7 +607,26 @@ export const skipNotePlay = (itemIndex: number, isStart = false) => {
|
|
|
* @param playState 可选: 默认 undefined, 需要切换的状态 play:播放, paused: 暂停
|
|
|
*/
|
|
|
export const togglePlay = async (playState?: "play" | "paused") => {
|
|
|
- state.playState = playState ? playState : state.playState === "paused" ? "play" : "paused";
|
|
|
+ // midi播放
|
|
|
+ if (state.isAppPlay) {
|
|
|
+ if( playState === "paused" ) {
|
|
|
+ await api_cloudSuspend({
|
|
|
+ songID: state.examSongId,
|
|
|
+ })
|
|
|
+ state.playState = 'paused'
|
|
|
+ return
|
|
|
+ }
|
|
|
+ await api_cloudChangeSpeed({
|
|
|
+ speed: state.modeType === "evaluating" ? state.originSpeed : state.speed,
|
|
|
+ originalSpeed: state.originSpeed,
|
|
|
+ songID: state.examSongId,
|
|
|
+ });
|
|
|
+ const cloudGetMediaStatus = await api_cloudGetMediaStatus();
|
|
|
+ const status = cloudGetMediaStatus?.content.status === "suspend" ? "play" : "paused"
|
|
|
+ state.playState = status
|
|
|
+ } else {
|
|
|
+ state.playState = playState ? playState : state.playState === "paused" ? "play" : "paused";
|
|
|
+ }
|
|
|
if (state.playState === "play" && state.sectionStatus && state.section.length == 2 && state.playProgress === 0) {
|
|
|
resetPlaybackToStart();
|
|
|
}
|
|
@@ -701,7 +748,7 @@ export const getNote = (currentTime: number) => {
|
|
|
const times = state.times;
|
|
|
const len = state.times.length;
|
|
|
/** 播放超过了最后一个音符的时间,直接结束, 2秒误差 */
|
|
|
- if (currentTime > times[len - 1].endtime + 2) {
|
|
|
+ if (currentTime > times[len - 1].endtime + 2 && !state.isAppPlay) {
|
|
|
onEnded();
|
|
|
return;
|
|
|
}
|
|
@@ -723,6 +770,10 @@ export const getNote = (currentTime: number) => {
|
|
|
|
|
|
/** 重播 */
|
|
|
export const handleResetPlay = () => {
|
|
|
+ // 如果是midi需要重置播放进度
|
|
|
+ if (state.isAppPlay) {
|
|
|
+ audioData.progress = 0
|
|
|
+ }
|
|
|
resetPlaybackToStart();
|
|
|
// 如果是暂停, 直接播放
|
|
|
togglePlay("play");
|
|
@@ -896,6 +947,10 @@ export const handleRessetState = () => {
|
|
|
// 切换模式,清除选段
|
|
|
skipNotePlay(0, true);
|
|
|
clearSelection();
|
|
|
+ // midi 重置播放进度
|
|
|
+ if (state.isAppPlay) {
|
|
|
+ audioData.progress = 0;
|
|
|
+ }
|
|
|
if (state.modeType === "evaluating") {
|
|
|
handleStartEvaluat();
|
|
|
} else if (state.modeType === "practise") {
|
|
@@ -981,6 +1036,8 @@ const setState = (data: any, index: number) => {
|
|
|
// state.isOpenMetronome = data.isUseSystemBeat ? false : true;
|
|
|
state.isOpenMetronome = data.isPlayBeat && !data.isUseSystemBeat ? true : false
|
|
|
state.isShowFingering = data.isShowFingering ? true : false;
|
|
|
+ // 设置曲谱的播放模式, APP播放(midi音频是app播放) | h5播放
|
|
|
+ state.isAppPlay = data.playMode === 'MIDI';
|
|
|
state.music = data.music;
|
|
|
state.accompany = data.accompany;
|
|
|
state.midiUrl = data.midiFileUrl;
|
|
@@ -993,7 +1050,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(',');
|