| 
					
				 | 
			
			
				@@ -7,7 +7,7 @@ import { Howl } from "howler"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import { storeData } from "/src/store"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import { api_back, api_cloudLoading, api_setRequestedOrientation, api_setStatusBarVisibility, isSpecialShapedScreen } from "/src/helpers/communication"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import Hammer from "hammerjs"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import { Button, Icon, Loading, Popover, Popup, Progress, Space } from "vant"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import { Button, Icon, Loading, Popover, Popup, Progress, Space, showToast } from "vant"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import GuideIndex from "./guide/guide-index"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import { getQuery } from "/src/utils/queryString"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import { browser } from "/src/utils"; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -15,6 +15,7 @@ import { usePageVisibility } from "@vant/use"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import { watch } from "vue"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import icon_loading_img from "./image/icon_loading_img.png"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import state, { IPlatform } from "/src/state"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import { getSubjectList } from "../api"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 export default defineComponent({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   name: "viewFigner", 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -70,33 +71,7 @@ export default defineComponent({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       huaweiPad: navigator?.userAgent?.includes("UAWEIVRD-W09") ? true : false, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       paddingTop: "", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       paddingLeft: "", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      subjects: [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          text: "排箫", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          value: "pan-flute", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          className: "", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          text: "陶笛", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          value: "ocarina", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          className: "", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          text: "葫芦丝", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          value: "hulusi-flute", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          className: "", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          text: "竖笛", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          value: "piccolo", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          className: "", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          text: "口风琴", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          value: "melodica", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          className: "", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      ], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      subjects: [] as any, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       fingeringModeList: [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           text: "指法模式", 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -188,30 +163,38 @@ export default defineComponent({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       fingerData.subject = await getFingeringConfig(subject); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     const createAudio = (url: string) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      return new Promise((resolve) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      return new Promise((resolve, reject) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         const noteAudio = new Howl({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           src: url, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           loop: true, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           onload: () => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             resolve(noteAudio); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          onloaderror: () => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            reject(new Error(`加载音频失败`)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     const getSounFonts = async () => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       const pathname = /(192|localhost)/.test(location.origin) ? "/" : location.pathname; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       data.loadingSoundFonts = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      data.loadingSoundProgress = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      for (let i = 0; i < data.notes.length; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        const note = data.notes[i]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // console.log("🚀 ~ note:", i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let url = `${pathname}soundfonts/${data.subject}/`; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        url += note.realName; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        url += ".mp3"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        data.soundFonts[note.realKey] = await createAudio(url); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        data.loadingSoundProgress = Math.floor(((i + 1) / data.notes.length) * 100); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        data.loadingSoundProgress = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (let i = 0; i < data.notes.length; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          const note = data.notes[i]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          // console.log("🚀 ~ note:", i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          let url = `${pathname}soundfonts/${data.subject}/`; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          url += note.realName; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          url += ".mp3"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          data.soundFonts[note.realKey] = await createAudio(url); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          data.loadingSoundProgress = Math.floor(((i + 1) / data.notes.length) * 100); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        data.loadingSoundProgress = 100; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } catch (e: any) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        showToast(e.message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      data.loadingSoundProgress = 100; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       api_cloudLoading(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       data.loadingSoundFonts = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     }; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -272,8 +255,34 @@ export default defineComponent({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       getHeadTop(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    onBeforeMount(() => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // 获取声部 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    const getSubjects = async () => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const subjects = await getSubjectList({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          enableFlag: true, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          delFlag: 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          page: 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          rows: 999, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const rows = subjects.data.rows || []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        rows.forEach((row: any) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          data.subjects.push({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            text: row.name, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            value: mappingVoicePart(row.code, "INSTRUMENT"), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            className: "", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        console.log(data.subjects, "subjects"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } catch { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    onBeforeMount(async () => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       state.platform = query.platform?.toLocaleUpperCase() || ""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      await getSubjects(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       __init(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -647,42 +656,77 @@ export default defineComponent({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     const containerBox = computed(() => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      console.log(state.platform, query.modelType, data.fingeringMode, "fingering"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if (state.platform === IPlatform.PC || query.modelType) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           paddingTop: "1rem", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           paddingBottom: "", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (data.subject === "hulusi-flute") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          paddingTop: "3.1rem", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          paddingBottom: ".8rem", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } else if (data.subject === "piccolo") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          paddingTop: "4rem", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          paddingBottom: ".8rem", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } else if (data.subject === "pan-flute") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          paddingTop: "0", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          paddingBottom: "0", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } else if (data.subject === "ocarina") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          paddingTop: "1.2rem", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          paddingBottom: "0", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } else if (data.subject === "melodica") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          paddingTop: "2.8rem", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          paddingBottom: "1.8rem", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (data.fingeringMode === "scaleMode") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (data.subject === "hulusi-flute") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          return { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            paddingTop: "3.1rem", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            paddingBottom: ".8rem", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } else if (data.subject === "piccolo") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          return { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            paddingTop: "4rem", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            paddingBottom: ".8rem", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } else if (data.subject === "pan-flute") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          return { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            paddingTop: "0", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            paddingBottom: "0", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } else if (data.subject === "ocarina") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          return { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            paddingTop: "1.2rem", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            paddingBottom: "0", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } else if (data.subject === "melodica") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          return { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            paddingTop: "2.8rem", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            paddingBottom: "1.8rem", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          return { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            paddingTop: "", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            paddingBottom: "", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          paddingTop: "", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          paddingBottom: "", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (data.subject === "hulusi-flute") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          return { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            paddingTop: "2.1rem", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            paddingBottom: "0rem", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } else if (data.subject === "piccolo") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          return { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            paddingTop: "3rem", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            paddingBottom: ".5rem", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } else if (data.subject === "pan-flute") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          return { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            paddingTop: "0", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            paddingBottom: "0", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } else if (data.subject === "ocarina") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          return { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            paddingTop: "1rem", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            paddingBottom: "0", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } else if (data.subject === "melodica") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          return { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            paddingTop: "2.8rem", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            paddingBottom: "0.8rem", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          return { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            paddingTop: "", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            paddingBottom: "", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |