|
@@ -223,7 +223,7 @@ export default defineComponent({
|
|
|
abcElem,
|
|
|
data.music.substring(data.active.startChar, data.active.endChar)
|
|
|
);
|
|
|
- if (data.active?.el_type === "note") {
|
|
|
+ if (data.active?.el_type === "note" && !popup.selectMearesShow) {
|
|
|
const totalTime = (abcData.synthControl as any).visualObj.getTotalTime();
|
|
|
if (totalTime) {
|
|
|
const progress = (data.active as any).currentTrackMilliseconds / 1000 / totalTime;
|
|
@@ -265,7 +265,7 @@ export default defineComponent({
|
|
|
synthControl: null as unknown as SynthObjectController,
|
|
|
synthOptions: {
|
|
|
program: 0,
|
|
|
- // soundFontUrl: "/soundFonts/",
|
|
|
+ // soundFontUrl: "https://oss.dayaedu.com/musicSheet/",
|
|
|
// soundFontUrl: "https://paulrosen.github.io/midi-js-soundfonts/FluidR3_GM/", // 默认 FluidR3_GM
|
|
|
// soundFontUrl: "https://paulrosen.github.io/midi-js-soundfonts/MusyngKite/", // Musyng Kite
|
|
|
},
|
|
@@ -319,7 +319,21 @@ export default defineComponent({
|
|
|
},
|
|
|
onBeat: function (beatNumber: any, totalBeats: any, totalTime: any) {
|
|
|
if (!data.playState) return;
|
|
|
- // console.log("🚀 ~ beatNumber:", (beatNumber / totalBeats) * totalTime);
|
|
|
+ if (popup.selectMearesShow && data.selectMeasures.startNote && data.selectMeasures.endNote) {
|
|
|
+ const end =
|
|
|
+ totalBeats *
|
|
|
+ (data.selectMeasures.endNote.milliseconds /
|
|
|
+ (abcData.visualObj.getTotalTime() * 1000)) - 0.1;
|
|
|
+ // console.log(beatNumber, start, end, progress);
|
|
|
+ if (beatNumber >= end) {
|
|
|
+ const progress =
|
|
|
+ data.selectMeasures.startNote.milliseconds /
|
|
|
+ (abcData.visualObj.getTotalTime() * 1000);
|
|
|
+ (abcData.synthControl as any).seek(progress);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // console.log("🚀 ~ beatNumber:", beatNumber, totalBeats, totalTime);
|
|
|
const time = (beatNumber / totalBeats) * totalTime;
|
|
|
metronomeData.metro.sound(time);
|
|
|
},
|
|
@@ -328,26 +342,6 @@ export default defineComponent({
|
|
|
if (!data.playState) return;
|
|
|
if (ev.measureStart && ev.left === null) return; // this was the second part of a tie across a measure line. Just ignore it.
|
|
|
|
|
|
- if (popup.selectMearesShow && data.selectMeasures.startNote && data.selectMeasures.endNote) {
|
|
|
- const startTime = data.selectMeasures.startNote?.currentTrackMilliseconds || 0;
|
|
|
- // const timeNote = data.times.find(
|
|
|
- // (n) => n.startChar === data.selectMeasures.startNote.startChar
|
|
|
- // );
|
|
|
- const endNote: any = data.selectMeasures.endNote ? data.selectMeasures.endNote : null;
|
|
|
- if (
|
|
|
- ev.milliseconds < startTime ||
|
|
|
- (endNote && ev.milliseconds > endNote.currentTrackMilliseconds)
|
|
|
- ) {
|
|
|
- const totalTime = (abcData.synthControl as any).visualObj.getTotalTime();
|
|
|
- if (totalTime) {
|
|
|
- const progress = startTime / 1000 / totalTime;
|
|
|
- nextTick(() => {
|
|
|
- (abcData.synthControl as any).seek(progress);
|
|
|
- });
|
|
|
- return;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
data.activePlayNote = { ...ev };
|
|
|
var cursor = document.querySelector("#paper svg .ABCJS-cursor");
|
|
|
if (cursor) {
|
|
@@ -404,7 +398,7 @@ export default defineComponent({
|
|
|
});
|
|
|
};
|
|
|
|
|
|
- const togglePlay = (type: "play" | "pause" | "reset") => {
|
|
|
+ const togglePlay = async (type: "play" | "pause" | "reset") => {
|
|
|
if (type === "play") {
|
|
|
if (popup.selectMearesShow) {
|
|
|
if (
|
|
@@ -423,6 +417,19 @@ export default defineComponent({
|
|
|
});
|
|
|
return;
|
|
|
}
|
|
|
+ if (!(abcData.synthControl as any).isLoaded) {
|
|
|
+ (abcData.synthControl as any).runWhenReady(() => {
|
|
|
+ const progress =
|
|
|
+ data.selectMeasures.startNote.milliseconds /
|
|
|
+ (abcData.visualObj.getTotalTime() * 1000);
|
|
|
+ (abcData.synthControl as any).seek(progress);
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ const progress =
|
|
|
+ data.selectMeasures.startNote.milliseconds /
|
|
|
+ (abcData.visualObj.getTotalTime() * 1000);
|
|
|
+ (abcData.synthControl as any).seek(progress);
|
|
|
+ }
|
|
|
}
|
|
|
abcData.synthControl.play();
|
|
|
data.playState = true;
|
|
@@ -503,7 +510,7 @@ export default defineComponent({
|
|
|
saveTimer && clearTimeout(saveTimer);
|
|
|
saveTimer = setTimeout(() => {
|
|
|
handleSaveMusic(false);
|
|
|
- }, 5000);
|
|
|
+ }, 15000);
|
|
|
};
|
|
|
|
|
|
/**
|
|
@@ -1299,7 +1306,7 @@ export default defineComponent({
|
|
|
try {
|
|
|
delete qs_data.config;
|
|
|
} catch (error) {
|
|
|
- console.log("🚀 ~ error:", error)
|
|
|
+ console.log("🚀 ~ error:", error);
|
|
|
}
|
|
|
location.hash = hash[0] + "?" + qs.stringify(qs_data);
|
|
|
}
|
|
@@ -1556,8 +1563,9 @@ export default defineComponent({
|
|
|
const handleSetSelectMeares = (index: number | null, type: "start" | "end") => {
|
|
|
console.log("🚀 ~ index:", index);
|
|
|
if (type === "start") {
|
|
|
- const note = index ? useIndexGetNote(`${index - 1}.0`) : null;
|
|
|
- // console.log("🚀 ~ note:", note);
|
|
|
+ let note = index ? useIndexGetNote(`${index - 1}.0`) : null;
|
|
|
+ note = data.times.find((_note: any) => _note.startChar === note.startChar);
|
|
|
+ // console.log("🚀 ~ note:", note, data.times);
|
|
|
data.selectMeasures.start = index ? index - 1 : 0;
|
|
|
data.selectMeasures.startNote = note;
|
|
|
if (
|
|
@@ -1569,9 +1577,10 @@ export default defineComponent({
|
|
|
data.selectMeasures.endNote = null;
|
|
|
}
|
|
|
} else {
|
|
|
- const note = index
|
|
|
- ? useIndexGetNote(`${index - 1}.${abcData.abc.measures[index - 1]?.notes.length - 1}`)
|
|
|
+ let note = index
|
|
|
+ ? useIndexGetNote(`${index}.0`)
|
|
|
: null;
|
|
|
+ note = data.times.find((_note: any) => _note.startChar === note.startChar);
|
|
|
// console.log("🚀 ~ note:", note);
|
|
|
data.selectMeasures.end = index ? index - 1 : 0;
|
|
|
data.selectMeasures.endNote = note;
|
|
@@ -1807,6 +1816,7 @@ export default defineComponent({
|
|
|
popup.selectSubjectShow = false;
|
|
|
abcData.abc.subjectCode =
|
|
|
ABCJS.synth.instrumentIndexToName[abcData.synthOptions.program];
|
|
|
+ autoSave();
|
|
|
}}
|
|
|
></NSelect>
|
|
|
</>
|
|
@@ -2171,9 +2181,10 @@ export default defineComponent({
|
|
|
</NSpin>
|
|
|
<div>{data.playState ? "暂停" : "播放"}</div>
|
|
|
</div>
|
|
|
+ {/* styles.btnDisabled */}
|
|
|
<div
|
|
|
id="selectMearesBtn"
|
|
|
- class={[styles.topBtn, styles.btnDisabled]}
|
|
|
+ class={[styles.topBtn]}
|
|
|
onClick={() => (popup.selectMearesShow = !popup.selectMearesShow)}
|
|
|
>
|
|
|
<div class={[styles.btnImg, popup.selectMearesShow && styles.btnImgActive]}>
|