|
@@ -782,6 +782,7 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
|
|
|
let isSetNextNoteReal = false;
|
|
|
let differFrom = 0;
|
|
|
// let testIdx = 0;
|
|
|
+ let repeatIdx = 0; // 循环的次数
|
|
|
while (!iterator.EndReached) {
|
|
|
// console.log({ ...iterator });
|
|
|
const voiceEntries = iterator.CurrentVoiceEntries?.[0] ? [iterator.CurrentVoiceEntries?.[0]] : [];
|
|
@@ -865,7 +866,12 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
|
|
|
}
|
|
|
|
|
|
iterator.moveToNextVisibleVoiceEntry(false);
|
|
|
- // console.log('小节',testIdx,iterator.EndReached,iterator.currentMeasureIndex)
|
|
|
+ // 从头开始循环,repeatIdx标记+1
|
|
|
+ if (iterator.backJumpOccurred) {
|
|
|
+ repeatIdx += 1;
|
|
|
+ }
|
|
|
+ iterator.repeatIdx = repeatIdx;
|
|
|
+ // console.log('小节',testIdx,iterator.repeatIdx,iterator.EndReached,iterator.currentMeasureIndex,iterator.backJumpOccurred,iterator.forwardJumpOccurred)
|
|
|
// testIdx += 1;
|
|
|
}
|
|
|
// 是否是变速的曲子
|
|
@@ -1171,14 +1177,22 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
|
|
|
totalMultipleRestMeasures, // 当前小节总的合并小节数
|
|
|
measureSpeed, // 小节速度
|
|
|
maxNoteNum: note.maxNoteNum, // 当前小节音符最多的分轨的音符数量
|
|
|
+ repeatIdx: iterator.repeatIdx, // 标记是第几遍循环,从0开始
|
|
|
};
|
|
|
// 如果是妙极客的曲子,并且第二遍循环播放需要等待时间,并且是第二遍循环的第一个小节的第一个音符
|
|
|
- if (state.isEvxml && state.secondEvXmlBeginTime && nodeDetail.i > 0 && nodeDetail.MeasureNumberXML === 1 && nodeDetail.noteId === 0) {
|
|
|
- nodeDetail.time = nodeDetail.time + state.secondEvXmlBeginTime;
|
|
|
- nodeDetail.endtime = nodeDetail.endtime + state.secondEvXmlBeginTime;
|
|
|
- usetime = usetime + state.secondEvXmlBeginTime;
|
|
|
- relativeTime = relativeTime + state.secondEvXmlBeginTime;
|
|
|
- }
|
|
|
+ // if (state.isEvxml && state.secondEvXmlBeginTime && nodeDetail.i > 0 && nodeDetail.MeasureNumberXML === 1 && nodeDetail.noteId === 0) {
|
|
|
+ // nodeDetail.time = nodeDetail.time + state.secondEvXmlBeginTime;
|
|
|
+ // nodeDetail.endtime = nodeDetail.endtime + state.secondEvXmlBeginTime;
|
|
|
+ // usetime = usetime + state.secondEvXmlBeginTime;
|
|
|
+ // relativeTime = relativeTime + state.secondEvXmlBeginTime;
|
|
|
+ // }
|
|
|
+ if (state.isEvxml && nodeDetail.repeatIdx && nodeDetail.i > 0 && nodeDetail.MeasureNumberXML === 1 && nodeDetail.noteId === 0) {
|
|
|
+ const currentWaitTime = state.evXmlBeginArr[nodeDetail.repeatIdx] || 0;
|
|
|
+ nodeDetail.time = nodeDetail.time + currentWaitTime;
|
|
|
+ nodeDetail.endtime = nodeDetail.endtime + currentWaitTime;
|
|
|
+ usetime = usetime + currentWaitTime;
|
|
|
+ relativeTime = relativeTime + currentWaitTime;
|
|
|
+ }
|
|
|
nodeDetail.realKey = formatRealKey(note.halfTone - fixedKey * 12, nodeDetail);
|
|
|
nodeDetail.duration = nodeDetail.endtime - nodeDetail.time;
|
|
|
let tickables = activeVerticalMeasureList[0]?.vfVoices["1"]?.tickables || [];
|
|
@@ -1377,6 +1391,7 @@ const analyzeEvxml = (xmlParse: any, xmlUrl?: string) => {
|
|
|
const denNum = xmlParse.getElementsByTagName("timegap")[0]?.getElementsByTagName("values")[0]?.getElementsByTagName("item")[0]?.getAttribute('den');
|
|
|
const xmlNum2 = xmlParse.getElementsByTagName("timegap")[0]?.getElementsByTagName("values")[0]?.getElementsByTagName("item")[1]?.getAttribute('num');
|
|
|
const denNum2 = xmlParse.getElementsByTagName("timegap")[0]?.getElementsByTagName("values")[0]?.getElementsByTagName("item")[1]?.getAttribute('den');
|
|
|
+ const timeGaps: any = Array.from(xmlParse.getElementsByTagName("timegap")[0]?.getElementsByTagName("values")[0]?.getElementsByTagName("item"));
|
|
|
// 第一个音符的起始时间
|
|
|
const firstMeasure = xmlParse.getElementsByTagName("measure")[0];
|
|
|
if (firstMeasure) {
|
|
@@ -1385,7 +1400,16 @@ const analyzeEvxml = (xmlParse: any, xmlUrl?: string) => {
|
|
|
state.secondEvXmlBeginTime = firstNoteBeginTime ? 0 : xmlNum2 ? 60 / state.originSpeed * xmlNum2 * 4/denNum2 : 0;
|
|
|
const hasTimeGap = xmlParse.getElementsByTagName("timegap").length > 0;
|
|
|
const hasTimes = xmlParse.getElementsByTagName("times").length > 0;
|
|
|
- console.log('🚀 ~ evxml解析','有timegap:',hasTimeGap,'有times:',hasTimes)
|
|
|
+
|
|
|
+ if (timeGaps && timeGaps.length && !firstNoteBeginTime) {
|
|
|
+ for (const timeGap of timeGaps) {
|
|
|
+ const num: any = timeGap?.getAttribute('num'), den: any = timeGap?.getAttribute('den');
|
|
|
+ const startTime = num ? 60 / state.originSpeed * num * 4/den : 0;
|
|
|
+ state.evXmlBeginArr.push(startTime)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ console.log('🚀 ~ evxml解析','有timegap:',hasTimeGap,'有times:',hasTimes,'timegap集合',state.evXmlBeginArr,'第一个timegap',state.evXmlBeginTime)
|
|
|
}
|
|
|
|
|
|
// if (!hasTimeGap && !hasTimes) {
|