|
@@ -17,6 +17,7 @@ import Crunker from "../../utils/crunker"
|
|
|
const crunker = new Crunker()
|
|
|
import tickWav from "/src/assets/tick.mp3";
|
|
|
import tockWav from "/src/assets/tock.mp3";
|
|
|
+import Loading from "./loading"
|
|
|
|
|
|
export const audioData = reactive({
|
|
|
songEle: null as unknown as HTMLAudioElement,
|
|
@@ -233,11 +234,11 @@ export default defineComponent({
|
|
|
onEnded();
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- onMounted(async () => {
|
|
|
- if (state.playMode !== "MIDI") {
|
|
|
- /* 合并节拍到音频 */
|
|
|
- const [musicBuff,accompanyBuff,tickWavBuff,tockWavBuff] = await crunker.fetchAudio(state.music+'?v='+Date.now(), state.accompany+'?v='+Date.now(), tickWav, tockWav)
|
|
|
+ // 合成节拍器音源
|
|
|
+ function loadMergeAudioBetas() {
|
|
|
+ console.time("音频加载时间")
|
|
|
+ return crunker.fetchAudio(state.music+'?v='+Date.now(), state.accompany+'?v='+Date.now(), tickWav, tockWav).then(([musicBuff,accompanyBuff,tickWavBuff,tockWavBuff])=>{
|
|
|
+ console.timeEnd("音频加载时间")
|
|
|
const beats:AudioBuffer[] = []
|
|
|
const beatsTime:number[] = []
|
|
|
metronomeData.metroMeasure.map(Measures=>{
|
|
@@ -251,47 +252,61 @@ export default defineComponent({
|
|
|
const musicBuffMeg = crunker.mergeAudioBuffers([musicBuff,...beats],[0,...beatsTime])
|
|
|
const accompanyBuffMeg = crunker.mergeAudioBuffers([accompanyBuff,...beats],[0,...beatsTime])
|
|
|
console.timeEnd("音频合并时间")
|
|
|
+ return [musicBuffMeg,accompanyBuffMeg]
|
|
|
+ }).then(([musicBuffMeg,accompanyBuffMeg])=>{
|
|
|
console.time("音频audioDom生成时间")
|
|
|
const musicAudio = crunker.exportAudioElement(musicBuffMeg)
|
|
|
const accompanyAudio = crunker.exportAudioElement(accompanyBuffMeg)
|
|
|
console.timeEnd("音频audioDom生成时间")
|
|
|
- if (musicAudio) {
|
|
|
- musicAudio.addEventListener("play", onPlay);
|
|
|
- musicAudio.addEventListener("ended", onEnded);
|
|
|
- accompanyAudio && (accompanyAudio.muted = true);
|
|
|
- } else if (accompanyAudio) {
|
|
|
- accompanyAudio.addEventListener("play", onPlay);
|
|
|
- accompanyAudio.addEventListener("ended", onEnded);
|
|
|
- }
|
|
|
- Promise.all([createAudio(state.music), createAudio(state.accompany)]).then(
|
|
|
- ([music, accompany]) => {
|
|
|
- state.audioDone = true;
|
|
|
- // console.log(music, accompany);
|
|
|
- if (music) {
|
|
|
- audioData.songEle = music;
|
|
|
- }
|
|
|
- if (accompany) {
|
|
|
- audioData.backgroundEle = accompany;
|
|
|
- }
|
|
|
- if (music) {
|
|
|
- music.addEventListener("play", onPlay);
|
|
|
- music.addEventListener("ended", onEnded);
|
|
|
- accompany && (accompany.muted = true);
|
|
|
- } else if (accompany) {
|
|
|
- accompany.addEventListener("play", onPlay);
|
|
|
- accompany.addEventListener("ended", onEnded);
|
|
|
- }
|
|
|
- Object.assign(audioData.songCollection,{
|
|
|
- songEle:music,
|
|
|
- backgroundEle:accompany,
|
|
|
- beatSongEle:musicAudio,
|
|
|
- bateBackgroundEle:accompanyAudio
|
|
|
- })
|
|
|
+ return [musicAudio,accompanyAudio]
|
|
|
+ })
|
|
|
+ }
|
|
|
+ // 加载普通音源
|
|
|
+ function loadAudio(){
|
|
|
+ return Promise.all([createAudio(state.music), createAudio(state.accompany)])
|
|
|
+ }
|
|
|
+ onMounted(async () => {
|
|
|
+ if (state.playMode !== "MIDI") {
|
|
|
+ console.time("加载资源耗时")
|
|
|
+ // 不带节拍的音源
|
|
|
+ const [music, accompany] = await loadAudio()
|
|
|
+ try {
|
|
|
+ // 带节拍的音源
|
|
|
+ const [musicAudio,accompanyAudio] = await loadMergeAudioBetas()
|
|
|
+ console.log("音频合成成功66666666")
|
|
|
+ state.audioBetaDone = true;
|
|
|
+ if (musicAudio) {
|
|
|
+ musicAudio.addEventListener("play", onPlay);
|
|
|
+ musicAudio.addEventListener("ended", onEnded);
|
|
|
+ accompanyAudio && (accompanyAudio.muted = true);
|
|
|
+ } else if (accompanyAudio) {
|
|
|
+ accompanyAudio.addEventListener("play", onPlay);
|
|
|
+ accompanyAudio.addEventListener("ended", onEnded);
|
|
|
}
|
|
|
- );
|
|
|
-
|
|
|
+ Object.assign(audioData.songCollection,{
|
|
|
+ songEle:music,
|
|
|
+ backgroundEle:accompany,
|
|
|
+ beatSongEle:musicAudio,
|
|
|
+ bateBackgroundEle:accompanyAudio
|
|
|
+ })
|
|
|
+ } catch (err) {
|
|
|
+ console.log("音频合成失败7777777:",err)
|
|
|
+ }
|
|
|
+ state.audioDone = true;
|
|
|
+ audioData.backgroundEle = accompany!;
|
|
|
+ audioData.songEle = music!;
|
|
|
+ if (music) {
|
|
|
+ music.addEventListener("play", onPlay);
|
|
|
+ music.addEventListener("ended", onEnded);
|
|
|
+ accompany && (accompany.muted = true);
|
|
|
+ } else if (accompany) {
|
|
|
+ accompany.addEventListener("play", onPlay);
|
|
|
+ accompany.addEventListener("ended", onEnded);
|
|
|
+ }
|
|
|
+ console.timeEnd("加载资源耗时")
|
|
|
api_playProgress(progress);
|
|
|
} else {
|
|
|
+ state.audioDone = true;
|
|
|
const songEndTime = state.times[state.times.length - 1 || 0]?.endtime || 0
|
|
|
audioData.duration = songEndTime
|
|
|
// 监听midi播放进度
|
|
@@ -307,16 +322,19 @@ export default defineComponent({
|
|
|
|
|
|
// console.log(state.playMode, state.midiUrl);
|
|
|
return () => (
|
|
|
- <div class={styles.audioList}>
|
|
|
- {state.playMode === "MIDI" && state.speed != 0 && (
|
|
|
- <iframe
|
|
|
- style={{ display: "none" }}
|
|
|
- ref={midiRef}
|
|
|
- src={`/midi/index.html`}
|
|
|
- onLoad={handleLoad}
|
|
|
- />
|
|
|
- )}
|
|
|
- </div>
|
|
|
+ <>
|
|
|
+ <Loading/>
|
|
|
+ <div class={styles.audioList}>
|
|
|
+ {state.playMode === "MIDI" && state.speed != 0 && (
|
|
|
+ <iframe
|
|
|
+ style={{ display: "none" }}
|
|
|
+ ref={midiRef}
|
|
|
+ src={`/midi/index.html`}
|
|
|
+ onLoad={handleLoad}
|
|
|
+ />
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
+ </>
|
|
|
);
|
|
|
},
|
|
|
});
|