skyblued 2 vuotta sitten
vanhempi
commit
bd52600b7c

+ 66 - 23
src/pages/detail/section-box/index.tsx

@@ -22,7 +22,9 @@ const noteInfoItems = reactive({
   speed: false,
 })
 
-;(window as unknown as Window & {setNoteInfoItems: (data: typeof noteInfoItems) => void}).setNoteInfoItems = (data) => {
+;(window as unknown as Window & { setNoteInfoItems: (data: typeof noteInfoItems) => void }).setNoteInfoItems = (
+  data
+) => {
   for (const key in data) {
     if (Object.prototype.hasOwnProperty.call(data, key)) {
       noteInfoItems[key as keyof typeof noteInfoItems] = data[key as keyof typeof noteInfoItems]
@@ -98,7 +100,7 @@ export default defineComponent({
       boundingBox.y = boundingBox.y * 10
       boundingBox.width = boundingBox.width * 10
       boundingBox.height = boundingBox.height * 10
-      if (note?.sourceMeasure?.verticalMeasureList?.[0]?.stave?.height){
+      if (note?.sourceMeasure?.verticalMeasureList?.[0]?.stave?.height) {
         boundingBox.height = note.sourceMeasure?.verticalMeasureList?.[0]?.stave?.height
       }
       return boundingBox
@@ -164,7 +166,7 @@ export default defineComponent({
     },
     setSection(evt: MouseEvent) {
       const activeNote = getActtiveNoteByTimes(evt)
-      console.log("🚀 ~ activeNote", activeNote)
+      console.log('🚀 ~ activeNote', activeNote)
       if (activeNote && state.section.length < 2) {
         const sectionLength = state.section.length
         if (sectionLength === 0) {
@@ -226,12 +228,12 @@ export default defineComponent({
     }
     // console.log(uniqueByPosition(Object.values(state.evaluatings)), 'state.evaluatings')
     // console.log('state.sectionFlash', state.sectionFlash)
-	const activeNumberXml = state.times[runtime.activeIndex]?.noteElement?.sourceMeasure?.MeasureNumberXML || -2;
-	const restMeasure = restPromptData.list.find((n) => {
-		const m = activeNumberXml - n.measureNumberXML;
-		return n.allRests && m >= 0 && m < n.multipleRestMeasures;
-	});
-	const restNumber = restMeasure ? activeNumberXml - restMeasure.measureNumberXML + 1 : 0;
+    const activeNumberXml = state.times[runtime.activeIndex]?.noteElement?.sourceMeasure?.MeasureNumberXML || -2
+    const restMeasure = restPromptData.list.find((n) => {
+      const m = activeNumberXml - n.measureNumberXML
+      return n.allRests && m >= 0 && m < n.multipleRestMeasures
+    })
+    const restNumber = restMeasure ? activeNumberXml - restMeasure.measureNumberXML + 1 : 0
     return (
       <div class={styles.section} ref={sectionRef}>
         {/* 为每个音符添加一个遮罩方便点击 */}
@@ -256,7 +258,6 @@ export default defineComponent({
           if (SettingState.sett.type === 'jianpu' && item.svgElelent) {
             if (item.svgElelent.top_y && item.svgElelent.note_height) {
               bbox.y = item.svgElelent.top_y - item.svgElelent.note_height
-
             }
           }
           let { x, y, h, w } = bbox
@@ -274,13 +275,23 @@ export default defineComponent({
               {item.si === 0 && boundingBox && (
                 <div
                   data-id={item.id}
+                  data-num={item.noteElement.sourceMeasure.MeasureNumberXML}
                   style={{
                     position: 'absolute',
                     top: formatZoom(boundingBox.y) + 'px',
                     left: formatZoom(boundingBox.x) + 'px',
                     height: formatZoom(boundingBox.height) + 'px',
                     width: formatZoom(boundingBox.width) + 'px',
-                    // background:  'var(--eye-section-background-color)!important',
+                    background: state.sectionStatus
+                      ? `${
+                          item?.noteElement?.sourceMeasure?.MeasureNumberXML <
+                            state.section[0]?.noteElement?.sourceMeasure?.MeasureNumberXML ||
+                          item?.noteElement?.sourceMeasure?.MeasureNumberXML >
+                            state.section[1]?.noteElement?.sourceMeasure.MeasureNumberXML
+                            ? 'rgba(0, 0, 0,.28)'
+                            : 'var(--section-background-color)'
+                        }`
+                      : '',
                   }}
                   onClick={state.sectionStatus ? this.sectionClick : undefined}
                 ></div>
@@ -296,21 +307,55 @@ export default defineComponent({
                   height: formatZoom(h) + 'px',
                   width: formatZoom(w) + 'px',
                   // background: 'rgba(0, 0, 0, 0.5)',
-                  background: Object.values(noteInfoItems).find(v => v === true) ? 'rgba(255, 255, 255, 0.8)' : '',
+                  background: Object.values(noteInfoItems).find((v) => v === true) ? 'rgba(255, 255, 255, 0.8)' : '',
                 }}
                 onClick={this.sectionClick}
               >
-                {noteInfoItems.duration && <>{parseInt((item.duration * 100) + '') / 100}<br/></>}
-                {noteInfoItems.time && <>{item.time.toFixed(2)}<br/></>}
-                {noteInfoItems.numerator && <>{item.noteElement.sourceMeasure.activeTimeSignature.numerator}<br/><br/></>}
-                {noteInfoItems.denominator && <>{item.noteElement.sourceMeasure.activeTimeSignature.denominator}<br/><br/></>}
-                {noteInfoItems.i && <>{item.i}<br/><br/></>}
-                {noteInfoItems.speed && <>{item.speed.toFixed(0)}<br/><br/></>}
+                {noteInfoItems.duration && (
+                  <>
+                    {parseInt(item.duration * 100 + '') / 100}
+                    <br />
+                  </>
+                )}
+                {noteInfoItems.time && (
+                  <>
+                    {item.time.toFixed(2)}
+                    <br />
+                  </>
+                )}
+                {noteInfoItems.numerator && (
+                  <>
+                    {item.noteElement.sourceMeasure.activeTimeSignature.numerator}
+                    <br />
+                    <br />
+                  </>
+                )}
+                {noteInfoItems.denominator && (
+                  <>
+                    {item.noteElement.sourceMeasure.activeTimeSignature.denominator}
+                    <br />
+                    <br />
+                  </>
+                )}
+                {noteInfoItems.i && (
+                  <>
+                    {item.i}
+                    <br />
+                    <br />
+                  </>
+                )}
+                {noteInfoItems.speed && (
+                  <>
+                    {item.speed.toFixed(0)}
+                    <br />
+                    <br />
+                  </>
+                )}
                 <div class={[styles.noteBase, styles.noteRight]}>
-                  <Icon name='success' size="16" color="var(--primary-color)" />
+                  <Icon name="success" size="16" color="var(--primary-color)" />
                 </div>
                 <div class={[styles.noteBase, styles.noteError]}>
-                  <Icon name='cross' size="16" color="red" />
+                  <Icon name="cross" size="16" color="red" />
                 </div>
               </div>
             </>
@@ -321,7 +366,7 @@ export default defineComponent({
           const boundingBox = getBoundingBoxByverticalNote(item)
           let X: number | undefined = undefined
           try {
-            const bbox = item.svgElelent.bbox ||  item.svgElelent?.getBoundingBox()
+            const bbox = item.svgElelent.bbox || item.svgElelent?.getBoundingBox()
             X = formatZoom(bbox?.x || (index === 0 ? boundingBox.start_x : boundingBox.end_x))
           } catch (error) {
             console.log(error)
@@ -419,8 +464,6 @@ export default defineComponent({
             <div class="dot">{restNumber}</div>
           </div>
         )}
-
-
       </div>
     )
   },

+ 0 - 1
src/subpages/colexiu/App.tsx

@@ -73,7 +73,6 @@ export default defineComponent({
     onMounted(() => {
       clearInterval(timer)
       if (!route.name) return
-      console.log('进入云教练')
 
       timer = setInterval(() => {
         recordTotalTime()

+ 135 - 153
src/subpages/colexiu/index.tsx

@@ -1,11 +1,9 @@
 import { defineComponent, onMounted, onUnmounted, reactive, Ref, ref, watch, nextTick, Transition } from 'vue'
 import MusicSheet from '/src/music-sheet'
 import store from 'store'
-// import { throttle } from 'lodash'
 import runtime, * as RuntimeUtils from '/src/pages/detail/runtime'
 import { typeById, ITypeContentItem } from '/src/constant/fingering-colexiu'
 import detailState from '/src/pages/detail/state'
-import EvaluatingTips from '/src/pages/detail/evaluating-tips'
 import { getAllNodes, getDuration } from '/src/pages/detail/helpers'
 import SettingState from '/src/pages/detail/setting-state'
 import {
@@ -45,6 +43,7 @@ import Tips from './tips'
 import AfterClassTraining from './afterClassTraining'
 import ModelWraper from './buttons/model-wraper'
 import Follow from './popups/follow'
+import UnitTest from './unitTest'
 
 // json化曲谱的note信息和svg
 export const musicJSON = reactive({
@@ -63,7 +62,7 @@ export default defineComponent({
     const browserInfo = browser()
     const tipShow = ref(false)
     const route = useRoute()
-    console.log("🚀 ~ route", route.query, search)
+    // console.log("🚀 ~ route", route.query, search)
     detailState.midiPlayIniting = true
     const renderLoading = ref(true)
     const renderError = ref(false)
@@ -74,11 +73,10 @@ export default defineComponent({
     const activeType = ref<object>({})
     const fingeringDetail = ref<ITypeContentItem | object>({})
     const [detailStatus, detail] = useDetail(search.id as string)
-    const pages = new PageFormat(650, 884)
+
     /** 监听详情的获取状态,设置指法等信息 */
     watch(detailStatus, async () => {
       if (detailStatus.value === 'success' && detail.value.xmlFileUrl) {
-        pushAppMusic(detail.value)
         fingeringDetail.value = typeById[formatId(detail.value.code || '')] || {}
         const { showFingering, frozenMode, compulsionEvaluating: compulsion } = useActivity()
         const [status, width, atype] = await useFingering(showFingering.value ? detail.value.code : undefined)
@@ -87,8 +85,6 @@ export default defineComponent({
         activeType.value = atype.value as object
         detailState.frozenMode = frozenMode.value
         compulsionEvaluating.value = compulsion.value
-      }
-      if (detailStatus.value === 'success' && detail.value.xmlFileUrl) {
         const xml = await useXml(detail.value.xmlFileUrl, detail.value)
         if (!xml.value) {
           renderLoading.value = false
@@ -100,6 +96,24 @@ export default defineComponent({
       }
     })
 
+    onMounted(() => {
+      ;(window as any).appName = 'colexiu'
+      RuntimeUtils.event.on('settingFingeringChange', settingFingeringChange)
+      postMessage({
+        api: 'setEventTracking',
+        content: {
+          type: 'klx_xiaokuAI',
+        },
+      })
+    })
+
+    onUnmounted(() => {
+      RuntimeUtils.event.off('settingFingeringChange', settingFingeringChange)
+      if (typeof runtime?.audiosInstance?.destroy === 'function') {
+        runtime.audiosInstance?.destroy()
+      }
+    })
+
     function throttle(fn: any, delay: number) {
       let valid = true
       return function () {
@@ -125,24 +139,6 @@ export default defineComponent({
       }
     }, 300)
 
-    onMounted(() => {
-      ;(window as any).appName = 'colexiu'
-      RuntimeUtils.event.on('settingFingeringChange', settingFingeringChange)
-      postMessage({
-        api: 'setEventTracking',
-        content: {
-          type: 'klx_xiaokuAI',
-        },
-      })
-    })
-
-    onUnmounted(() => {
-      RuntimeUtils.event.off('settingFingeringChange', settingFingeringChange)
-      if (typeof runtime?.audiosInstance?.destroy === 'function') {
-        runtime.audiosInstance?.destroy()
-      }
-    })
-
     useUser()
 
     useSpecialShapedScreen()
@@ -153,11 +149,10 @@ export default defineComponent({
     const isProductJson = ref(false)
     const productRef = ref()
 
-    /** 当渲染完成后的回调 */
-    const onRerender = async (osmd: OpenSheetMusicDisplay) => {
+    /**结束全屏动画 */
+    const endFullLoading = () => {
       // @ts-ignore
       window.isLoading = false
-      console.log('onRerender', '渲染结束')
       postMessage({
         api: 'cloudLoading',
         content: {
@@ -165,13 +160,18 @@ export default defineComponent({
           type: 'fullscreen',
         },
       })
+    }
+
+    /** 当渲染完成后的回调 */
+    const onRerender = async (osmd: OpenSheetMusicDisplay) => {
+      endFullLoading()
       detailState.initRendered = true
-      // console.log('onRerender', osmd)
-      // console.log(search)
       console.time('获取数据')
       runtime.osmd = osmd
       // 设置速度
-      const saveSpeed = (store.get('speeds') || {})[search.id as string]
+      console.log(store.get('speeds22'))
+      //@ts-ignore
+      const saveSpeed = (store.get('speeds') || {})[search.id]
       const bpm = (osmd as any).bpm || osmd.Sheet.userStartTempoInBPM
 
       detailState.activeSpeed = saveSpeed || detail.value.playSpeed || bpm || 100
@@ -260,29 +260,11 @@ export default defineComponent({
       renderLoading.value = true
     }
     const onRenderError = () => {
-      // @ts-ignore
-      window.isLoading = false
-      postMessage({
-        api: 'cloudLoading',
-        content: {
-          show: false,
-          type: 'fullscreen',
-        },
-      })
+      endFullLoading()
       renderError.value = true
       renderLoading.value = false
     }
 
-    //给app传伴奏
-    const pushAppMusic = (detail: any) => {
-      postMessage({
-        api: 'cloudAccompanyMessage',
-        content: {
-          accompanyUrl: detail.audioFileUrl || detail.metronomeUrl || detail.url || '',
-        },
-      })
-    }
-
     return () => {
       const loading = renderLoading.value || detailStatus.value === 'loading'
       const error = renderError.value || detailStatus.value === 'error'
@@ -306,117 +288,117 @@ export default defineComponent({
             : '',
       }
       return (
-        <div
-          class={[
-            styles.container,
-            SettingState.sett.eyeProtection && 'eyeProtection',
-            browserInfo.android && 'android',
-          ]}
-        >
-          <Transition name="van-slide-down">{!renderLoading.value && <Buttons class={styles.buttons} />}</Transition>
+        <>
           <div
-            id="colexiu-detail-music-sheet"
-            class={[styles.musicSheet, { evaluating: runtime.evaluatingStatus || modelType.value === 'follow' }]}
-            style={{
-              paddingLeft: detailState.isSpecialShapedScreen ? detailState.notchHeight / 2 + 'px' : 'auto',
-              paddingBottom:
-                needFingering && (fingeringDetail.value as any).height ? (fingeringDetail.value as any).height : '40px',
-              background: SettingState.sett.camera
-                ? `rgba(${SettingState.sett.eyeProtection ? '253,244,229' : '255,255,255'} ,${
-                    SettingState.sett.opacity / 100
-                  }) !important`
-                : '',
-            }}
+            class={[
+              styles.container,
+              SettingState.sett.eyeProtection && 'eyeProtection',
+              browserInfo.android && 'android',
+            ]}
           >
-            {!!detail.value.musicSheetName && (
-              <div style={{ width: !renderLoading.value ? musicSheetStyle.width : '' }} class={styles.headTitle}>
-                {detail.value.musicSheetName}
-              </div>
-            )}
-            <Skeleton class={styles.skeleton} rowWidth="80%" title loading={detailStatus.value === 'loading'} />
-            <Skeleton class={styles.skeleton} row={6} loading={renderLoading.value} />
-            {score.value && fingeringInited && (
-              <>
-                <MusicSheet
-                  ref={MusicSheetRef}
-                  style={musicSheetStyle}
-                  score={score.value}
-                  EngravingRules={
-                    search.pageType === 'multiple'
-                      ? {
-                          PageFormat: pages,
-                          DYMusicScoreType: SettingState.sett.type,
-                        }
-                      : {
-                          DYMusicScoreType: SettingState.sett.type,
-                        }
-                  }
-                  opotions={{
-                    drawTitle: false,
-                    drawComposer: true,
-                    drawLyricist: false,
-                    drawMetronomeMarks: true,
-                    drawMeasureNumbers: true,
-                    autoResize: false,
-                  }}
-                  onStartRender={onStartRender}
-                  onRenderError={onRenderError}
-                  onRerender={onRerender}
-                />
-                {needFingering && (
-                  <Fingering
-                    style={{
-                      background: SettingState.sett.camera
-                        ? `rgba(${SettingState.sett.eyeProtection ? '253,244,229' : '255,255,255'} ,${
-                            SettingState.sett.opacity / 100
-                          })`
-                        : '',
-                      boxShadow: SettingState.sett.camera ? 'none' : '',
+            <Transition name="van-slide-down">{!renderLoading.value && <Buttons class={styles.buttons} />}</Transition>
+            <div
+              id="colexiu-detail-music-sheet"
+              class={[styles.musicSheet, { evaluating: runtime.evaluatingStatus || modelType.value === 'follow' }]}
+              style={{
+                paddingLeft: detailState.isSpecialShapedScreen ? detailState.notchHeight / 2 + 'px' : 'auto',
+                paddingBottom:
+                  needFingering && (fingeringDetail.value as any).height
+                    ? (fingeringDetail.value as any).height
+                    : '40px',
+                background: SettingState.sett.camera
+                  ? `rgba(${SettingState.sett.eyeProtection ? '253,244,229' : '255,255,255'} ,${
+                      SettingState.sett.opacity / 100
+                    }) !important`
+                  : '',
+              }}
+            >
+              {!!detail.value.musicSheetName && (
+                <div style={{ width: !renderLoading.value ? musicSheetStyle.width : '' }} class={styles.headTitle}>
+                  {detail.value.musicSheetName}
+                </div>
+              )}
+              <Skeleton class={styles.skeleton} rowWidth="80%" title loading={detailStatus.value === 'loading'} />
+              <Skeleton class={styles.skeleton} row={6} loading={renderLoading.value} />
+              {score.value && fingeringInited && (
+                <>
+                  <MusicSheet
+                    ref={MusicSheetRef}
+                    style={musicSheetStyle}
+                    score={score.value}
+                    EngravingRules={{
+                      DYMusicScoreType: SettingState.sett.type,
+                    }}
+                    opotions={{
+                      drawTitle: false,
+                      drawComposer: true,
+                      drawLyricist: false,
+                      drawMetronomeMarks: true,
+                      drawMeasureNumbers: true,
+                      autoResize: false,
                     }}
-                    code={detail.value.code}
+                    onStartRender={onStartRender}
+                    onRenderError={onRenderError}
+                    onRerender={onRerender}
                   />
-                )}
-              </>
-            )}
-            {modelType.value === 'follow' && <Follow ref={followRef} />}
-          </div>
-          {!renderLoading.value && <ButtonsPlayer />}
-          {/* 节拍器弹窗 */}
-          <TickPopup score={score.value} />
-          <Permission />
-          {/* 效音 */}
-          <SoundEffect />
-          {/* 投屏帮助 */}
-          <HelperPopup />
-          {/** 曲目列表 */}
-          <MusicList />
-          {/* 保存json */}
-          <ProductJson ref={productRef} />
+                  {needFingering && (
+                    <Fingering
+                      style={{
+                        background: SettingState.sett.camera
+                          ? `rgba(${SettingState.sett.eyeProtection ? '253,244,229' : '255,255,255'} ,${
+                              SettingState.sett.opacity / 100
+                            })`
+                          : '',
+                        boxShadow: SettingState.sett.camera ? 'none' : '',
+                      }}
+                      code={detail.value.code}
+                    />
+                  )}
+                </>
+              )}
+              {modelType.value === 'follow' && <Follow ref={followRef} />}
+            </div>
+            {!renderLoading.value && <ButtonsPlayer />}
+            {/* 节拍器弹窗 */}
+            <TickPopup score={score.value} />
+            <Permission />
+            {/* 效音 */}
+            <SoundEffect />
+            {/* 投屏帮助 */}
+            <HelperPopup />
+            {/** 曲目列表 */}
+            <MusicList />
+            {/* 保存json */}
+            <ProductJson ref={productRef} />
 
-          {/* 后台课后训练小节选择 */}
-          <AfterClassTraining />
+            {/* 后台课后训练小节选择 */}
+            <AfterClassTraining />
 
-          {/* 模式选择 */}
-          <Transition
-            name="van-slide-up"
-            onAfterEnter={() => {
-              tipShow.value = true
-              console.log('2342')
-            }}
-          >
-            {!renderLoading.value && modelType.value == 'init' && <ModelWraper onChangeModelType={onChangeModelType} />}
-          </Transition>
+            {/* 模式选择 */}
+            <Transition
+              name="van-slide-up"
+              onAfterEnter={() => {
+                tipShow.value = true
+              }}
+            >
+              {!renderLoading.value && modelType.value == 'init' && (
+                <ModelWraper onChangeModelType={onChangeModelType} />
+              )}
+            </Transition>
 
-          {/* 引导 */}
-          {tipShow.value && <Tips />}
+            {/* 引导 */}
+            {tipShow.value && !error && <Tips />}
 
-          {/* 加载错误 */}
-          {error && (
-            <div class={styles.errorWrap}>
-              <Empty />
-            </div>
-          )}
-        </div>
+            {/* 加载错误 */}
+            {error && (
+              <div class={styles.errorWrap}>
+                <Empty />
+              </div>
+            )}
+          </div>
+          {/* 单元测验选段 */}
+          {/* {!renderLoading.value && <UnitTest />} */}
+        </>
       )
     }
   },

+ 84 - 0
src/subpages/colexiu/unitTest/index.tsx

@@ -0,0 +1,84 @@
+import { defineComponent, onMounted, ref } from 'vue'
+import { useOriginSearch } from '../uses'
+import request from '/src/helpers/request'
+import SettingState from '/src/pages/detail/setting-state'
+import runtime, { sectionChange } from '/src/pages/detail/runtime'
+import state from '/src/pages/detail/state'
+import { Toast } from 'vant'
+
+interface IquestionExtendsInfo {
+  /** 评测难度 */
+  difficulty: 'ONE' | 'TWO' | 'THREE' | '1' | '2' | '3' | ''
+  /** 开始小节 */
+  start: string
+  /** 结束小节 */
+  end: string
+}
+const difficultyData: { [_: string]: any } = {
+  ONE: 'BEGINNER',
+  TWO: 'ADVANCED',
+  THREE: 'PERFORMER',
+  '1': 'BEGINNER',
+  '2': 'ADVANCED',
+  '3': 'PERFORMER',
+}
+
+/** 是否是选段模式 */
+export const isSelctMeasureMode = ref(false)
+
+export default defineComponent({
+  name: 'unitTest',
+  setup() {
+    const questionExtendsInfo = ref<IquestionExtendsInfo>({
+      difficulty: '',
+      start: '',
+      end: '',
+    })
+    /**
+     * 如果是课后训练或者单元测验,获取数据
+     * @param xml 获取的xml数据
+     * @returns 格式化的xml数据
+     */
+    const getUnitData = async () => {
+      const search = useOriginSearch()
+      if (!search.questionId) return ''
+
+      try {
+        const res: any = await request.get(`/examinationQuestion/detail?examinationQuestionId=${search.questionId}`)
+        questionExtendsInfo.value = JSON.parse(res?.data?.questionExtendsInfo) || {}
+      } catch (error) {
+        console.error('解析单元测验曲谱题目失败', error)
+      }
+
+      // 设置评测难度
+      if (difficultyData[questionExtendsInfo.value.difficulty]) {
+        SettingState.eva.difficulty = difficultyData[questionExtendsInfo.value.difficulty]
+      }
+      if (questionExtendsInfo.value.start && questionExtendsInfo.value.end) {
+      }
+      console.log('🚀 ~ questionExtendsInfo', questionExtendsInfo.value)
+    }
+
+    /**设置小节 */
+    const setSection = () => {
+      const startNote = state.times.find(
+        (n: any) => n.si === 0 && n.noteElement.sourceMeasure.MeasureNumberXML == questionExtendsInfo.value.start
+      )
+      const endNote = state.times.find(
+        (n: any) => n.si === 0 && n.noteElement.sourceMeasure.MeasureNumberXML == questionExtendsInfo.value.end
+      )
+      console.log('🚀 ~ activeNote', startNote, endNote)
+      if (startNote && endNote) {
+        state.section = [startNote, endNote]
+        Toast.clear()
+        isSelctMeasureMode.value = true
+      }
+    }
+    onMounted(async () => {
+      await getUnitData()
+      sectionChange()
+      setSection()
+    })
+    return () => <div></div>
+  },
+})

+ 16 - 5
src/subpages/colexiu/uses/use-app.ts

@@ -41,6 +41,15 @@ export const useXml = async (url: string, detail: MusicSheelDetail) => {
   return score
 }
 
+/**给app传伴奏 */
+const pushAppMusic = (accompanyUrl: string) => {
+  postMessage({
+    api: 'cloudAccompanyMessage',
+    content: {
+      accompanyUrl,
+    },
+  })
+}
 /**
  * 设置音频信息
  * @param detail 音乐详情
@@ -52,6 +61,7 @@ export const useMp3s = async (detail: MusicSheelDetail) => {
 
   // 伴奏
   const backgroundSong = encodeURI(detail.audioFileUrl || detail.metronomeUrl || detail.url || '')
+  pushAppMusic(backgroundSong)
   // 原音
   const musicSong = encodeURI(activebg?.audioFileUrl || activebg?.metronomeUrl || '')
   // 兼容未修改之前
@@ -66,7 +76,7 @@ export const useMp3s = async (detail: MusicSheelDetail) => {
   let defaultExtConfigJson = {
     skipTick: false,
     repeatedBeats: true,
-    scoreSize: 'middle'
+    scoreSize: 'middle',
   }
   let extConfigJson = {}
   detailState.activeDetail = {
@@ -94,7 +104,7 @@ export const useMp3s = async (detail: MusicSheelDetail) => {
   const zooms = store.get('zooms') || {}
 
   if (setZoom && !zooms['' + detail.id]) {
-    store.set('zooms', {...zooms, ['' + detail.id]: setZoom})
+    store.set('zooms', { ...zooms, ['' + detail.id]: setZoom })
     SettingState.sett.scoreSize = setZoom
   }
 
@@ -108,7 +118,6 @@ export const useMp3s = async (detail: MusicSheelDetail) => {
   if (!runtime.audiosInstance) {
     runtime.audiosInstance = new audiosInstance(Object.values(runtime.songs) as string[])
   }
-
 }
 
 /**
@@ -149,7 +158,10 @@ export const useDetail = (id: number | string): [Ref<ShaeetStatusType>, Ref<Musi
       useMp3s(res.data)
       data.value = {
         ...res.data,
-        code: Array.isArray(res?.data?.background) && res.data.background.length ? getSubjectIdCode(res.data.background[0].musicSubject) : ''
+        code:
+          Array.isArray(res?.data?.background) && res.data.background.length
+            ? getSubjectIdCode(res.data.background[0].musicSubject)
+            : '',
       }
       // notation: 是能转简谱 0: 不可以,需要设置成五线谱模式
       if (data.value.notation == 0) {
@@ -176,7 +188,6 @@ export const useSuspendPlay = () => {
     if (runtime.playState === 'play') {
       RuntimeUtils.resetPlayStatus()
       if (runtime.evaluatingStatus) {
-        
         // postMessage(
         //   {
         //     api: 'pauseRecording',