Selaa lähdekoodia

兼容酷乐秀播放

liushengqiang 2 vuotta sitten
vanhempi
commit
e0fde5fea4

+ 10 - 20
src/helpers/formateMusic.ts

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

+ 1 - 1
src/page-colexiu/App.tsx

@@ -27,7 +27,7 @@ export default defineComponent({
 			const res = await getUserInfo();
 			const student = res?.data || {};
 			setUserInfo(student);
-			console.log("🚀 ~ res:", student);
+			// console.log("🚀 ~ res:", student);
 		};
 		onBeforeMount(() => {
 			if (query.Authorization) {

+ 5 - 1
src/page-colexiu/detail/index.tsx

@@ -70,6 +70,7 @@ export default defineComponent({
 		};
 
 		const setState = (data: any, index: number) => {
+			state.appName = 'COLEXIU'
 			state.detailId = data.id;
 			state.xmlUrl = data.xmlFileUrl;
 			state.partIndex = index;
@@ -105,7 +106,7 @@ export default defineComponent({
 
 			// 设置指法
 			state.fingeringInfo = subjectFingering(state.subjectId);
-			console.log("🚀 ~ state.fingeringInfo:", state.fingeringInfo, state.subjectId)
+			// console.log("🚀 ~ state.fingeringInfo:", state.fingeringInfo, state.subjectId)
 		};
 
 		const setCustom = () => {
@@ -125,6 +126,9 @@ export default defineComponent({
 		const handleRendered = (osmd: any) => {
 			state.musicRendered = true;
 			state.osmd = osmd;
+			const saveSpeed = (store.get('speeds') || {})[state.examSongId]
+			const bpm = (osmd as any).bpm || osmd.Sheet.userStartTempoInBPM
+			state.originSpeed = state.speed = saveSpeed || bpm || 100
 			state.times = formateTimes(osmd);
 			console.log("🚀 ~ state.times:", state.times);
 			try {

+ 1 - 0
src/state.ts

@@ -11,6 +11,7 @@ import { IFingering } from "src/view/fingering/fingering-config";
 export type IDifficulty = "BEGINNER" | "ADVANCED" | "PERFORMER";
 
 const state = reactive({
+	appName: "" as "GYM" | "COLEXIU",
 	/**曲谱是否渲染完成 */
 	musicRendered: false,
 	/** 当前曲谱数据ID, 和曲谱ID不一致 */

+ 26 - 4
src/view/audio-list/index.tsx

@@ -2,7 +2,7 @@ import { computed, defineComponent, onMounted, reactive } from "vue";
 import state, { onEnded, onLoadedmetadata, onPlay, onTimeupdate } from "../../state";
 import styles from "./index.module.less";
 import { Howl, Howler } from "howler";
-import tockAndTick from '/src/constant/tockAndTick.json'
+import tockAndTick from "/src/constant/tockAndTick.json";
 
 export default defineComponent({
 	name: "audio-list",
@@ -11,7 +11,7 @@ export default defineComponent({
 		const isMusicMuted = computed(() => {
 			return state.playSource === "music";
 		});
-		
+
 		// const music = new Howl({
 		// 	src: tockAndTick.tick,
 		// })
@@ -33,8 +33,30 @@ export default defineComponent({
 					Howler.mute(true)
 					console.log("🚀 ~ music:", music, music.duration(), Howler.ctx.currentTime)
 				}}>静音</button> */}
-				<audio muted={!isMusicMuted.value} preload="auto" ref={(el) => (state.songEl = el as HTMLAudioElement)} src={state.music} onLoadedmetadata={onLoadedmetadata} onPlay={onPlay} onTimeupdate={onTimeupdate} onEnded={onEnded} />
-				<audio muted={isMusicMuted.value} preload="auto" ref={(el) => (state.backgroundEl = el as HTMLAudioElement)} src={state.accompany} />
+				<audio
+					muted={!isMusicMuted.value}
+					preload="auto"
+					ref={(el) => {
+						if (state.music) {
+							state.songEl = el as HTMLAudioElement;
+						}
+					}}
+					src={state.music}
+					onLoadedmetadata={onLoadedmetadata}
+					onPlay={onPlay}
+					onTimeupdate={onTimeupdate}
+					onEnded={onEnded}
+				/>
+				<audio
+					muted={isMusicMuted.value}
+					preload="auto"
+					ref={(el) => {
+						if (state.accompany) {
+							state.backgroundEl = el as HTMLAudioElement;
+						}
+					}}
+					src={state.accompany}
+				/>
 			</div>
 		);
 	},