|
@@ -1,13 +1,21 @@
|
|
-import { computed, defineComponent, reactive } from "vue";
|
|
|
|
|
|
+import { computed, defineComponent, reactive, ref } from "vue";
|
|
import state, { onEnded, onLoadedmetadata, onPlay, onTimeupdate } from "../../state";
|
|
import state, { onEnded, onLoadedmetadata, onPlay, onTimeupdate } from "../../state";
|
|
import styles from "./index.module.less";
|
|
import styles from "./index.module.less";
|
|
|
|
+import { getMidiCurrentTime, getMidiDuration, handleTogglePlayMidi, hanldeInitMidiData, hanldeSetMidiPlaybackRate, setMidiCurrentTime } from "./midiPlayer";
|
|
|
|
|
|
const audioData = reactive({
|
|
const audioData = reactive({
|
|
songEle: null as unknown as HTMLAudioElement,
|
|
songEle: null as unknown as HTMLAudioElement,
|
|
backgroundEle: null as unknown as HTMLAudioElement,
|
|
backgroundEle: null as unknown as HTMLAudioElement,
|
|
|
|
+ midiRender: false,
|
|
});
|
|
});
|
|
|
|
+const midiRef = ref();
|
|
/** 播放或暂停 */
|
|
/** 播放或暂停 */
|
|
export const audioListStart = (type: "play" | "paused") => {
|
|
export const audioListStart = (type: "play" | "paused") => {
|
|
|
|
+ // 如果是midi播放
|
|
|
|
+ if (audioData.midiRender) {
|
|
|
|
+ handleTogglePlayMidi(type);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
if (type === "play") {
|
|
if (type === "play") {
|
|
audioData.songEle?.play();
|
|
audioData.songEle?.play();
|
|
audioData.backgroundEle?.play();
|
|
audioData.backgroundEle?.play();
|
|
@@ -18,21 +26,41 @@ export const audioListStart = (type: "play" | "paused") => {
|
|
};
|
|
};
|
|
/** 设置倍数播放 */
|
|
/** 设置倍数播放 */
|
|
export const setAudioPlaybackRate = (rate: number) => {
|
|
export const setAudioPlaybackRate = (rate: number) => {
|
|
|
|
+ // 如果是midi播放
|
|
|
|
+ if (audioData.midiRender) {
|
|
|
|
+ hanldeSetMidiPlaybackRate(rate);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
audioData.songEle && (audioData.songEle.playbackRate = rate);
|
|
audioData.songEle && (audioData.songEle.playbackRate = rate);
|
|
audioData.backgroundEle && (audioData.backgroundEle.playbackRate = rate);
|
|
audioData.backgroundEle && (audioData.backgroundEle.playbackRate = rate);
|
|
};
|
|
};
|
|
|
|
|
|
/** 获取当前播放的时间 */
|
|
/** 获取当前播放的时间 */
|
|
export const getAudioCurrentTime = () => {
|
|
export const getAudioCurrentTime = () => {
|
|
|
|
+ // 如果是midi播放
|
|
|
|
+ if (audioData.midiRender) {
|
|
|
|
+ const c = getMidiCurrentTime()
|
|
|
|
+ return c
|
|
|
|
+ }
|
|
return audioData.songEle?.currentTime || audioData.backgroundEle?.currentTime || 0;
|
|
return audioData.songEle?.currentTime || audioData.backgroundEle?.currentTime || 0;
|
|
};
|
|
};
|
|
/** 获取曲谱的总时间 */
|
|
/** 获取曲谱的总时间 */
|
|
export const getAudioDuration = () => {
|
|
export const getAudioDuration = () => {
|
|
|
|
+ // 如果是midi播放
|
|
|
|
+ if (audioData.midiRender) {
|
|
|
|
+ const d = getMidiDuration()
|
|
|
|
+ return d
|
|
|
|
+ }
|
|
return audioData.songEle?.duration || audioData.backgroundEle?.duration || 0;
|
|
return audioData.songEle?.duration || audioData.backgroundEle?.duration || 0;
|
|
};
|
|
};
|
|
|
|
|
|
/** 设置播放的开始时间 */
|
|
/** 设置播放的开始时间 */
|
|
-export const setAudioCurrentTime = (time: number) => {
|
|
|
|
|
|
+export const setAudioCurrentTime = (time: number, index = 0) => {
|
|
|
|
+ // 如果是midi播放
|
|
|
|
+ if (audioData.midiRender) {
|
|
|
|
+ setMidiCurrentTime(index)
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
audioData.songEle && (audioData.songEle.currentTime = time);
|
|
audioData.songEle && (audioData.songEle.currentTime = time);
|
|
audioData.backgroundEle && (audioData.backgroundEle.currentTime = time);
|
|
audioData.backgroundEle && (audioData.backgroundEle.currentTime = time);
|
|
};
|
|
};
|
|
@@ -45,41 +73,62 @@ export default defineComponent({
|
|
return state.playSource === "music";
|
|
return state.playSource === "music";
|
|
});
|
|
});
|
|
|
|
|
|
- // const music = new Howl({
|
|
|
|
- // src: tockAndTick.tick,
|
|
|
|
- // })
|
|
|
|
- // const accompany = new Howl({
|
|
|
|
- // src: tockAndTick.tock,
|
|
|
|
- // })
|
|
|
|
- // console.log(state.music, music);
|
|
|
|
|
|
+ /** iframe 加载完成后, 加载midiURL */
|
|
|
|
+ const handleLoad = () => {
|
|
|
|
+ midiRef.value.contentWindow.handleRendered = () => {
|
|
|
|
+ audioData.midiRender = true;
|
|
|
|
+ };
|
|
|
|
+ hanldeInitMidiData(midiRef.value);
|
|
|
|
+
|
|
|
|
+ // const result = {
|
|
|
|
+ // src: state.midiUrl,
|
|
|
|
+ // bpm: state.speed,
|
|
|
|
+ // };
|
|
|
|
+
|
|
|
|
+ // // midiRef.value.contentWindow.handleLoadFile(result, () => {
|
|
|
|
+ // // console.log("文件加载成功", state.speed);
|
|
|
|
+ // // midiRef.value.contentWindow.setMusicSpeed(state.speed || 100)
|
|
|
|
+ // // });
|
|
|
|
+ // midiRef.value.contentWindow.onPlay = () => {
|
|
|
|
+ // onPlay();
|
|
|
|
+ // };
|
|
|
|
+ // midiRef.value.contentWindow.onEnded = () => {
|
|
|
|
+ // onEnded();
|
|
|
|
+ // };
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ console.log(state.playMode, state.midiUrl);
|
|
return () => (
|
|
return () => (
|
|
<div class={styles.audioList}>
|
|
<div class={styles.audioList}>
|
|
- <div>
|
|
|
|
- <audio
|
|
|
|
- muted={!isMusicMuted.value}
|
|
|
|
- preload="auto"
|
|
|
|
- ref={(el) => {
|
|
|
|
- if (state.music) {
|
|
|
|
- audioData.songEle = el as HTMLAudioElement;
|
|
|
|
- }
|
|
|
|
- }}
|
|
|
|
- src={state.music}
|
|
|
|
- onLoadedmetadata={onLoadedmetadata}
|
|
|
|
- onPlay={onPlay}
|
|
|
|
- onTimeupdate={onTimeupdate}
|
|
|
|
- onEnded={onEnded}
|
|
|
|
- />
|
|
|
|
- <audio
|
|
|
|
- muted={isMusicMuted.value}
|
|
|
|
- preload="auto"
|
|
|
|
- ref={(el) => {
|
|
|
|
- if (state.accompany) {
|
|
|
|
- audioData.backgroundEle = el as HTMLAudioElement;
|
|
|
|
- }
|
|
|
|
- }}
|
|
|
|
- src={state.accompany}
|
|
|
|
- />
|
|
|
|
- </div>
|
|
|
|
|
|
+ {state.playMode === "MIDI" && state.speed != 0 && <iframe style={{ display: "none" }} ref={midiRef} src={`/midi/index.html`} onLoad={handleLoad} />}
|
|
|
|
+ {state.playMode !== "MIDI" && (
|
|
|
|
+ <div>
|
|
|
|
+ <audio
|
|
|
|
+ muted={!isMusicMuted.value}
|
|
|
|
+ preload="auto"
|
|
|
|
+ ref={(el) => {
|
|
|
|
+ if (state.music) {
|
|
|
|
+ audioData.songEle = el as HTMLAudioElement;
|
|
|
|
+ }
|
|
|
|
+ }}
|
|
|
|
+ src={state.music}
|
|
|
|
+ onLoadedmetadata={onLoadedmetadata}
|
|
|
|
+ onPlay={onPlay}
|
|
|
|
+ onTimeupdate={onTimeupdate}
|
|
|
|
+ onEnded={onEnded}
|
|
|
|
+ />
|
|
|
|
+ <audio
|
|
|
|
+ muted={isMusicMuted.value}
|
|
|
|
+ preload="auto"
|
|
|
|
+ ref={(el) => {
|
|
|
|
+ if (state.accompany) {
|
|
|
|
+ audioData.backgroundEle = el as HTMLAudioElement;
|
|
|
|
+ }
|
|
|
|
+ }}
|
|
|
|
+ src={state.accompany}
|
|
|
|
+ />
|
|
|
|
+ </div>
|
|
|
|
+ )}
|
|
</div>
|
|
</div>
|
|
);
|
|
);
|
|
},
|
|
},
|