Przeglądaj źródła

feat: 妙极客的曲子,唱多遍时,合并休止小节没有音符,多遍time取值问题修复

TIANYONG 6 miesięcy temu
rodzic
commit
1a96e5893e
2 zmienionych plików z 22 dodań i 6 usunięć
  1. 20 4
      src/helpers/formateMusic.ts
  2. 2 2
      vite.config.ts

+ 20 - 4
src/helpers/formateMusic.ts

@@ -969,6 +969,9 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 	// let voicesBBox: any = null;
 	for (let { note, iterator, currentTime, isDouble, isMutileSubject } of _notes) {
 		if (note) {
+			if (i==75) {
+				debugger
+			}
 			if (preMeasureNumber != note?.sourceMeasure?.MeasureNumberXML) {
 				si = 0
 			}
@@ -1258,13 +1261,22 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 			 * evxml的曲子,如果曲谱xml中带有times信息,则音符时值优先取times中的值
 			 * 曲子:1795013295024062466(春暖花开),如果音符有times信息,休止符没有times信息,此种规则是认为休止符不参与时值计算的,需要过滤掉该休止符
 			 */
-			if (state.isEvxml && note.isRestFlag && note?.noteTimeInfo?.length === 0 && state.xmlHasTimes && _notes[i-1]?.note?.noteTimeInfo?.[0]?.end === _notes[i+1]?.note?.noteTimeInfo?.[0]?.begin) {
-				note.maxNoteNum = note.maxNoteNum - 1;
-				continue;
+			if (state.isEvxml && note.isRestFlag && note?.noteTimeInfo?.length === 0 && state.xmlHasTimes) {
+				const idx = _notes.findIndex(item=>item.note === note);
+				const allowRange = Math.abs(_notes[idx+1]?.note?.noteTimeInfo?.[0]?.begin - _notes[idx-1]?.note?.noteTimeInfo?.[0]?.end) < 10;
+				if (allowRange) {
+					note.maxNoteNum = note.maxNoteNum - 1;
+					continue;
+				}
 			}
 			let evNoteStartTime = 0, evNoteEndTime = 0;
 			if (state.isEvxml && note?.noteTimeInfo?.length) {
-				const idx = noteIds.filter((item: any) => item === svgElement?.attrs.id)?.length || 0
+				let idx = noteIds.filter((item: any) => item === svgElement?.attrs.id)?.length || 0;
+				// 如果是合并的小节的休止符
+				if (note.isRestFlag && !svgElement && note?.NoteToGraphicalNoteObjectId) {
+					const customRestId = `rest-${note?.sourceMeasure?.MeasureNumberXML}-${note?.NoteToGraphicalNoteObjectId}`;
+					idx = noteIds.filter((item: any) => item === customRestId)?.length || 0;
+				}
 				evNoteStartTime = note?.noteTimeInfo[idx]?.begin
 				evNoteEndTime = note?.noteTimeInfo[idx]?.end
 				if (evNoteStartTime) {
@@ -1274,6 +1286,10 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 				// usetime = evNoteStartTime - fixtime
 			}
 			svgElement?.attrs.id && noteIds.push(svgElement?.attrs.id)
+			// 如果是合并的休止小节,是没有渲染音符的,所以没有svgElement对象,也就没有id,此时需要添加自定义的一个id进度,便于多遍循环时,找到对应的noteTimeInfo里面的时间信息
+			if (note.isRestFlag && !svgElement && note?.NoteToGraphicalNoteObjectId) {
+				noteIds.push(`rest-${note?.sourceMeasure?.MeasureNumberXML}-${note?.NoteToGraphicalNoteObjectId}`)
+			}
 
 			// 如果该音符包含倚音,添加标记
 			let hasGraceNote = false;

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