|  | @@ -32,7 +32,7 @@ export const getFixTime = (speed: number) => {
 | 
											
												
													
														|  |  	const duration: any = getDuration(state.osmd as unknown as OpenSheetMusicDisplay);
 |  |  	const duration: any = getDuration(state.osmd as unknown as OpenSheetMusicDisplay);
 | 
											
												
													
														|  |  	let numerator = duration.numerator || 0;
 |  |  	let numerator = duration.numerator || 0;
 | 
											
												
													
														|  |  	let denominator = duration.denominator || 4;
 |  |  	let denominator = duration.denominator || 4;
 | 
											
												
													
														|  | -	const beatUnit = duration.beatUnit || "quarter";
 |  | 
 | 
											
												
													
														|  | 
 |  | +	const beatUnit = "quarter";
 | 
											
												
													
														|  |  	// if (state.repeatedBeats) {
 |  |  	// if (state.repeatedBeats) {
 | 
											
												
													
														|  |  	// 	// 音频制作问题仅2拍不重复
 |  |  	// 	// 音频制作问题仅2拍不重复
 | 
											
												
													
														|  |  	// 	numerator = numerator === 2 ? 4 : numerator;
 |  |  	// 	numerator = numerator === 2 ? 4 : numerator;
 | 
											
										
											
												
													
														|  | @@ -149,9 +149,9 @@ export const getDuration = (osmd?: OpenSheetMusicDisplay): Duration => {
 | 
											
												
													
														|  |  		const { Duration, TempoInBPM, ActiveTimeSignature, TempoExpressions } = osmd.GraphicSheet.MeasureList[0][0]?.parentSourceMeasure;
 |  |  		const { Duration, TempoInBPM, ActiveTimeSignature, TempoExpressions } = osmd.GraphicSheet.MeasureList[0][0]?.parentSourceMeasure;
 | 
											
												
													
														|  |  		if (Duration) {
 |  |  		if (Duration) {
 | 
											
												
													
														|  |  			let beatUnit = "quarter";
 |  |  			let beatUnit = "quarter";
 | 
											
												
													
														|  | -			for (const item of TempoExpressions) {
 |  | 
 | 
											
												
													
														|  | -				beatUnit = item.InstantaneousTempo.beatUnit || "quarter";
 |  | 
 | 
											
												
													
														|  | -			}
 |  | 
 | 
											
												
													
														|  | 
 |  | +			// for (const item of TempoExpressions) {
 | 
											
												
													
														|  | 
 |  | +			// 	beatUnit = item.InstantaneousTempo.beatUnit || "quarter";
 | 
											
												
													
														|  | 
 |  | +			// }
 | 
											
												
													
														|  |  			const duration = formatDuration(ActiveTimeSignature, Duration) as unknown as FractionDefault;
 |  |  			const duration = formatDuration(ActiveTimeSignature, Duration) as unknown as FractionDefault;
 | 
											
												
													
														|  |  			return {
 |  |  			return {
 | 
											
												
													
														|  |  				...duration,
 |  |  				...duration,
 | 
											
										
											
												
													
														|  | @@ -238,11 +238,6 @@ export function formatBeatUnit(beatUnit: string) {
 | 
											
												
													
														|  |  	return multiple;
 |  |  	return multiple;
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/** 根据音符单位,速度,几几拍计算正确的时间 */
 |  | 
 | 
											
												
													
														|  | -export function getTimeByBeatUnit(beatUnit: string, bpm: number, denominator: number) {
 |  | 
 | 
											
												
													
														|  | -	return (denominator / formatBeatUnit(beatUnit)) * bpm;
 |  | 
 | 
											
												
													
														|  | -}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  |  export type CustomInfo = {
 |  |  export type CustomInfo = {
 | 
											
												
													
														|  |  	showSpeed: boolean;
 |  |  	showSpeed: boolean;
 | 
											
												
													
														|  |  	parsedXML: string;
 |  |  	parsedXML: string;
 | 
											
										
											
												
													
														|  | @@ -1002,14 +997,14 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 | 
											
												
													
														|  |  				preMeasureNumber = note?.sourceMeasure?.MeasureNumberXML
 |  |  				preMeasureNumber = note?.sourceMeasure?.MeasureNumberXML
 | 
											
												
													
														|  |  				allMeasures.push(note.sourceMeasure);
 |  |  				allMeasures.push(note.sourceMeasure);
 | 
											
												
													
														|  |  			}
 |  |  			}
 | 
											
												
													
														|  | -			if (si === 0 && state.isSpecialBookCategory) {
 |  | 
 | 
											
												
													
														|  | -				for (const expression of (note.sourceMeasure as SourceMeasure)?.TempoExpressions) {
 |  | 
 | 
											
												
													
														|  | -					if (expression?.InstantaneousTempo?.beatUnit) {
 |  | 
 | 
											
												
													
														|  | -						// 取最后一个有效的tempo
 |  | 
 | 
											
												
													
														|  | -						beatUnit = expression.InstantaneousTempo.beatUnit;
 |  | 
 | 
											
												
													
														|  | -					}
 |  | 
 | 
											
												
													
														|  | -				}
 |  | 
 | 
											
												
													
														|  | -			}
 |  | 
 | 
											
												
													
														|  | 
 |  | +			// if (si === 0 && state.isSpecialBookCategory) {
 | 
											
												
													
														|  | 
 |  | +			// 	for (const expression of (note.sourceMeasure as SourceMeasure)?.TempoExpressions) {
 | 
											
												
													
														|  | 
 |  | +			// 		if (expression?.InstantaneousTempo?.beatUnit) {
 | 
											
												
													
														|  | 
 |  | +			// 			// 取最后一个有效的tempo
 | 
											
												
													
														|  | 
 |  | +			// 			beatUnit = expression.InstantaneousTempo.beatUnit;
 | 
											
												
													
														|  | 
 |  | +			// 		}
 | 
											
												
													
														|  | 
 |  | +			// 	}
 | 
											
												
													
														|  | 
 |  | +			// }
 | 
											
												
													
														|  |  			// 判断是否是同一小节
 |  |  			// 判断是否是同一小节
 | 
											
												
													
														|  |  			if (staveIndex == note.sourceMeasure?.MeasureNumberXML && i !== 0) {
 |  |  			if (staveIndex == note.sourceMeasure?.MeasureNumberXML && i !== 0) {
 | 
											
												
													
														|  |  				staveNoteIndex++
 |  |  				staveNoteIndex++
 | 
											
										
											
												
													
														|  | @@ -1117,7 +1112,6 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 | 
											
												
													
														|  |  				xmlMp3BeatFixTime = getFixTime(beatSpeed)
 |  |  				xmlMp3BeatFixTime = getFixTime(beatSpeed)
 | 
											
												
													
														|  |  				// console.log("fixtime:", fixtime, '速度:', beatSpeed, "state.isSpecialBookCategory:", state.isSpecialBookCategory, 'state.isOpenMetronome:', state.isOpenMetronome);
 |  |  				// console.log("fixtime:", fixtime, '速度:', beatSpeed, "state.isSpecialBookCategory:", state.isSpecialBookCategory, 'state.isOpenMetronome:', state.isOpenMetronome);
 | 
											
												
													
														|  |  			}
 |  |  			}
 | 
											
												
													
														|  | -			// console.log(getTimeByBeatUnit(beatUnit, measureSpeed, iterator.currentMeasure.activeTimeSignature.Denominator))
 |  | 
 | 
											
												
													
														|  |  			let gradualLength = 0;
 |  |  			let gradualLength = 0;
 | 
											
												
													
														|  |  			let speed = (state.isSpecialBookCategory ? measureSpeed : baseSpeed) || 1;
 |  |  			let speed = (state.isSpecialBookCategory ? measureSpeed : baseSpeed) || 1;
 | 
											
												
													
														|  |  			gradualChange = iterator.currentMeasure.speedInfo || gradualChange;
 |  |  			gradualChange = iterator.currentMeasure.speedInfo || gradualChange;
 | 
											
										
											
												
													
														|  | @@ -1157,34 +1151,6 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 | 
											
												
													
														|  |  						}
 |  |  						}
 | 
											
												
													
														|  |  					}
 |  |  					}
 | 
											
												
													
														|  |  				}
 |  |  				}
 | 
											
												
													
														|  | -			} else if (state.appName === "GYM" && gradualChange && gradualSpeed && (gradualChange.startXmlNoteIndex === si || gradualChangeIndex > 0)) {
 |  | 
 | 
											
												
													
														|  | -				const startSpeed = gradualSpeed[0] - (gradualSpeed[1] - gradualSpeed[0]);
 |  | 
 | 
											
												
													
														|  | -				const { resetXmlNoteIndex, endXmlNoteIndex } = gradualChange;
 |  | 
 | 
											
												
													
														|  | -				const noteDiff = endXmlNoteIndex;
 |  | 
 | 
											
												
													
														|  | -				let stepSpeed = (gradualSpeed[gradualSpeed.length - 1] - startSpeed) / noteDiff;
 |  | 
 | 
											
												
													
														|  | -				stepSpeed = note.DotsXml ? stepSpeed / 1.5 : stepSpeed;
 |  | 
 | 
											
												
													
														|  | -				if (gradualChangeIndex < noteDiff) {
 |  | 
 | 
											
												
													
														|  | -					const tempSpeed = Math.ceil(speed + stepSpeed * gradualChangeIndex);
 |  | 
 | 
											
												
													
														|  | -					let tmpSpeed = getTimeByBeatUnit(beatUnit, tempSpeed, iterator.currentMeasure.activeTimeSignature.Denominator);
 |  | 
 | 
											
												
													
														|  | -					const maxLength = (wholeValue + numerator / denominator) * vDenominator * (60 / tmpSpeed);
 |  | 
 | 
											
												
													
														|  | -					// speed += stepSpeeds.reduce((a, b) => a + b, 0)
 |  | 
 | 
											
												
													
														|  | -					speed += Math.ceil(stepSpeed * (gradualChangeIndex + 1));
 |  | 
 | 
											
												
													
														|  | -					tmpSpeed = getTimeByBeatUnit(beatUnit, speed, iterator.currentMeasure.activeTimeSignature.Denominator);
 |  | 
 | 
											
												
													
														|  | -					const minLength = (wholeValue + numerator / denominator) * vDenominator * (60 / tmpSpeed);
 |  | 
 | 
											
												
													
														|  | -					gradualLength = (maxLength + minLength) / 2;
 |  | 
 | 
											
												
													
														|  | -				} else if (resetXmlNoteIndex > gradualChangeIndex) {
 |  | 
 | 
											
												
													
														|  | -					speed = allNotes[i - 1]?.speed;
 |  | 
 | 
											
												
													
														|  | -				}
 |  | 
 | 
											
												
													
														|  | -				beatSpeed =
 |  | 
 | 
											
												
													
														|  | -					(state.isSpecialBookCategory ? getTimeByBeatUnit(beatUnit, speed, iterator.currentMeasure.activeTimeSignature.Denominator) : baseSpeed) || 1;
 |  | 
 | 
											
												
													
														|  | -				const isEnd = !(gradualChangeIndex < noteDiff) && !(resetXmlNoteIndex > gradualChangeIndex);
 |  | 
 | 
											
												
													
														|  | -				gradualChangeIndex++;
 |  | 
 | 
											
												
													
														|  | -				if (isEnd) {
 |  | 
 | 
											
												
													
														|  | -					gradualChangeIndex = 0;
 |  | 
 | 
											
												
													
														|  | -					gradualChange = undefined;
 |  | 
 | 
											
												
													
														|  | -					gradualSpeed = undefined;
 |  | 
 | 
											
												
													
														|  | -					stepSpeeds = [];
 |  | 
 | 
											
												
													
														|  | -				}
 |  | 
 | 
											
												
													
														|  |  			}
 |  |  			}
 | 
											
												
													
														|  |  			const _noteLength = NoteRealValue;
 |  |  			const _noteLength = NoteRealValue;
 | 
											
												
													
														|  |  			// 当前音符的持续时长,当前音符的RealValue值*拍数*(60/后台设置的基准速度)
 |  |  			// 当前音符的持续时长,当前音符的RealValue值*拍数*(60/后台设置的基准速度)
 |