import { defineComponent, onMounted, reactive, ref } from 'vue'; import styles from './index.module.less'; import { postMessage } from '@/helpers/native-message'; import icon_title from './images/icon-title.png'; import icon_back from './images/icon-back.png'; import icon_setting from './images/icon-setting.png'; import iconPlay from './images/icon-play.png'; import iconPause from './images/icon-pause.png'; import beat from './images/btn-2.png'; import tempo from './images/btn-3.png'; import randDom from './images/btn-1.png'; import iconPlus from './images/icon-plus.png'; import iconAdd from './images/icon-add.png'; import { getImage } from './images/music'; import '@vant/touch-emulator'; // import j2 from './images/music/j-2.png'; import { Popover, Popup, showToast } from 'vant'; import SettingModal from './setting-modal'; import { randomScoreElement, renderScore, setting, elementDirection } from './setting'; import { handleStartTick, hendleEndTick } from './tick'; import { handleStartBeat, hendleEndBeat } from './beat-tick'; import { browser } from '@/helpers/utils'; import { useRoute } from 'vue-router'; export default defineComponent({ name: 'tempo-practice', setup() { const route = useRoute(); const state = reactive({ platform: route.query.platform, // microapp 老师端应用里面打开单独处理返回逻辑 win: route.query.win, settingStatus: false, speedList: [ { text: '40', value: 40, color: '#060606' }, { text: '50', value: 50, color: '#060606' }, { text: '60', value: 60, color: '#060606' }, { text: '70', value: 70, color: '#060606' }, { text: '80', value: 80, color: '#060606' }, { text: '90', value: 90, color: '#060606' }, { text: '100', value: 100, color: '#060606' }, { text: '110', value: 110, color: '#060606' }, { text: '120', value: 120, color: '#060606' }, { text: '130', value: 130, color: '#060606' }, { text: '140', value: 140, color: '#060606' }, { text: '150', value: 150, color: '#060606' }, { text: '160', value: 160, color: '#060606' }, { text: '170', value: 170, color: '#060606' }, { text: '180', value: 180, color: '#060606' }, { text: '190', value: 190, color: '#060606' }, { text: '200', value: 200, color: '#060606' } ] }); // 返回 const goback = () => { if (state.platform === 'microapp') { window.parent.postMessage( { api: 'iframe_exit' }, '*' ); return; } if (!browser().isApp) { window.close(); return; } postMessage({ api: 'goBack' }); }; /** 播放切换 */ const handlePlay = async () => { if (setting.playState === 'pause') { setting.playState = 'play'; if (setting.playType === 'beat') { await handleStartTick(); } else { await handleStartBeat(); } } else { handleStop(); } }; /** 播放类型 */ const handlePlayType = () => { handleStop(); if (setting.playType === 'beat') { setting.playType = 'tempo'; } else { setting.playType = 'beat'; } }; const handleStop = () => { setting.playState = 'pause'; if (setting.playType === 'beat') { hendleEndTick(); } else { hendleEndBeat(); } }; onMounted(() => { state.speedList.forEach((item: any) => { if (item.value === setting.speed) item.color = '#1CACF1'; }); renderScore(); }); return () => (
{ handleStop(); state.settingStatus = true; }}>
{setting.scorePart.map((item: any, i: number) => (
= 2 && item.length !== 1 && styles.small ]}> {item.map((child: any, jIndex: number) => (
{ if (setting.playState === 'play') return; if (setting.tempo.length <= 1) { showToast('无法切换,请选择至少2种节奏型'); return; } // const obj = randomScoreElement(child.index); const obj = elementDirection('up', child.index); child.index = obj.index; child.url = obj.url; }}>
{ if (setting.playState === 'play') return; if (setting.tempo.length <= 1) { showToast('无法切换,请选择至少2种节奏型'); return; } // const obj = randomScoreElement(child.index); const obj = elementDirection('down', child.index); child.index = obj.index; child.url = obj.url; }}>
))}
))}
{/* 播放 */}
{setting.playState === 'pause' ? ( ) : ( )}
{/* 播放类型 */}
{setting.playType === 'beat' ? ( ) : ( )}
{/* 随机生成 */}
{ renderScore(); handleStop(); }}>
{/* 速度 */}
{ if (setting.speed <= 40) return; setting.speed -= 1; handleStop(); }} /> { if (val.value === setting.speed) return; state.speedList.forEach((item: any) => { if (item.value === val.value) { item.color = '#1CACF1'; setting.speed = val.value; } else { item.color = '#060606'; } }); handleStop(); }}> {{ reference: () => (
{setting.speed}
) }}
{ if (setting.speed >= 200) return; setting.speed += 1; handleStop(); }} />
(state.settingStatus = false)} />
); } });