|
@@ -614,6 +614,7 @@ export const formatZoom = (num = 1) => {
|
|
* 1.全休止符的小节,没有音符默认加个全休止符
|
|
* 1.全休止符的小节,没有音符默认加个全休止符
|
|
*/
|
|
*/
|
|
export const formatXML = (xml: string): string => {
|
|
export const formatXML = (xml: string): string => {
|
|
|
|
+ console.log(11111)
|
|
if (!xml) return "";
|
|
if (!xml) return "";
|
|
const xmlParse = new DOMParser().parseFromString(xml, "text/xml");
|
|
const xmlParse = new DOMParser().parseFromString(xml, "text/xml");
|
|
const measures = Array.from(xmlParse.getElementsByTagName("measure"));
|
|
const measures = Array.from(xmlParse.getElementsByTagName("measure"));
|
|
@@ -621,6 +622,8 @@ export const formatXML = (xml: string): string => {
|
|
compatibleXmlPitchVoice(xmlParse);
|
|
compatibleXmlPitchVoice(xmlParse);
|
|
// 处理重复小节信息
|
|
// 处理重复小节信息
|
|
parseXmlToRepeat(repeats)
|
|
parseXmlToRepeat(repeats)
|
|
|
|
+ // 解析处理evxml
|
|
|
|
+ analyzeEvxml(xmlParse);
|
|
// const words: any = xmlParse.getElementsByTagName("words");
|
|
// const words: any = xmlParse.getElementsByTagName("words");
|
|
// for (const word of words) {
|
|
// for (const word of words) {
|
|
// if (word && word.textContent?.trim() === "筒音作5") {
|
|
// if (word && word.textContent?.trim() === "筒音作5") {
|
|
@@ -644,6 +647,15 @@ export const formatXML = (xml: string): string => {
|
|
speed = Number(measure.getElementsByTagName('per-minute')[0]?.textContent)
|
|
speed = Number(measure.getElementsByTagName('per-minute')[0]?.textContent)
|
|
}
|
|
}
|
|
const divisions = parseInt(measure.getElementsByTagName("divisions")[0]?.textContent || "256");
|
|
const divisions = parseInt(measure.getElementsByTagName("divisions")[0]?.textContent || "256");
|
|
|
|
+ // 如果note节点里面有space节点,并且没有duration节点,代表这是一个空白节点,需要删除
|
|
|
|
+ if (measure.getElementsByTagName("note").length) {
|
|
|
|
+ const noteList = Array.from(measure.getElementsByTagName("note")) || [];
|
|
|
|
+ noteList.forEach((note: any) => {
|
|
|
|
+ if (note.getElementsByTagName("space").length && !note.getElementsByTagName("duration").length) {
|
|
|
|
+ measure.removeChild(note);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ }
|
|
if (measure.getElementsByTagName("note").length === 0) {
|
|
if (measure.getElementsByTagName("note").length === 0) {
|
|
const forwardTimeElement = measure.getElementsByTagName("forward")[0]?.getElementsByTagName("duration")[0];
|
|
const forwardTimeElement = measure.getElementsByTagName("forward")[0]?.getElementsByTagName("duration")[0];
|
|
if (forwardTimeElement) {
|
|
if (forwardTimeElement) {
|
|
@@ -1037,6 +1049,13 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
|
|
// difftime = iterator.currentTimeStamp.realValue * formatBeatUnit(beatUnit) * (60 / beatSpeed);
|
|
// difftime = iterator.currentTimeStamp.realValue * formatBeatUnit(beatUnit) * (60 / beatSpeed);
|
|
// fixtime += difftime;
|
|
// fixtime += difftime;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ // 如果是evxml,fixtime取读取xml的值
|
|
|
|
+ if (state.isEvxml) {
|
|
|
|
+ fixtime = state.evXmlBeginTime ? state.evXmlBeginTime : fixtime
|
|
|
|
+ state.fixtime = fixtime
|
|
|
|
+ }
|
|
|
|
+ console.log('节拍器时间',fixtime,state.evXmlBeginTime)
|
|
}
|
|
}
|
|
let stave = activeVerticalMeasureList[0]?.stave;
|
|
let stave = activeVerticalMeasureList[0]?.stave;
|
|
|
|
|
|
@@ -1218,6 +1237,15 @@ export const verifyCanRepeat = (startNum: number, endNum: number) => {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+// 计算evxml的起始播放时间
|
|
|
|
+const analyzeEvxml = (xmlParse: any) => {
|
|
|
|
+ // xml拍号数
|
|
|
|
+ const xmlNum = xmlParse.getElementsByTagName("timegap")[0]?.getElementsByTagName("values")[0]?.getElementsByTagName("item")[0]?.getAttribute('num');
|
|
|
|
+ // 第一个音符的起始时间
|
|
|
|
+ const firstNoteBeginTime = xmlParse.getElementsByTagName("times")[0]?.getElementsByTagName("time")[0]?.getAttribute('begin');
|
|
|
|
+ state.evXmlBeginTime = firstNoteBeginTime ? firstNoteBeginTime / 1000 : xmlNum ? 60 / state.originSpeed * xmlNum : 0;
|
|
|
|
+}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* 兼容处理xml声部移调
|
|
* 兼容处理xml声部移调
|
|
* 打谱软件可能会自动处理移调,这类型的xml就不用通过程序移调了
|
|
* 打谱软件可能会自动处理移调,这类型的xml就不用通过程序移调了
|