|
@@ -2,7 +2,6 @@ import { Toast } from "vant";
|
|
|
import { reactive, watchEffect } from "vue";
|
|
|
import { OpenSheetMusicDisplay } from "../osmd-extended/src";
|
|
|
import { GradualNote, GradualTimes, GradualVersion, IMode } from "./type";
|
|
|
-import { audioList } from "./view/audio-list";
|
|
|
|
|
|
const state = reactive({
|
|
|
|
|
@@ -53,13 +52,17 @@ const state = reactive({
|
|
|
playState: "paused" as "play" | "paused",
|
|
|
|
|
|
playSource: "music" as "music" | "background",
|
|
|
-
|
|
|
- audioData: {
|
|
|
-
|
|
|
- progress: 0
|
|
|
+
|
|
|
+ playProgress: 0,
|
|
|
+
|
|
|
+ activeNoteIndex: 0,
|
|
|
+
|
|
|
+ activeMeasureIndex: 0,
|
|
|
+
|
|
|
+ songEl: null as unknown as HTMLAudioElement,
|
|
|
+
|
|
|
+ backgroundEl: null as unknown as HTMLAudioElement,
|
|
|
|
|
|
- },
|
|
|
-
|
|
|
repeatedBeats: 0,
|
|
|
|
|
|
sectionStatus: false,
|
|
@@ -108,17 +111,125 @@ const state = reactive({
|
|
|
|
|
|
export const onLoadedmetadata = (evt: Event) => {
|
|
|
|
|
|
-}
|
|
|
-
|
|
|
-export const onTimeupdate = (evt: Event) => {
|
|
|
- console.log(evt.timeStamp)
|
|
|
};
|
|
|
+
|
|
|
+const setStep = () => {
|
|
|
+ let startTime = Date.now();
|
|
|
+ requestAnimationFrame(() => {
|
|
|
+ const endTime = Date.now();
|
|
|
+
|
|
|
+ if (endTime - startTime < 16.6) {
|
|
|
+ if (state.playState !== "play") {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (state.songEl) {
|
|
|
+ state.playProgress = (state.songEl.currentTime / state.songEl.duration) * 100;
|
|
|
+
|
|
|
+ const item = getNote(state.songEl.currentTime);
|
|
|
+ if (item) gotoNext(item);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ setStep();
|
|
|
+ });
|
|
|
+};
|
|
|
+
|
|
|
+export const onPlay = () => {
|
|
|
+ setStep();
|
|
|
+};
|
|
|
+
|
|
|
+export const onTimeupdate = (evt: Event) => {};
|
|
|
|
|
|
-export const onEnded = (evt: Event) => {};
|
|
|
+export const onEnded = () => {
|
|
|
+ state.playState = "paused";
|
|
|
+};
|
|
|
|
|
|
+
|
|
|
export const togglePlay = () => {
|
|
|
state.playState = state.playState === "paused" ? "play" : "paused";
|
|
|
- audioList.audioPlay(state.playState);
|
|
|
+ if (state.playState == "play") {
|
|
|
+ state.songEl?.play();
|
|
|
+ state.backgroundEl?.play();
|
|
|
+ } else {
|
|
|
+ state.songEl?.pause();
|
|
|
+ state.backgroundEl?.pause();
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+const handleStopPlay = () => {
|
|
|
+ state.playState = "paused";
|
|
|
+ state.songEl?.pause();
|
|
|
+ state.backgroundEl?.pause();
|
|
|
+ skipNotePlay(0)
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+export const gotoCustomNote = (index: number) => {
|
|
|
+ try {
|
|
|
+ state.osmd.cursor.reset();
|
|
|
+ } catch (error) {}
|
|
|
+ for (let i = 0; i < index; i++) {
|
|
|
+ state.osmd.cursor.next();
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+export const gotoNext = (note: any) => {
|
|
|
+ if (note) {
|
|
|
+ const num = note.i;
|
|
|
+
|
|
|
+ if (state.activeNoteIndex === note.i) return;
|
|
|
+ const osmd = state.osmd;
|
|
|
+ let prev = state.activeNoteIndex;
|
|
|
+ state.activeNoteIndex = num;
|
|
|
+ state.activeMeasureIndex = note.MeasureNumberXML;
|
|
|
+ if (prev && num - prev === 1) {
|
|
|
+ osmd.cursor.next();
|
|
|
+ } else if (prev && num - prev > 0) {
|
|
|
+ while (num - prev > 0) {
|
|
|
+ prev++;
|
|
|
+ osmd.cursor.next();
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ gotoCustomNote(num);
|
|
|
+ }
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+export const getNote = (currentTime: number) => {
|
|
|
+ const times = state.times;
|
|
|
+ const len = state.times.length;
|
|
|
+
|
|
|
+ if (currentTime >= times[len - 1]) {
|
|
|
+ handleStopPlay();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ let _item = null as any;
|
|
|
+ for (let i = state.activeNoteIndex; i < len; i++) {
|
|
|
+ const item = times[i];
|
|
|
+ const prevItem = times[i - 1];
|
|
|
+ if (currentTime >= item.time) {
|
|
|
+ if (!prevItem || item.time != prevItem.time) {
|
|
|
+ _item = item;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return _item;
|
|
|
+};
|
|
|
+
|
|
|
+export const skipNotePlay = (itemIndex: number) => {
|
|
|
+ const item = state.times[itemIndex];
|
|
|
+ console.log("🚀 ~ item:", itemIndex);
|
|
|
+ if (state.songEl) {
|
|
|
+ state.songEl.currentTime = item.time;
|
|
|
+ }
|
|
|
+ if (state.backgroundEl) {
|
|
|
+ state.backgroundEl.currentTime = item.time;
|
|
|
+ }
|
|
|
+ state.activeNoteIndex = item.i;
|
|
|
+ state.activeMeasureIndex = item.MeasureNumberXML;
|
|
|
+ gotoCustomNote(item.i);
|
|
|
};
|
|
|
|
|
|
export default state;
|