Browse Source

Merge branch 'feature-tianyong-newVersion' into ktyq-online-new

TIANYONG 7 months ago
parent
commit
82a2ebe41e
2 changed files with 28 additions and 7 deletions
  1. 27 6
      src/helpers/formateMusic.ts
  2. 1 1
      src/page-instrument/view-figner/index.tsx

+ 27 - 6
src/helpers/formateMusic.ts

@@ -1257,14 +1257,26 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 			/**
 			 * evxml的曲子,如果曲谱xml中带有times信息,则音符时值优先取times中的值
 			 * 曲子:1795013295024062466(春暖花开),如果音符有times信息,休止符没有times信息,此种规则是认为休止符不参与时值计算的,需要过滤掉该休止符
+			 * TODO:需要考虑唱名怎么处理,唱名是xml有多少个音符,就需要唱多少个,不能剔除
 			 */
-			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;
+					// 唱名时间补齐
+					xmlNoteTime += noteLength
+					continue;
+				}
 			}
 			let evNoteStartTime = 0, evNoteEndTime = 0;
-			if (state.isEvxml && note?.noteTimeInfo?.length) {
-				const idx = noteIds.filter((item: any) => item === svgElement?.attrs.id)?.length || 0
+			if (state.isEvxml && note?.noteTimeInfo?.length ) {
+				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;
@@ -1363,10 +1379,15 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 			// console.log('👀看看endtime', nodeDetail.duration, relaEndtime, fixtime, i)
 			// console.log('音符时间',nodeDetail.i,nodeDetail.time,nodeDetail.endtime)
 			tickables = tickables.filter((tickable: any) => tickable.attrs?.type !== "GhostNote")
-			const maxNum = (state.isCombineRender && note.maxNoteNum) ? note.maxNoteNum : tickables.length;
+			let maxNum = (state.isCombineRender && note.maxNoteNum) ? note.maxNoteNum : tickables.length;
+			// 妙极客的曲子,一个休止小节内可能有多个休止符,此时maxNum是0,需要针对这种情况作处理
+			if (note.isRestFlag && maxNum === 0) {
+				maxNum = note.maxNoteNum;
+			}
 			nodeDetail.noteLength = maxNum || 1;
 			allNotes.push(nodeDetail);
 			allNoteId.push(nodeDetail.id);
+
 			if ( measures.some((item: any) => item.MeasureNumberXML !== nodeDetail.MeasureNumberXML) ) {
 				measures = [];
 				measures.push(nodeDetail);

+ 1 - 1
src/page-instrument/view-figner/index.tsx

@@ -928,7 +928,7 @@ export default defineComponent({
       playAction.listenLock = true; // 锁
       playAction.listenTipsStatus = true;
       // 设置并保存示例数据
-      let randomIndex = data.notes.findIndex((item: any) => item.realKey === 67); // Math.floor(Math.random() * data.notes.length);
+      let randomIndex = data.notes.findIndex((item: any) => item.realKey === 69); // Math.floor(Math.random() * data.notes.length);
 
       playAction.exampleAnser = data.notes[randomIndex];
       data.realKey = playAction.exampleAnser.realKey;