|
@@ -14,17 +14,36 @@ import iconAdd from './images/icon-add.png';
|
|
|
import { getImage } from './images/music';
|
|
|
import j1 from './images/music/j-1.png';
|
|
|
// import j2 from './images/music/j-2.png';
|
|
|
-import { Popup } from 'vant';
|
|
|
+import { Popover, Popup } from 'vant';
|
|
|
import SettingModal from './setting-modal';
|
|
|
import { randomScoreElement, renderScore, setting } from './setting';
|
|
|
import { handleStartTick, hendleEndTick } from './tick';
|
|
|
+import { handleStartBeat, hendleEndBeat } from './beat-tick';
|
|
|
|
|
|
export default defineComponent({
|
|
|
name: 'tempo-practice',
|
|
|
setup() {
|
|
|
const state = reactive({
|
|
|
settingStatus: false,
|
|
|
- playType: 'beat' as 'beat' | 'tempo'
|
|
|
+ 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 = () => {
|
|
@@ -35,23 +54,38 @@ export default defineComponent({
|
|
|
const handlePlay = async () => {
|
|
|
if (setting.playState === 'pause') {
|
|
|
setting.playState = 'play';
|
|
|
- const a = await handleStartTick();
|
|
|
- console.log(a, 'play');
|
|
|
+ if (setting.playType === 'beat') {
|
|
|
+ await handleStartTick();
|
|
|
+ } else {
|
|
|
+ await handleStartBeat();
|
|
|
+ }
|
|
|
} else {
|
|
|
- setting.playState = 'pause';
|
|
|
- hendleEndTick();
|
|
|
+ handleStopPlay();
|
|
|
}
|
|
|
};
|
|
|
/** 播放类型 */
|
|
|
const handlePlayType = () => {
|
|
|
- if (state.playType === 'beat') {
|
|
|
- state.playType = 'tempo';
|
|
|
+ handleStopPlay();
|
|
|
+ if (setting.playType === 'beat') {
|
|
|
+ setting.playType = 'tempo';
|
|
|
} else {
|
|
|
- state.playType = 'beat';
|
|
|
+ setting.playType = 'beat';
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ const handleStopPlay = () => {
|
|
|
+ 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 () => (
|
|
@@ -69,20 +103,18 @@ export default defineComponent({
|
|
|
</div>
|
|
|
|
|
|
<div class={styles.container}>
|
|
|
- {setting.scorePart.map((item: any) => (
|
|
|
+ {setting.scorePart.map((item: any, i: number) => (
|
|
|
<div
|
|
|
class={[
|
|
|
styles.beatSection,
|
|
|
- setting.scorePart.length >= 2 && styles.small,
|
|
|
- ((item.length <= 2 && item.length > 4) ||
|
|
|
- (item.length == 2 && setting.scorePart.length == 4)) &&
|
|
|
- styles.minLength,
|
|
|
- item.length <= 4 && item.length != 2 && styles.maxLength
|
|
|
+ // item.length !== 1 &&
|
|
|
+ setting.scorePart.length >= 2 &&
|
|
|
+ item.length !== 1 &&
|
|
|
+ styles.small
|
|
|
]}>
|
|
|
- {item.map((child: any) => (
|
|
|
- // , styles.active
|
|
|
+ {item.map((child: any, j: number) => (
|
|
|
<div
|
|
|
- class={[styles.beat]}
|
|
|
+ class={[styles.beat, child.selected ? styles.active : '']}
|
|
|
onClick={() => {
|
|
|
const obj = randomScoreElement(child.index);
|
|
|
child.index = obj.index;
|
|
@@ -107,21 +139,64 @@ export default defineComponent({
|
|
|
</div>
|
|
|
{/* 播放类型 */}
|
|
|
<div class={styles.playType} onClick={handlePlayType}>
|
|
|
- {state.playType === 'beat' ? (
|
|
|
+ {setting.playType === 'beat' ? (
|
|
|
<img src={beat} />
|
|
|
) : (
|
|
|
<img src={tempo} />
|
|
|
)}
|
|
|
</div>
|
|
|
{/* 随机生成 */}
|
|
|
- <div class={styles.randomTempo} onClick={() => renderScore()}>
|
|
|
+ <div
|
|
|
+ class={styles.randomTempo}
|
|
|
+ onClick={() => {
|
|
|
+ renderScore();
|
|
|
+ handleStopPlay();
|
|
|
+ }}>
|
|
|
<img src={randDom} />
|
|
|
</div>
|
|
|
{/* 速度 */}
|
|
|
<div class={styles.speedChange}>
|
|
|
- <img src={iconPlus} class={styles.speedPlus} />
|
|
|
- <div class={styles.speedNum}>{setting.speed}</div>
|
|
|
- <img src={iconAdd} class={styles.speedAdd} />
|
|
|
+ <img
|
|
|
+ src={iconPlus}
|
|
|
+ class={styles.speedPlus}
|
|
|
+ onClick={() => {
|
|
|
+ if (setting.speed <= 40) return;
|
|
|
+ setting.speed -= 1;
|
|
|
+ handleStopPlay();
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ <Popover
|
|
|
+ placement="top"
|
|
|
+ class={styles.popupContainer}
|
|
|
+ actions={state.speedList}
|
|
|
+ onSelect={(val: any) => {
|
|
|
+ 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';
|
|
|
+ }
|
|
|
+ });
|
|
|
+ handleStopPlay();
|
|
|
+ }}>
|
|
|
+ {{
|
|
|
+ reference: () => (
|
|
|
+ <div class={styles.speedNum}>{setting.speed}</div>
|
|
|
+ )
|
|
|
+ }}
|
|
|
+ </Popover>
|
|
|
+
|
|
|
+ <img
|
|
|
+ src={iconAdd}
|
|
|
+ class={styles.speedAdd}
|
|
|
+ onClick={() => {
|
|
|
+ if (setting.speed >= 200) return;
|
|
|
+ setting.speed += 1;
|
|
|
+ handleStopPlay();
|
|
|
+ }}
|
|
|
+ />
|
|
|
</div>
|
|
|
</div>
|
|
|
|