|
@@ -1093,4 +1093,207 @@ export const setCustomNoteRealValue = () => {
|
|
if (["12667", "12673"].includes(detailId)){
|
|
if (["12667", "12673"].includes(detailId)){
|
|
customData.customNoteCurrentTime = true
|
|
customData.customNoteCurrentTime = true
|
|
}
|
|
}
|
|
-};
|
|
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+/** 转换简谱的全休止符和二分休止符 */
|
|
|
|
+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) {
|
|
|
|
+ // 是否需要考虑带上附点
|
|
|
|
+ let needAddDot = true;
|
|
|
|
+ const noteType = note.getElementsByTagName("type")?.[0]?.textContent || '';
|
|
|
|
+ if ((noteType === 'whole' || noteType === 'half') && note.getElementsByTagName("rest").length) {
|
|
|
|
+ // 4/4拍,3/4拍
|
|
|
|
+ if (preBeatType === 4) {
|
|
|
|
+ let maxNumber = noteType === 'half' ? 2 : preBeats / multipleXs;
|
|
|
|
+ if (noteType === 'whole') {
|
|
|
|
+ // 有可能是全休止符,但是该小节又不是整小节都休止,此时这个全休止符不能按照整小节休止来计算
|
|
|
|
+ const noteDivisions = parseInt(note.getElementsByTagName("duration")[0]?.textContent);
|
|
|
|
+ if (noteDivisions/divisions !== preBeats) {
|
|
|
|
+ maxNumber = 4;
|
|
|
|
+ } else {
|
|
|
|
+ // 满足了时值,则不需要考虑加上附点
|
|
|
|
+ needAddDot = false;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ // 如果音符带附点,需要判断处理下
|
|
|
|
+ if (note.getElementsByTagName("dot").length && needAddDot) {
|
|
|
|
+ maxNumber = noteType === 'whole' ? maxNumber + 2 : maxNumber + 1;
|
|
|
|
+ }
|
|
|
|
+ if (!Number.isInteger(maxNumber)) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ // console.log('几个1/4音符',maxNumber)
|
|
|
|
+ let quarterNoteNumber = 1;
|
|
|
|
+ while (quarterNoteNumber <= maxNumber) {
|
|
|
|
+ const newnote = document.createElement('note');
|
|
|
|
+ newnote.innerHTML = `
|
|
|
|
+ <rest></rest>
|
|
|
|
+ <duration>${divisions}</duration>
|
|
|
|
+ <voice>1</voice>
|
|
|
|
+ <type>quarter</type>`
|
|
|
|
+ measure.insertBefore(newnote, note);
|
|
|
|
+ quarterNoteNumber += 1;
|
|
|
|
+ };
|
|
|
|
+ measure.removeChild(note);
|
|
|
|
+ } else if (preBeats === 3 && preBeatType === 8) {
|
|
|
|
+ const maxNumber = noteType === 'half' ? 2 : 3;
|
|
|
|
+ let quarterNoteNumber = 1;
|
|
|
|
+ while (quarterNoteNumber <= maxNumber) {
|
|
|
|
+ const newnote = document.createElement('note');
|
|
|
|
+ newnote.innerHTML = `
|
|
|
|
+ <rest></rest>
|
|
|
|
+ <duration>${divisions/2}</duration>
|
|
|
|
+ <voice>1</voice>
|
|
|
|
+ <type>eighth</type>`
|
|
|
|
+ measure.insertBefore(newnote, note);
|
|
|
|
+ quarterNoteNumber += 1;
|
|
|
|
+ };
|
|
|
|
+ measure.removeChild(note);
|
|
|
|
+ } else if (preBeats === 5 && preBeatType === 8) {
|
|
|
|
+ if (noteType === 'whole') {
|
|
|
|
+ const newnote = document.createElement('note');
|
|
|
|
+ newnote.innerHTML = `
|
|
|
|
+ <rest></rest>
|
|
|
|
+ <duration>${divisions+divisions/2}</duration>
|
|
|
|
+ <voice>1</voice>
|
|
|
|
+ <type>quarter</type>
|
|
|
|
+ <dot></dot>`
|
|
|
|
+ measure.insertBefore(newnote, note);
|
|
|
|
+ const newnote2 = document.createElement('note');
|
|
|
|
+ newnote2.innerHTML = `
|
|
|
|
+ <rest></rest>
|
|
|
|
+ <duration>${divisions}</duration>
|
|
|
|
+ <voice>1</voice>
|
|
|
|
+ <type>quarter</type>`
|
|
|
|
+ measure.insertBefore(newnote2, note);
|
|
|
|
+ measure.removeChild(note);
|
|
|
|
+ } else if (noteType === 'half') {
|
|
|
|
+ dealDotHalfNote(measure, divisions, note)
|
|
|
|
+ }
|
|
|
|
+ } else if (preBeats === 6 && preBeatType === 8) {
|
|
|
|
+ if (noteType === 'whole') {
|
|
|
|
+ const maxNumber = 2;
|
|
|
|
+ let quarterNoteNumber = 1;
|
|
|
|
+ while (quarterNoteNumber <= maxNumber) {
|
|
|
|
+ const newnote = document.createElement('note');
|
|
|
|
+ newnote.innerHTML = `
|
|
|
|
+ <rest></rest>
|
|
|
|
+ <duration>${divisions+divisions/2}</duration>
|
|
|
|
+ <voice>1</voice>
|
|
|
|
+ <type>quarter</type>
|
|
|
|
+ <dot></dot>`
|
|
|
|
+ measure.insertBefore(newnote, note);
|
|
|
|
+ quarterNoteNumber += 1;
|
|
|
|
+ };
|
|
|
|
+ measure.removeChild(note);
|
|
|
|
+ } else if (noteType === 'half') {
|
|
|
|
+ dealDotHalfNote(measure, divisions, note)
|
|
|
|
+ }
|
|
|
|
+ } else if (preBeats === 7 && preBeatType === 8) {
|
|
|
|
+ if (noteType === 'whole') {
|
|
|
|
+ const newnote2 = document.createElement('note');
|
|
|
|
+ newnote2.innerHTML = `
|
|
|
|
+ <rest></rest>
|
|
|
|
+ <duration>${divisions+divisions/2}</duration>
|
|
|
|
+ <voice>1</voice>
|
|
|
|
+ <type>quarter</type>
|
|
|
|
+ <dot></dot>`
|
|
|
|
+ measure.insertBefore(newnote2, note);
|
|
|
|
+ const maxNumber = 2;
|
|
|
|
+ let quarterNoteNumber = 1;
|
|
|
|
+ while (quarterNoteNumber <= maxNumber) {
|
|
|
|
+ const newnote = document.createElement('note');
|
|
|
|
+ newnote.innerHTML = `
|
|
|
|
+ <rest></rest>
|
|
|
|
+ <duration>${divisions}</duration>
|
|
|
|
+ <voice>1</voice>
|
|
|
|
+ <type>quarter</type>`
|
|
|
|
+ measure.insertBefore(newnote, note);
|
|
|
|
+ quarterNoteNumber += 1;
|
|
|
|
+ };
|
|
|
|
+ measure.removeChild(note);
|
|
|
|
+ } else if (noteType === 'half') {
|
|
|
|
+ dealDotHalfNote(measure, divisions, note)
|
|
|
|
+ }
|
|
|
|
+ } else if (preBeats === 9 && preBeatType === 8) {
|
|
|
|
+ if (noteType === 'whole') {
|
|
|
|
+ const maxNumber = 3;
|
|
|
|
+ let quarterNoteNumber = 1;
|
|
|
|
+ while (quarterNoteNumber <= maxNumber) {
|
|
|
|
+ const newnote = document.createElement('note');
|
|
|
|
+ newnote.innerHTML = `
|
|
|
|
+ <rest></rest>
|
|
|
|
+ <duration>${divisions+divisions/2}</duration>
|
|
|
|
+ <voice>1</voice>
|
|
|
|
+ <type>quarter</type>
|
|
|
|
+ <dot></dot>`
|
|
|
|
+ measure.insertBefore(newnote, note);
|
|
|
|
+ quarterNoteNumber += 1;
|
|
|
|
+ };
|
|
|
|
+ measure.removeChild(note);
|
|
|
|
+ } else if (noteType === 'half') {
|
|
|
|
+ dealDotHalfNote(measure, divisions, note)
|
|
|
|
+ }
|
|
|
|
+ } else if (preBeats === 12 && preBeatType === 8) {
|
|
|
|
+ if (noteType === 'whole') {
|
|
|
|
+ const maxNumber = 4;
|
|
|
|
+ let quarterNoteNumber = 1;
|
|
|
|
+ while (quarterNoteNumber <= maxNumber) {
|
|
|
|
+ const newnote = document.createElement('note');
|
|
|
|
+ newnote.innerHTML = `
|
|
|
|
+ <rest></rest>
|
|
|
|
+ <duration>${divisions+divisions/2}</duration>
|
|
|
|
+ <voice>1</voice>
|
|
|
|
+ <type>quarter</type>
|
|
|
|
+ <dot></dot>`
|
|
|
|
+ measure.insertBefore(newnote, note);
|
|
|
|
+ quarterNoteNumber += 1;
|
|
|
|
+ };
|
|
|
|
+ measure.removeChild(note);
|
|
|
|
+ } else if (noteType === 'half') {
|
|
|
|
+ dealDotHalfNote(measure, divisions, note)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/** 八几排的小节,二分休止符带附点 */
|
|
|
|
+const dealDotHalfNote = (measure: any, divisions: number, note: any) => {
|
|
|
|
+ // 如果音符带附点,需要判断处理下
|
|
|
|
+ if (note.getElementsByTagName("dot").length) {
|
|
|
|
+ const maxNumber = 2;
|
|
|
|
+ let quarterNoteNumber = 1;
|
|
|
|
+ while (quarterNoteNumber <= maxNumber) {
|
|
|
|
+ const newnote = document.createElement('note');
|
|
|
|
+ newnote.innerHTML = `
|
|
|
|
+ <rest></rest>
|
|
|
|
+ <duration>${divisions+divisions/2}</duration>
|
|
|
|
+ <voice>1</voice>
|
|
|
|
+ <type>quarter</type>
|
|
|
|
+ <dot></dot>`
|
|
|
|
+ measure.insertBefore(newnote, note);
|
|
|
|
+ quarterNoteNumber += 1;
|
|
|
|
+ };
|
|
|
|
+ measure.removeChild(note);
|
|
|
|
+ } else {
|
|
|
|
+ const newnote = document.createElement('note');
|
|
|
|
+ newnote.innerHTML = `
|
|
|
|
+ <rest></rest>
|
|
|
|
+ <duration>${divisions+divisions/2}</duration>
|
|
|
|
+ <voice>1</voice>
|
|
|
|
+ <type>quarter</type>
|
|
|
|
+ <dot></dot>`
|
|
|
|
+ measure.insertBefore(newnote, note);
|
|
|
|
+ const newnote2 = document.createElement('note');
|
|
|
|
+ newnote2.innerHTML = `
|
|
|
|
+ <rest></rest>
|
|
|
|
+ <duration>${divisions/2}</duration>
|
|
|
|
+ <voice>1</voice>
|
|
|
|
+ <type>eighth</type>`
|
|
|
|
+ measure.insertBefore(newnote2, note);
|
|
|
|
+ measure.removeChild(note);
|
|
|
|
+ }
|
|
|
|
+}
|