Browse Source

feat: 简谱渲染时,全休止符&二分休止符渲染规则修改

TIANYONG 5 months ago
parent
commit
7496a82aee
3 changed files with 194 additions and 52 deletions
  1. 188 1
      src/helpers/customMusicScore.ts
  2. 4 49
      src/helpers/formateMusic.ts
  3. 2 2
      vite.config.ts

+ 188 - 1
src/helpers/customMusicScore.ts

@@ -1093,4 +1093,191 @@ export const setCustomNoteRealValue = () => {
     if (["12667", "12673"].includes(detailId)){
         customData.customNoteCurrentTime = true
     }
-};
+};
+
+/** 转换简谱的全休止符和二分休止符 */
+export const transferJianNote = (measure: any, divisions: number, preBeats: number, preBeatType: number) => {
+	const multipleXs = preBeatType / 4;
+	const notes = measure.getElementsByTagName("note")
+	for (const note of notes) {
+		const noteType = note.getElementsByTagName("type")?.[0]?.textContent || '';
+		if ((noteType === 'whole' || noteType === 'half') && note.getElementsByTagName("rest").length) {
+			// 4/4拍,3/4拍
+			if ((preBeats === 4 && preBeatType === 4) || (preBeats === 3 && preBeatType === 4)) {
+				let maxNumber = noteType === 'half' ? 2 : preBeats / multipleXs;
+				// 如果二分音符带附点,需要判断处理下
+				if (note.getElementsByTagName("dot").length) {
+					maxNumber = maxNumber + 1;
+				}
+				if (!Number.isInteger(maxNumber)) {
+					return;
+				}
+				// console.log('几个1/4音符',maxNumber)
+				let quarterNoteNumber = 1;
+				while (quarterNoteNumber <= maxNumber) {
+					const newnote = document.createElement('note');
+					newnote.innerHTML = `
+					<rest></rest>
+					<duration>${divisions}</duration>
+					<voice>1</voice>
+					<type>quarter</type>`
+					measure.insertBefore(newnote, note);
+					quarterNoteNumber += 1;
+				};
+				measure.removeChild(note);
+			} else if (preBeats === 3 && preBeatType === 8) {
+				const maxNumber = noteType === 'half' ? 2 : 3;
+				let quarterNoteNumber = 1;
+				while (quarterNoteNumber <= maxNumber) {
+					const newnote = document.createElement('note');
+					newnote.innerHTML = `
+					<rest></rest>
+					<duration>${divisions/2}</duration>
+					<voice>1</voice>
+					<type>eighth</type>`
+					measure.insertBefore(newnote, note);
+					quarterNoteNumber += 1;
+				};
+				measure.removeChild(note);
+			} else if (preBeats === 5 && preBeatType === 8) {
+				if (noteType === 'whole') {
+					const newnote = document.createElement('note');
+					newnote.innerHTML = `
+					<rest></rest>
+					<duration>${divisions+divisions/2}</duration>
+					<voice>1</voice>
+					<type>quarter</type>
+					<dot></dot>`
+					measure.insertBefore(newnote, note);
+					const newnote2 = document.createElement('note');
+					newnote2.innerHTML = `
+					<rest></rest>
+					<duration>${divisions}</duration>
+					<voice>1</voice>
+					<type>quarter</type>`
+					measure.insertBefore(newnote2, note);
+					measure.removeChild(note);
+				} else if (noteType === 'half') {
+					const newnote = document.createElement('note');
+					newnote.innerHTML = `
+					<rest></rest>
+					<duration>${divisions+divisions/2}</duration>
+					<voice>1</voice>
+					<type>quarter</type>
+					<dot></dot>`
+					measure.insertBefore(newnote, note);
+					const newnote2 = document.createElement('note');
+					newnote2.innerHTML = `
+					<rest></rest>
+					<duration>${divisions/2}</duration>
+					<voice>1</voice>
+					<type>eighth</type>`
+					measure.insertBefore(newnote2, note);
+					measure.removeChild(note);
+				}
+			} else if (preBeats === 6 && preBeatType === 8) {
+				if (noteType === 'whole') {
+					const maxNumber = 2;
+					let quarterNoteNumber = 1;
+					while (quarterNoteNumber <= maxNumber) {
+						const newnote = document.createElement('note');
+						newnote.innerHTML = `
+						<rest></rest>
+						<duration>${divisions+divisions/2}</duration>
+						<voice>1</voice>
+						<type>quarter</type>
+						<dot></dot>`
+						measure.insertBefore(newnote, note);
+						quarterNoteNumber += 1;
+					};
+					measure.removeChild(note);
+				} else if (noteType === 'half') {
+					const newnote = document.createElement('note');
+					newnote.innerHTML = `
+					<rest></rest>
+					<duration>${divisions+divisions/2}</duration>
+					<voice>1</voice>
+					<type>quarter</type>
+					<dot></dot>`
+					measure.insertBefore(newnote, note);
+					const newnote2 = document.createElement('note');
+					newnote2.innerHTML = `
+					<rest></rest>
+					<duration>${divisions/2}</duration>
+					<voice>1</voice>
+					<type>eighth</type>`
+					measure.insertBefore(newnote2, note);
+					measure.removeChild(note);
+				}
+			} else if (preBeats === 9 && preBeatType === 8) {
+				if (noteType === 'whole') {
+					const maxNumber = 3;
+					let quarterNoteNumber = 1;
+					while (quarterNoteNumber <= maxNumber) {
+						const newnote = document.createElement('note');
+						newnote.innerHTML = `
+						<rest></rest>
+						<duration>${divisions+divisions/2}</duration>
+						<voice>1</voice>
+						<type>quarter</type>
+						<dot></dot>`
+						measure.insertBefore(newnote, note);
+						quarterNoteNumber += 1;
+					};
+					measure.removeChild(note);
+				} else if (noteType === 'half') {
+					const newnote = document.createElement('note');
+					newnote.innerHTML = `
+					<rest></rest>
+					<duration>${divisions+divisions/2}</duration>
+					<voice>1</voice>
+					<type>quarter</type>
+					<dot></dot>`
+					measure.insertBefore(newnote, note);
+					const newnote2 = document.createElement('note');
+					newnote2.innerHTML = `
+					<rest></rest>
+					<duration>${divisions/2}</duration>
+					<voice>1</voice>
+					<type>eighth</type>`
+					measure.insertBefore(newnote2, note);
+					measure.removeChild(note);
+				}
+			} else if (preBeats === 12 && preBeatType === 8) {
+				if (noteType === 'whole') {
+					const maxNumber = 4;
+					let quarterNoteNumber = 1;
+					while (quarterNoteNumber <= maxNumber) {
+						const newnote = document.createElement('note');
+						newnote.innerHTML = `
+						<rest></rest>
+						<duration>${divisions+divisions/2}</duration>
+						<voice>1</voice>
+						<type>quarter</type>
+						<dot></dot>`
+						measure.insertBefore(newnote, note);
+						quarterNoteNumber += 1;
+					};
+					measure.removeChild(note);
+				} else if (noteType === 'half') {
+					const newnote = document.createElement('note');
+					newnote.innerHTML = `
+					<rest></rest>
+					<duration>${divisions+divisions/2}</duration>
+					<voice>1</voice>
+					<type>quarter</type>
+					<dot></dot>`
+					measure.insertBefore(newnote, note);
+					const newnote2 = document.createElement('note');
+					newnote2.innerHTML = `
+					<rest></rest>
+					<duration>${divisions/2}</duration>
+					<voice>1</voice>
+					<type>eighth</type>`
+					measure.insertBefore(newnote2, note);
+					measure.removeChild(note);
+				}
+			}
+		} 
+	}
+}

+ 4 - 49
src/helpers/formateMusic.ts

@@ -2,6 +2,7 @@ import dayjs from "dayjs";
 import duration from "dayjs/plugin/duration";
 import state, { customData } from "/src/state";
 import { browser } from "../utils/index";
+import { transferJianNote } from "/src/helpers/customMusicScore"
 import {
 	isSpecialMark,
 	isSpeedKeyword,
@@ -780,59 +781,13 @@ export const formatXML = (xml: string, xmlUrl?: string): string => {
           <type>whole</type>
         </note>`;
 		}
-		// if (state.musicRenderType !== 'staff') {
-		// 	transferJianNote(measure, divisions, preBeats, preBeatType)
-		// }
+		if (state.musicRenderType !== 'staff') {
+			transferJianNote(measure, divisions, preBeats, preBeatType)
+		}
 	}
 	return new XMLSerializer().serializeToString(xmlParse);
 };
 
-/** 转换简谱的全休止符和二分休止符 */
-export const transferJianNote = (measure: any, divisions: number, preBeats: number, preBeatType: number) => {
-	const multipleXs = preBeatType / 4;
-	const notes = measure.getElementsByTagName("note")
-	for (const note of notes) {
-		const noteType = note.getElementsByTagName("type")?.[0]?.textContent || '';
-		if (noteType === 'whole' || noteType === 'half') {
-			// 4/4拍
-			if (preBeats === 4 && preBeatType === 4) {
-
-			} else if (preBeats === 3 && preBeatType === 4) {
-
-			} else if (preBeats === 3 && preBeatType === 8) {
-
-			} else if (preBeats === 3 && preBeatType === 8) {
-
-			} else if (preBeats === 5 && preBeatType === 8) {
-
-			} else if (preBeats === 6 && preBeatType === 8) {
-
-			} else if (preBeats === 9 && preBeatType === 8) {
-
-			} else if (preBeats === 12 && preBeatType === 8) {
-
-			}
-
-			const maxNumber = noteType === 'half' ? 2 : preBeats / multipleXs;
-			if (!Number.isInteger(maxNumber)) {
-				return;
-			}
-			// console.log('几个1/4音符',maxNumber)
-			let quarterNoteNumber = 1;
-			while (quarterNoteNumber <= maxNumber) {
-				const newnote = document.createElement('note');
-				newnote.innerHTML = `
-				<rest></rest>
-				<duration>${divisions}</duration>
-				<voice>1</voice>
-				<type>quarter</type>`
-				measure.insertBefore(newnote, note);
-				quarterNoteNumber += 1;
-			};
-			measure.removeChild(note);
-		} 
-	}
-}
 
 /** 获取所有音符的时值,以及格式化音符 */
 export const formateTimes = (osmd: OpenSheetMusicDisplay) => {

+ 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/, ""),