|
@@ -46,9 +46,12 @@ export const audioData = reactive({
|
|
|
beatMingSongEle: null as HTMLAudioElement | null,
|
|
|
beatMingSongGirlEle: null as HTMLAudioElement | null
|
|
|
},
|
|
|
- combineIndex: -1, // 当前 播放的总谱音频索引
|
|
|
+ combineIndex: "-1", // 当前 播放的总谱音频索引
|
|
|
combineMusics: {} as Record<string, any>, // 音频 url
|
|
|
- combineMusicEles:[] as {key:number, value:HTMLAudioElement, beatValue:HTMLAudioElement|null}[] // 存储的音频el 当大于4个时候删除
|
|
|
+ combineMusicEles:[] as {key:string, value:HTMLAudioElement, beatValue:HTMLAudioElement|null}[], // 存储的音频el 当大于4个时候删除
|
|
|
+ scoreAudioUrl:"", // 总谱范唱 存一个备份
|
|
|
+ scoreAudioEle: null as HTMLAudioElement | null, // 总谱范唱 存一个备份
|
|
|
+ beatScoreAudioEle: null as HTMLAudioElement | null, // 总谱范唱节拍器 存一个备份
|
|
|
});
|
|
|
const midiRef = ref();
|
|
|
/** 播放或暂停 */
|
|
@@ -326,12 +329,6 @@ export const handleLoadBeatMusic = async () => {
|
|
|
state.loadingText = "音频资源加载中,请稍后…"
|
|
|
state.isLoading = true
|
|
|
const musicAudio = await mergeBeatAudio(currentMusic) as any
|
|
|
- const playEleObj = {
|
|
|
- "play_music":"beatSongEle",
|
|
|
- "play_background":"beatBackgroundEle",
|
|
|
- "sing_music":"beatFanSongEle",
|
|
|
- "sing_background":"beatBanSongEle"
|
|
|
- }
|
|
|
// 给音频赋值
|
|
|
if(playSource === "mingSong"){
|
|
|
// 当男声女声都有的时候 才区分
|
|
@@ -364,22 +361,39 @@ export const handleLoadBeatMusic = async () => {
|
|
|
}
|
|
|
}
|
|
|
// @ts-ignore
|
|
|
- audioData.songCollection[playEleObj[`${playType}_${playSource}`]] = musicAudio
|
|
|
+ audioData.songCollection[beatPlayObj[`${playType}_${playSource}`]] = musicAudio
|
|
|
+ // 总谱范唱需要保存一份备份
|
|
|
+ if(audioData.combineIndex === "-1" && playType === "sing" && playSource==="music" ){
|
|
|
+ audioData.beatScoreAudioEle = musicAudio
|
|
|
+ }
|
|
|
}
|
|
|
state.isLoading = false
|
|
|
}
|
|
|
|
|
|
// 切换对应的声轨,并且配置当前的audio
|
|
|
-export async function changeCombineAudio (combineIndex: number){
|
|
|
+export async function changeCombineAudio (combineIndex: string){
|
|
|
// 重复点击的时候取消选中 原音
|
|
|
if(combineIndex === audioData.combineIndex){
|
|
|
- audioData.combineIndex = -1
|
|
|
- state.playSource = "background"
|
|
|
- state.music = ""
|
|
|
+ audioData.combineIndex = "-1"
|
|
|
+ // 区分演奏和演唱
|
|
|
+ if(state.playType === "play") {
|
|
|
+ state.playSource = "background"
|
|
|
+ state.music = ""
|
|
|
+ }else{
|
|
|
+ // 有总谱范唱就切换到总谱范唱
|
|
|
+ if(audioData.scoreAudioUrl){
|
|
|
+ state.fanSong = audioData.scoreAudioUrl
|
|
|
+ audioData.songCollection.fanSongEle = audioData.scoreAudioEle
|
|
|
+ audioData.songCollection.beatFanSongEle = audioData.beatScoreAudioEle
|
|
|
+ }else{
|
|
|
+ state.playSource = "background"
|
|
|
+ state.fanSong = ""
|
|
|
+ }
|
|
|
+ }
|
|
|
// 当开启节拍器的时候,切为伴奏的时候合成节拍器1
|
|
|
await handleLoadBeatMusic()
|
|
|
// 当没有背景音文件的时候
|
|
|
- if(!state.accompany) {
|
|
|
+ if(!state.accompany && !state.fanSong && !state.banSong) {
|
|
|
state.noMusicSource = true
|
|
|
}
|
|
|
return
|
|
@@ -393,28 +407,23 @@ export async function changeCombineAudio (combineIndex: number){
|
|
|
})
|
|
|
const cacheMusic = audioData.combineMusicEles[cacheMusicIndex]
|
|
|
if(cacheMusic?.value){
|
|
|
- audioData.songCollection.songEle = cacheMusic.value
|
|
|
- audioData.songCollection.beatSongEle = cacheMusic.beatValue
|
|
|
+ if(state.playType === "play") {
|
|
|
+ audioData.songCollection.songEle = cacheMusic.value
|
|
|
+ audioData.songCollection.beatSongEle = cacheMusic.beatValue
|
|
|
+ }else{
|
|
|
+ audioData.songCollection.fanSongEle = cacheMusic.value
|
|
|
+ audioData.songCollection.beatFanSongEle = cacheMusic.beatValue
|
|
|
+ }
|
|
|
// 使用缓存之后 当前数据位置向后偏移,删除缓存的时候以使用顺序位置
|
|
|
const itemMusic = audioData.combineMusicEles.splice(cacheMusicIndex, 1)
|
|
|
audioData.combineMusicEles.push(...itemMusic)
|
|
|
}else{
|
|
|
const music = await createAudio(musicUrl)
|
|
|
const beatMusic = await mergeBeatAudio(musicUrl) as any
|
|
|
- // 当没有背景音的时候 需要绑定事件
|
|
|
- if(!audioData.songCollection.backgroundEle){
|
|
|
- if(music){
|
|
|
- music.addEventListener("play", onPlay);
|
|
|
- music.addEventListener("ended", onEnded);
|
|
|
- }
|
|
|
- }
|
|
|
- // 取消掉背景音绑定的时候,然后给当前原音节拍音频绑定事件,这样防止没有背景节拍的时候,能给
|
|
|
- if(beatMusic){
|
|
|
- audioData.songCollection.beatBackgroundEle?.removeEventListener("play", onPlay)
|
|
|
- audioData.songCollection.beatBackgroundEle?.removeEventListener("ended", onEnded)
|
|
|
- beatMusic.addEventListener("play", onPlay);
|
|
|
- beatMusic.addEventListener("ended", onEnded);
|
|
|
- }
|
|
|
+ music?.addEventListener("play", onPlay);
|
|
|
+ music?.addEventListener("ended", onEnded);
|
|
|
+ beatMusic?.addEventListener("play", onPlay);
|
|
|
+ beatMusic?.addEventListener("ended", onEnded);
|
|
|
audioData.combineMusicEles.push({
|
|
|
key: combineIndex,
|
|
|
value: music!,
|
|
@@ -424,18 +433,27 @@ export async function changeCombineAudio (combineIndex: number){
|
|
|
if(audioData.combineMusicEles.length > 4){
|
|
|
audioData.combineMusicEles.splice(0,1)
|
|
|
}
|
|
|
- audioData.songCollection.songEle = music
|
|
|
- audioData.songCollection.beatSongEle = beatMusic!
|
|
|
+ if(state.playType === "play") {
|
|
|
+ audioData.songCollection.songEle = music
|
|
|
+ audioData.songCollection.beatSongEle = beatMusic!
|
|
|
+ }else{
|
|
|
+ audioData.songCollection.fanSongEle = music
|
|
|
+ audioData.songCollection.beatFanSongEle = beatMusic!
|
|
|
+ }
|
|
|
}
|
|
|
audioData.combineIndex = combineIndex
|
|
|
- state.music = musicUrl
|
|
|
+ if(state.playType === "play"){
|
|
|
+ state.music = musicUrl
|
|
|
+ }else{
|
|
|
+ state.fanSong = musicUrl
|
|
|
+ }
|
|
|
state.playSource = "music"
|
|
|
// 当没有背景音文件的时候
|
|
|
- if(!state.accompany) {
|
|
|
+ if(!state.accompany && !state.fanSong && !state.banSong) {
|
|
|
state.noMusicSource = false
|
|
|
}
|
|
|
showToast({
|
|
|
- message: "已开启原声",
|
|
|
+ message: state.playType === "play" ? "已开启原声" : "已开启范唱",
|
|
|
position: "top",
|
|
|
className: "selectionToast",
|
|
|
});
|
|
@@ -567,6 +585,8 @@ export default defineComponent({
|
|
|
banSongEle:banSong,
|
|
|
mingSongEle:mingSong
|
|
|
})
|
|
|
+ audioData.scoreAudioUrl = state.fanSong
|
|
|
+ audioData.scoreAudioEle = fanSong
|
|
|
Object.assign(audioData.mingSongTypeCollection, {
|
|
|
mingSongEle: mingSong,
|
|
|
mingSongGirlEle:mingSongGirl
|