|  | @@ -714,7 +714,13 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 | 
	
		
			
				|  |  |  		currentTimes.push(iterator.currentTimeStamp.realValue - currentTimeStamp);
 | 
	
		
			
				|  |  |  		currentTimeStamp = iterator.currentTimeStamp.realValue;
 | 
	
		
			
				|  |  |  		for (const v of voiceEntries) {
 | 
	
		
			
				|  |  | -			const note = v.notes[0];
 | 
	
		
			
				|  |  | +			
 | 
	
		
			
				|  |  | +			let note = v.notes[0];
 | 
	
		
			
				|  |  | +			if (note.IsGraceNote){
 | 
	
		
			
				|  |  | +				// 如果是装饰音, 取不是装饰音的时值
 | 
	
		
			
				|  |  | +				const voice = note.parentStaffEntry.voiceEntries.find((_v: any) => !_v.isGrace)
 | 
	
		
			
				|  |  | +				note = voice.notes[0];
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  |  			note.fixedKey = note.ParentVoiceEntry.ParentVoice.Parent.SubInstruments[0].fixedKey || 0;
 | 
	
		
			
				|  |  |  			// 有倚音
 | 
	
		
			
				|  |  |  			if (note?.voiceEntry?.isGrace) {
 | 
	
	
		
			
				|  | @@ -743,7 +749,6 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  	for (let { note, iterator, currentTime, isDouble, isMutileSubject } of _notes) {
 | 
	
		
			
				|  |  |  		if (note) {
 | 
	
		
			
				|  |  | -			// console.log("🚀 ~ note:", note)
 | 
	
		
			
				|  |  |  			if (si === 0) {
 | 
	
		
			
				|  |  |  				allMeasures.push(note.sourceMeasure);
 | 
	
		
			
				|  |  |  			}
 | 
	
	
		
			
				|  | @@ -804,6 +809,7 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 | 
	
		
			
				|  |  |  			if (!gradualSpeed || gradualSpeed.length < 2) {
 | 
	
		
			
				|  |  |  				gradualSpeed = createSpeedInfo(gradualChange, speed);
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  | +			// console.log({...iterator.currentMeasure},gradualChange, gradualSpeed)
 | 
	
		
			
				|  |  |  			const measureListIndex = iterator.currentMeasure.measureListIndex;
 | 
	
		
			
				|  |  |  			// 计算相差时间按照比例分配到所有音符上
 | 
	
		
			
				|  |  |  			if (state.gradualTimes && Object.keys(state.gradualTimes).length > 0) {
 | 
	
	
		
			
				|  | @@ -835,21 +841,13 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 | 
	
		
			
				|  |  |  						}
 | 
	
		
			
				|  |  |  					}
 | 
	
		
			
				|  |  |  				}
 | 
	
		
			
				|  |  | -			} else if (gradualChange && gradualSpeed && (gradualChange.startXmlNoteIndex === si || gradualChangeIndex > 0)) {
 | 
	
		
			
				|  |  | -				// const tmpNoteLength = (wholeValue + numerator / denominator) * vDenominator * (60 / beatSpeed)
 | 
	
		
			
				|  |  | -				// const tmpMeasureLength = vRealValue * 4 * (60 / beatSpeed)
 | 
	
		
			
				|  |  | +			} else if (state.appName === 'GYM' && gradualChange && gradualSpeed && (gradualChange.startXmlNoteIndex === si || gradualChangeIndex > 0)) {
 | 
	
		
			
				|  |  |  				const startSpeed = gradualSpeed[0] - (gradualSpeed[1] - gradualSpeed[0]);
 | 
	
		
			
				|  |  | -				// console.log((gradualSpeed[gradualSpeed.length - 1] - startSpeed) * tmpNoteLength/tmpMeasureLength)
 | 
	
		
			
				|  |  | -				// console.log(gradualChange, gradualSpeed, startSpeed, gradualChange.startXmlNoteIndex, si, gradualChangeIndex)
 | 
	
		
			
				|  |  | -				// gradualChangeIndex = 0
 | 
	
		
			
				|  |  |  				const { resetXmlNoteIndex, endXmlNoteIndex } = gradualChange;
 | 
	
		
			
				|  |  |  				const noteDiff = endXmlNoteIndex;
 | 
	
		
			
				|  |  |  				let stepSpeed = (gradualSpeed[gradualSpeed.length - 1] - startSpeed) / noteDiff;
 | 
	
		
			
				|  |  |  				stepSpeed = note.DotsXml ? stepSpeed / 1.5 : stepSpeed;
 | 
	
		
			
				|  |  | -				// console.log(gradualChangeIndex, stepSpeed, stepSpeed * gradualChangeIndex, stepSpeed * (gradualChangeIndex + 1), noteDiff, resetXmlNoteIndex)
 | 
	
		
			
				|  |  |  				if (gradualChangeIndex < noteDiff) {
 | 
	
		
			
				|  |  | -					// stepSpeeds.push((gradualSpeed[gradualSpeed.length - 1] - startSpeed) * tmpNoteLength/tmpMeasureLength)
 | 
	
		
			
				|  |  | -					// speed += Math.ceil((stepSpeed) * (gradualChangeIndex + 1))
 | 
	
		
			
				|  |  |  					const tempSpeed = Math.ceil(speed + stepSpeed * gradualChangeIndex);
 | 
	
		
			
				|  |  |  					let tmpSpeed = getTimeByBeatUnit(beatUnit, tempSpeed, iterator.currentMeasure.activeTimeSignature.Denominator);
 | 
	
		
			
				|  |  |  					const maxLength = (wholeValue + numerator / denominator) * vDenominator * (60 / tmpSpeed);
 | 
	
	
		
			
				|  | @@ -858,15 +856,12 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 | 
	
		
			
				|  |  |  					tmpSpeed = getTimeByBeatUnit(beatUnit, speed, iterator.currentMeasure.activeTimeSignature.Denominator);
 | 
	
		
			
				|  |  |  					const minLength = (wholeValue + numerator / denominator) * vDenominator * (60 / tmpSpeed);
 | 
	
		
			
				|  |  |  					gradualLength = (maxLength + minLength) / 2;
 | 
	
		
			
				|  |  | -					// console.table({maxLength, minLength, gradualLength, tempSpeed, speed, tmpSpeed, dot: note.DotsXml})
 | 
	
		
			
				|  |  |  				} else if (resetXmlNoteIndex > gradualChangeIndex) {
 | 
	
		
			
				|  |  |  					speed = allNotes[i - 1]?.speed;
 | 
	
		
			
				|  |  | -					// console.log('resetXmlNoteIndex', resetXmlNoteIndex, 'gradualChangeIndex', gradualChangeIndex, allNotes[i -1]?.speed)
 | 
	
		
			
				|  |  |  				}
 | 
	
		
			
				|  |  |  				beatSpeed = (state.isSpecialBookCategory ? getTimeByBeatUnit(beatUnit, speed, iterator.currentMeasure.activeTimeSignature.Denominator) : baseSpeed) || 1;
 | 
	
		
			
				|  |  |  				const isEnd = !(gradualChangeIndex < noteDiff) && !(resetXmlNoteIndex > gradualChangeIndex);
 | 
	
		
			
				|  |  |  				gradualChangeIndex++;
 | 
	
		
			
				|  |  | -				// console.log(gradualChangeIndex)
 | 
	
		
			
				|  |  |  				if (isEnd) {
 | 
	
		
			
				|  |  |  					gradualChangeIndex = 0;
 | 
	
		
			
				|  |  |  					gradualChange = undefined;
 | 
	
	
		
			
				|  | @@ -874,16 +869,11 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 | 
	
		
			
				|  |  |  					stepSpeeds = [];
 | 
	
		
			
				|  |  |  				}
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  | -			// console.log(speed, beatSpeed)
 | 
	
		
			
				|  |  | -			// const vDenominator = 8
 | 
	
		
			
				|  |  | -			// console.log(NoteRealValue)
 | 
	
		
			
				|  |  | -			// console.log(activeInstantaneousTempo)
 | 
	
		
			
				|  |  | -			// console.log({vDenominator, NoteRealValue, denominator, numerator, wholeValue, realValue, vRealValue, measureSpeed, speed, beatSpeed})
 | 
	
		
			
				|  |  | -			// console.log(gradualLength)
 | 
	
		
			
				|  |  |  			const _noteLength = NoteRealValue
 | 
	
		
			
				|  |  |  			let noteLength = gradualLength ? gradualLength : Math.min(vRealValue, NoteRealValue) * formatBeatUnit(beatUnit) * (60 / beatSpeed);
 | 
	
		
			
				|  |  |  			const measureLength = vRealValue * vDenominator * (60 / beatSpeed);
 | 
	
		
			
				|  |  |  			// console.table({value: iterator.currentTimeStamp.realValue, vRealValue,NoteRealValue, noteLength,measureLength, MeasureNumberXML: note.sourceMeasure.MeasureNumberXML})
 | 
	
		
			
				|  |  | +			// console.log(i, Math.min(vRealValue, NoteRealValue),noteLength,gradualLength, formatBeatUnit(beatUnit),beatSpeed, NoteRealValue * formatBeatUnit(beatUnit) * (60 / beatSpeed) )
 | 
	
		
			
				|  |  |  			usetime += noteLength;
 | 
	
		
			
				|  |  |  			relaMeasureLength += noteLength;
 | 
	
		
			
				|  |  |  			let relaEndtime = noteLength + relativeTime;
 |