|  | @@ -505,6 +505,10 @@ const state = reactive({
 | 
											
												
													
														|  |    loadingText: '音频资源加载中,请稍后…',
 |  |    loadingText: '音频资源加载中,请稍后…',
 | 
											
												
													
														|  |    /** 是否是简单的单行谱模式页面 */
 |  |    /** 是否是简单的单行谱模式页面 */
 | 
											
												
													
														|  |    isSimplePage: false, 
 |  |    isSimplePage: false, 
 | 
											
												
													
														|  | 
 |  | +  /** xml的速度和后台设置的速度,计算出的基础音频播放倍率 */
 | 
											
												
													
														|  | 
 |  | +  originAudioPlayRate: 1,  
 | 
											
												
													
														|  | 
 |  | +  /** 开始播放时,记录的mp3播放倍率,用户当前设置的速度/当前小节的速度 */
 | 
											
												
													
														|  | 
 |  | +  basePlayRate: 1,
 | 
											
												
													
														|  |  });
 |  |  });
 | 
											
												
													
														|  |  const browserInfo = browser();
 |  |  const browserInfo = browser();
 | 
											
												
													
														|  |  let offset_duration = 0;
 |  |  let offset_duration = 0;
 | 
											
										
											
												
													
														|  | @@ -580,6 +584,35 @@ export const onEnded = () => {
 | 
											
												
													
														|  |    autoResetPlay();
 |  |    autoResetPlay();
 | 
											
												
													
														|  |  };
 |  |  };
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +// 根据当前小节动态设置,右上角展示的速度
 | 
											
												
													
														|  | 
 |  | +const dynamicShowPlaySpeed = (index: number) => {
 | 
											
												
													
														|  | 
 |  | +  const item: any = state.times[index];
 | 
											
												
													
														|  | 
 |  | +  if (item && item.measureSpeed ) {
 | 
											
												
													
														|  | 
 |  | +    state.playIngSpeed = Math.floor(state.basePlayRate * item.measureSpeed)
 | 
											
												
													
														|  | 
 |  | +    state.speed = state.playIngSpeed
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +// 开始播放时,计算mp3的播放倍率
 | 
											
												
													
														|  | 
 |  | +export const initSetPlayRate = () => {
 | 
											
												
													
														|  | 
 |  | +  const item: any = (state.sectionStatus && state.section.length === 2) ? state.sectionFirst || state.section[0] : state.times[state.activeNoteIndex];
 | 
											
												
													
														|  | 
 |  | +  if (item && item.measureSpeed) {
 | 
											
												
													
														|  | 
 |  | +    const ratio = state.speed / item.measureSpeed
 | 
											
												
													
														|  | 
 |  | +    // state.audiosInstance?.setSpeed(ratio)
 | 
											
												
													
														|  | 
 |  | +    state.basePlayRate = ratio || 1;
 | 
											
												
													
														|  | 
 |  | +    console.log('播放倍率',state.basePlayRate)
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +// 重置播放倍率
 | 
											
												
													
														|  | 
 |  | +export const resetBaseRate = () => {
 | 
											
												
													
														|  | 
 |  | +  const currentItem: any = state.times[0];
 | 
											
												
													
														|  | 
 |  | +  const currentSpeed = currentItem?.measureSpeed ? currentItem.measureSpeed : state.originSpeed;
 | 
											
												
													
														|  | 
 |  | +  state.speed = currentSpeed
 | 
											
												
													
														|  | 
 |  | +  //state.activeNoteIndex = 0
 | 
											
												
													
														|  | 
 |  | +  state.basePlayRate = 1;
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |  /**
 |  |  /**
 | 
											
												
													
														|  |   * 播放一直触发的事件
 |  |   * 播放一直触发的事件
 | 
											
												
													
														|  |   */
 |  |   */
 | 
											
										
											
												
													
														|  | @@ -588,17 +621,8 @@ const handlePlaying = () => {
 | 
											
												
													
														|  |    const duration = getAudioDuration();
 |  |    const duration = getAudioDuration();
 | 
											
												
													
														|  |    state.playProgress = (currentTime / duration) * 100;
 |  |    state.playProgress = (currentTime / duration) * 100;
 | 
											
												
													
														|  |    let item = getNote(currentTime);
 |  |    let item = getNote(currentTime);
 | 
											
												
													
														|  | -  // console.log(11111,currentTime,duration,state.playSource, item)
 |  | 
 | 
											
												
													
														|  | -  // console.log(item?.i,item?.noteId,item?.measureSpeed,'播放')
 |  | 
 | 
											
												
													
														|  | -  // 练习模式下,实时刷新小节速度
 |  | 
 | 
											
												
													
														|  | -  if (item && state.modeType === "practise" && state.playState === "play" && item.measureSpeed && item.measureSpeed !== state.playIngSpeed) {
 |  | 
 | 
											
												
													
														|  | -    const ratio = state.speed / state.originSpeed
 |  | 
 | 
											
												
													
														|  | -    state.playIngSpeed = Math.ceil(ratio * item.measureSpeed) || state.speed
 |  | 
 | 
											
												
													
														|  | -  } else if (state.modeType === "practise" && state.playState === "play" && item && !item.measureSpeed) {
 |  | 
 | 
											
												
													
														|  | -    state.playIngSpeed = state.speed
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -  state.playIngSpeed = state.playIngSpeed || state.speed;
 |  | 
 | 
											
												
													
														|  |    if (item) {
 |  |    if (item) {
 | 
											
												
													
														|  | 
 |  | +    dynamicShowPlaySpeed(item.i);
 | 
											
												
													
														|  |      // 选段状态下
 |  |      // 选段状态下
 | 
											
												
													
														|  |      if (state.sectionStatus && state.section.length === 2) {
 |  |      if (state.sectionStatus && state.section.length === 2) {
 | 
											
												
													
														|  |        // 如果开启了预备拍
 |  |        // 如果开启了预备拍
 | 
											
										
											
												
													
														|  | @@ -641,6 +665,8 @@ const handlePlaying = () => {
 | 
											
												
													
														|  |          // #8698 bug修复
 |  |          // #8698 bug修复
 | 
											
												
													
														|  |          if (state.modeType === "practise" && state.sectionStatus) {
 |  |          if (state.modeType === "practise" && state.sectionStatus) {
 | 
											
												
													
														|  |            onEnded();
 |  |            onEnded();
 | 
											
												
													
														|  | 
 |  | +          // state.activeNoteIndex = state.sectionFirst ? state.sectionFirst.i : state.section[0].i
 | 
											
												
													
														|  | 
 |  | +          // dynamicShowPlaySpeed(state.activeNoteIndex)
 | 
											
												
													
														|  |            resetPlaybackToStart();
 |  |            resetPlaybackToStart();
 | 
											
												
													
														|  |            return;
 |  |            return;
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
										
											
												
													
														|  | @@ -670,6 +696,10 @@ export const skipNotePlay = async (itemIndex: number, isStart = false) => {
 | 
											
												
													
														|  |      itemTime = 0;
 |  |      itemTime = 0;
 | 
											
												
													
														|  |    }
 |  |    }
 | 
											
												
													
														|  |    if (item) {
 |  |    if (item) {
 | 
											
												
													
														|  | 
 |  | +    // 非选段模式,点击音符,动态设置右下角的速度
 | 
											
												
													
														|  | 
 |  | +    if (item.measureSpeed && state.section.length < 2) {
 | 
											
												
													
														|  | 
 |  | +      state.speed = Math.floor(state.basePlayRate * item.measureSpeed)
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  |      setAudioCurrentTime(itemTime, itemIndex);
 |  |      setAudioCurrentTime(itemTime, itemIndex);
 | 
											
												
													
														|  |      // 一行谱,点击音符,或者播放完成,需要跳转音符位置
 |  |      // 一行谱,点击音符,或者播放完成,需要跳转音符位置
 | 
											
												
													
														|  |      gotoNext(item, true);
 |  |      gotoNext(item, true);
 | 
											
										
											
												
													
														|  | @@ -753,6 +783,7 @@ export const togglePlay = async (playState?: "play" | "paused", sourceType?: str
 | 
											
												
													
														|  |        clearSelection();
 |  |        clearSelection();
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |    }
 |  |    }
 | 
											
												
													
														|  | 
 |  | +  initSetPlayRate();
 | 
											
												
													
														|  |    audioListStart(state.playState);
 |  |    audioListStart(state.playState);
 | 
											
												
													
														|  |    return true;
 |  |    return true;
 | 
											
												
													
														|  |  };
 |  |  };
 | 
											
										
											
												
													
														|  | @@ -995,14 +1026,20 @@ export const handleResetPlay = () => {
 | 
											
												
													
														|  |    if (state.isAppPlay) {
 |  |    if (state.isAppPlay) {
 | 
											
												
													
														|  |      audioData.progress = 0
 |  |      audioData.progress = 0
 | 
											
												
													
														|  |    }
 |  |    }
 | 
											
												
													
														|  | 
 |  | +  resetBaseRate();
 | 
											
												
													
														|  |    resetPlaybackToStart();
 |  |    resetPlaybackToStart();
 | 
											
												
													
														|  |    // 如果是暂停, 直接播放
 |  |    // 如果是暂停, 直接播放
 | 
											
												
													
														|  |    togglePlay("play");
 |  |    togglePlay("play");
 | 
											
												
													
														|  |  };
 |  |  };
 | 
											
												
													
														|  |  /** 设置速度 */
 |  |  /** 设置速度 */
 | 
											
												
													
														|  |  export const handleSetSpeed = (speed: number) => {
 |  |  export const handleSetSpeed = (speed: number) => {
 | 
											
												
													
														|  | -  setStorageSpeed(state.examSongId, speed);
 |  | 
 | 
											
												
													
														|  | 
 |  | +  // setStorageSpeed(state.examSongId, speed);
 | 
											
												
													
														|  |    state.speed = speed;
 |  |    state.speed = speed;
 | 
											
												
													
														|  | 
 |  | +  // 当前的音符
 | 
											
												
													
														|  | 
 |  | +  const currentItem: any = (state.sectionStatus && state.section.length === 2) ? state.sectionFirst || state.section[0] : state.times[state.activeNoteIndex];
 | 
											
												
													
														|  | 
 |  | +  state.basePlayRate = currentItem?.measureSpeed ? state.speed / currentItem.measureSpeed : state.speed / state.originSpeed;
 | 
											
												
													
														|  | 
 |  | +  const actualRate = state.originAudioPlayRate * state.basePlayRate;
 | 
											
												
													
														|  | 
 |  | +  console.log('速度设置',speed,'小节计算的倍率',state.basePlayRate,'实际播放倍率',actualRate)
 | 
											
												
													
														|  |  };
 |  |  };
 | 
											
												
													
														|  |  /** 清除选段状态 */
 |  |  /** 清除选段状态 */
 | 
											
												
													
														|  |  export const clearSelection = () => {
 |  |  export const clearSelection = () => {
 | 
											
										
											
												
													
														|  | @@ -1017,7 +1054,7 @@ export const handleChangeSection = () => {
 | 
											
												
													
														|  |    if (state.sectionStatus) {
 |  |    if (state.sectionStatus) {
 | 
											
												
													
														|  |      togglePlay("paused");
 |  |      togglePlay("paused");
 | 
											
												
													
														|  |      clearSelection();
 |  |      clearSelection();
 | 
											
												
													
														|  | -    skipNotePlay(0, true);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    //skipNotePlay(0, true);  取消选段的时候 不跳回开头
 | 
											
												
													
														|  |      state.sectionFirst = null;
 |  |      state.sectionFirst = null;
 | 
											
												
													
														|  |      return;
 |  |      return;
 | 
											
												
													
														|  |    }
 |  |    }
 | 
											
										
											
												
													
														|  | @@ -1127,7 +1164,7 @@ export const setSection = (start: number, end: number, userSpeed?: number) => {
 | 
											
												
													
														|  |      // 设置小节
 |  |      // 设置小节
 | 
											
												
													
														|  |      hanldeDirectSelection([startNote, endNote]);
 |  |      hanldeDirectSelection([startNote, endNote]);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    //设置速度
 |  | 
 | 
											
												
													
														|  | 
 |  | +    // 评测作业,练习作业的场景,需要用老师布置的速度,设置播放速度
 | 
											
												
													
														|  |      if (userSpeed) {
 |  |      if (userSpeed) {
 | 
											
												
													
														|  |        handleSetSpeed(userSpeed);
 |  |        handleSetSpeed(userSpeed);
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
										
											
												
													
														|  | @@ -1141,6 +1178,11 @@ export const hanldeDirectSelection = (list: any[]) => {
 | 
											
												
													
														|  |    state.sectionStatus = true;
 |  |    state.sectionStatus = true;
 | 
											
												
													
														|  |    setTimeout(() => {
 |  |    setTimeout(() => {
 | 
											
												
													
														|  |      state.section = formateSelectMearure(list);
 |  |      state.section = formateSelectMearure(list);
 | 
											
												
													
														|  | 
 |  | +    // 选段完成后,需要根据预报小节的速度,设置右下角显示的速度
 | 
											
												
													
														|  | 
 |  | +    const currentItem: any = (state.sectionStatus && state.section.length === 2) ? state.sectionFirst || state.section[0] : state.times[state.activeNoteIndex];
 | 
											
												
													
														|  | 
 |  | +    if (currentItem.measureSpeed && query.workRecord === undefined) {
 | 
											
												
													
														|  | 
 |  | +      handleSetSpeed(currentItem.measureSpeed);
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  |      console.log('选段小节', state.section)
 |  |      console.log('选段小节', state.section)
 | 
											
												
													
														|  |    }, 0);
 |  |    }, 0);
 | 
											
												
													
														|  |  };
 |  |  };
 | 
											
										
											
												
													
														|  | @@ -1316,6 +1358,10 @@ const setState = (data: any, index: number) => {
 | 
											
												
													
														|  |    state.coverImg = data.musicCover ?? "";
 |  |    state.coverImg = data.musicCover ?? "";
 | 
											
												
													
														|  |    // 单声部多声轨合并展示
 |  |    // 单声部多声轨合并展示
 | 
											
												
													
														|  |    state.isCombineRender = data.musicSheetType === "SINGLE" && data.musicSheetSoundList?.length > 1
 |  |    state.isCombineRender = data.musicSheetType === "SINGLE" && data.musicSheetSoundList?.length > 1
 | 
											
												
													
														|  | 
 |  | +  // 如果是simple页面,只显示单轨
 | 
											
												
													
														|  | 
 |  | +  if (state.isSimplePage) {
 | 
											
												
													
														|  | 
 |  | +    state.isCombineRender = false;
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  |    setCustom(state.isCombineRender ? data.musicSheetSoundList?.length : 0);
 |  |    setCustom(state.isCombineRender ? data.musicSheetSoundList?.length : 0);
 | 
											
												
													
														|  |    // 解析扩展字段
 |  |    // 解析扩展字段
 | 
											
												
													
														|  |    if (data.extConfigJson) {
 |  |    if (data.extConfigJson) {
 | 
											
										
											
												
													
														|  | @@ -1350,12 +1396,11 @@ const setState = (data: any, index: number) => {
 | 
											
												
													
														|  |    const track = data.code || data.track;
 |  |    const track = data.code || data.track;
 | 
											
												
													
														|  |    state.track = track ? track.replace(/ /g, "").toLocaleLowerCase() : "";
 |  |    state.track = track ? track.replace(/ /g, "").toLocaleLowerCase() : "";
 | 
											
												
													
														|  |    // 能否评测,根据当前声轨有无伴奏判断
 |  |    // 能否评测,根据当前声轨有无伴奏判断
 | 
											
												
													
														|  | -  // if (state.isAppPlay) {
 |  | 
 | 
											
												
													
														|  | -  //   state.enableEvaluation = state.midiUrl ? true : false
 |  | 
 | 
											
												
													
														|  | -  // } else {
 |  | 
 | 
											
												
													
														|  | -  //   state.enableEvaluation = state.accompany ? true : false
 |  | 
 | 
											
												
													
														|  | -  // }
 |  | 
 | 
											
												
													
														|  | -  state.enableEvaluation = true
 |  | 
 | 
											
												
													
														|  | 
 |  | +  if (state.isAppPlay) {
 | 
											
												
													
														|  | 
 |  | +    state.enableEvaluation = state.midiUrl ? true : false
 | 
											
												
													
														|  | 
 |  | +  } else {
 | 
											
												
													
														|  | 
 |  | +    state.enableEvaluation = state.accompany || state.music ? true : false
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  |    state.isConcert = data.musicSheetType === "CONCERT" ? true : false;
 |  |    state.isConcert = data.musicSheetType === "CONCERT" ? true : false;
 | 
											
												
													
														|  |    // multiTracksSelection 返回为空,默认代表全部分轨
 |  |    // multiTracksSelection 返回为空,默认代表全部分轨
 | 
											
												
													
														|  |    state.canSelectTracks = data.multiTracksSelection === "null" || data.multiTracksSelection === "" || data.multiTracksSelection === null ? [] : data.multiTracksSelection?.split(',');
 |  |    state.canSelectTracks = data.multiTracksSelection === "null" || data.multiTracksSelection === "" || data.multiTracksSelection === null ? [] : data.multiTracksSelection?.split(',');
 | 
											
										
											
												
													
														|  | @@ -1622,11 +1667,13 @@ watch(
 | 
											
												
													
														|  |    () => state.activeMeasureIndex,
 |  |    () => state.activeMeasureIndex,
 | 
											
												
													
														|  |    () => {
 |  |    () => {
 | 
											
												
													
														|  |      // 需要减去的合并小节数
 |  |      // 需要减去的合并小节数
 | 
											
												
													
														|  | -    const needReduceMultipleRestNum = getNeedReduceMultipleRestNum(state.activeMeasureIndex)
 |  | 
 | 
											
												
													
														|  | -    const matchMeasureNum = state.activeMeasureIndex - needReduceMultipleRestNum - 1
 |  | 
 | 
											
												
													
														|  | -    console.log('选中的小节', matchMeasureNum, '需要减去的小节', needReduceMultipleRestNum, '当前的小节', state.activeMeasureIndex)
 |  | 
 | 
											
												
													
														|  | 
 |  | +    // const needReduceMultipleRestNum = getNeedReduceMultipleRestNum(state.activeMeasureIndex)
 | 
											
												
													
														|  | 
 |  | +    // const matchMeasureNum = state.activeMeasureIndex - needReduceMultipleRestNum - 1
 | 
											
												
													
														|  | 
 |  | +    // console.log('选中的小节',matchMeasureNum,'需要减去的小节',needReduceMultipleRestNum,'当前的小节',state.activeMeasureIndex)
 | 
											
												
													
														|  |      state.vfmeasures.forEach((item: any, idx: number) => {
 |  |      state.vfmeasures.forEach((item: any, idx: number) => {
 | 
											
												
													
														|  | -      if (idx === matchMeasureNum) {
 |  | 
 | 
											
												
													
														|  | 
 |  | +      const measureNum = item.getAttribute('data-num') ? Number(item.getAttribute('data-num')) : -1;
 | 
											
												
													
														|  | 
 |  | +      const nextMeasureNum = state.vfmeasures[idx+1]?.getAttribute('data-num') ? Number(state.vfmeasures[idx+1]?.getAttribute('data-num')) : -1;
 | 
											
												
													
														|  | 
 |  | +      if (measureNum >= 0 && (measureNum === state.activeMeasureIndex || (measureNum < state.activeMeasureIndex && nextMeasureNum > state.activeMeasureIndex)) ) {
 | 
											
												
													
														|  |          item.querySelector('.vf-custom-bg')?.setAttribute("fill", "#132D4C")
 |  |          item.querySelector('.vf-custom-bg')?.setAttribute("fill", "#132D4C")
 | 
											
												
													
														|  |          item.querySelector('.vf-custom-bot')?.setAttribute("fill", "#040D1E")
 |  |          item.querySelector('.vf-custom-bot')?.setAttribute("fill", "#040D1E")
 | 
											
												
													
														|  |        } else {
 |  |        } else {
 | 
											
										
											
												
													
														|  | @@ -1639,18 +1686,14 @@ watch(
 | 
											
												
													
														|  |              leftMeasureNumberXML = state.section[1].MeasureNumberXML
 |  |              leftMeasureNumberXML = state.section[1].MeasureNumberXML
 | 
											
												
													
														|  |              rightMeasureNumberXML = state.section[0].MeasureNumberXML
 |  |              rightMeasureNumberXML = state.section[0].MeasureNumberXML
 | 
											
												
													
														|  |            }
 |  |            }
 | 
											
												
													
														|  | -          const leftVfmeasuresIndex = leftMeasureNumberXML - getNeedReduceMultipleRestNum(leftMeasureNumberXML) - 1
 |  | 
 | 
											
												
													
														|  | -          const rightVfmeasuresIndex = rightMeasureNumberXML - getNeedReduceMultipleRestNum(rightMeasureNumberXML) - 1
 |  | 
 | 
											
												
													
														|  | -          if (idx >= leftVfmeasuresIndex && idx <= rightVfmeasuresIndex) {
 |  | 
 | 
											
												
													
														|  | 
 |  | +          if(measureNum >= leftMeasureNumberXML && measureNum <= rightMeasureNumberXML){
 | 
											
												
													
														|  |              item.querySelector('.vf-custom-bg')?.setAttribute("fill", "#609FCF")
 |  |              item.querySelector('.vf-custom-bg')?.setAttribute("fill", "#609FCF")
 | 
											
												
													
														|  |              item.querySelector('.vf-custom-bot')?.setAttribute("fill", "#2B70A5")
 |  |              item.querySelector('.vf-custom-bot')?.setAttribute("fill", "#2B70A5")
 | 
											
												
													
														|  |            }
 |  |            }
 | 
											
												
													
														|  |            // 预备小节
 |  |            // 预备小节
 | 
											
												
													
														|  | -          if (state.sectionFirst) {
 |  | 
 | 
											
												
													
														|  | -            const sectionFirstVfmeasuresIndex = state.sectionFirst.MeasureNumberXML - getNeedReduceMultipleRestNum(state.sectionFirst.MeasureNumberXML) - 1
 |  | 
 | 
											
												
													
														|  | -            const sectionFirstDom = state.vfmeasures[sectionFirstVfmeasuresIndex]
 |  | 
 | 
											
												
													
														|  | -            sectionFirstDom?.querySelector('.vf-custom-bg')?.setAttribute("fill", "#71B8BD")
 |  | 
 | 
											
												
													
														|  | -            sectionFirstDom?.querySelector('.vf-custom-bot')?.setAttribute("fill", "#448F9C")
 |  | 
 | 
											
												
													
														|  | 
 |  | +          if(state.sectionFirst && measureNum === state.sectionFirst.MeasureNumberXML){
 | 
											
												
													
														|  | 
 |  | +            item?.querySelector('.vf-custom-bg')?.setAttribute("fill", "#71B8BD")
 | 
											
												
													
														|  | 
 |  | +            item?.querySelector('.vf-custom-bot')?.setAttribute("fill", "#448F9C")
 | 
											
												
													
														|  |            }
 |  |            }
 | 
											
												
													
														|  |          } else {
 |  |          } else {
 | 
											
												
													
														|  |            item.querySelector('.vf-custom-bg')?.setAttribute("fill", "#609FCF")
 |  |            item.querySelector('.vf-custom-bg')?.setAttribute("fill", "#609FCF")
 | 
											
										
											
												
													
														|  | @@ -1674,32 +1717,30 @@ watch(
 | 
											
												
													
														|  |          leftMeasureNumberXML = state.section[1].MeasureNumberXML
 |  |          leftMeasureNumberXML = state.section[1].MeasureNumberXML
 | 
											
												
													
														|  |          rightMeasureNumberXML = state.section[0].MeasureNumberXML
 |  |          rightMeasureNumberXML = state.section[0].MeasureNumberXML
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -      const leftVfmeasuresIndex = leftMeasureNumberXML - getNeedReduceMultipleRestNum(leftMeasureNumberXML) - 1
 |  | 
 | 
											
												
													
														|  | -      const rightVfmeasuresIndex = rightMeasureNumberXML - getNeedReduceMultipleRestNum(rightMeasureNumberXML) - 1
 |  | 
 | 
											
												
													
														|  |        state.vfmeasures.forEach((item: any, idx: number) => {
 |  |        state.vfmeasures.forEach((item: any, idx: number) => {
 | 
											
												
													
														|  | 
 |  | +        const measureNum = item.getAttribute('data-num') ? Number(item.getAttribute('data-num')) : 1;
 | 
											
												
													
														|  |          // 小于选中置灰
 |  |          // 小于选中置灰
 | 
											
												
													
														|  | -        if (idx < leftVfmeasuresIndex) {
 |  | 
 | 
											
												
													
														|  | 
 |  | +        if (measureNum < leftMeasureNumberXML) {
 | 
											
												
													
														|  |            item.querySelector('.vf-custom-bg')?.setAttribute("fill", "rgba(96,159,207,0.5)")
 |  |            item.querySelector('.vf-custom-bg')?.setAttribute("fill", "rgba(96,159,207,0.5)")
 | 
											
												
													
														|  |            item.querySelector('.vf-custom-bot')?.setAttribute("fill", "rgba(43,112,165,0.5)")
 |  |            item.querySelector('.vf-custom-bot')?.setAttribute("fill", "rgba(43,112,165,0.5)")
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  |          // 大于选中置灰
 |  |          // 大于选中置灰
 | 
											
												
													
														|  | -        if (idx > rightVfmeasuresIndex) {
 |  | 
 | 
											
												
													
														|  | 
 |  | +        if(measureNum > rightMeasureNumberXML){
 | 
											
												
													
														|  |            item.querySelector('.vf-custom-bg')?.setAttribute("fill", "rgba(96,159,207,0.5)")
 |  |            item.querySelector('.vf-custom-bg')?.setAttribute("fill", "rgba(96,159,207,0.5)")
 | 
											
												
													
														|  |            item.querySelector('.vf-custom-bot')?.setAttribute("fill", "rgba(43,112,165,0.5)")
 |  |            item.querySelector('.vf-custom-bot')?.setAttribute("fill", "rgba(43,112,165,0.5)")
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  | 
 |  | +        // 预备小节
 | 
											
												
													
														|  | 
 |  | +        if(state.sectionFirst && measureNum === state.sectionFirst.MeasureNumberXML){
 | 
											
												
													
														|  | 
 |  | +          item?.querySelector('.vf-custom-bg')?.setAttribute("fill", "#71B8BD")
 | 
											
												
													
														|  | 
 |  | +          item?.querySelector('.vf-custom-bot')?.setAttribute("fill", "#448F9C")
 | 
											
												
													
														|  | 
 |  | +        }        
 | 
											
												
													
														|  |        })
 |  |        })
 | 
											
												
													
														|  | -      // 预备小节
 |  | 
 | 
											
												
													
														|  | -      if (state.sectionFirst) {
 |  | 
 | 
											
												
													
														|  | -        const sectionFirstVfmeasuresIndex = state.sectionFirst.MeasureNumberXML - getNeedReduceMultipleRestNum(state.sectionFirst.MeasureNumberXML) - 1
 |  | 
 | 
											
												
													
														|  | -        const sectionFirstDom = state.vfmeasures[sectionFirstVfmeasuresIndex]
 |  | 
 | 
											
												
													
														|  | -        sectionFirstDom?.querySelector('.vf-custom-bg')?.setAttribute("fill", "#71B8BD")
 |  | 
 | 
											
												
													
														|  | -        sectionFirstDom?.querySelector('.vf-custom-bot')?.setAttribute("fill", "#448F9C")
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -    } else {
 |  | 
 | 
											
												
													
														|  | 
 |  | +    }else{
 | 
											
												
													
														|  |        // 恢复选段前
 |  |        // 恢复选段前
 | 
											
												
													
														|  | -      const matchMeasureNum = state.activeMeasureIndex - getNeedReduceMultipleRestNum(state.activeMeasureIndex) - 1
 |  | 
 | 
											
												
													
														|  |        state.vfmeasures.forEach((item: any, idx: number) => {
 |  |        state.vfmeasures.forEach((item: any, idx: number) => {
 | 
											
												
													
														|  | -        if (idx === matchMeasureNum) {
 |  | 
 | 
											
												
													
														|  | 
 |  | +        const measureNum = item.getAttribute('data-num') ? Number(item.getAttribute('data-num')) : -1;
 | 
											
												
													
														|  | 
 |  | +        const nextMeasureNum = state.vfmeasures[idx+1]?.getAttribute('data-num') ? Number(state.vfmeasures[idx+1]?.getAttribute('data-num')) : -1;
 | 
											
												
													
														|  | 
 |  | +        if (measureNum >= 0 && (measureNum === state.activeMeasureIndex || (measureNum < state.activeMeasureIndex && nextMeasureNum > state.activeMeasureIndex)) ) {
 | 
											
												
													
														|  |            item.querySelector('.vf-custom-bg')?.setAttribute("fill", "#132D4C")
 |  |            item.querySelector('.vf-custom-bg')?.setAttribute("fill", "#132D4C")
 | 
											
												
													
														|  |            item.querySelector('.vf-custom-bot')?.setAttribute("fill", "#040D1E")
 |  |            item.querySelector('.vf-custom-bot')?.setAttribute("fill", "#040D1E")
 | 
											
												
													
														|  |          } else {
 |  |          } else {
 | 
											
										
											
												
													
														|  | @@ -1714,10 +1755,8 @@ watch(
 | 
											
												
													
														|  |  /** 刷新谱面 */
 |  |  /** 刷新谱面 */
 | 
											
												
													
														|  |  export const refreshMusicSvg = () => {
 |  |  export const refreshMusicSvg = () => {
 | 
											
												
													
														|  |    state.loadingText = '正在加载中,请稍等…'
 |  |    state.loadingText = '正在加载中,请稍等…'
 | 
											
												
													
														|  | -  if (state.isSingleLine) {
 |  | 
 | 
											
												
													
														|  | -    // 销毁旋律线
 |  | 
 | 
											
												
													
														|  | -    destroySmoothAnimation()
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | 
 |  | +  // 销毁旋律线
 | 
											
												
													
														|  | 
 |  | +  destroySmoothAnimation()
 | 
											
												
													
														|  |    musicScoreRef.value?.refreshMusicScore()
 |  |    musicScoreRef.value?.refreshMusicScore()
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 |