|
@@ -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);
|