|
@@ -2,7 +2,16 @@ import dayjs from "dayjs";
|
|
|
import duration from "dayjs/plugin/duration";
|
|
|
import state from "../state";
|
|
|
import { browser } from "../utils/index";
|
|
|
-import { isSpecialMark, isSpeedKeyword, Fraction, SourceMeasure, isGradientWords, GRADIENT_SPEED_RESET_TAG, StringUtil, OpenSheetMusicDisplay } from "/osmd-extended/src";
|
|
|
+import {
|
|
|
+ isSpecialMark,
|
|
|
+ isSpeedKeyword,
|
|
|
+ Fraction,
|
|
|
+ SourceMeasure,
|
|
|
+ isGradientWords,
|
|
|
+ GRADIENT_SPEED_RESET_TAG,
|
|
|
+ StringUtil,
|
|
|
+ OpenSheetMusicDisplay,
|
|
|
+} from "/osmd-extended/src";
|
|
|
import { GradualChange, speedInfo } from "./calcSpeed";
|
|
|
const browserInfo = browser();
|
|
|
dayjs.extend(duration);
|
|
@@ -26,7 +35,6 @@ export const getFixTime = (speed: number) => {
|
|
|
return state.isOpenMetronome ? (60 / speed) * formatBeatUnit(beatUnit) * (numerator / denominator) : 0;
|
|
|
};
|
|
|
|
|
|
-
|
|
|
export const retain = (time: number) => {
|
|
|
return Math.ceil(time * 1000000) / 1000000;
|
|
|
};
|
|
@@ -52,7 +60,6 @@ export const getMeasureDurationDiff = (measure: any) => {
|
|
|
return SRealValue - RRealValue;
|
|
|
};
|
|
|
|
|
|
-
|
|
|
/** 按照dorico的渐快渐慢生成对应的速度 */
|
|
|
export const createSpeedInfo = (gradualChange: GradualChange | undefined, speed: number) => {
|
|
|
if (gradualChange && speedInfo[gradualChange.startWord?.toLocaleLowerCase()]) {
|
|
@@ -114,7 +121,6 @@ export const getParentNote = (note: any) => {
|
|
|
return parentNote;
|
|
|
};
|
|
|
|
|
|
-
|
|
|
export type FractionDefault = {
|
|
|
numerator: number;
|
|
|
denominator: number;
|
|
@@ -321,7 +327,23 @@ export const isRepeatWord = (text: string): boolean => {
|
|
|
const dsRegEx: string = "d\\s?\\.s\\.";
|
|
|
const dcRegEx: string = "d\\.\\s?c\\.";
|
|
|
|
|
|
- return innerText === "@" || StringUtil.StringContainsSeparatedWord(innerText, dsRegEx + " al fine", true) || StringUtil.StringContainsSeparatedWord(innerText, dsRegEx + " al coda", true) || StringUtil.StringContainsSeparatedWord(innerText, dcRegEx + " al fine", true) || StringUtil.StringContainsSeparatedWord(innerText, dcRegEx + " al coda", true) || StringUtil.StringContainsSeparatedWord(innerText, dcRegEx) || StringUtil.StringContainsSeparatedWord(innerText, "da\\s?capo", true) || StringUtil.StringContainsSeparatedWord(innerText, dsRegEx, true) || StringUtil.StringContainsSeparatedWord(innerText, "dal\\s?segno", true) || StringUtil.StringContainsSeparatedWord(innerText, "al\\s?coda", true) || StringUtil.StringContainsSeparatedWord(innerText, "to\\s?coda", true) || StringUtil.StringContainsSeparatedWord(innerText, "a (la )?coda", true) || StringUtil.StringContainsSeparatedWord(innerText, "fine", true) || StringUtil.StringContainsSeparatedWord(innerText, "coda", true) || StringUtil.StringContainsSeparatedWord(innerText, "segno", true);
|
|
|
+ return (
|
|
|
+ innerText === "@" ||
|
|
|
+ StringUtil.StringContainsSeparatedWord(innerText, dsRegEx + " al fine", true) ||
|
|
|
+ StringUtil.StringContainsSeparatedWord(innerText, dsRegEx + " al coda", true) ||
|
|
|
+ StringUtil.StringContainsSeparatedWord(innerText, dcRegEx + " al fine", true) ||
|
|
|
+ StringUtil.StringContainsSeparatedWord(innerText, dcRegEx + " al coda", true) ||
|
|
|
+ StringUtil.StringContainsSeparatedWord(innerText, dcRegEx) ||
|
|
|
+ StringUtil.StringContainsSeparatedWord(innerText, "da\\s?capo", true) ||
|
|
|
+ StringUtil.StringContainsSeparatedWord(innerText, dsRegEx, true) ||
|
|
|
+ StringUtil.StringContainsSeparatedWord(innerText, "dal\\s?segno", true) ||
|
|
|
+ StringUtil.StringContainsSeparatedWord(innerText, "al\\s?coda", true) ||
|
|
|
+ StringUtil.StringContainsSeparatedWord(innerText, "to\\s?coda", true) ||
|
|
|
+ StringUtil.StringContainsSeparatedWord(innerText, "a (la )?coda", true) ||
|
|
|
+ StringUtil.StringContainsSeparatedWord(innerText, "fine", true) ||
|
|
|
+ StringUtil.StringContainsSeparatedWord(innerText, "coda", true) ||
|
|
|
+ StringUtil.StringContainsSeparatedWord(innerText, "segno", true)
|
|
|
+ );
|
|
|
}
|
|
|
return false;
|
|
|
};
|
|
@@ -646,8 +668,8 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
|
|
|
let gradualSpeed;
|
|
|
let gradualChange: GradualChange | undefined;
|
|
|
let gradualChangeIndex = 0;
|
|
|
- let totalMultipleRestMeasures = 0
|
|
|
- let multipleRestMeasures = 0
|
|
|
+ let totalMultipleRestMeasures = 0;
|
|
|
+ let multipleRestMeasures = 0;
|
|
|
const _notes = [] as any[];
|
|
|
|
|
|
if (state.gradualTimes) {
|
|
@@ -716,11 +738,10 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
|
|
|
currentTimes.push(iterator.currentTimeStamp.realValue - currentTimeStamp);
|
|
|
currentTimeStamp = iterator.currentTimeStamp.realValue;
|
|
|
for (const v of voiceEntries) {
|
|
|
-
|
|
|
let note = v.notes[0];
|
|
|
- if (note.IsGraceNote){
|
|
|
+ if (note.IsGraceNote) {
|
|
|
// 如果是装饰音, 取不是装饰音的时值
|
|
|
- const voice = note.parentStaffEntry.voiceEntries.find((_v: any) => !_v.isGrace)
|
|
|
+ const voice = note.parentStaffEntry.voiceEntries.find((_v: any) => !_v.isGrace);
|
|
|
note = voice.notes[0];
|
|
|
}
|
|
|
note.fixedKey = note.ParentVoiceEntry.ParentVoice.Parent.SubInstruments[0].fixedKey || 0;
|
|
@@ -774,7 +795,10 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
|
|
|
// console.log([...activeVerticalMeasureList])
|
|
|
const { realValue } = iterator.currentTimeStamp;
|
|
|
// console.log({...iterator}, i)
|
|
|
- const { RealValue: vRealValue, Denominator: vDenominator } = formatDuration(iterator.currentMeasure.activeTimeSignature, iterator.currentMeasure.duration);
|
|
|
+ const { RealValue: vRealValue, Denominator: vDenominator } = formatDuration(
|
|
|
+ iterator.currentMeasure.activeTimeSignature,
|
|
|
+ iterator.currentMeasure.duration
|
|
|
+ );
|
|
|
let { wholeValue, numerator, denominator, realValue: NoteRealValue } = note.length;
|
|
|
// 管乐迷
|
|
|
// if (i === 0 && ["2670"].includes(detailId)) {
|
|
@@ -803,7 +827,7 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
|
|
|
// 如果有节拍器,需要将节拍器的时间算出来
|
|
|
if (i === 0) {
|
|
|
fixtime += getFixTime(beatSpeed);
|
|
|
- console.log("🚀 ~ fixtime:", fixtime, beatSpeed)
|
|
|
+ console.log("🚀 ~ fixtime:", fixtime, beatSpeed);
|
|
|
}
|
|
|
// console.log(getTimeByBeatUnit(beatUnit, measureSpeed, iterator.currentMeasure.activeTimeSignature.Denominator))
|
|
|
let gradualLength = 0;
|
|
@@ -819,7 +843,11 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
|
|
|
if (state.gradualTimes && Object.keys(state.gradualTimes).length > 0) {
|
|
|
const withInRangeNote = state.gradual.find((item, index) => {
|
|
|
const nextItem: any = state.gradual[index + 1];
|
|
|
- return item[0].measureIndex <= measureListIndex && item[1]?.measureIndex! >= measureListIndex && (!nextItem || nextItem?.[0].measureIndex !== measureListIndex);
|
|
|
+ return (
|
|
|
+ item[0].measureIndex <= measureListIndex &&
|
|
|
+ item[1]?.measureIndex! >= measureListIndex &&
|
|
|
+ (!nextItem || nextItem?.[0].measureIndex !== measureListIndex)
|
|
|
+ );
|
|
|
});
|
|
|
if (!withInRangeNote) {
|
|
|
useGradualTime = 0;
|
|
@@ -845,7 +873,7 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- } else if (state.appName === 'GYM' && gradualChange && gradualSpeed && (gradualChange.startXmlNoteIndex === si || gradualChangeIndex > 0)) {
|
|
|
+ } 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;
|
|
@@ -863,7 +891,8 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
|
|
|
} else if (resetXmlNoteIndex > gradualChangeIndex) {
|
|
|
speed = allNotes[i - 1]?.speed;
|
|
|
}
|
|
|
- beatSpeed = (state.isSpecialBookCategory ? getTimeByBeatUnit(beatUnit, speed, iterator.currentMeasure.activeTimeSignature.Denominator) : baseSpeed) || 1;
|
|
|
+ beatSpeed =
|
|
|
+ (state.isSpecialBookCategory ? getTimeByBeatUnit(beatUnit, speed, iterator.currentMeasure.activeTimeSignature.Denominator) : baseSpeed) || 1;
|
|
|
const isEnd = !(gradualChangeIndex < noteDiff) && !(resetXmlNoteIndex > gradualChangeIndex);
|
|
|
gradualChangeIndex++;
|
|
|
if (isEnd) {
|
|
@@ -873,7 +902,7 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
|
|
|
stepSpeeds = [];
|
|
|
}
|
|
|
}
|
|
|
- const _noteLength = NoteRealValue
|
|
|
+ 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})
|
|
@@ -890,34 +919,45 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
|
|
|
// console.log(iterator.currentMeasure)
|
|
|
// 如果是弱起就补齐缺省的时长
|
|
|
if (i === 0) {
|
|
|
- const diff = getMeasureDurationDiff(iterator.currentMeasure);
|
|
|
- if (diff > 0) {
|
|
|
- difftime = diff * formatBeatUnit(beatUnit) * (60 / beatSpeed);
|
|
|
+ let _firstMeasureRealValue = 0;
|
|
|
+ const staffEntries = note.sourceMeasure.verticalMeasureList?.[0]?.staffEntries || [];
|
|
|
+ //计算第一个小节里面的音符时值是否等于整个小节的时值
|
|
|
+ staffEntries.forEach((_a: any) => {
|
|
|
+ if (_a?.sourceStaffEntry?.voiceEntries?.[0]?.notes?.[0]?.length?.realValue) {
|
|
|
+ _firstMeasureRealValue += _a.sourceStaffEntry.voiceEntries[0].notes[0].length.realValue;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ if (_firstMeasureRealValue < vRealValue) {
|
|
|
+ // console.log(_firstMeasureRealValue, vRealValue)
|
|
|
+ // 如果是弱起,将整个小节的时值减去音符的时值,就是缺省的时值
|
|
|
+ difftime = measureLength - noteLength;
|
|
|
+ }
|
|
|
+ if (difftime > 0) {
|
|
|
fixtime += difftime;
|
|
|
}
|
|
|
- // diff获取不准确时, 弱起补齐
|
|
|
+ // 管乐迷 diff获取不准确时, 弱起补齐
|
|
|
if (["2589", "2561", "2560", "2559", "2558", "2556", "2555", "2554"].includes(detailId)) {
|
|
|
- difftime = iterator.currentTimeStamp.realValue * formatBeatUnit(beatUnit) * (60 / beatSpeed);
|
|
|
- fixtime += difftime;
|
|
|
+ // difftime = iterator.currentTimeStamp.realValue * formatBeatUnit(beatUnit) * (60 / beatSpeed);
|
|
|
+ // fixtime += difftime;
|
|
|
}
|
|
|
}
|
|
|
- let stave = activeVerticalMeasureList[0]?.stave
|
|
|
+ let stave = activeVerticalMeasureList[0]?.stave;
|
|
|
if (!stave && note.isRestFlag && allNotes.length) {
|
|
|
// 全休止符, 公用stave
|
|
|
// stave = allNotes[allNotes.length - 1].stave
|
|
|
}
|
|
|
-
|
|
|
- if(note.sourceMeasure.multipleRestMeasures) {
|
|
|
- totalMultipleRestMeasures = note.sourceMeasure.multipleRestMeasures
|
|
|
- multipleRestMeasures = 0
|
|
|
+
|
|
|
+ if (note.sourceMeasure.multipleRestMeasures) {
|
|
|
+ totalMultipleRestMeasures = note.sourceMeasure.multipleRestMeasures;
|
|
|
+ multipleRestMeasures = 0;
|
|
|
}
|
|
|
if (multipleRestMeasures < totalMultipleRestMeasures) {
|
|
|
- multipleRestMeasures++
|
|
|
+ multipleRestMeasures++;
|
|
|
} else {
|
|
|
- multipleRestMeasures = 0
|
|
|
- totalMultipleRestMeasures = 0
|
|
|
+ multipleRestMeasures = 0;
|
|
|
+ totalMultipleRestMeasures = 0;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
// console.log(note.tie)
|
|
|
const nodeDetail = {
|
|
|
isStaccato: note.voiceEntry.isStaccato(),
|
|
@@ -989,7 +1029,7 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
|
|
|
try {
|
|
|
osmd.cursor.reset();
|
|
|
} catch (error) {}
|
|
|
- state.activeMeasureIndex = sortArray[0].MeasureNumberXML
|
|
|
+ state.activeMeasureIndex = sortArray[0].MeasureNumberXML;
|
|
|
return sortArray;
|
|
|
};
|
|
|
|