|
@@ -1,4 +1,4 @@
|
|
-import { Transition, computed, defineComponent, onMounted, onUnmounted, reactive, ref, watch, toRef } from "vue";
|
|
|
|
|
|
+import { Transition, computed, defineComponent, onMounted, onUnmounted, reactive, ref, watch, toRef,ComputedRef } from "vue";
|
|
import styles from "./index.module.less";
|
|
import styles from "./index.module.less";
|
|
|
|
|
|
import iconBack from "./image/icon-back.png";
|
|
import iconBack from "./image/icon-back.png";
|
|
@@ -9,7 +9,7 @@ import { Badge, Circle, Popover, Popup, showConfirmDialog, showToast, NoticeBar
|
|
import Speed from "./speed";
|
|
import Speed from "./speed";
|
|
import { evaluatingData, handleStartEvaluat } from "/src/view/evaluating";
|
|
import { evaluatingData, handleStartEvaluat } from "/src/view/evaluating";
|
|
import Settting from "./settting";
|
|
import Settting from "./settting";
|
|
-import state, { IPlatform, handleChangeSection, handleResetPlay, handleRessetState, togglePlay } from "/src/state";
|
|
|
|
|
|
+import state, { IPlatform, handleChangeSection, handleResetPlay, handleRessetState, togglePlay, IPlayState } from "/src/state";
|
|
import { getAudioCurrentTime } from "/src/view/audio-list";
|
|
import { getAudioCurrentTime } from "/src/view/audio-list";
|
|
import { followData, toggleFollow } from "/src/view/follow-practice";
|
|
import { followData, toggleFollow } from "/src/view/follow-practice";
|
|
import { api_back } from "/src/helpers/communication";
|
|
import { api_back } from "/src/helpers/communication";
|
|
@@ -89,6 +89,143 @@ export const headData = reactive({
|
|
musicTypeShow: false,
|
|
musicTypeShow: false,
|
|
});
|
|
});
|
|
|
|
|
|
|
|
+let resetBtn:ComputedRef<{
|
|
|
|
+ display: boolean;
|
|
|
|
+ disabled: boolean;
|
|
|
|
+}>
|
|
|
|
+/**
|
|
|
|
+ * 处理模式切换
|
|
|
|
+ * @param oldPlayType 没改变之前的播放模式
|
|
|
|
+ * @param oldPlaySource 没改变之前的播放类型
|
|
|
|
+ * @param isforceReset 是否强制刷新播放状态 模式times时值改变时候也刷新
|
|
|
|
+ */
|
|
|
|
+export function handlerModeChange(oldPlayType:"play"|"sing", oldPlaySource:IPlayState,isforceReset?:boolean) {
|
|
|
|
+ const isModeChange = modeChangeHandleTimes(oldPlayType, oldPlaySource)
|
|
|
|
+ // 没有切换的时候 不处理下面的
|
|
|
|
+ if(isModeChange){
|
|
|
|
+ try {
|
|
|
|
+ metronomeData.metro.calculation(state.times);
|
|
|
|
+ } catch (error) {}
|
|
|
|
+ console.log("重新之后的times", state.times, state.fixtime)
|
|
|
|
+ }
|
|
|
|
+ if(isModeChange||isforceReset){
|
|
|
|
+ // 重置播放状态
|
|
|
|
+ handleRessetState()
|
|
|
|
+ // 隐藏重播按钮
|
|
|
|
+ resetBtn && (resetBtn.value.display = false)
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+// 模式切换之后重新给times赋值
|
|
|
|
+function modeChangeHandleTimes(oldPlayType:"play"|"sing", oldPlaySource:IPlayState){
|
|
|
|
+ const playType = state.playType
|
|
|
|
+ const playSource = state.playSource
|
|
|
|
+ const {notBeatFixtime, xmlMp3BeatFixTime} = state.times[0]
|
|
|
|
+ const { isOpenMetronome, isSingOpenMetronome } = state
|
|
|
|
+ // 演奏向演唱切
|
|
|
|
+ if(oldPlayType === "play"&&playType === "sing"){
|
|
|
|
+ if(playSource === "mingSong"){
|
|
|
|
+ state.fixtime = 0
|
|
|
|
+ state.times.map(item => {
|
|
|
|
+ item.time = item.xmlNoteTime
|
|
|
|
+ item.endtime = item.xmlNoteEndTime
|
|
|
|
+ item.fixtime = 0
|
|
|
|
+ })
|
|
|
|
+ return true
|
|
|
|
+ }else{
|
|
|
|
+ //演奏开了节拍器,演唱没开节拍器
|
|
|
|
+ if(isOpenMetronome&&!isSingOpenMetronome){
|
|
|
|
+ state.fixtime = notBeatFixtime
|
|
|
|
+ state.times.map(item => {
|
|
|
|
+ item.time = item.notBeatTime
|
|
|
|
+ item.endtime = item.notBeatEndTime
|
|
|
|
+ item.fixtime = notBeatFixtime
|
|
|
|
+ })
|
|
|
|
+ return true
|
|
|
|
+ }else if(!isOpenMetronome&&isSingOpenMetronome){
|
|
|
|
+ state.fixtime = notBeatFixtime + xmlMp3BeatFixTime
|
|
|
|
+ state.times.map(item => {
|
|
|
|
+ item.time = item.notBeatTime + xmlMp3BeatFixTime
|
|
|
|
+ item.endtime = item.notBeatEndTime + xmlMp3BeatFixTime
|
|
|
|
+ item.fixtime = notBeatFixtime + xmlMp3BeatFixTime
|
|
|
|
+ })
|
|
|
|
+ return true
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }else if(oldPlayType === "sing"&&playType === "play"){
|
|
|
|
+ // 演唱向演奏切
|
|
|
|
+ if(oldPlaySource === "mingSong"){
|
|
|
|
+ // 有节拍器
|
|
|
|
+ if(isOpenMetronome){
|
|
|
|
+ state.fixtime = notBeatFixtime + xmlMp3BeatFixTime
|
|
|
|
+ state.times.map(item => {
|
|
|
|
+ item.time = item.notBeatTime + xmlMp3BeatFixTime
|
|
|
|
+ item.endtime = item.notBeatEndTime + xmlMp3BeatFixTime
|
|
|
|
+ item.fixtime = notBeatFixtime + xmlMp3BeatFixTime
|
|
|
|
+ })
|
|
|
|
+ return true
|
|
|
|
+ }else{
|
|
|
|
+ state.fixtime = notBeatFixtime
|
|
|
|
+ state.times.map(item => {
|
|
|
|
+ item.time = item.notBeatTime
|
|
|
|
+ item.endtime = item.notBeatEndTime
|
|
|
|
+ item.fixtime = notBeatFixtime
|
|
|
|
+ })
|
|
|
|
+ return true
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ // 演奏开了节拍器,演唱没开节拍器
|
|
|
|
+ if(isOpenMetronome&&!isSingOpenMetronome){
|
|
|
|
+ state.fixtime = notBeatFixtime + xmlMp3BeatFixTime
|
|
|
|
+ state.times.map(item => {
|
|
|
|
+ item.time = item.notBeatTime + xmlMp3BeatFixTime
|
|
|
|
+ item.endtime = item.notBeatEndTime + xmlMp3BeatFixTime
|
|
|
|
+ item.fixtime = notBeatFixtime + xmlMp3BeatFixTime
|
|
|
|
+ })
|
|
|
|
+ return true
|
|
|
|
+ }else if(!isOpenMetronome&&isSingOpenMetronome){
|
|
|
|
+ state.fixtime = notBeatFixtime
|
|
|
|
+ state.times.map(item => {
|
|
|
|
+ item.time = item.notBeatTime
|
|
|
|
+ item.endtime = item.notBeatEndTime
|
|
|
|
+ item.fixtime = notBeatFixtime
|
|
|
|
+ })
|
|
|
|
+ return true
|
|
|
|
+ }
|
|
|
|
+ }else if(oldPlayType === "sing"&&playType === "sing"){
|
|
|
|
+ // 演唱之间切换
|
|
|
|
+ // 切到唱名时候
|
|
|
|
+ if(playSource === "mingSong"){
|
|
|
|
+ state.fixtime = 0
|
|
|
|
+ state.times.map(item => {
|
|
|
|
+ item.time = item.xmlNoteTime
|
|
|
|
+ item.endtime = item.xmlNoteEndTime
|
|
|
|
+ item.fixtime = 0
|
|
|
|
+ })
|
|
|
|
+ return true
|
|
|
|
+ }else if(oldPlaySource === "mingSong"){
|
|
|
|
+ // 有节拍器
|
|
|
|
+ if(isSingOpenMetronome){
|
|
|
|
+ state.fixtime = notBeatFixtime + xmlMp3BeatFixTime
|
|
|
|
+ state.times.map(item => {
|
|
|
|
+ item.time = item.notBeatTime + xmlMp3BeatFixTime
|
|
|
|
+ item.endtime = item.notBeatEndTime + xmlMp3BeatFixTime
|
|
|
|
+ item.fixtime = notBeatFixtime + xmlMp3BeatFixTime
|
|
|
|
+ })
|
|
|
|
+ return true
|
|
|
|
+ }else{
|
|
|
|
+ state.fixtime = notBeatFixtime
|
|
|
|
+ state.times.map(item => {
|
|
|
|
+ item.time = item.notBeatTime
|
|
|
|
+ item.endtime = item.notBeatEndTime
|
|
|
|
+ item.fixtime = notBeatFixtime
|
|
|
|
+ })
|
|
|
|
+ return true
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return false
|
|
|
|
+}
|
|
|
|
+
|
|
export default defineComponent({
|
|
export default defineComponent({
|
|
name: "header-top",
|
|
name: "header-top",
|
|
emits: ["close"],
|
|
emits: ["close"],
|
|
@@ -200,6 +337,11 @@ export default defineComponent({
|
|
// 原声, 伴奏 少一个,就不能切换
|
|
// 原声, 伴奏 少一个,就不能切换
|
|
if (state.music && state.accompany) return { display: true, disabled: false };
|
|
if (state.music && state.accompany) return { display: true, disabled: false };
|
|
} else {
|
|
} else {
|
|
|
|
+ // 播放过程中不能切换
|
|
|
|
+ if (state.playState === "play"){
|
|
|
|
+ return { display: true, disabled: true };
|
|
|
|
+ }
|
|
|
|
+ // 范唱
|
|
let index = 0
|
|
let index = 0
|
|
state.fanSong && index++
|
|
state.fanSong && index++
|
|
state.banSong && index++
|
|
state.banSong && index++
|
|
@@ -223,15 +365,17 @@ export default defineComponent({
|
|
// 音频播放中 禁用
|
|
// 音频播放中 禁用
|
|
if (state.playState === "play") return { display: true, disabled: true };
|
|
if (state.playState === "play") return { display: true, disabled: true };
|
|
if (!state.isAppPlay) {
|
|
if (!state.isAppPlay) {
|
|
- if(!state.isConcert){
|
|
|
|
let index = 0
|
|
let index = 0
|
|
- state.fanSong && index++
|
|
|
|
- state.banSong && index++
|
|
|
|
- state.mingSong && index++
|
|
|
|
- if(index > 0) {
|
|
|
|
|
|
+ state.music && index++
|
|
|
|
+ state.accompany && index++
|
|
|
|
+ let songIndex = 0
|
|
|
|
+ state.fanSong && songIndex++
|
|
|
|
+ state.banSong && songIndex++
|
|
|
|
+ state.mingSong && songIndex++
|
|
|
|
+ // 演唱和演奏 都有数据的时间不禁用
|
|
|
|
+ if(songIndex>0&&index>0) {
|
|
return { display: true, disabled: false };
|
|
return { display: true, disabled: false };
|
|
}
|
|
}
|
|
- }
|
|
|
|
}
|
|
}
|
|
return {
|
|
return {
|
|
disabled: true,
|
|
disabled: true,
|
|
@@ -266,7 +410,7 @@ export default defineComponent({
|
|
});
|
|
});
|
|
|
|
|
|
/** 重播按钮 */
|
|
/** 重播按钮 */
|
|
- const resetBtn = computed(() => {
|
|
|
|
|
|
+ resetBtn = computed(() => {
|
|
// 选择模式 不显示
|
|
// 选择模式 不显示
|
|
if (headTopData.modeType !== "show") return { display: false, disabled: false };
|
|
if (headTopData.modeType !== "show") return { display: false, disabled: false };
|
|
// 评测模式 不显示,跟练模式 不显示
|
|
// 评测模式 不显示,跟练模式 不显示
|
|
@@ -428,61 +572,6 @@ export default defineComponent({
|
|
console.log(e);
|
|
console.log(e);
|
|
}
|
|
}
|
|
};
|
|
};
|
|
-
|
|
|
|
- // 切换 演唱和演奏模式的时候处理
|
|
|
|
- function handlerRefreshPlayType() {
|
|
|
|
- // 妙极客的 曲子 时间是不变的,所以不做处理
|
|
|
|
- if( !state.isEvxml ) {
|
|
|
|
- // 重新计算state.times
|
|
|
|
- const { isOpenMetronome, isSingOpenMetronome } = state
|
|
|
|
- const { xmlMp3BeatFixTime } = metronomeData
|
|
|
|
- if(state.playType === "play"){
|
|
|
|
- if(isOpenMetronome && !isSingOpenMetronome){
|
|
|
|
- state.fixtime = state.fixtime + xmlMp3BeatFixTime
|
|
|
|
- } else if(!isOpenMetronome && isSingOpenMetronome){
|
|
|
|
- state.fixtime = state.fixtime - xmlMp3BeatFixTime
|
|
|
|
- }
|
|
|
|
- }else{
|
|
|
|
- if(isSingOpenMetronome && !isOpenMetronome){
|
|
|
|
- state.fixtime = state.fixtime + xmlMp3BeatFixTime
|
|
|
|
- } else if(!isSingOpenMetronome && isOpenMetronome){
|
|
|
|
- state.fixtime = state.fixtime - xmlMp3BeatFixTime
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- const fixtime = state.fixtime
|
|
|
|
- state.times.map(item => {
|
|
|
|
- if(state.playType === "play"){
|
|
|
|
- if(isOpenMetronome && !isSingOpenMetronome){
|
|
|
|
- item.time = item.time + xmlMp3BeatFixTime
|
|
|
|
- item.endtime = item.endtime + xmlMp3BeatFixTime
|
|
|
|
- item.fixtime = fixtime
|
|
|
|
- } else if(!isOpenMetronome && isSingOpenMetronome){
|
|
|
|
- item.time = item.time - xmlMp3BeatFixTime
|
|
|
|
- item.endtime = item.endtime - xmlMp3BeatFixTime
|
|
|
|
- item.fixtime = fixtime
|
|
|
|
- }
|
|
|
|
- }else{
|
|
|
|
- if(isSingOpenMetronome && !isOpenMetronome){
|
|
|
|
- item.time = item.time + xmlMp3BeatFixTime
|
|
|
|
- item.endtime = item.endtime + xmlMp3BeatFixTime
|
|
|
|
- item.fixtime = fixtime
|
|
|
|
- } else if(!isSingOpenMetronome && isOpenMetronome){
|
|
|
|
- item.time = item.time - xmlMp3BeatFixTime
|
|
|
|
- item.endtime = item.endtime - xmlMp3BeatFixTime
|
|
|
|
- item.fixtime = fixtime
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- })
|
|
|
|
- try {
|
|
|
|
- metronomeData.metro.calculation(state.times);
|
|
|
|
- } catch (error) {}
|
|
|
|
- console.log("重新之后的times", state.times, fixtime)
|
|
|
|
- }
|
|
|
|
- // 重置播放状态
|
|
|
|
- handleRessetState()
|
|
|
|
- // 隐藏重播按钮
|
|
|
|
- resetBtn.value.display = false
|
|
|
|
- }
|
|
|
|
return () => (
|
|
return () => (
|
|
<>
|
|
<>
|
|
<div
|
|
<div
|
|
@@ -519,18 +608,21 @@ export default defineComponent({
|
|
}
|
|
}
|
|
</div>
|
|
</div>
|
|
{/* 模式切换 */}
|
|
{/* 模式切换 */}
|
|
- <div
|
|
|
|
- id={state.platform === IPlatform.PC ? "teacherTop-0" : "studnetT-0"}
|
|
|
|
- style={{ display: toggleBtn.value.display ? "" : "none" }}
|
|
|
|
- class={[styles.modeChangeBox, toggleBtn.value.disabled && styles.disabled]}
|
|
|
|
- onClick={() => {
|
|
|
|
- handleRessetState();
|
|
|
|
- headTopData.modeType = "init";
|
|
|
|
- }}
|
|
|
|
- >
|
|
|
|
- <img class={styles.img} src={iconMode} />
|
|
|
|
- <div class={styles.title}>{state.modeType==="practise" ? '练习模式' : state.modeType==="follow" ? "跟练模式" : state.modeType==="evaluating" ? "评测模式" : ""}</div>
|
|
|
|
- </div>
|
|
|
|
|
|
+ {
|
|
|
|
+ state.playType === "play" &&
|
|
|
|
+ <div
|
|
|
|
+ id={state.platform === IPlatform.PC ? "teacherTop-0" : "studnetT-0"}
|
|
|
|
+ style={{ display: toggleBtn.value.display ? "" : "none" }}
|
|
|
|
+ class={[styles.modeChangeBox, toggleBtn.value.disabled && styles.disabled]}
|
|
|
|
+ onClick={() => {
|
|
|
|
+ handleRessetState();
|
|
|
|
+ headTopData.modeType = "init";
|
|
|
|
+ }}
|
|
|
|
+ >
|
|
|
|
+ <img class={styles.img} src={iconMode} />
|
|
|
|
+ <div class={styles.title}>{state.modeType==="practise" ? '练习模式' : state.modeType==="follow" ? "跟练模式" : state.modeType==="evaluating" ? "评测模式" : ""}</div>
|
|
|
|
+ </div>
|
|
|
|
+ }
|
|
{/* 功能按钮 */}
|
|
{/* 功能按钮 */}
|
|
<div
|
|
<div
|
|
class={[styles.headRight]}
|
|
class={[styles.headRight]}
|
|
@@ -569,6 +661,8 @@ export default defineComponent({
|
|
style={{ display: playTypeBtn.value.display ? "" : "none" }}
|
|
style={{ display: playTypeBtn.value.display ? "" : "none" }}
|
|
class={[styles.btn, playTypeBtn.value.disabled && styles.disabled]}
|
|
class={[styles.btn, playTypeBtn.value.disabled && styles.disabled]}
|
|
onClick={() => {
|
|
onClick={() => {
|
|
|
|
+ const oldPlayType = state.playType
|
|
|
|
+ const oldPlaySource = state.playSource
|
|
if(state.playType === "play"){
|
|
if(state.playType === "play"){
|
|
state.playType = "sing"
|
|
state.playType = "sing"
|
|
state.playSource = state.fanSong?"music":state.banSong?"background":"mingSong"
|
|
state.playSource = state.fanSong?"music":state.banSong?"background":"mingSong"
|
|
@@ -576,7 +670,7 @@ export default defineComponent({
|
|
state.playType = "play"
|
|
state.playType = "play"
|
|
state.playSource = state.music?"music":"background"
|
|
state.playSource = state.music?"music":"background"
|
|
}
|
|
}
|
|
- handlerRefreshPlayType()
|
|
|
|
|
|
+ handlerModeChange(oldPlayType, oldPlaySource, true)
|
|
}}
|
|
}}
|
|
>
|
|
>
|
|
<img style={{ display: state.playType === "play" ? "" : "none" }} class={styles.iconBtn} src={headImg(`perform.png`)} />
|
|
<img style={{ display: state.playType === "play" ? "" : "none" }} class={styles.iconBtn} src={headImg(`perform.png`)} />
|
|
@@ -588,6 +682,8 @@ export default defineComponent({
|
|
style={{ display: originBtn.value.display ? "" : "none" }}
|
|
style={{ display: originBtn.value.display ? "" : "none" }}
|
|
class={[styles.btn, originBtn.value.disabled && styles.disabled]}
|
|
class={[styles.btn, originBtn.value.disabled && styles.disabled]}
|
|
onClick={() => {
|
|
onClick={() => {
|
|
|
|
+ const oldPlayType = state.playType
|
|
|
|
+ const oldPlaySource = state.playSource
|
|
if(state.playType === 'play'){
|
|
if(state.playType === 'play'){
|
|
state.playSource = state.playSource === "music" ? "background" : "music";
|
|
state.playSource = state.playSource === "music" ? "background" : "music";
|
|
}else{
|
|
}else{
|
|
@@ -599,6 +695,7 @@ export default defineComponent({
|
|
state.playSource = state.fanSong ? "music" :"background"
|
|
state.playSource = state.fanSong ? "music" :"background"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ handlerModeChange(oldPlayType, oldPlaySource)
|
|
}}
|
|
}}
|
|
>
|
|
>
|
|
<img style={{ display: state.playSource === "music" ? "" : "none" }} class={styles.iconBtn} src={state.playType === 'play'?headImg(`music.png`):headImg(`music1.png`)} />
|
|
<img style={{ display: state.playSource === "music" ? "" : "none" }} class={styles.iconBtn} src={state.playType === 'play'?headImg(`music.png`):headImg(`music1.png`)} />
|