TIANYONG 2 月之前
父節點
當前提交
192cbd5ccf
共有 60 個文件被更改,包括 162 次插入95 次删除
  1. 9 9
      dist/colexiu.html
  2. 0 0
      dist/css/index-64ae39d1.css
  3. 9 9
      dist/index.html
  4. 6 6
      dist/instrument.html
  5. 0 0
      dist/js/colexiu-716c854a.js
  6. 0 0
      dist/js/colexiu-legacy-80e6f551.js
  7. 0 0
      dist/js/gym-4b62f039.js
  8. 0 0
      dist/js/gym-legacy-cd6d56af.js
  9. 0 0
      dist/js/index-1207b9a5.js
  10. 0 0
      dist/js/index-1541b87a.js
  11. 0 0
      dist/js/index-1d7da1e0.js
  12. 0 0
      dist/js/index-2a4b118d.js
  13. 0 0
      dist/js/index-35fc45ed.js
  14. 0 0
      dist/js/index-481a44b7.js
  15. 1 1
      dist/js/index-6fb84019.js
  16. 0 0
      dist/js/index-9feb05e7.js
  17. 1 1
      dist/js/index-c3f6432e.js
  18. 0 0
      dist/js/index-legacy-0a9a20c6.js
  19. 0 0
      dist/js/index-legacy-1f2d0e80.js
  20. 1 1
      dist/js/index-legacy-2f6120a3.js
  21. 1 1
      dist/js/index-legacy-4fa0273e.js
  22. 0 0
      dist/js/index-legacy-51168feb.js
  23. 0 0
      dist/js/index-legacy-883670ff.js
  24. 0 0
      dist/js/index-legacy-ad8f83b7.js
  25. 0 0
      dist/js/index-legacy-d1daec56.js
  26. 0 0
      dist/js/index-legacy-f1317986.js
  27. 0 0
      dist/js/instrument-05bd7b38.js
  28. 0 0
      dist/js/instrument-legacy-5e666a92.js
  29. 0 0
      dist/js/modeView-a8e98e58.js
  30. 0 0
      dist/js/modeView-legacy-7a50728d.js
  31. 0 0
      dist/js/orchestra-aed649a5.js
  32. 0 0
      dist/js/orchestra-legacy-cbe1b26f.js
  33. 0 0
      dist/js/polyfills-eb47a7de.js
  34. 0 0
      dist/js/polyfills-legacy-2b34d33c.js
  35. 0 0
      dist/js/polyfills-legacy-d06b42a6.js
  36. 0 0
      dist/js/report-share-11698839.js
  37. 0 0
      dist/js/report-share-legacy-89257010.js
  38. 10 10
      dist/orchestra.html
  39. 7 7
      dist/report-share.html
  40. 42 19
      src/helpers/formateMusic.ts
  41. 17 1
      src/helpers/metronome.ts
  42. 1 1
      src/page-instrument/custom-plugins/recording-time/index.tsx
  43. 二進制
      src/page-instrument/header-top/image/speed1.png
  44. 二進制
      src/page-instrument/header-top/image/speed2.png
  45. 二進制
      src/page-instrument/header-top/image/speed3.png
  46. 二進制
      src/page-instrument/header-top/image/speed4.png
  47. 二進制
      src/page-instrument/header-top/image/speed5.png
  48. 二進制
      src/page-instrument/header-top/image/speed6.png
  49. 二進制
      src/page-instrument/header-top/image/speed7.png
  50. 二進制
      src/page-instrument/header-top/image/speed8.png
  51. 1 1
      src/page-instrument/header-top/index.tsx
  52. 9 4
      src/page-instrument/header-top/speed/index.module.less
  53. 7 7
      src/page-instrument/header-top/speed/index.tsx
  54. 28 9
      src/state.ts
  55. 2 2
      src/view/evaluating/evaluatResult.ts
  56. 0 0
      src/view/evaluating/scoreIcon.json
  57. 1 1
      src/view/follow-practice/index.tsx
  58. 7 3
      src/view/selection/index.module.less
  59. 0 0
      stats.html
  60. 2 2
      vite.config.ts

+ 9 - 9
dist/colexiu.html

@@ -2,7 +2,7 @@
 <html lang="en">
 
 <head>
-  <script type="module" crossorigin src="./js/polyfills-336fef56.js"></script>
+  <script type="module" crossorigin src="./js/polyfills-eb47a7de.js"></script>
 
   <meta charset="UTF-8" />
   <link rel="icon" type="image/svg+xml" href="./vite.svg" />
@@ -40,12 +40,12 @@
       },
     })
   </script>
-  <script type="module" crossorigin src="./js/colexiu-513a065b.js"></script>
-  <link rel="modulepreload" crossorigin href="./js/index-5bbbe457.js">
-  <link rel="modulepreload" crossorigin href="./js/index-522f7332.js">
-  <link rel="modulepreload" crossorigin href="./js/index-68946d68.js">
-  <link rel="modulepreload" crossorigin href="./js/index-d7bafa9a.js">
-  <link rel="stylesheet" href="./css/index-0e9d5ebe.css">
+  <script type="module" crossorigin src="./js/colexiu-716c854a.js"></script>
+  <link rel="modulepreload" crossorigin href="./js/index-9feb05e7.js">
+  <link rel="modulepreload" crossorigin href="./js/index-1541b87a.js">
+  <link rel="modulepreload" crossorigin href="./js/index-35fc45ed.js">
+  <link rel="modulepreload" crossorigin href="./js/index-c3f6432e.js">
+  <link rel="stylesheet" href="./css/index-64ae39d1.css">
   <link rel="stylesheet" href="./css/colexiu-62f31c4f.css">
   <script type="module">import.meta.url;import("_").catch(()=>1);async function* g(){};window.__vite_is_modern_browser=true;</script>
   <script type="module">!function(){if(window.__vite_is_modern_browser)return;console.warn("vite: loading legacy chunks, syntax error above and the same error below should be ignored");var e=document.getElementById("vite-legacy-polyfill"),n=document.createElement("script");n.src=e.src,n.onload=function(){System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))},document.body.appendChild(n)}();</script>
@@ -56,8 +56,8 @@
   <img id="loading" class="show" src="./loading.svg" alt="loading" />
   
   <script nomodule>!function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",(function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()}),!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();</script>
-  <script nomodule crossorigin id="vite-legacy-polyfill" src="./js/polyfills-legacy-d06b42a6.js"></script>
-  <script nomodule crossorigin id="vite-legacy-entry" data-src="./js/colexiu-legacy-3455b5fa.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
+  <script nomodule crossorigin id="vite-legacy-polyfill" src="./js/polyfills-legacy-2b34d33c.js"></script>
+  <script nomodule crossorigin id="vite-legacy-entry" data-src="./js/colexiu-legacy-80e6f551.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
 </body>
 
 </html>

File diff suppressed because it is too large
+ 0 - 0
dist/css/index-64ae39d1.css


+ 9 - 9
dist/index.html

@@ -2,7 +2,7 @@
 <html lang="ZH-cn">
 
 <head>
-  <script type="module" crossorigin src="./js/polyfills-336fef56.js"></script>
+  <script type="module" crossorigin src="./js/polyfills-eb47a7de.js"></script>
 
   <meta charset="UTF-8">
   <link rel="icon" href="./favicon.ico" />
@@ -75,13 +75,13 @@
       }
     })
   </script>
-  <script type="module" crossorigin src="./js/gym-1470be8b.js"></script>
-  <link rel="modulepreload" crossorigin href="./js/index-5bbbe457.js">
-  <link rel="modulepreload" crossorigin href="./js/index-522f7332.js">
-  <link rel="modulepreload" crossorigin href="./js/index-e9c8f4b1.js">
-  <link rel="modulepreload" crossorigin href="./js/index-d7bafa9a.js">
+  <script type="module" crossorigin src="./js/gym-4b62f039.js"></script>
+  <link rel="modulepreload" crossorigin href="./js/index-9feb05e7.js">
+  <link rel="modulepreload" crossorigin href="./js/index-1541b87a.js">
+  <link rel="modulepreload" crossorigin href="./js/index-481a44b7.js">
+  <link rel="modulepreload" crossorigin href="./js/index-c3f6432e.js">
   <link rel="modulepreload" crossorigin href="./js/plyr.min-c8c2777b.js">
-  <link rel="stylesheet" href="./css/index-0e9d5ebe.css">
+  <link rel="stylesheet" href="./css/index-64ae39d1.css">
   <link rel="stylesheet" href="./css/index-85f95688.css">
   <link rel="stylesheet" href="./css/plyr-ad8ef5ae.css">
   <link rel="stylesheet" href="./css/index-171cd132.css">
@@ -98,8 +98,8 @@
   <img id="loading" class="show" src="./loading.svg" alt="loading" />
   
   <script nomodule>!function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",(function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()}),!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();</script>
-  <script nomodule crossorigin id="vite-legacy-polyfill" src="./js/polyfills-legacy-d06b42a6.js"></script>
-  <script nomodule crossorigin id="vite-legacy-entry" data-src="./js/gym-legacy-3f3a9a20.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
+  <script nomodule crossorigin id="vite-legacy-polyfill" src="./js/polyfills-legacy-2b34d33c.js"></script>
+  <script nomodule crossorigin id="vite-legacy-entry" data-src="./js/gym-legacy-cd6d56af.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
 </body>
 
 </html>

+ 6 - 6
dist/instrument.html

@@ -2,7 +2,7 @@
 <html lang="en">
 
 <head>
-  <script type="module" crossorigin src="./js/polyfills-336fef56.js"></script>
+  <script type="module" crossorigin src="./js/polyfills-eb47a7de.js"></script>
 
   <meta charset="UTF-8" />
   <meta name="viewport"
@@ -41,9 +41,9 @@
       })
     }
   </script>
-  <script type="module" crossorigin src="./js/instrument-4b0ee13e.js"></script>
-  <link rel="modulepreload" crossorigin href="./js/index-5bbbe457.js">
-  <link rel="stylesheet" href="./css/index-0e9d5ebe.css">
+  <script type="module" crossorigin src="./js/instrument-05bd7b38.js"></script>
+  <link rel="modulepreload" crossorigin href="./js/index-9feb05e7.js">
+  <link rel="stylesheet" href="./css/index-64ae39d1.css">
   <link rel="stylesheet" href="./css/instrument-118f68d3.css">
   <script type="module">import.meta.url;import("_").catch(()=>1);async function* g(){};window.__vite_is_modern_browser=true;</script>
   <script type="module">!function(){if(window.__vite_is_modern_browser)return;console.warn("vite: loading legacy chunks, syntax error above and the same error below should be ignored");var e=document.getElementById("vite-legacy-polyfill"),n=document.createElement("script");n.src=e.src,n.onload=function(){System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))},document.body.appendChild(n)}();</script>
@@ -67,8 +67,8 @@
     var vConsole = new window.VConsole();
   </script>   -->
   <script nomodule>!function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",(function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()}),!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();</script>
-  <script nomodule crossorigin id="vite-legacy-polyfill" src="./js/polyfills-legacy-d06b42a6.js"></script>
-  <script nomodule crossorigin id="vite-legacy-entry" data-src="./js/instrument-legacy-4f902f35.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
+  <script nomodule crossorigin id="vite-legacy-polyfill" src="./js/polyfills-legacy-2b34d33c.js"></script>
+  <script nomodule crossorigin id="vite-legacy-entry" data-src="./js/instrument-legacy-5e666a92.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
 </body>
 
 </html>

File diff suppressed because it is too large
+ 0 - 0
dist/js/colexiu-716c854a.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/colexiu-legacy-80e6f551.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/gym-4b62f039.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/gym-legacy-cd6d56af.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/index-1207b9a5.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/index-1541b87a.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/index-1d7da1e0.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/index-2a4b118d.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/index-35fc45ed.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/index-481a44b7.js


+ 1 - 1
dist/js/index-d1df7006.js → dist/js/index-6fb84019.js

@@ -1 +1 @@
-import{d as i,g as l,n as d,bM as e,c,m as r,h as s,au as u}from"./index-5bbbe457.js";const m="_skeleton_vtlsh_1",f="_detail_vtlsh_12",p="_container_vtlsh_20",a={skeleton:m,detail:f,container:p},y=i({name:"music-list",setup(){const n=l(),t=d({isLoading:!0,isProductLoading:!1,product:[{state:!1,name:"五线谱",type:e.staff,base64:""},{state:!1,name:"首调",type:e.firstTone,base64:""},{state:!1,name:"固定调",type:e.fixedTone,base64:""}]});c(()=>{window.appName="colexiu",r.xmlUrl=n.xmlUrl,t.isLoading=!1});const o=async()=>{console.log("渲染完成")};return()=>s("div",{class:a.detail},[s("div",{id:"scrollContainer",class:[a.container,"hideCursor"]},[!t.isLoading&&s(u,{onRendered:o},null)])])}});export{y as default};
+import{d as i,g as l,n as d,bM as e,c,m as r,h as s,au as u}from"./index-9feb05e7.js";const m="_skeleton_vtlsh_1",f="_detail_vtlsh_12",p="_container_vtlsh_20",a={skeleton:m,detail:f,container:p},y=i({name:"music-list",setup(){const n=l(),t=d({isLoading:!0,isProductLoading:!1,product:[{state:!1,name:"五线谱",type:e.staff,base64:""},{state:!1,name:"首调",type:e.firstTone,base64:""},{state:!1,name:"固定调",type:e.fixedTone,base64:""}]});c(()=>{window.appName="colexiu",r.xmlUrl=n.xmlUrl,t.isLoading=!1});const o=async()=>{console.log("渲染完成")};return()=>s("div",{class:a.detail},[s("div",{id:"scrollContainer",class:[a.container,"hideCursor"]},[!t.isLoading&&s(u,{onRendered:o},null)])])}});export{y as default};

File diff suppressed because it is too large
+ 0 - 0
dist/js/index-9feb05e7.js


+ 1 - 1
dist/js/index-d7bafa9a.js → dist/js/index-c3f6432e.js

@@ -1 +1 @@
-import{b7 as l,d as i,h as a,bh as v,ba as r,bc as d,bz as _,bd as m,bA as w,bg as u,bk as g,F as A}from"./index-5bbbe457.js";const[$,y]=l("skeleton-title"),P={round:Boolean,titleWidth:r};var p=i({name:$,props:P,setup(t){return()=>a("h3",{class:y([{round:t.round}]),style:{width:v(t.titleWidth)}},null)}});const T=d(p);var z=T;const[B,D]=l("skeleton-avatar"),F={avatarSize:r,avatarShape:m("round")};var N=i({name:B,props:F,setup(t){return()=>a("div",{class:D([t.avatarShape]),style:_(t.avatarSize)},null)}});const R=d(N);var I=R;const s="100%",L={round:Boolean,rowWidth:{type:r,default:s}},[U,C]=l("skeleton-paragraph");var E=i({name:U,props:L,setup(t){return()=>a("div",{class:C([{round:t.round}]),style:{width:t.rowWidth}},null)}});const H=d(E);var O=H;const[V,c]=l("skeleton"),j="60%",q={row:w(0),round:Boolean,title:Boolean,titleWidth:r,avatar:Boolean,avatarSize:r,avatarShape:m("round"),loading:u,animate:u,rowWidth:{type:[Number,String,Array],default:s}};var x=i({name:V,inheritAttrs:!1,props:q,setup(t,{slots:o,attrs:h}){const f=()=>{if(t.avatar)return a(I,{avatarShape:t.avatarShape,avatarSize:t.avatarSize},null)},S=()=>{if(t.title)return a(z,{round:t.round,titleWidth:t.titleWidth},null)},k=n=>{const{rowWidth:e}=t;return e===s&&n===+t.row-1?j:Array.isArray(e)?e[n]:e},W=()=>Array(+t.row).fill("").map((n,e)=>a(O,{key:e,round:t.round,rowWidth:v(k(e))},null)),b=()=>o.template?o.template():a(A,null,[f(),a("div",{class:c("content")},[S(),W()])]);return()=>{var n;return t.loading?a("div",g({class:c({animate:t.animate,round:t.round})},h),[b()]):(n=o.default)==null?void 0:n.call(o)}}});const J=d(x);export{J as S};
+import{b7 as l,d as i,h as a,bh as v,ba as r,bc as d,bz as _,bd as m,bA as w,bg as u,bk as g,F as A}from"./index-9feb05e7.js";const[$,y]=l("skeleton-title"),P={round:Boolean,titleWidth:r};var p=i({name:$,props:P,setup(t){return()=>a("h3",{class:y([{round:t.round}]),style:{width:v(t.titleWidth)}},null)}});const T=d(p);var z=T;const[B,D]=l("skeleton-avatar"),F={avatarSize:r,avatarShape:m("round")};var N=i({name:B,props:F,setup(t){return()=>a("div",{class:D([t.avatarShape]),style:_(t.avatarSize)},null)}});const R=d(N);var I=R;const s="100%",L={round:Boolean,rowWidth:{type:r,default:s}},[U,C]=l("skeleton-paragraph");var E=i({name:U,props:L,setup(t){return()=>a("div",{class:C([{round:t.round}]),style:{width:t.rowWidth}},null)}});const H=d(E);var O=H;const[V,c]=l("skeleton"),j="60%",q={row:w(0),round:Boolean,title:Boolean,titleWidth:r,avatar:Boolean,avatarSize:r,avatarShape:m("round"),loading:u,animate:u,rowWidth:{type:[Number,String,Array],default:s}};var x=i({name:V,inheritAttrs:!1,props:q,setup(t,{slots:o,attrs:h}){const f=()=>{if(t.avatar)return a(I,{avatarShape:t.avatarShape,avatarSize:t.avatarSize},null)},S=()=>{if(t.title)return a(z,{round:t.round,titleWidth:t.titleWidth},null)},k=n=>{const{rowWidth:e}=t;return e===s&&n===+t.row-1?j:Array.isArray(e)?e[n]:e},W=()=>Array(+t.row).fill("").map((n,e)=>a(O,{key:e,round:t.round,rowWidth:v(k(e))},null)),b=()=>o.template?o.template():a(A,null,[f(),a("div",{class:c("content")},[S(),W()])]);return()=>{var n;return t.loading?a("div",g({class:c({animate:t.animate,round:t.round})},h),[b()]):(n=o.default)==null?void 0:n.call(o)}}});const J=d(x);export{J as S};

File diff suppressed because it is too large
+ 0 - 0
dist/js/index-legacy-0a9a20c6.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/index-legacy-1f2d0e80.js


+ 1 - 1
dist/js/index-legacy-99e81ac9.js → dist/js/index-legacy-2f6120a3.js

@@ -1 +1 @@
-System.register(["./index-legacy-c2fd5365.js"],(function(t,a){"use strict";var r,e,n,l,o,i,s,u,d,p,v,h;return{setters:[t=>{r=t.b7,e=t.d,n=t.h,l=t.bh,o=t.ba,i=t.bc,s=t.bz,u=t.bd,d=t.bA,p=t.bg,v=t.bk,h=t.F}],execute:function(){const[a,c]=r("skeleton-title"),S={round:Boolean,titleWidth:o};var m=e({name:a,props:S,setup:t=>()=>n("h3",{class:c([{round:t.round}]),style:{width:l(t.titleWidth)}},null)}),y=i(m);const[b,w]=r("skeleton-avatar"),W={avatarSize:o,avatarShape:u("round")};var f=e({name:b,props:W,setup:t=>()=>n("div",{class:w([t.avatarShape]),style:s(t.avatarSize)},null)}),g=i(f);const k="100%",z={round:Boolean,rowWidth:{type:o,default:k}},[A,B]=r("skeleton-paragraph");var x=e({name:A,props:z,setup:t=>()=>n("div",{class:B([{round:t.round}]),style:{width:t.rowWidth}},null)}),j=i(x);const[F,N]=r("skeleton"),q={row:d(0),round:Boolean,title:Boolean,titleWidth:o,avatar:Boolean,avatarSize:o,avatarShape:u("round"),loading:p,animate:p,rowWidth:{type:[Number,String,Array],default:k}};var C=e({name:F,inheritAttrs:!1,props:q,setup(t,{slots:a,attrs:r}){const e=()=>{if(t.avatar)return n(g,{avatarShape:t.avatarShape,avatarSize:t.avatarSize},null)},o=()=>{if(t.title)return n(y,{round:t.round,titleWidth:t.titleWidth},null)},i=a=>{const{rowWidth:r}=t;return r===k&&a===+t.row-1?"60%":Array.isArray(r)?r[a]:r};return()=>{var s;return t.loading?n("div",v({class:N({animate:t.animate,round:t.round})},r),[a.template?a.template():n(h,null,[e(),n("div",{class:N("content")},[o(),Array(+t.row).fill("").map(((a,r)=>n(j,{key:r,round:t.round,rowWidth:l(i(r))},null)))])])]):null==(s=a.default)?void 0:s.call(a)}}});t("S",i(C))}}}));
+System.register(["./index-legacy-f1317986.js"],(function(t,a){"use strict";var r,e,n,l,o,i,s,u,d,p,v,h;return{setters:[t=>{r=t.b7,e=t.d,n=t.h,l=t.bh,o=t.ba,i=t.bc,s=t.bz,u=t.bd,d=t.bA,p=t.bg,v=t.bk,h=t.F}],execute:function(){const[a,c]=r("skeleton-title"),S={round:Boolean,titleWidth:o};var m=e({name:a,props:S,setup:t=>()=>n("h3",{class:c([{round:t.round}]),style:{width:l(t.titleWidth)}},null)}),y=i(m);const[b,w]=r("skeleton-avatar"),W={avatarSize:o,avatarShape:u("round")};var f=e({name:b,props:W,setup:t=>()=>n("div",{class:w([t.avatarShape]),style:s(t.avatarSize)},null)}),g=i(f);const k="100%",z={round:Boolean,rowWidth:{type:o,default:k}},[A,B]=r("skeleton-paragraph");var x=e({name:A,props:z,setup:t=>()=>n("div",{class:B([{round:t.round}]),style:{width:t.rowWidth}},null)}),j=i(x);const[F,N]=r("skeleton"),q={row:d(0),round:Boolean,title:Boolean,titleWidth:o,avatar:Boolean,avatarSize:o,avatarShape:u("round"),loading:p,animate:p,rowWidth:{type:[Number,String,Array],default:k}};var C=e({name:F,inheritAttrs:!1,props:q,setup(t,{slots:a,attrs:r}){const e=()=>{if(t.avatar)return n(g,{avatarShape:t.avatarShape,avatarSize:t.avatarSize},null)},o=()=>{if(t.title)return n(y,{round:t.round,titleWidth:t.titleWidth},null)},i=a=>{const{rowWidth:r}=t;return r===k&&a===+t.row-1?"60%":Array.isArray(r)?r[a]:r};return()=>{var s;return t.loading?n("div",v({class:N({animate:t.animate,round:t.round})},r),[a.template?a.template():n(h,null,[e(),n("div",{class:N("content")},[o(),Array(+t.row).fill("").map(((a,r)=>n(j,{key:r,round:t.round,rowWidth:l(i(r))},null)))])])]):null==(s=a.default)?void 0:s.call(a)}}});t("S",i(C))}}}));

+ 1 - 1
dist/js/index-legacy-60e49413.js → dist/js/index-legacy-4fa0273e.js

@@ -1 +1 @@
-System.register(["./index-legacy-c2fd5365.js"],(function(e,t){"use strict";var i,n,a,o,r,s,d,l,c=document.createElement("style");return c.textContent="._skeleton_vtlsh_1{position:fixed;left:0;top:0;width:100vw;height:100vh;padding:.53333rem .8rem;background-color:#fff;z-index:1000;--van-skeleton-paragraph-height: .8rem}._detail_vtlsh_12{width:100vw;height:100vh;overflow:hidden;overflow-y:auto;--header-height: 1.65333rem;background:var(--container-background)}._detail_vtlsh_12 ._container_vtlsh_20{margin:0 .26667rem;border-radius:.26667rem}._detail_vtlsh_12 #musicAndSelection{overflow:initial!important;height:initial!important;max-height:initial!important}\n",document.head.appendChild(c),{setters:[e=>{i=e.d,n=e.g,a=e.n,o=e.bM,r=e.c,s=e.m,d=e.h,l=e.au}],execute:function(){const t="_detail_vtlsh_12",c="_container_vtlsh_20";e("default",i({name:"music-list",setup(){const e=n(),i=a({isLoading:!0,isProductLoading:!1,product:[{state:!1,name:"五线谱",type:o.staff,base64:""},{state:!1,name:"首调",type:o.firstTone,base64:""},{state:!1,name:"固定调",type:o.fixedTone,base64:""}]});r((()=>{window.appName="colexiu",s.xmlUrl=e.xmlUrl,i.isLoading=!1}));const h=async()=>{console.log("渲染完成")};return()=>d("div",{class:t},[d("div",{id:"scrollContainer",class:[c,"hideCursor"]},[!i.isLoading&&d(l,{onRendered:h},null)])])}}))}}}));
+System.register(["./index-legacy-f1317986.js"],(function(e,t){"use strict";var i,n,a,o,r,s,d,l,c=document.createElement("style");return c.textContent="._skeleton_vtlsh_1{position:fixed;left:0;top:0;width:100vw;height:100vh;padding:.53333rem .8rem;background-color:#fff;z-index:1000;--van-skeleton-paragraph-height: .8rem}._detail_vtlsh_12{width:100vw;height:100vh;overflow:hidden;overflow-y:auto;--header-height: 1.65333rem;background:var(--container-background)}._detail_vtlsh_12 ._container_vtlsh_20{margin:0 .26667rem;border-radius:.26667rem}._detail_vtlsh_12 #musicAndSelection{overflow:initial!important;height:initial!important;max-height:initial!important}\n",document.head.appendChild(c),{setters:[e=>{i=e.d,n=e.g,a=e.n,o=e.bM,r=e.c,s=e.m,d=e.h,l=e.au}],execute:function(){const t="_detail_vtlsh_12",c="_container_vtlsh_20";e("default",i({name:"music-list",setup(){const e=n(),i=a({isLoading:!0,isProductLoading:!1,product:[{state:!1,name:"五线谱",type:o.staff,base64:""},{state:!1,name:"首调",type:o.firstTone,base64:""},{state:!1,name:"固定调",type:o.fixedTone,base64:""}]});r((()=>{window.appName="colexiu",s.xmlUrl=e.xmlUrl,i.isLoading=!1}));const h=async()=>{console.log("渲染完成")};return()=>d("div",{class:t},[d("div",{id:"scrollContainer",class:[c,"hideCursor"]},[!i.isLoading&&d(l,{onRendered:h},null)])])}}))}}}));

File diff suppressed because it is too large
+ 0 - 0
dist/js/index-legacy-51168feb.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/index-legacy-883670ff.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/index-legacy-ad8f83b7.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/index-legacy-d1daec56.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/index-legacy-f1317986.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/instrument-05bd7b38.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/instrument-legacy-5e666a92.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/modeView-a8e98e58.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/modeView-legacy-7a50728d.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/orchestra-aed649a5.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/orchestra-legacy-cbe1b26f.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/polyfills-eb47a7de.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/polyfills-legacy-2b34d33c.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/polyfills-legacy-d06b42a6.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/report-share-11698839.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/report-share-legacy-89257010.js


+ 10 - 10
dist/orchestra.html

@@ -2,7 +2,7 @@
 <html lang="en">
 
 <head>
-  <script type="module" crossorigin src="./js/polyfills-336fef56.js"></script>
+  <script type="module" crossorigin src="./js/polyfills-eb47a7de.js"></script>
 
   <meta charset="UTF-8" />
   <!-- <link rel="icon" type="image/svg+xml" href="/vite.svg" /> -->
@@ -41,13 +41,13 @@
       transition: opacity .3s;
     }
   </style>
-  <script type="module" crossorigin src="./js/orchestra-65d6be9a.js"></script>
-  <link rel="modulepreload" crossorigin href="./js/index-5bbbe457.js">
-  <link rel="modulepreload" crossorigin href="./js/index-522f7332.js">
-  <link rel="modulepreload" crossorigin href="./js/index-68946d68.js">
-  <link rel="modulepreload" crossorigin href="./js/index-e9c8f4b1.js">
-  <link rel="modulepreload" crossorigin href="./js/index-d7bafa9a.js">
-  <link rel="stylesheet" href="./css/index-0e9d5ebe.css">
+  <script type="module" crossorigin src="./js/orchestra-aed649a5.js"></script>
+  <link rel="modulepreload" crossorigin href="./js/index-9feb05e7.js">
+  <link rel="modulepreload" crossorigin href="./js/index-1541b87a.js">
+  <link rel="modulepreload" crossorigin href="./js/index-35fc45ed.js">
+  <link rel="modulepreload" crossorigin href="./js/index-481a44b7.js">
+  <link rel="modulepreload" crossorigin href="./js/index-c3f6432e.js">
+  <link rel="stylesheet" href="./css/index-64ae39d1.css">
   <link rel="stylesheet" href="./css/index-85f95688.css">
   <link rel="stylesheet" href="./css/orchestra-8bc1a9c0.css">
   <script type="module">import.meta.url;import("_").catch(()=>1);async function* g(){};window.__vite_is_modern_browser=true;</script>
@@ -70,8 +70,8 @@
   </script>
   
   <script nomodule>!function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",(function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()}),!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();</script>
-  <script nomodule crossorigin id="vite-legacy-polyfill" src="./js/polyfills-legacy-d06b42a6.js"></script>
-  <script nomodule crossorigin id="vite-legacy-entry" data-src="./js/orchestra-legacy-6b8fa61e.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
+  <script nomodule crossorigin id="vite-legacy-polyfill" src="./js/polyfills-legacy-2b34d33c.js"></script>
+  <script nomodule crossorigin id="vite-legacy-entry" data-src="./js/orchestra-legacy-cbe1b26f.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
 </body>
 
 </html>

+ 7 - 7
dist/report-share.html

@@ -2,7 +2,7 @@
 <html lang="en">
 
 <head>
-  <script type="module" crossorigin src="./js/polyfills-336fef56.js"></script>
+  <script type="module" crossorigin src="./js/polyfills-eb47a7de.js"></script>
 
   <meta charset="UTF-8" />
   <!-- <link rel="icon" type="image/svg+xml" href="/vite.svg" /> -->
@@ -25,11 +25,11 @@
       transition: opacity .3s;
     }
   </style>
-  <script type="module" crossorigin src="./js/report-share-f1f9b7ea.js"></script>
-  <link rel="modulepreload" crossorigin href="./js/index-5bbbe457.js">
+  <script type="module" crossorigin src="./js/report-share-11698839.js"></script>
+  <link rel="modulepreload" crossorigin href="./js/index-9feb05e7.js">
   <link rel="modulepreload" crossorigin href="./js/plyr.min-c8c2777b.js">
-  <link rel="modulepreload" crossorigin href="./js/index-d7bafa9a.js">
-  <link rel="stylesheet" href="./css/index-0e9d5ebe.css">
+  <link rel="modulepreload" crossorigin href="./js/index-c3f6432e.js">
+  <link rel="stylesheet" href="./css/index-64ae39d1.css">
   <link rel="stylesheet" href="./css/plyr-ad8ef5ae.css">
   <link rel="stylesheet" href="./css/report-share-0f4c3151.css">
   <script type="module">import.meta.url;import("_").catch(()=>1);async function* g(){};window.__vite_is_modern_browser=true;</script>
@@ -52,8 +52,8 @@
   </script>
   
   <script nomodule>!function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",(function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()}),!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();</script>
-  <script nomodule crossorigin id="vite-legacy-polyfill" src="./js/polyfills-legacy-d06b42a6.js"></script>
-  <script nomodule crossorigin id="vite-legacy-entry" data-src="./js/report-share-legacy-e3272ef1.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
+  <script nomodule crossorigin id="vite-legacy-polyfill" src="./js/polyfills-legacy-2b34d33c.js"></script>
+  <script nomodule crossorigin id="vite-legacy-entry" data-src="./js/report-share-legacy-89257010.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
 </body>
 
 </html>

+ 42 - 19
src/helpers/formateMusic.ts

@@ -14,6 +14,8 @@ import {
 	OpenSheetMusicDisplay,
 } from "/osmd-extended/src";
 import { GradualChange, speedInfo } from "./calcSpeed";
+import { beatUnitTo, speedBeatTo } from "/src/helpers/beatConfig"
+
 const browserInfo = browser();
 dayjs.extend(duration);
 
@@ -661,6 +663,7 @@ export const formatXML = (xml: string, xmlUrl?: string): string => {
 	}
 
 	const measures = Array.from(xmlParse.getElementsByTagName("measure"));
+	state.firstMeasureNumber = measures[0] ? Number(measures[0].getAttribute('number') || 1) : 1;
 	const minutes: any = xmlParse.getElementsByTagName("per-minute");
 	let speeds: any = []
 	for (const minute of minutes) {
@@ -684,11 +687,19 @@ export const formatXML = (xml: string, xmlUrl?: string): string => {
 		state.originSpeed = speeds[0] ? speeds[0] : 100;
 		state.speed = state.originSpeed;
 	}
+	// 赋值谱面速度节拍器,没有的时候 以后台传入的为准
+	const metronomeXml = xmlParse.getElementsByTagName('metronome')?.[0]
+	const beatUnit = metronomeXml?.getElementsByTagName('beat-unit')?.[0]?.textContent || ''
+	if(beatUnit){
+		const beatUnitDot = metronomeXml?.getElementsByTagName('beat-unit-dot')?.[0]
+		state.speedBeatUnit = beatUnitTo(beatUnit, !!beatUnitDot)
+	}	
 	// 如果谱面和小节都没有打速度,osmd设置的小节速度默认取后台设置的速度
 	if (speeds.length === 0) {
 		;(window as any).baseMeasureSpeed = state.originSpeed
 	} else {
-		state.originAudioPlayRate = speeds[0] / state.originSpeed
+		// 当前谱面的速度转为4分音符速度 因为我们速度比例转为4分音符了
+		state.originAudioPlayRate = speedBeatTo({unit:state.speedBeatUnit, speed:speeds[0]}, "1/4") / state.originSpeed
 	}
 	console.log('是否是变速的曲子:',hasVaryingSpeed,speeds)
 
@@ -877,6 +888,7 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 	let preNoteEndTime = 0; // 上一个音符的结束时间
 
 	let preNoteMeasureNumber: any = null; // 上一个小节的number值
+	let currentRealTempo: any = {}; // 当前小节的速度与拍号信息
 
 	let _notes = [] as any[];
 	if (state.gradualTimes) {
@@ -990,6 +1002,9 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 			}
 			note.maxNoteNum = maxNoteNum;
 			note.trackIndex = minIndex;
+			currentRealTempo = iterator.currentMeasure.tempoExpressions.length ? iterator.currentMeasure.tempoExpressions.find((item: any) => item?.InstantaneousTempo?.isMetronomeMark)?.InstantaneousTempo || currentRealTempo : currentRealTempo;
+			const { beatUnit="quarter", dotted=false, tempoInBpm=state.originSpeed } = currentRealTempo
+			const speedBeatUnit = beatUnitTo(beatUnit, dotted)			
 			_notes.push({
 				measureNum: note?.sourceMeasure?.MeasureNumberXML,
 				note,
@@ -997,7 +1012,11 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 				currentTime,
 				isDouble,
 				isMutileSubject,
-				measuresTempoInBPM: note?.sourceMeasure?.tempoInBPM,
+				// measuresTempoInBPM: note?.sourceMeasure?.tempoInBPM,
+				// 转换成1/4拍的速度
+				measuresTempoInBPM: speedBeatTo({unit: speedBeatUnit || "1/4",speed: tempoInBpm || 0}, `1/4`),
+				speedBeatUnit, // 当前谱面小节的速度对应的是几分音符
+				currentRealTempo
 			});
 		}
 		iterator.moveToNextVisibleVoiceEntry(false);
@@ -1016,7 +1035,7 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 	console.log('变速曲子',hasVaryingSpeed, _notes)
 	let noteIds: any = [];
 	// let voicesBBox: any = null;
-	for (let { note, iterator, currentTime, isDouble, isMutileSubject } of _notes) {
+	for (let { note, iterator, currentTime, isDouble, isMutileSubject, speedBeatUnit, measuresTempoInBPM } of _notes) {
 		if (note) {
 			if (preMeasureNumber != note?.sourceMeasure?.MeasureNumberXML) {
 				si = 0
@@ -1025,14 +1044,14 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 				preMeasureNumber = note?.sourceMeasure?.MeasureNumberXML
 				allMeasures.push(note.sourceMeasure);
 			}
-			if (si === 0 && state.isSpecialBookCategory) {
-				for (const expression of (note.sourceMeasure as SourceMeasure)?.TempoExpressions) {
-					if (expression?.InstantaneousTempo?.beatUnit) {
-						// 取最后一个有效的tempo
-						beatUnit = expression.InstantaneousTempo.beatUnit;
-					}
-				}
-			}
+			// if (si === 0 && state.isSpecialBookCategory) {
+			// 	for (const expression of (note.sourceMeasure as SourceMeasure)?.TempoExpressions) {
+			// 		if (expression?.InstantaneousTempo?.beatUnit) {
+			// 			// 取最后一个有效的tempo
+			// 			beatUnit = expression.InstantaneousTempo.beatUnit;
+			// 		}
+			// 	}
+			// }
 			// 判断是否是同一小节
 			if (staveIndex == note.sourceMeasure?.MeasureNumberXML && i !== 0) {
 				staveNoteIndex++
@@ -1124,12 +1143,15 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 
 			let beatSpeed = 0;
 			// 速度不能为0 此处的速度应该是按照设置的速度而不是校准后的速度,否则mp3速度不对
-			if (measureSpeed !== baseSpeed && !hasVaryingSpeed) {
-				beatSpeed = baseSpeed || measureSpeed || 100
-			} else {
-				beatSpeed = (state.isSpecialBookCategory ? measureSpeed : baseSpeed) || 1;
-			}
+			// if (measureSpeed !== baseSpeed && !hasVaryingSpeed) {
+			// 	beatSpeed = baseSpeed || measureSpeed || 100
+			// } else {
+			// 	beatSpeed = (state.isSpecialBookCategory ? measureSpeed : baseSpeed) || 1;
+			// }
+			// 计算音符时值,使用转换成1/4的速度计算
+			beatSpeed = measuresTempoInBPM;
 			// let beatSpeed = measureSpeed || baseSpeed
+			beatSpeed = beatSpeed / state.originAudioPlayRate;
 			// 如果有节拍器,需要将节拍器的时间算出来
 			if (i === 0) {
 				if(state.isOpenMetronome){
@@ -1142,7 +1164,7 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 			}
 			// console.log(getTimeByBeatUnit(beatUnit, measureSpeed, iterator.currentMeasure.activeTimeSignature.Denominator))
 			let gradualLength = 0;
-			let speed = (state.isSpecialBookCategory ? measureSpeed : baseSpeed) || 1;
+			let speed = measureSpeed ? measureSpeed : baseSpeed;
 			gradualChange = iterator.currentMeasure.speedInfo || gradualChange;
 			gradualSpeed = osmd.Sheet.SoundTempos?.get(note.sourceMeasure.measureListIndex) || gradualSpeed;
 			if (!gradualSpeed || gradualSpeed.length < 2) {
@@ -1437,7 +1459,8 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 				firstVerticalMeasure: activeVerticalMeasureList[0],
 				noteLength: 1,
 				osdmContext: osmd,
-				speedbeatUnit: beatUnit,
+				// speedbeatUnit: beatUnit,
+				speedBeatUnit,
 				multipleRestMeasures: multipleRestMeasures, // 当前合并小节的索引,从1开始到当前的totalMultipleRestMeasures结束,
 				totalMultipleRestMeasures, // 当前小节总的合并小节数
 				measureSpeed,  // 小节速度
@@ -1470,7 +1493,7 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 						nodeDetail.frequencyList.push(cnote.pitch.frequency)
 					}
 				})
-			}			
+			}
 
 			const firstRepeatNodeId = allNotes.find((item: any) => item.MeasureNumberXML === state.timegapRepeatMeasureIndex)?.noteId || 0;
 			if (state.isEvxml && nodeDetail.repeatIdx && nodeDetail.i > 0 && nodeDetail.MeasureNumberXML === state.timegapRepeatMeasureIndex && nodeDetail.noteId === firstRepeatNodeId) {

+ 17 - 1
src/helpers/metronome.ts

@@ -281,7 +281,12 @@ class Metronome {
 			// console.log("🚀 ~ note?.noteElement?.sourceMeasure", note?.noteElement?.sourceMeasure)
 			// console.log("🚀 ~ measureNumberXML", measureNumberXML, note)
 			// console.log("🚀 ~ measureNumberXML", note)
-			const measureListIndex = measureNumberXML - 1;
+			const measureListIndex = state.firstMeasureNumber == 0 ? measureNumberXML : measureNumberXML - 1;
+			// 当渐快渐慢的时候  不播节拍器
+			if(isWithinRange(state.gradual, measureListIndex)){
+				xmlNumber = measureNumberXML;
+				continue
+			}
 			if (measureNumberXML > -1) {
 				if (measureNumberXML != xmlNumber) {
 					// 弱起的时候 根据音符结尾时间减去音符开头时间,得到的不是正常小节的时间,然后平均分配节拍之后,当前节拍间隔会非常短 这里弱起取整个小节的时间
@@ -660,4 +665,15 @@ function hideCursorTip() {
 	}
 }
 
+function isWithinRange(ranges:any[], index:number) {
+	for (const range of ranges) {
+		const start = range[0].measureIndex;
+		const end = range[1].measureIndex;
+		if (index >= start && index < end) {
+			return true;
+		}
+	}
+	return false;
+}
+
 export default Metronome;

+ 1 - 1
src/page-instrument/custom-plugins/recording-time/index.tsx

@@ -32,7 +32,7 @@ const handleRecord = () => {
 		instrumentId: state.instrumentId,
         playRate: rate,
 		partIndex: state.partIndex, // 音轨
-        speed: currentSpeed, // 速度
+        speed: currentSpeed, // 速度		
 	};
 	api_musicPracticeRecordSave(body);
 };

二進制
src/page-instrument/header-top/image/speed1.png


二進制
src/page-instrument/header-top/image/speed2.png


二進制
src/page-instrument/header-top/image/speed3.png


二進制
src/page-instrument/header-top/image/speed4.png


二進制
src/page-instrument/header-top/image/speed5.png


二進制
src/page-instrument/header-top/image/speed6.png


二進制
src/page-instrument/header-top/image/speed7.png


二進制
src/page-instrument/header-top/image/speed8.png


+ 1 - 1
src/page-instrument/header-top/index.tsx

@@ -913,7 +913,7 @@ export default defineComponent({
                   <img style={{ display: !metronomeData.disable ? "block" : "none" }} class={styles.iconBtn} src={headImg("tickoff.png")} />
                   <span style={{ whiteSpace: "nowrap" }}>节拍</span>
                   <div class={styles.speedCon}>
-                    <img src={headImg("speed.png")} />
+                    <img src={headImg(`${state.speedIcon}.png`)} />
                     <div>{Math.floor(state.speed)}</div>
                   </div>
                 </div>

+ 9 - 4
src/page-instrument/header-top/speed/index.module.less

@@ -75,7 +75,7 @@
             background: #EAF2FB;
             border-radius: 12px;
             overflow-y: auto;
-            padding: 12px 16px 0;
+            padding: 12px 16px;
             &::-webkit-scrollbar {
                 width: 0;
                 display: none;
@@ -166,19 +166,24 @@
                 }
             }
             .speedSel{
-                margin-top: 20px;
+                margin-top: 8px;
                 padding-bottom: 18px;
                 display: flex;
                 justify-content: space-between;
+                flex-wrap: wrap;
                 & > div{
-                    padding: 6px 13px;
+                    width: 42px;
+                    height: 24px;
+                    line-height: 24px;
+                    text-align: center;
                     background: #FFFFFF;
                     border-radius: 14px;
                     font-weight: 400;
                     font-size: 13px;
                     color: rgba(0,0,0,0.6);
-                    line-height: 1;
                     cursor: pointer;
+                    margin-top: 10px;
+                    margin-right: 3px;
                     &:active{
                         background: linear-gradient( 131deg, #44CAFF 0%, #259CFE 100%);
                         color: #fff;

+ 7 - 7
src/page-instrument/header-top/speed/index.tsx

@@ -36,11 +36,13 @@ export default defineComponent({
 			() => speed.value,
 			() => {
 				// handleSetSpeed(speed.value);
-				state.speed = Math.floor(speed.value);
+				state.speed = speed.value
 				// handleSetSpeed(speed.value);
 				if (state.playState === 'paused') {
-					const currentItem: any = (state.sectionStatus && state.section.length === 2) ? state.sectionFirst || state.section[0] : state.times[state.activeNoteIndex];
+					// const currentItem: any = (state.sectionStatus && state.section.length === 2) ? state.sectionFirst || state.section[0] : state.times[state.activeNoteIndex];
+					const currentItem: any = state.times[state.activeNoteIndex];
 					state.basePlayRate = currentItem?.measureSpeed ? state.speed / currentItem.measureSpeed : state.speed / state.originSpeed;
+					// console.log('播放倍率2',state.basePlayRate)
 				}
 			}
 		);
@@ -136,11 +138,9 @@ export default defineComponent({
 						</div>
 						<div class={[styles.speedSel, (workData.trainingType === "PRACTICE" || workData.trainingType === "EVALUATION") && styles.disableSpend]}>
 							<div onClick={resetCurrentSpeed}>原速</div>
-							<div onClick={()=>{ speed.value = 70 }}>70</div>
-							<div onClick={()=>{ speed.value = 80 }}>80</div>
-							<div onClick={()=>{ speed.value = 90 }}>90</div>
-							<div onClick={()=>{ speed.value = 100 }}>100</div>
-							<div onClick={()=>{ speed.value = 110 }}>110</div>
+							{[60,70,80,90,100,110,120,130,140,150,160].map((item) => (
+								<div onClick={()=>{ speed.value = item }}>{item}</div>
+							))}
 						</div>
 						{
 							state.isMixBeat && 

+ 28 - 9
src/state.ts

@@ -22,7 +22,7 @@ import { musicScoreRef, headerColumnHide } from "/src/page-instrument/view-detai
 import { headTopData } from "/src/page-instrument/header-top/index";
 import { api_lessonTrainingTrainingStudentDetail } from "/src/page-instrument/api"
 import { undoData, moveData } from "/src/view/plugins/move-music-score"
-import { speedBeatTo } from "/src/helpers/beatConfig"
+import { speedBeatTo, unitImgs } from "/src/helpers/beatConfig"
 
 const query: any = getQuery();
 
@@ -584,6 +584,12 @@ const state = reactive({
   instrumentId: null,
   /** 作业是否达标 */
   isWorkDone: false,
+  /** xml的第一个measure标签的number */
+  firstMeasureNumber: 1,
+  /** 是否是自动重播,练习模式开启自动重播时,播放前不需要再次计算播放倍率了,还是按照上次的播放倍率播放音频 */
+  isAutoRePlay: false,
+  /** 右上角速度图标,根据当前小节的速度是几分音符的动态变化 */
+  speedIcon: 'speed3', // 默认取1/4拍的图片
 });
 const browserInfo = browser();
 let offset_duration = 0;
@@ -634,6 +640,8 @@ const autoResetPlay = () => {
   offsetTop = 0;
   scrollViewNote();
   setTimeout(() => {
+    // 自动播放,不需要再次计算播放倍率
+    state.isAutoRePlay = true;
     togglePlay("play");
   }, 1000);
 };
@@ -662,25 +670,31 @@ export const onEnded = () => {
 
 // 根据当前小节动态设置,右上角展示的速度
 const dynamicShowPlaySpeed = (index: number) => {
-  if (!headerColumnHide.value) {
-    // console.log('动态计算速度')
+  //if (!headerColumnHide.value) {
     const item: any = state.times[index];
     if (item && item.measureSpeed ) {
       // console.log('速度1',item.measureSpeed)
-      const newSpeed = Math.floor(state.basePlayRate * item.measureSpeed)
+      const newSpeed = state.basePlayRate * item.measureSpeed
       if (state.speed !== newSpeed) {
         state.speed = newSpeed;
       }
     }
-  }
+  //}
 
 }
 
 // 开始播放时,计算mp3的播放倍率
 export const initSetPlayRate = () => {
-  const item: any = (state.sectionStatus && state.section.length === 2) ? state.sectionFirst || state.section[0] : state.times[state.activeNoteIndex];
+  // 自动播放,不需要再次计算播放倍率
+  if (state.isAutoRePlay) {
+    state.isAutoRePlay = false
+    return
+  }  
+  // const item: any = (state.sectionStatus && state.section.length === 2) ? state.sectionFirst || state.section[0] : state.times[state.activeNoteIndex];
+  let item: any = state.times[state.activeNoteIndex];
+  console.log('播放状态',state.playState)  
   if (item && item.measureSpeed) {
-    const ratio = state.speed / Math.floor(item.measureSpeed)
+    const ratio = state.speed / item.measureSpeed
     // state.audiosInstance?.setSpeed(ratio)
     state.basePlayRate = ratio || 1;
     console.log('播放倍率',state.basePlayRate)
@@ -788,7 +802,7 @@ export const skipNotePlay = async (itemIndex: number, isStart = false) => {
   if (item) {
     // 非选段模式,点击音符,动态设置右下角的速度
     if (item.measureSpeed && state.section.length < 2) {
-      state.speed = Math.floor(state.basePlayRate * item.measureSpeed)
+      state.speed = state.basePlayRate * 10000 * item.measureSpeed / 10000
     }
     setAudioCurrentTime(itemTime, itemIndex);
     // 一行谱,点击音符,或者播放完成,需要跳转音符位置
@@ -1144,7 +1158,8 @@ export const handleSetSpeed = (speed: number) => {
   // setStorageSpeed(state.examSongId, speed);
   state.speed = speed;
   // 当前的音符
-  const currentItem: any = (state.sectionStatus && state.section.length === 2) ? state.sectionFirst || state.section[0] : state.times[state.activeNoteIndex];
+  // const currentItem: any = (state.sectionStatus && state.section.length === 2) ? state.sectionFirst || state.section[0] : state.times[state.activeNoteIndex];
+  const currentItem: any = 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)
@@ -2033,6 +2048,10 @@ function getNeedReduceMultipleRestNum(currMeasureIndex: number) {
 watch(
   () => state.activeMeasureIndex,
   () => {
+    // 监听音符小节的变化,取对应的小节速度图片
+    const currentNote = state.times[state.activeNoteIndex]
+    state.speedIcon = unitImgs[currentNote.speedBeatUnit]
+        
     // 需要减去的合并小节数
     // const needReduceMultipleRestNum = getNeedReduceMultipleRestNum(state.activeMeasureIndex)
     // const matchMeasureNum = state.activeMeasureIndex - needReduceMultipleRestNum - 1

+ 2 - 2
src/view/evaluating/evaluatResult.ts

@@ -33,7 +33,7 @@ export const leveByScoreMeasureIcons = [
 	{
 		icon: scoreIcon.good,
 		text: "good",
-		color: "#FF958B",
+		color: "#14C187",
 	},
 	{
 		icon: scoreIcon.great,
@@ -43,7 +43,7 @@ export const leveByScoreMeasureIcons = [
 	{
 		icon: scoreIcon.perfect,
 		text: "perfect",
-		color: "#516AFF",
+		color: "#90A0FF",
 	},
 ];
 

File diff suppressed because it is too large
+ 0 - 0
src/view/evaluating/scoreIcon.json


+ 1 - 1
src/view/follow-practice/index.tsx

@@ -48,7 +48,7 @@ const handleRecord = (total: number) => {
 		instrumentId: state.instrumentId,
         playRate: rate,
 		partIndex: state.partIndex, // 音轨
-        speed: currentSpeed, // 速度
+        speed: currentSpeed, // 速度		
 	};
 	api_musicPracticeRecordSave(body);
 };

+ 7 - 3
src/view/selection/index.module.less

@@ -83,10 +83,10 @@
 
 .scoreItem {
     position: absolute;
-    left: 80%;
+    left: 60%;
     top: -120%;
     transform: translateX(-50%);
-    font-size: 16px;
+    font-size: 18px;
     font-family: "Roboto", sans-serif;
     font-weight: bold;
     display: flex;
@@ -95,7 +95,11 @@
     transition: all .8s;
 
     img {
-        height: 30px;
+        height: 43px;
+    }
+
+    span {
+        margin-top: 5px;
     }
 }
 

File diff suppressed because it is too large
+ 0 - 0
stats.html


+ 2 - 2
vite.config.ts

@@ -76,8 +76,8 @@ export default defineConfig({
         // target: "https://kt.colexiu.com",
         // target: "https://test.lexiaoya.cn",
         // target: "https://kt.colexiu.com",
-        target: "https://test.resource.colexiu.com", // 内容平台开发环境,内容平台开发,需在url链接上加上isCbs=true
-        //target: "https://test.kt.colexiu.com",
+        // target: "https://test.resource.colexiu.com", // 内容平台开发环境,内容平台开发,需在url链接上加上isCbs=true
+        target: "https://test.kt.colexiu.com",
         // target: "https://mec.colexiu.com",
         changeOrigin: true,
         rewrite: (path) => path.replace(/^\/instrument/, ""),

Some files were not shown because too many files changed in this diff