|
@@ -9,6 +9,8 @@ import axios from 'axios'
|
|
|
import {CheckboxGroup} from "vant";
|
|
|
import {musicSheetSourceType, musicSheetType} from "@/utils/constant";
|
|
|
import {getSelectDataFromObj} from "@/utils/objectUtil";
|
|
|
+import {musicalInstrumentPage} from "@views/system-manage/subject-manage/api";
|
|
|
+import {subjectPage} from "@views/system-manage/api";
|
|
|
|
|
|
/**
|
|
|
* 获取指定元素下一个Note元素
|
|
@@ -253,38 +255,47 @@ export default defineComponent({
|
|
|
playMode: 'MP3', // 播放类型
|
|
|
xmlFileUrl: null, // XML
|
|
|
midiUrl: null, // mid
|
|
|
- metronomeUrl: null, // 伴奏 根据mp3Type 是否是为包含节拍器
|
|
|
name: null, // 曲目名称
|
|
|
musicTag: [] as any, // 曲目标签
|
|
|
composer: null, // 音乐人
|
|
|
playSpeed: null, // 曲谱速度
|
|
|
- showFingering: null as any, // 是否显示指法
|
|
|
- canEvaluate: null as any, // 是否评测
|
|
|
- subjectIds: null as any, // 可用声部
|
|
|
- notation: null as any, // 能否转和简谱
|
|
|
- auditVersion: null as any, // 审核版本
|
|
|
- audioType: 'HOMEMODE', // 伴奏类型
|
|
|
- sortNumber: null, // 排序
|
|
|
+ // showFingering: null as any, // 是否显示指法
|
|
|
+ // canEvaluate: null as any, // 是否评测
|
|
|
+ // notation: null as any, // 能否转和简谱
|
|
|
+ // auditVersion: null as any, // 审核版本
|
|
|
+ // sortNumber: null, // 排序
|
|
|
musicCover: null, // 曲谱封面
|
|
|
remark: null, // 曲谱描述
|
|
|
- background: [] as any, // 原音
|
|
|
+ musicSheetSoundList: [] as any, // 原音
|
|
|
musicSheetCategoriesId: null,
|
|
|
status: false,
|
|
|
musicSheetType: null, // 曲目类型
|
|
|
- sourceType: undefined,
|
|
|
+ sourceType: undefined, //来源类型/作者属性(PLATFORM: 平台; ORG: 机构; PERSON: 个人)
|
|
|
userId: null, // 所属人
|
|
|
- isPlayBeat: 1, // 是否播放节拍器
|
|
|
- playStyle: undefined, // 播放方式
|
|
|
appAuditFlag: false, // 是否审核版本
|
|
|
- midiFileUrl: null, // 伴奏文件
|
|
|
- musicalInstrumentIds: null, //可用乐器
|
|
|
+ midiFileUrl: null, // 伴奏文件 MIDI文件(保留字段)
|
|
|
+ subjectIds: '', // 可用声部
|
|
|
+ subjectIdList: [] as any, // 可用声部
|
|
|
+ musicalInstrumentIds: '', //可用乐器
|
|
|
+ musicalInstrumentIdList: [] as any, //可用乐器
|
|
|
musicCategoryId: null, //曲目分类
|
|
|
+ musicSheetAccompanimentList: [], //曲目伴奏
|
|
|
+ audioType: 'HOMEMODE', // 伴奏类型
|
|
|
+ isPlayBeat: 1, // 是否播放节拍器
|
|
|
+ isUseSystemBeat: '1', // 是否使用系统节拍器(0:否;1:是)
|
|
|
+ repeatedBeats: '0', // 是否重复节拍时长
|
|
|
+ evaluationStandard: 'AMPLITUDE', // 评分标准 节奏 AMPLITUDE 音准 FREQUENCY 分贝 DECIBELS
|
|
|
})
|
|
|
const state = reactive({
|
|
|
+ loading: false,
|
|
|
tagList: [...props.tagList] as any, // 标签列表
|
|
|
xmlFirstSpeed: null as any, // 第一个音轨速度
|
|
|
partListNames: [] as any, // 所有音轨声部列表
|
|
|
- musicSheetCategories: [...props.musicSheetCategories] as any
|
|
|
+ musicSheetCategories: [...props.musicSheetCategories] as any,
|
|
|
+ musicSheetAccompanimentNames: [] as any,
|
|
|
+ instrumentData: [],
|
|
|
+ instrumentList: [],
|
|
|
+ subjectList: [],
|
|
|
})
|
|
|
const gradualData = reactive({
|
|
|
list: [] as any[],
|
|
@@ -305,13 +316,14 @@ export default defineComponent({
|
|
|
return
|
|
|
}
|
|
|
try {
|
|
|
+ //extConfigJson: {"repeatedBeats":0,"gradualTimes":{"75":"02:38:60","77":"02:43:39"}}
|
|
|
const obj = {
|
|
|
...forms,
|
|
|
musicTag: '-1',
|
|
|
extConfigJson: JSON.stringify({gradualTimes: forms.graduals})
|
|
|
}
|
|
|
if (forms.audioType == 'MIDI') {
|
|
|
- obj.background = []
|
|
|
+ obj.musicSheetSoundList = []
|
|
|
}
|
|
|
btnLoading.value = true
|
|
|
if (props.type === 'add') {
|
|
@@ -332,7 +344,7 @@ export default defineComponent({
|
|
|
})
|
|
|
}
|
|
|
|
|
|
- // 上传XML,初始化音轨 音轨速度
|
|
|
+ // 上传XML,初始化音轨 音轨速度 乐器、声部
|
|
|
const readFileInputEventAsArrayBuffer = (file: any) => {
|
|
|
const xmlRead = new FileReader()
|
|
|
xmlRead.onload = (res) => {
|
|
@@ -345,17 +357,17 @@ export default defineComponent({
|
|
|
state.partListNames = getPartListNames(res?.target?.result as any) as any
|
|
|
// 这里是如果没有当前音轨就重新写
|
|
|
for (let j = 0; j < state.partListNames.length; j++) {
|
|
|
- if (!forms.background[j]) {
|
|
|
- forms.background.push({audioFileUrl: null, track: null})
|
|
|
+ if (!forms.musicSheetSoundList[j]) {
|
|
|
+ forms.musicSheetSoundList.push({audioFileUrl: null, track: null})
|
|
|
}
|
|
|
- forms.background[j].track = state.partListNames[j].value
|
|
|
+ forms.musicSheetSoundList[j].track = state.partListNames[j].value
|
|
|
}
|
|
|
|
|
|
// 循环添加所在音轨的原音
|
|
|
- for (let index = forms.background.length; index < state.partListNames.length; index++) {
|
|
|
+ for (let index = forms.musicSheetSoundList.length; index < state.partListNames.length; index++) {
|
|
|
const part = state.partListNames[index].value
|
|
|
const sysData = {
|
|
|
- ...forms.background[0],
|
|
|
+ ...forms.musicSheetSoundList[0],
|
|
|
track: part
|
|
|
}
|
|
|
if (!sysData.speed) {
|
|
@@ -364,8 +376,8 @@ export default defineComponent({
|
|
|
createSys(sysData)
|
|
|
}
|
|
|
|
|
|
- if (forms.background.length == 0) {
|
|
|
- forms.background.push({audioFileUrl: '', track: ''})
|
|
|
+ if (forms.musicSheetSoundList.length == 0) {
|
|
|
+ forms.musicSheetSoundList.push({audioFileUrl: '', track: ''})
|
|
|
}
|
|
|
|
|
|
|
|
@@ -373,7 +385,7 @@ export default defineComponent({
|
|
|
xmlRead.readAsText(file)
|
|
|
}
|
|
|
|
|
|
- // 获取xml中所有轨道
|
|
|
+ // 获取xml中所有轨道 乐器
|
|
|
const getPartListNames = (xml: any) => {
|
|
|
if (!xml) return []
|
|
|
const xmlParse = new DOMParser().parseFromString(xml, 'text/xml')
|
|
@@ -388,13 +400,39 @@ export default defineComponent({
|
|
|
})
|
|
|
|
|
|
if (partListNames.length > 0) {
|
|
|
- forms.background = forms.background.slice(0, partListNames.length)
|
|
|
+ forms.musicSheetSoundList = forms.musicSheetSoundList.slice(0, partListNames.length)
|
|
|
}
|
|
|
|
|
|
state.xmlFirstSpeed = xmlParse.getElementsByTagName('per-minute')?.[0]?.textContent || ''
|
|
|
if (!forms.playSpeed) {
|
|
|
forms.playSpeed = state.xmlFirstSpeed
|
|
|
}
|
|
|
+
|
|
|
+ // 乐器
|
|
|
+ const instrumentCodeList: any = [];
|
|
|
+ const instrumentEle = xmlParse.getElementsByTagName('virtual-instrument');
|
|
|
+ for (let index = 0; index < instrumentEle.length; index++) {
|
|
|
+ const note = instrumentEle[index]
|
|
|
+ const instrumentCode = note.getElementsByTagName('virtual-name')?.[0].textContent || '';
|
|
|
+ if (instrumentCode && !instrumentCodeList.includes(instrumentCode)) {
|
|
|
+ instrumentCodeList.push(instrumentCode);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ const codeIdMap = new Map<string, string>();
|
|
|
+ state.instrumentData.forEach((data: any) => {
|
|
|
+ codeIdMap.set(data.code, data.id + '');
|
|
|
+ })
|
|
|
+ forms.musicalInstrumentIdList = [];
|
|
|
+ instrumentCodeList.forEach((code: string) => {
|
|
|
+ if (codeIdMap.has(code)) {
|
|
|
+ forms.musicalInstrumentIdList.push(codeIdMap.get(code));
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ // 声部
|
|
|
+ if (forms.musicalInstrumentIdList.length > 0) {
|
|
|
+ showBackSubject(forms.musicalInstrumentIdList);
|
|
|
+ }
|
|
|
return partListNames
|
|
|
}
|
|
|
|
|
@@ -403,7 +441,7 @@ export default defineComponent({
|
|
|
const _names = state.partListNames.filter((n: any) => n.value?.toLocaleUpperCase?.() != 'COMMON')
|
|
|
const partListNames = deepClone(_names) || []
|
|
|
partListNames.forEach((item: any) => {
|
|
|
- const index = forms.background.findIndex((ground: any) => item.value == ground.track)
|
|
|
+ const index = forms.musicSheetSoundList.findIndex((ground: any) => item.value == ground.track)
|
|
|
if (index > -1 && track != item.value) {
|
|
|
item.disabled = true
|
|
|
} else {
|
|
@@ -413,9 +451,40 @@ export default defineComponent({
|
|
|
return partListNames || []
|
|
|
}
|
|
|
|
|
|
+ // 获取乐器信息
|
|
|
+
|
|
|
+ const initInstrumentList = async () => {
|
|
|
+ if (state.instrumentList && state.instrumentList.length > 0) {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ const {data} = await musicalInstrumentPage({page: 1, rows: 999})
|
|
|
+ const tempList = data.rows || []
|
|
|
+ state.instrumentData = tempList
|
|
|
+ tempList.forEach((item: any) => {
|
|
|
+ item.label = item.name
|
|
|
+ item.value = item.id + ''
|
|
|
+ })
|
|
|
+ state.instrumentList = tempList
|
|
|
+ } catch {
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 反显声部
|
|
|
+ const showBackSubject = async (musicalInstrumentIdList: []) => {
|
|
|
+ try {
|
|
|
+ const {data} = await subjectPage({page: 1, rows: 999, musicalInstrumentIdList: musicalInstrumentIdList})
|
|
|
+ const tempList = data.rows || []
|
|
|
+ tempList.forEach((item: any) => {
|
|
|
+ forms.subjectIdList.push(item.id + '')
|
|
|
+ })
|
|
|
+ } catch {
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
// 添加原音
|
|
|
const createSys = (initData?: any) => {
|
|
|
- forms.background.push({
|
|
|
+ forms.musicSheetSoundList.push({
|
|
|
audioFileUrl: null, // 原音
|
|
|
track: null, // 轨道
|
|
|
...initData
|
|
@@ -429,12 +498,13 @@ export default defineComponent({
|
|
|
positiveText: '确定',
|
|
|
negativeText: '取消',
|
|
|
onPositiveClick: async () => {
|
|
|
- forms.background.splice(index, 1)
|
|
|
+ forms.musicSheetSoundList.splice(index, 1)
|
|
|
}
|
|
|
})
|
|
|
}
|
|
|
|
|
|
onMounted(async () => {
|
|
|
+ initInstrumentList();
|
|
|
if (props.type === 'edit' || props.type === 'preview') {
|
|
|
const detail = props.data
|
|
|
try {
|
|
@@ -443,22 +513,31 @@ export default defineComponent({
|
|
|
forms.playMode = data.playMode
|
|
|
forms.xmlFileUrl = data.xmlFileUrl
|
|
|
forms.midiUrl = data.midiUrl
|
|
|
- forms.metronomeUrl = data.metronomeUrl
|
|
|
forms.name = data.name
|
|
|
forms.musicTag = data.musicTag?.split(',')
|
|
|
forms.composer = data.composer
|
|
|
forms.playSpeed = data.playSpeed
|
|
|
- forms.showFingering = Number(data.showFingering)
|
|
|
- forms.canEvaluate = Number(data.canEvaluate)
|
|
|
- forms.notation = Number(data.notation)
|
|
|
- forms.auditVersion = Number(data.auditVersion)
|
|
|
- forms.sortNumber = data.sortNumber
|
|
|
+ // forms.showFingering = Number(data.showFingering)
|
|
|
+ // forms.canEvaluate = Number(data.canEvaluate)
|
|
|
+ // forms.notation = Number(data.notation)
|
|
|
+ // forms.auditVersion = Number(data.auditVersion)
|
|
|
+ // forms.sortNumber = data.sortNumber
|
|
|
forms.musicCover = data.musicCover
|
|
|
forms.remark = data.remark
|
|
|
forms.status = data.status
|
|
|
forms.musicSheetCategoriesId = data.musicSheetCategoriesId
|
|
|
- forms.background = data.background || []
|
|
|
+ forms.musicSheetSoundList = data.musicSheetSoundList || []
|
|
|
forms.musicSheetType = data.musicSheetType || "SINGLE"
|
|
|
+ forms.musicSheetAccompanimentList = data.musicSheetAccompanimentList
|
|
|
+ data.musicSheetAccompanimentList?.forEach((next: any) => {
|
|
|
+ state.musicSheetAccompanimentNames.push(next.audioFileUrl);
|
|
|
+ })
|
|
|
+ forms.evaluationStandard = data.evaluationStandard
|
|
|
+ forms.musicalInstrumentIds = data.musicalInstrumentIds
|
|
|
+ forms.musicalInstrumentIdList = data.musicalInstrumentIds.split(',') || []
|
|
|
+
|
|
|
+ forms.subjectIds = data.subjectIds
|
|
|
+ forms.subjectIdList = data.subjectIds?.split(',') || []
|
|
|
// 获取渐变 和 是否多声部
|
|
|
try {
|
|
|
const extConfigJson = data.extConfigJson ? JSON.parse(data.extConfigJson) : {}
|
|
@@ -615,7 +694,7 @@ export default defineComponent({
|
|
|
[
|
|
|
{
|
|
|
label: '小A',
|
|
|
- value: '小B'
|
|
|
+ value: '1'
|
|
|
}
|
|
|
] as any
|
|
|
}
|
|
@@ -662,6 +741,47 @@ export default defineComponent({
|
|
|
/>
|
|
|
</NFormItemGi>
|
|
|
</NGrid>
|
|
|
+ <NGrid cols={2}>
|
|
|
+ <NFormItemGi label="是否重复节拍时长" path="repeatedBeats"
|
|
|
+ rule={[
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ message: '请选择是否重复节拍时长'
|
|
|
+ }
|
|
|
+ ]}
|
|
|
+ >
|
|
|
+ <NRadioGroup
|
|
|
+ v-model:value={forms.repeatedBeats}
|
|
|
+ // onUpdateValue={(value: string | number | boolean) => {
|
|
|
+ // if (value === 'MP3') {
|
|
|
+ // forms.repeatedBeats = 'MP3'
|
|
|
+ // } else {
|
|
|
+ // forms.repeatedBeats = 'MIDI'
|
|
|
+ // }
|
|
|
+ // }}
|
|
|
+ >
|
|
|
+ <NRadio value="1">是</NRadio>
|
|
|
+ <NRadio value="0">否</NRadio>
|
|
|
+ </NRadioGroup>
|
|
|
+ </NFormItemGi>
|
|
|
+ <NFormItemGi
|
|
|
+ label="评分标准"
|
|
|
+ path="evaluationStandard"
|
|
|
+ rule={[
|
|
|
+ {
|
|
|
+ required: true
|
|
|
+ }
|
|
|
+ ]}
|
|
|
+ >
|
|
|
+ <NRadioGroup
|
|
|
+ v-model:value={forms.evaluationStandard}
|
|
|
+ >
|
|
|
+ <NRadio value={'AMPLITUDE'}>节奏评分</NRadio>
|
|
|
+ <NRadio value={'FREQUENCY'}>音准评分</NRadio>
|
|
|
+ <NRadio value={'DECIBELS'}>分贝评分</NRadio>
|
|
|
+ </NRadioGroup>
|
|
|
+ </NFormItemGi>
|
|
|
+ </NGrid>
|
|
|
<NAlert showIcon={false} style={{marginBottom: "12px"}}>曲目上传</NAlert>
|
|
|
<NGrid cols={2}>
|
|
|
<NFormItemGi label="播放模式" path="playMode"
|
|
@@ -709,23 +829,25 @@ export default defineComponent({
|
|
|
{forms.playMode === 'MP3' && (
|
|
|
<NFormItemGi
|
|
|
label="上传伴奏"
|
|
|
- path="midiFileUrl"
|
|
|
+ path="musicSheetAccompanimentNames"
|
|
|
rule={[
|
|
|
{
|
|
|
required: true,
|
|
|
- message: '请选择上传.mp3/.aac'
|
|
|
+ message: '请选择上传.mp3'
|
|
|
}
|
|
|
]}
|
|
|
>
|
|
|
<UploadFile
|
|
|
size={10}
|
|
|
- v-model:fileList={forms.midiFileUrl}
|
|
|
- tips="仅支持上传.mp3/.aac格式文件"
|
|
|
+ v-model:imageList={state.musicSheetAccompanimentNames}
|
|
|
+ tips="仅支持上传.mp3格式文件"
|
|
|
listType="image"
|
|
|
- accept=".mp3,.aac"
|
|
|
+ accept=".mp3"
|
|
|
bucketName="cloud-coach"
|
|
|
text="点击上传伴奏文件"
|
|
|
- onReadFileInputEventAsArrayBuffer={readFileInputEventAsArrayBuffer}
|
|
|
+ max={10}
|
|
|
+ // onReadFileInputEventAsArrayBuffer={readFileInputEventAsArrayBuffer}
|
|
|
+ multiple={true}
|
|
|
/>
|
|
|
</NFormItemGi>
|
|
|
)}
|
|
@@ -777,15 +899,16 @@ export default defineComponent({
|
|
|
</NGrid>
|
|
|
|
|
|
<NGrid cols={2}>
|
|
|
- <NFormItemGi label="可用声部" path="musicSubject"
|
|
|
+ <NFormItemGi label="可用声部" path="subjectIdList"
|
|
|
rule={[
|
|
|
{
|
|
|
- required: true
|
|
|
+ required: true,
|
|
|
+ message: '请选择可用声部'
|
|
|
}
|
|
|
]}
|
|
|
>
|
|
|
<NSelect
|
|
|
- v-model:value={forms.subjectIds}
|
|
|
+ v-model:value={forms.subjectIdList}
|
|
|
options={props.subjectList}
|
|
|
multiple
|
|
|
filterable
|
|
@@ -793,7 +916,7 @@ export default defineComponent({
|
|
|
placeholder="请选择可用声部"
|
|
|
/>
|
|
|
</NFormItemGi>
|
|
|
- {(forms.playMode === 'MP3' || forms.musicSheetType === 'SINGLE') && (
|
|
|
+ {(forms.musicSheetType === 'SINGLE') && (
|
|
|
<NFormItemGi
|
|
|
label="页面渲染声轨"
|
|
|
path="audioType"
|
|
@@ -812,7 +935,7 @@ export default defineComponent({
|
|
|
</CheckboxGroup>
|
|
|
</NFormItemGi>
|
|
|
)}
|
|
|
- {forms.playMode === 'MIDI' && forms.musicSheetType === 'CONCERT' && (
|
|
|
+ {forms.musicSheetType === 'CONCERT' && (
|
|
|
<NFormItemGi
|
|
|
label="用户可切换声轨"
|
|
|
path="audioType"
|
|
@@ -835,7 +958,7 @@ export default defineComponent({
|
|
|
</NGrid>
|
|
|
|
|
|
<NGrid cols={2}>
|
|
|
- <NFormItemGi label="可用乐器" path="audioType"
|
|
|
+ <NFormItemGi label="可用乐器" path="musicalInstrumentIdList"
|
|
|
rule={[
|
|
|
{
|
|
|
required: true,
|
|
@@ -844,15 +967,16 @@ export default defineComponent({
|
|
|
]}
|
|
|
>
|
|
|
<NSelect
|
|
|
- options={
|
|
|
- [] as any
|
|
|
- }
|
|
|
- v-model:value={forms.musicalInstrumentIds}
|
|
|
+ placeholder="请选择可用乐器"
|
|
|
+ options={state.instrumentList}
|
|
|
+ v-model:value={forms.musicalInstrumentIdList}
|
|
|
+ clearable
|
|
|
+ multiple
|
|
|
/>
|
|
|
</NFormItemGi>
|
|
|
</NGrid>
|
|
|
<NGrid cols={2}>
|
|
|
- <NFormItemGi label="是否播放节拍器" path="audioType"
|
|
|
+ <NFormItemGi label="是否播放节拍器" path="isPlayBeat"
|
|
|
rule={[
|
|
|
{
|
|
|
required: true,
|
|
@@ -877,10 +1001,10 @@ export default defineComponent({
|
|
|
]}
|
|
|
>
|
|
|
<NRadioGroup
|
|
|
- v-model:value={forms.playStyle}
|
|
|
+ v-model:value={forms.isUseSystemBeat}
|
|
|
>
|
|
|
- <NRadio value="MP3">系统节拍器</NRadio>
|
|
|
- <NRadio value="MIDI">MP3节拍器</NRadio>
|
|
|
+ <NRadio value="1">系统节拍器</NRadio>
|
|
|
+ <NRadio value="0">MP3节拍器</NRadio>
|
|
|
</NRadioGroup>
|
|
|
</NFormItemGi>
|
|
|
)}
|
|
@@ -888,13 +1012,13 @@ export default defineComponent({
|
|
|
{/* 只有播放类型为mp3时才会有原音 */}
|
|
|
{forms.playMode === 'MP3' && (
|
|
|
<>
|
|
|
- {forms.background.map((item: any, index: number) => (
|
|
|
+ {forms.musicSheetSoundList.map((item: any, index: number) => (
|
|
|
<>
|
|
|
{item.track?.toLocaleUpperCase?.() != 'COMMON' && <NGrid class={styles.audioSection}>
|
|
|
<NFormItemGi
|
|
|
span={12}
|
|
|
label="原音"
|
|
|
- path={`background[${index}].audioFileUrl`}
|
|
|
+ path={`musicSheetSoundList[${index}].audioFileUrl`}
|
|
|
rule={[
|
|
|
{
|
|
|
required: true,
|
|
@@ -917,7 +1041,7 @@ export default defineComponent({
|
|
|
<NFormItemGi
|
|
|
span={12}
|
|
|
label="所属轨道"
|
|
|
- path={`background[${index}].track`}
|
|
|
+ path={`musicSheetSoundList[${index}].track`}
|
|
|
rule={[
|
|
|
{
|
|
|
required: true,
|
|
@@ -936,7 +1060,7 @@ export default defineComponent({
|
|
|
<NButton
|
|
|
type="primary"
|
|
|
text
|
|
|
- disabled={forms.background.length === 1}
|
|
|
+ disabled={forms.musicSheetSoundList.length === 1}
|
|
|
onClick={() => removeSys(index)}
|
|
|
>
|
|
|
删除
|
|
@@ -950,7 +1074,7 @@ export default defineComponent({
|
|
|
type="primary"
|
|
|
dashed
|
|
|
block
|
|
|
- disabled={state.partListNames.length <= forms.background.length}
|
|
|
+ disabled={state.partListNames.length <= forms.musicSheetSoundList.length}
|
|
|
style={{
|
|
|
marginBottom: '24px'
|
|
|
}}
|