|
@@ -715,7 +715,8 @@ export const formatXML = (xml: string, xmlUrl?: string): string => {
|
|
|
let beats = -1;
|
|
|
let beatType = -1;
|
|
|
// 前面小节的拍子
|
|
|
- let preBeats = -1;
|
|
|
+ let preBeats: number = 4;
|
|
|
+ let preBeatType: number = 4;
|
|
|
// 小节中如果没有节点默认为休止符
|
|
|
for (const measure of measures) {
|
|
|
if (beats === -1 && measure.getElementsByTagName("beats").length) {
|
|
@@ -727,6 +728,11 @@ export const formatXML = (xml: string, xmlUrl?: string): string => {
|
|
|
if (speed === -1 && measure.getElementsByTagName('per-minute').length) {
|
|
|
speed = Number(measure.getElementsByTagName('per-minute')[0]?.textContent)
|
|
|
}
|
|
|
+ // 当前小节的拍数
|
|
|
+ const currentBeats = measure.getElementsByTagName("beats").length ? measure.getElementsByTagName("beats")[0]?.textContent : preBeats;
|
|
|
+ const currentBeatType = measure.getElementsByTagName("beat-type").length ? measure.getElementsByTagName("beat-type")[0]?.textContent : preBeatType;
|
|
|
+ preBeats = Number(currentBeats);
|
|
|
+ preBeatType = Number(currentBeatType);
|
|
|
const divisions = parseInt(measure.getElementsByTagName("divisions")[0]?.textContent || "256");
|
|
|
// 如果note节点里面有space节点,并且没有duration节点,代表这是一个空白节点,需要删除
|
|
|
if (measure.getElementsByTagName("note").length && state.isEvxml) {
|
|
@@ -775,19 +781,24 @@ export const formatXML = (xml: string, xmlUrl?: string): string => {
|
|
|
</note>`;
|
|
|
}
|
|
|
// if (state.musicRenderType !== 'staff') {
|
|
|
- // transferJianNote(measure, divisions, beats)
|
|
|
+ // transferJianNote(measure, divisions, preBeats, preBeatType)
|
|
|
// }
|
|
|
}
|
|
|
return new XMLSerializer().serializeToString(xmlParse);
|
|
|
};
|
|
|
|
|
|
/** 转换简谱的全休止符和二分休止符 */
|
|
|
-export const transferJianNote = (measure: any, divisions: number, beats: number) => {
|
|
|
+export const transferJianNote = (measure: any, divisions: number, preBeats: number, preBeatType: number) => {
|
|
|
+ const multipleXs = preBeatType / 4;
|
|
|
const notes = measure.getElementsByTagName("note")
|
|
|
for (const note of notes) {
|
|
|
const noteType = note.getElementsByTagName("type")?.[0]?.textContent || '';
|
|
|
if (noteType === 'whole' || noteType === 'half') {
|
|
|
- const maxNumber = noteType === 'half' ? 2 : beats
|
|
|
+ const maxNumber = noteType === 'half' ? 2 : preBeats / multipleXs;
|
|
|
+ if (!Number.isInteger(maxNumber)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // console.log('几个1/4音符',maxNumber)
|
|
|
let quarterNoteNumber = 1;
|
|
|
while (quarterNoteNumber <= maxNumber) {
|
|
|
const newnote = document.createElement('note');
|