|  | @@ -1328,20 +1328,17 @@ export default defineComponent({
 | 
	
		
			
				|  |  |  		};
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		const downPng = async () => {
 | 
	
		
			
				|  |  | -			await handleResetRender();
 | 
	
		
			
				|  |  | -			const paper = document.getElementById("paper");
 | 
	
		
			
				|  |  | +			abcData.abc.title = `T:${data.musicName}`;
 | 
	
		
			
				|  |  | +			abcData.abc.creator = `R:${data.creator}`;
 | 
	
		
			
				|  |  | +			const paper = document.getElementById("exportPng");
 | 
	
		
			
				|  |  |  			if (!paper) return;
 | 
	
		
			
				|  |  | +			const abc = renderMeasures(abcData.abc, { hiddenIndex: true, showTitle: true, showCreator: true });
 | 
	
		
			
				|  |  | +			ABCJS.renderAbc(paper, abc, abcData.abcOptions);
 | 
	
		
			
				|  |  |  			const svg: any = paper.children[0]?.cloneNode(true);
 | 
	
		
			
				|  |  | -			const annotation = svg.querySelectorAll(".abcjs-annotation");
 | 
	
		
			
				|  |  | -			annotation.forEach((n: HTMLElement) => {
 | 
	
		
			
				|  |  | -				n.remove();
 | 
	
		
			
				|  |  | -			});
 | 
	
		
			
				|  |  |  			const svgBox = paper.getBoundingClientRect();
 | 
	
		
			
				|  |  | -			console.log("🚀 ~ svgBox:", svgBox);
 | 
	
		
			
				|  |  |  			svg.setAttribute("width", `${svgBox.width * 3}`);
 | 
	
		
			
				|  |  |  			svg.setAttribute("height", `${svgBox.height * 3}`);
 | 
	
		
			
				|  |  |  			const rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
 | 
	
		
			
				|  |  | -			console.log("🚀 ~ svg:", svg);
 | 
	
		
			
				|  |  |  			rect.setAttribute("x", "0");
 | 
	
		
			
				|  |  |  			rect.setAttribute("y", "0");
 | 
	
		
			
				|  |  |  			rect.setAttribute("width", `${svgBox.width * 10}`);
 | 
	
	
		
			
				|  | @@ -1462,866 +1459,908 @@ export default defineComponent({
 | 
	
		
			
				|  |  |  		};
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		return () => (
 | 
	
		
			
				|  |  | -			<div class={styles.container}>
 | 
	
		
			
				|  |  | -				<div class={styles.containerTop} onKeyup={(e: Event) => e.stopPropagation()}>
 | 
	
		
			
				|  |  | -					<div class={styles.topWrap}>
 | 
	
		
			
				|  |  | -						<div class={styles.topBtn} onClick={() => handleChange({ type: "exit", value: "exit" })}>
 | 
	
		
			
				|  |  | -							<div class={[styles.btnImg]}>
 | 
	
		
			
				|  |  | -								<img class={styles.topBtnIcon} src={getImage("icon_-1.png")} />
 | 
	
		
			
				|  |  | +			<>
 | 
	
		
			
				|  |  | +				<div class={styles.container}>
 | 
	
		
			
				|  |  | +					<div class={styles.containerTop} onKeyup={(e: Event) => e.stopPropagation()}>
 | 
	
		
			
				|  |  | +						<div class={styles.topWrap}>
 | 
	
		
			
				|  |  | +							<div class={styles.topBtn} onClick={() => handleChange({ type: "exit", value: "exit" })}>
 | 
	
		
			
				|  |  | +								<div class={[styles.btnImg]}>
 | 
	
		
			
				|  |  | +									<img class={styles.topBtnIcon} src={getImage("icon_-1.png")} />
 | 
	
		
			
				|  |  | +								</div>
 | 
	
		
			
				|  |  | +								<div>退出</div>
 | 
	
		
			
				|  |  | +							</div>
 | 
	
		
			
				|  |  | +							<div class={styles.topBtn}>
 | 
	
		
			
				|  |  | +								<FileBtn
 | 
	
		
			
				|  |  | +									onSelect={(val: IFileBtnType) => {
 | 
	
		
			
				|  |  | +										if (val === "newMusic") {
 | 
	
		
			
				|  |  | +											handleCreateMusic();
 | 
	
		
			
				|  |  | +										} else if (val === "save") {
 | 
	
		
			
				|  |  | +											handleSaveMusic();
 | 
	
		
			
				|  |  | +										} else if (["xml"].includes(val)) {
 | 
	
		
			
				|  |  | +											handleExport();
 | 
	
		
			
				|  |  | +										} else if (val === "upload") {
 | 
	
		
			
				|  |  | +										} else if (["png", "midi", "wav"].includes(val)) {
 | 
	
		
			
				|  |  | +											handleDownFile(val);
 | 
	
		
			
				|  |  | +										} else if (val === "print") {
 | 
	
		
			
				|  |  | +										}
 | 
	
		
			
				|  |  | +										//  else if (val === "exit") {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +										// }
 | 
	
		
			
				|  |  | +									}}
 | 
	
		
			
				|  |  | +								/>
 | 
	
		
			
				|  |  | +								<div>文件</div>
 | 
	
		
			
				|  |  |  							</div>
 | 
	
		
			
				|  |  | -							<div>退出</div>
 | 
	
		
			
				|  |  | -						</div>
 | 
	
		
			
				|  |  | -						<div class={styles.topBtn}>
 | 
	
		
			
				|  |  | -							<FileBtn
 | 
	
		
			
				|  |  | -								onSelect={(val: IFileBtnType) => {
 | 
	
		
			
				|  |  | -									if (val === "newMusic") {
 | 
	
		
			
				|  |  | -										handleCreateMusic();
 | 
	
		
			
				|  |  | -									} else if (val === "save") {
 | 
	
		
			
				|  |  | -										handleSaveMusic();
 | 
	
		
			
				|  |  | -									} else if (["xml"].includes(val)) {
 | 
	
		
			
				|  |  | -										handleExport();
 | 
	
		
			
				|  |  | -									} else if (val === "upload") {
 | 
	
		
			
				|  |  | -									} else if (["png", "midi", "wav"].includes(val)) {
 | 
	
		
			
				|  |  | -										handleDownFile(val);
 | 
	
		
			
				|  |  | -									} else if (val === "print") {
 | 
	
		
			
				|  |  | -									}
 | 
	
		
			
				|  |  | -									//  else if (val === "exit") {
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -									// }
 | 
	
		
			
				|  |  | -								}}
 | 
	
		
			
				|  |  | -							/>
 | 
	
		
			
				|  |  | -							<div>文件</div>
 | 
	
		
			
				|  |  | -						</div>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -						<div class={styles.topLine}></div>
 | 
	
		
			
				|  |  | +							<div class={styles.topLine}></div>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -						<div class={styles.topBtn} onClick={() => handleChange({ type: "dot", value: ">" })}>
 | 
	
		
			
				|  |  | -							<div class={[styles.btnImg, noteComputed.value.dot === ">" && styles.btnImgActive]}>
 | 
	
		
			
				|  |  | -								<img class={styles.topBtnIcon} src={getImage("icon_1.png")} />
 | 
	
		
			
				|  |  | +							<div class={styles.topBtn} onClick={() => handleChange({ type: "dot", value: ">" })}>
 | 
	
		
			
				|  |  | +								<div class={[styles.btnImg, noteComputed.value.dot === ">" && styles.btnImgActive]}>
 | 
	
		
			
				|  |  | +									<img class={styles.topBtnIcon} src={getImage("icon_1.png")} />
 | 
	
		
			
				|  |  | +								</div>
 | 
	
		
			
				|  |  | +								<div>附点</div>
 | 
	
		
			
				|  |  |  							</div>
 | 
	
		
			
				|  |  | -							<div>附点</div>
 | 
	
		
			
				|  |  | -						</div>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -						<div class={styles.topLine}></div>
 | 
	
		
			
				|  |  | +							<div class={styles.topLine}></div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +							{ABC_DATA.accidentals.map((item) => (
 | 
	
		
			
				|  |  | +								<div
 | 
	
		
			
				|  |  | +									class={styles.topBtn}
 | 
	
		
			
				|  |  | +									onClick={() => handleChange({ type: "accidentals", value: item.value })}
 | 
	
		
			
				|  |  | +								>
 | 
	
		
			
				|  |  | +									<div
 | 
	
		
			
				|  |  | +										class={[
 | 
	
		
			
				|  |  | +											styles.btnImg,
 | 
	
		
			
				|  |  | +											noteComputed.value.accidental === item.value && styles.btnImgActive,
 | 
	
		
			
				|  |  | +										]}
 | 
	
		
			
				|  |  | +									>
 | 
	
		
			
				|  |  | +										<img class={styles.topBtnIcon} src={item.icon} />
 | 
	
		
			
				|  |  | +									</div>
 | 
	
		
			
				|  |  | +									<div class={styles.btnName}>{item.name}</div>
 | 
	
		
			
				|  |  | +								</div>
 | 
	
		
			
				|  |  | +							))}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +							<div class={styles.topLine}></div>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -						{ABC_DATA.accidentals.map((item) => (
 | 
	
		
			
				|  |  |  							<div
 | 
	
		
			
				|  |  |  								class={styles.topBtn}
 | 
	
		
			
				|  |  | -								onClick={() => handleChange({ type: "accidentals", value: item.value })}
 | 
	
		
			
				|  |  | +								onClick={() => handleChange({ type: "tie", value: ABC_DATA.tie[0].value })}
 | 
	
		
			
				|  |  |  							>
 | 
	
		
			
				|  |  |  								<div
 | 
	
		
			
				|  |  |  									class={[
 | 
	
		
			
				|  |  |  										styles.btnImg,
 | 
	
		
			
				|  |  | -										noteComputed.value.accidental === item.value && styles.btnImgActive,
 | 
	
		
			
				|  |  | +										noteComputed.value.tieline === ABC_DATA.tie[0].value && styles.btnImgActive,
 | 
	
		
			
				|  |  |  									]}
 | 
	
		
			
				|  |  |  								>
 | 
	
		
			
				|  |  | -									<img class={styles.topBtnIcon} src={item.icon} />
 | 
	
		
			
				|  |  | +									<img class={styles.topBtnIcon} src={ABC_DATA.tie[0].icon} />
 | 
	
		
			
				|  |  |  								</div>
 | 
	
		
			
				|  |  | -								<div class={styles.btnName}>{item.name}</div>
 | 
	
		
			
				|  |  | -							</div>
 | 
	
		
			
				|  |  | -						))}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -						<div class={styles.topLine}></div>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -						<div
 | 
	
		
			
				|  |  | -							class={styles.topBtn}
 | 
	
		
			
				|  |  | -							onClick={() => handleChange({ type: "tie", value: ABC_DATA.tie[0].value })}
 | 
	
		
			
				|  |  | -						>
 | 
	
		
			
				|  |  | -							<div
 | 
	
		
			
				|  |  | -								class={[
 | 
	
		
			
				|  |  | -									styles.btnImg,
 | 
	
		
			
				|  |  | -									noteComputed.value.tieline === ABC_DATA.tie[0].value && styles.btnImgActive,
 | 
	
		
			
				|  |  | -								]}
 | 
	
		
			
				|  |  | -							>
 | 
	
		
			
				|  |  | -								<img class={styles.topBtnIcon} src={ABC_DATA.tie[0].icon} />
 | 
	
		
			
				|  |  | +								<div>{ABC_DATA.tie[0].name}</div>
 | 
	
		
			
				|  |  |  							</div>
 | 
	
		
			
				|  |  | -							<div>{ABC_DATA.tie[0].name}</div>
 | 
	
		
			
				|  |  | -						</div>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -						<div
 | 
	
		
			
				|  |  | -							class={styles.topBtn}
 | 
	
		
			
				|  |  | -							onClick={() => handleChange({ type: "tie", value: ABC_DATA.tie[1].value })}
 | 
	
		
			
				|  |  | -						>
 | 
	
		
			
				|  |  | -							<div
 | 
	
		
			
				|  |  | -								class={[
 | 
	
		
			
				|  |  | -									styles.btnImg,
 | 
	
		
			
				|  |  | -									ABC_DATA.tie[1].value.includes(noteComputed.value.tie) && styles.btnImgActive,
 | 
	
		
			
				|  |  | -								]}
 | 
	
		
			
				|  |  | -							>
 | 
	
		
			
				|  |  | -								<img class={styles.topBtnIcon} src={ABC_DATA.tie[1].icon} />
 | 
	
		
			
				|  |  | -							</div>
 | 
	
		
			
				|  |  | -							<div>{ABC_DATA.tie[1].name}</div>
 | 
	
		
			
				|  |  | -						</div>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -						<div class={styles.topLine}></div>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -						{ABC_DATA.play.slice(0, 4).map((item) => (
 | 
	
		
			
				|  |  |  							<div
 | 
	
		
			
				|  |  | -								class={[styles.topBtn]}
 | 
	
		
			
				|  |  | -								onClick={() => handleChange({ type: "play", value: item.value })}
 | 
	
		
			
				|  |  | +								class={styles.topBtn}
 | 
	
		
			
				|  |  | +								onClick={() => handleChange({ type: "tie", value: ABC_DATA.tie[1].value })}
 | 
	
		
			
				|  |  |  							>
 | 
	
		
			
				|  |  |  								<div
 | 
	
		
			
				|  |  |  									class={[
 | 
	
		
			
				|  |  |  										styles.btnImg,
 | 
	
		
			
				|  |  | -										noteComputed.value.play?.includes(item.value) && styles.btnImgActive,
 | 
	
		
			
				|  |  | +										ABC_DATA.tie[1].value.includes(noteComputed.value.tie) && styles.btnImgActive,
 | 
	
		
			
				|  |  |  									]}
 | 
	
		
			
				|  |  |  								>
 | 
	
		
			
				|  |  | -									<img class={styles.topBtnIcon} src={item.icon} />
 | 
	
		
			
				|  |  | +									<img class={styles.topBtnIcon} src={ABC_DATA.tie[1].icon} />
 | 
	
		
			
				|  |  |  								</div>
 | 
	
		
			
				|  |  | -								<div>{item.name}</div>
 | 
	
		
			
				|  |  | +								<div>{ABC_DATA.tie[1].name}</div>
 | 
	
		
			
				|  |  |  							</div>
 | 
	
		
			
				|  |  | -						))}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -						<NPopover
 | 
	
		
			
				|  |  | -							class={styles.popupWrap}
 | 
	
		
			
				|  |  | -							showArrow={false}
 | 
	
		
			
				|  |  | -							trigger="click"
 | 
	
		
			
				|  |  | -							contentStyle={{ width: "400px" }}
 | 
	
		
			
				|  |  | -						>
 | 
	
		
			
				|  |  | -							{{
 | 
	
		
			
				|  |  | -								trigger: () => (
 | 
	
		
			
				|  |  | -									<div class={styles.topDownArrow}>
 | 
	
		
			
				|  |  | -										<img src={getImage("icon_arrow.png")} />
 | 
	
		
			
				|  |  | +							<div class={styles.topLine}></div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +							{ABC_DATA.play.slice(0, 4).map((item) => (
 | 
	
		
			
				|  |  | +								<div
 | 
	
		
			
				|  |  | +									class={[styles.topBtn]}
 | 
	
		
			
				|  |  | +									onClick={() => handleChange({ type: "play", value: item.value })}
 | 
	
		
			
				|  |  | +								>
 | 
	
		
			
				|  |  | +									<div
 | 
	
		
			
				|  |  | +										class={[
 | 
	
		
			
				|  |  | +											styles.btnImg,
 | 
	
		
			
				|  |  | +											noteComputed.value.play?.includes(item.value) && styles.btnImgActive,
 | 
	
		
			
				|  |  | +										]}
 | 
	
		
			
				|  |  | +									>
 | 
	
		
			
				|  |  | +										<img class={styles.topBtnIcon} src={item.icon} />
 | 
	
		
			
				|  |  |  									</div>
 | 
	
		
			
				|  |  | -								),
 | 
	
		
			
				|  |  | -								default: () => (
 | 
	
		
			
				|  |  | -									<NGrid cols={4} yGap={8}>
 | 
	
		
			
				|  |  | -										{ABC_DATA.play.slice(4).map((item) => (
 | 
	
		
			
				|  |  | -											<NGi>
 | 
	
		
			
				|  |  | -												<div
 | 
	
		
			
				|  |  | -													class={[
 | 
	
		
			
				|  |  | -														styles.btnItem,
 | 
	
		
			
				|  |  | -														noteComputed.value.play?.includes(item.value) && styles.btnItemActive,
 | 
	
		
			
				|  |  | -													]}
 | 
	
		
			
				|  |  | -													onClick={() => {
 | 
	
		
			
				|  |  | -														data.morePlay = false;
 | 
	
		
			
				|  |  | -														handleChange({ type: "play", value: item.value });
 | 
	
		
			
				|  |  | -													}}
 | 
	
		
			
				|  |  | -												>
 | 
	
		
			
				|  |  | -													<div class={styles.btnItemIcon}>
 | 
	
		
			
				|  |  | -														<TheIcon iconClassName={item.icon} />
 | 
	
		
			
				|  |  | +									<div>{item.name}</div>
 | 
	
		
			
				|  |  | +								</div>
 | 
	
		
			
				|  |  | +							))}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +							<NPopover
 | 
	
		
			
				|  |  | +								class={styles.popupWrap}
 | 
	
		
			
				|  |  | +								showArrow={false}
 | 
	
		
			
				|  |  | +								trigger="click"
 | 
	
		
			
				|  |  | +								contentStyle={{ width: "400px" }}
 | 
	
		
			
				|  |  | +							>
 | 
	
		
			
				|  |  | +								{{
 | 
	
		
			
				|  |  | +									trigger: () => (
 | 
	
		
			
				|  |  | +										<div class={styles.topDownArrow}>
 | 
	
		
			
				|  |  | +											<img src={getImage("icon_arrow.png")} />
 | 
	
		
			
				|  |  | +										</div>
 | 
	
		
			
				|  |  | +									),
 | 
	
		
			
				|  |  | +									default: () => (
 | 
	
		
			
				|  |  | +										<NGrid cols={4} yGap={8}>
 | 
	
		
			
				|  |  | +											{ABC_DATA.play.slice(4).map((item) => (
 | 
	
		
			
				|  |  | +												<NGi>
 | 
	
		
			
				|  |  | +													<div
 | 
	
		
			
				|  |  | +														class={[
 | 
	
		
			
				|  |  | +															styles.btnItem,
 | 
	
		
			
				|  |  | +															noteComputed.value.play?.includes(item.value) && styles.btnItemActive,
 | 
	
		
			
				|  |  | +														]}
 | 
	
		
			
				|  |  | +														onClick={() => {
 | 
	
		
			
				|  |  | +															data.morePlay = false;
 | 
	
		
			
				|  |  | +															handleChange({ type: "play", value: item.value });
 | 
	
		
			
				|  |  | +														}}
 | 
	
		
			
				|  |  | +													>
 | 
	
		
			
				|  |  | +														<div class={styles.btnItemIcon}>
 | 
	
		
			
				|  |  | +															<TheIcon iconClassName={item.icon} />
 | 
	
		
			
				|  |  | +														</div>
 | 
	
		
			
				|  |  | +														<div>{item.name}</div>
 | 
	
		
			
				|  |  |  													</div>
 | 
	
		
			
				|  |  | -													<div>{item.name}</div>
 | 
	
		
			
				|  |  | -												</div>
 | 
	
		
			
				|  |  | -											</NGi>
 | 
	
		
			
				|  |  | -										))}
 | 
	
		
			
				|  |  | -									</NGrid>
 | 
	
		
			
				|  |  | -								),
 | 
	
		
			
				|  |  | -							}}
 | 
	
		
			
				|  |  | -						</NPopover>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -						<div class={styles.topLine}></div>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -						<NDropdown
 | 
	
		
			
				|  |  | -							trigger="click"
 | 
	
		
			
				|  |  | -							options={ABC_DATA.slus as any}
 | 
	
		
			
				|  |  | -							labelField="name"
 | 
	
		
			
				|  |  | -							keyField="value"
 | 
	
		
			
				|  |  | -							onSelect={(val) => {
 | 
	
		
			
				|  |  | -								console.log(val);
 | 
	
		
			
				|  |  | -								handleChange({ type: "slus", value: val });
 | 
	
		
			
				|  |  | -							}}
 | 
	
		
			
				|  |  | -						>
 | 
	
		
			
				|  |  | -							<div class={[styles.topBtn]}>
 | 
	
		
			
				|  |  | -								<div class={styles.btnImg}>
 | 
	
		
			
				|  |  | -									<img class={styles.topBtnIcon} src={getImage("icon_13.png")} />
 | 
	
		
			
				|  |  | +												</NGi>
 | 
	
		
			
				|  |  | +											))}
 | 
	
		
			
				|  |  | +										</NGrid>
 | 
	
		
			
				|  |  | +									),
 | 
	
		
			
				|  |  | +								}}
 | 
	
		
			
				|  |  | +							</NPopover>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +							<div class={styles.topLine}></div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +							<NDropdown
 | 
	
		
			
				|  |  | +								trigger="click"
 | 
	
		
			
				|  |  | +								options={ABC_DATA.slus as any}
 | 
	
		
			
				|  |  | +								labelField="name"
 | 
	
		
			
				|  |  | +								keyField="value"
 | 
	
		
			
				|  |  | +								onSelect={(val) => {
 | 
	
		
			
				|  |  | +									console.log(val);
 | 
	
		
			
				|  |  | +									handleChange({ type: "slus", value: val });
 | 
	
		
			
				|  |  | +								}}
 | 
	
		
			
				|  |  | +							>
 | 
	
		
			
				|  |  | +								<div class={[styles.topBtn]}>
 | 
	
		
			
				|  |  | +									<div class={styles.btnImg}>
 | 
	
		
			
				|  |  | +										<img class={styles.topBtnIcon} src={getImage("icon_13.png")} />
 | 
	
		
			
				|  |  | +									</div>
 | 
	
		
			
				|  |  | +									<div>连音</div>
 | 
	
		
			
				|  |  |  								</div>
 | 
	
		
			
				|  |  | -								<div>连音</div>
 | 
	
		
			
				|  |  | -							</div>
 | 
	
		
			
				|  |  | -						</NDropdown>
 | 
	
		
			
				|  |  | +							</NDropdown>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -						<div class={[styles.topBtn, styles.btnDisabled]}>
 | 
	
		
			
				|  |  | -							<div class={styles.btnImg}>
 | 
	
		
			
				|  |  | -								<img class={styles.topBtnIcon} src={getImage("icon_14.png")} />
 | 
	
		
			
				|  |  | +							<div class={[styles.topBtn, styles.btnDisabled]}>
 | 
	
		
			
				|  |  | +								<div class={styles.btnImg}>
 | 
	
		
			
				|  |  | +									<img class={styles.topBtnIcon} src={getImage("icon_14.png")} />
 | 
	
		
			
				|  |  | +								</div>
 | 
	
		
			
				|  |  | +								<div>翻转</div>
 | 
	
		
			
				|  |  |  							</div>
 | 
	
		
			
				|  |  | -							<div>翻转</div>
 | 
	
		
			
				|  |  | -						</div>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -						<div class={styles.topLine}></div>
 | 
	
		
			
				|  |  | +							<div class={styles.topLine}></div>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -						<NPopover
 | 
	
		
			
				|  |  | -							class={styles.popupWrap}
 | 
	
		
			
				|  |  | -							showArrow={false}
 | 
	
		
			
				|  |  | -							v-model:show={popup.selectSubjectShow}
 | 
	
		
			
				|  |  | -							trigger="click"
 | 
	
		
			
				|  |  | -							contentStyle={{ width: "320px" }}
 | 
	
		
			
				|  |  | -						>
 | 
	
		
			
				|  |  | -							{{
 | 
	
		
			
				|  |  | -								trigger: () => (
 | 
	
		
			
				|  |  | -									<div class={styles.topBtn}>
 | 
	
		
			
				|  |  | -										<div class={styles.btnImg} onClick={() => (popup.instrument = true)}>
 | 
	
		
			
				|  |  | -											<img class={styles.topBtnIcon} src={getImage("icon_25.png")} />
 | 
	
		
			
				|  |  | +							<NPopover
 | 
	
		
			
				|  |  | +								class={styles.popupWrap}
 | 
	
		
			
				|  |  | +								showArrow={false}
 | 
	
		
			
				|  |  | +								v-model:show={popup.selectSubjectShow}
 | 
	
		
			
				|  |  | +								trigger="click"
 | 
	
		
			
				|  |  | +								contentStyle={{ width: "320px" }}
 | 
	
		
			
				|  |  | +							>
 | 
	
		
			
				|  |  | +								{{
 | 
	
		
			
				|  |  | +									trigger: () => (
 | 
	
		
			
				|  |  | +										<div class={styles.topBtn}>
 | 
	
		
			
				|  |  | +											<div class={styles.btnImg} onClick={() => (popup.instrument = true)}>
 | 
	
		
			
				|  |  | +												<img class={styles.topBtnIcon} src={getImage("icon_25.png")} />
 | 
	
		
			
				|  |  | +											</div>
 | 
	
		
			
				|  |  | +											<div>选择声部</div>
 | 
	
		
			
				|  |  |  										</div>
 | 
	
		
			
				|  |  | -										<div>选择声部</div>
 | 
	
		
			
				|  |  | -									</div>
 | 
	
		
			
				|  |  | -								),
 | 
	
		
			
				|  |  | -								default: () => (
 | 
	
		
			
				|  |  | -									<>
 | 
	
		
			
				|  |  | -										<div class={styles.btnLineTitle}>选择声部</div>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -										<NSelect
 | 
	
		
			
				|  |  | -											filterable
 | 
	
		
			
				|  |  | -											options={instruments.value}
 | 
	
		
			
				|  |  | -											v-model:value={abcData.synthOptions.program}
 | 
	
		
			
				|  |  | -											onUpdate:value={async () => {
 | 
	
		
			
				|  |  | -												abcData.synthControl.disable(true);
 | 
	
		
			
				|  |  | -												data.playState = false;
 | 
	
		
			
				|  |  | -												await loadMiniMp3();
 | 
	
		
			
				|  |  | -												resetMidi(true);
 | 
	
		
			
				|  |  | -												popup.selectSubjectShow = false;
 | 
	
		
			
				|  |  | -											}}
 | 
	
		
			
				|  |  | -										></NSelect>
 | 
	
		
			
				|  |  | -									</>
 | 
	
		
			
				|  |  | -								),
 | 
	
		
			
				|  |  | -							}}
 | 
	
		
			
				|  |  | -						</NPopover>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -						<NPopover
 | 
	
		
			
				|  |  | -							class={styles.popupWrap}
 | 
	
		
			
				|  |  | -							showArrow={false}
 | 
	
		
			
				|  |  | -							v-model:show={popup.moveKeyShow}
 | 
	
		
			
				|  |  | -							trigger="click"
 | 
	
		
			
				|  |  | -							contentStyle={{ width: "320px" }}
 | 
	
		
			
				|  |  | -						>
 | 
	
		
			
				|  |  | -							{{
 | 
	
		
			
				|  |  | -								trigger: () => (
 | 
	
		
			
				|  |  | -									<div class={styles.topBtn}>
 | 
	
		
			
				|  |  | -										<div class={styles.btnImg}>
 | 
	
		
			
				|  |  | -											<img class={styles.topBtnIcon} src={getImage("icon_15.png")} />
 | 
	
		
			
				|  |  | +									),
 | 
	
		
			
				|  |  | +									default: () => (
 | 
	
		
			
				|  |  | +										<>
 | 
	
		
			
				|  |  | +											<div class={styles.btnLineTitle}>选择声部</div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +											<NSelect
 | 
	
		
			
				|  |  | +												filterable
 | 
	
		
			
				|  |  | +												options={instruments.value}
 | 
	
		
			
				|  |  | +												v-model:value={abcData.synthOptions.program}
 | 
	
		
			
				|  |  | +												onUpdate:value={async () => {
 | 
	
		
			
				|  |  | +													abcData.synthControl.disable(true);
 | 
	
		
			
				|  |  | +													data.playState = false;
 | 
	
		
			
				|  |  | +													await loadMiniMp3();
 | 
	
		
			
				|  |  | +													resetMidi(true);
 | 
	
		
			
				|  |  | +													popup.selectSubjectShow = false;
 | 
	
		
			
				|  |  | +												}}
 | 
	
		
			
				|  |  | +											></NSelect>
 | 
	
		
			
				|  |  | +										</>
 | 
	
		
			
				|  |  | +									),
 | 
	
		
			
				|  |  | +								}}
 | 
	
		
			
				|  |  | +							</NPopover>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +							<NPopover
 | 
	
		
			
				|  |  | +								class={styles.popupWrap}
 | 
	
		
			
				|  |  | +								showArrow={false}
 | 
	
		
			
				|  |  | +								v-model:show={popup.moveKeyShow}
 | 
	
		
			
				|  |  | +								trigger="click"
 | 
	
		
			
				|  |  | +								contentStyle={{ width: "320px" }}
 | 
	
		
			
				|  |  | +							>
 | 
	
		
			
				|  |  | +								{{
 | 
	
		
			
				|  |  | +									trigger: () => (
 | 
	
		
			
				|  |  | +										<div class={styles.topBtn}>
 | 
	
		
			
				|  |  | +											<div class={styles.btnImg}>
 | 
	
		
			
				|  |  | +												<img class={styles.topBtnIcon} src={getImage("icon_15.png")} />
 | 
	
		
			
				|  |  | +											</div>
 | 
	
		
			
				|  |  | +											<div>移调</div>
 | 
	
		
			
				|  |  |  										</div>
 | 
	
		
			
				|  |  | -										<div>移调</div>
 | 
	
		
			
				|  |  | -									</div>
 | 
	
		
			
				|  |  | -								),
 | 
	
		
			
				|  |  | -								default: () => (
 | 
	
		
			
				|  |  | -									<>
 | 
	
		
			
				|  |  | -										<div class={styles.btnLineTitle}>移调方式</div>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -										<NSpace>
 | 
	
		
			
				|  |  | -											<NButton
 | 
	
		
			
				|  |  | -												secondary
 | 
	
		
			
				|  |  | -												type={data.moveKeyType === "inset" ? "primary" : "default"}
 | 
	
		
			
				|  |  | -												onClick={() => (data.moveKeyType = "inset")}
 | 
	
		
			
				|  |  | -											>
 | 
	
		
			
				|  |  | -												<NIcon component={GripLinesVertical} />
 | 
	
		
			
				|  |  | -												最靠近
 | 
	
		
			
				|  |  | -											</NButton>
 | 
	
		
			
				|  |  | -											<NButton
 | 
	
		
			
				|  |  | -												secondary
 | 
	
		
			
				|  |  | -												type={data.moveKeyType === "down" ? "primary" : "default"}
 | 
	
		
			
				|  |  | -												onClick={() => (data.moveKeyType = "down")}
 | 
	
		
			
				|  |  | -											>
 | 
	
		
			
				|  |  | -												<NIcon component={LongArrowAltDown} />
 | 
	
		
			
				|  |  | -												向下移调
 | 
	
		
			
				|  |  | -											</NButton>
 | 
	
		
			
				|  |  | -											<NButton
 | 
	
		
			
				|  |  | -												secondary
 | 
	
		
			
				|  |  | -												type={data.moveKeyType === "up" ? "primary" : "default"}
 | 
	
		
			
				|  |  | -												onClick={() => (data.moveKeyType = "up")}
 | 
	
		
			
				|  |  | -											>
 | 
	
		
			
				|  |  | -												<NIcon component={LongArrowAltUp} />
 | 
	
		
			
				|  |  | -												向上移调
 | 
	
		
			
				|  |  | -											</NButton>
 | 
	
		
			
				|  |  | -										</NSpace>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -										<div class={styles.btnLineTitle}>目标音调</div>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -										<NGrid cols={5} yGap={8}>
 | 
	
		
			
				|  |  | -											{ABC_DATA.key
 | 
	
		
			
				|  |  | -												.sort((a, b) => b.step - a.step)
 | 
	
		
			
				|  |  | -												.map((item) => (
 | 
	
		
			
				|  |  | -													<NGi>
 | 
	
		
			
				|  |  | -														<div
 | 
	
		
			
				|  |  | -															class={[
 | 
	
		
			
				|  |  | -																styles.btnItem,
 | 
	
		
			
				|  |  | -																abcData.abc.key === item.value && styles.btnItemActive,
 | 
	
		
			
				|  |  | -															]}
 | 
	
		
			
				|  |  | -															onClick={() => handleMoveKey(item)}
 | 
	
		
			
				|  |  | -														>
 | 
	
		
			
				|  |  | -															<div class={[styles.btnItemIcon]}>
 | 
	
		
			
				|  |  | -																<TheIcon iconClassName={item.icon} />
 | 
	
		
			
				|  |  | +									),
 | 
	
		
			
				|  |  | +									default: () => (
 | 
	
		
			
				|  |  | +										<>
 | 
	
		
			
				|  |  | +											<div class={styles.btnLineTitle}>移调方式</div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +											<NSpace>
 | 
	
		
			
				|  |  | +												<NButton
 | 
	
		
			
				|  |  | +													secondary
 | 
	
		
			
				|  |  | +													type={data.moveKeyType === "inset" ? "primary" : "default"}
 | 
	
		
			
				|  |  | +													onClick={() => (data.moveKeyType = "inset")}
 | 
	
		
			
				|  |  | +												>
 | 
	
		
			
				|  |  | +													<NIcon component={GripLinesVertical} />
 | 
	
		
			
				|  |  | +													最靠近
 | 
	
		
			
				|  |  | +												</NButton>
 | 
	
		
			
				|  |  | +												<NButton
 | 
	
		
			
				|  |  | +													secondary
 | 
	
		
			
				|  |  | +													type={data.moveKeyType === "down" ? "primary" : "default"}
 | 
	
		
			
				|  |  | +													onClick={() => (data.moveKeyType = "down")}
 | 
	
		
			
				|  |  | +												>
 | 
	
		
			
				|  |  | +													<NIcon component={LongArrowAltDown} />
 | 
	
		
			
				|  |  | +													向下移调
 | 
	
		
			
				|  |  | +												</NButton>
 | 
	
		
			
				|  |  | +												<NButton
 | 
	
		
			
				|  |  | +													secondary
 | 
	
		
			
				|  |  | +													type={data.moveKeyType === "up" ? "primary" : "default"}
 | 
	
		
			
				|  |  | +													onClick={() => (data.moveKeyType = "up")}
 | 
	
		
			
				|  |  | +												>
 | 
	
		
			
				|  |  | +													<NIcon component={LongArrowAltUp} />
 | 
	
		
			
				|  |  | +													向上移调
 | 
	
		
			
				|  |  | +												</NButton>
 | 
	
		
			
				|  |  | +											</NSpace>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +											<div class={styles.btnLineTitle}>目标音调</div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +											<NGrid cols={5} yGap={8}>
 | 
	
		
			
				|  |  | +												{ABC_DATA.key
 | 
	
		
			
				|  |  | +													.sort((a, b) => b.step - a.step)
 | 
	
		
			
				|  |  | +													.map((item) => (
 | 
	
		
			
				|  |  | +														<NGi>
 | 
	
		
			
				|  |  | +															<div
 | 
	
		
			
				|  |  | +																class={[
 | 
	
		
			
				|  |  | +																	styles.btnItem,
 | 
	
		
			
				|  |  | +																	abcData.abc.key === item.value && styles.btnItemActive,
 | 
	
		
			
				|  |  | +																]}
 | 
	
		
			
				|  |  | +																onClick={() => handleMoveKey(item)}
 | 
	
		
			
				|  |  | +															>
 | 
	
		
			
				|  |  | +																<div class={[styles.btnItemIcon]}>
 | 
	
		
			
				|  |  | +																	<TheIcon iconClassName={item.icon} />
 | 
	
		
			
				|  |  | +																</div>
 | 
	
		
			
				|  |  | +																<div class={styles.btnItemName}>{item.name}</div>
 | 
	
		
			
				|  |  |  															</div>
 | 
	
		
			
				|  |  | -															<div class={styles.btnItemName}>{item.name}</div>
 | 
	
		
			
				|  |  | -														</div>
 | 
	
		
			
				|  |  | -													</NGi>
 | 
	
		
			
				|  |  | -												))}
 | 
	
		
			
				|  |  | -										</NGrid>
 | 
	
		
			
				|  |  | -									</>
 | 
	
		
			
				|  |  | -								),
 | 
	
		
			
				|  |  | -							}}
 | 
	
		
			
				|  |  | -						</NPopover>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -						<NPopover
 | 
	
		
			
				|  |  | -							class={styles.popupWrap}
 | 
	
		
			
				|  |  | -							showArrow={false}
 | 
	
		
			
				|  |  | -							v-model:value={popup.speedShow}
 | 
	
		
			
				|  |  | -							trigger="click"
 | 
	
		
			
				|  |  | -							placement="bottom"
 | 
	
		
			
				|  |  | -							displayDirective="show"
 | 
	
		
			
				|  |  | -						>
 | 
	
		
			
				|  |  | -							{{
 | 
	
		
			
				|  |  | -								trigger: () => (
 | 
	
		
			
				|  |  | -									<div class={[styles.topBtn]}>
 | 
	
		
			
				|  |  | -										<div class={styles.btnImg}>
 | 
	
		
			
				|  |  | -											<img class={styles.topBtnIcon} src={getImage("icon_16.png")} />
 | 
	
		
			
				|  |  | +														</NGi>
 | 
	
		
			
				|  |  | +													))}
 | 
	
		
			
				|  |  | +											</NGrid>
 | 
	
		
			
				|  |  | +										</>
 | 
	
		
			
				|  |  | +									),
 | 
	
		
			
				|  |  | +								}}
 | 
	
		
			
				|  |  | +							</NPopover>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +							<NPopover
 | 
	
		
			
				|  |  | +								class={styles.popupWrap}
 | 
	
		
			
				|  |  | +								showArrow={false}
 | 
	
		
			
				|  |  | +								v-model:value={popup.speedShow}
 | 
	
		
			
				|  |  | +								trigger="click"
 | 
	
		
			
				|  |  | +								placement="bottom"
 | 
	
		
			
				|  |  | +								displayDirective="show"
 | 
	
		
			
				|  |  | +							>
 | 
	
		
			
				|  |  | +								{{
 | 
	
		
			
				|  |  | +									trigger: () => (
 | 
	
		
			
				|  |  | +										<div class={[styles.topBtn]}>
 | 
	
		
			
				|  |  | +											<div class={styles.btnImg}>
 | 
	
		
			
				|  |  | +												<img class={styles.topBtnIcon} src={getImage("icon_16.png")} />
 | 
	
		
			
				|  |  | +											</div>
 | 
	
		
			
				|  |  | +											<div>速度调整</div>
 | 
	
		
			
				|  |  |  										</div>
 | 
	
		
			
				|  |  | -										<div>速度调整</div>
 | 
	
		
			
				|  |  | -									</div>
 | 
	
		
			
				|  |  | -								),
 | 
	
		
			
				|  |  | -								default: () => <TheSpeed onChange={(val) => handleChange(val)} />,
 | 
	
		
			
				|  |  | -							}}
 | 
	
		
			
				|  |  | -						</NPopover>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -						<NPopover
 | 
	
		
			
				|  |  | -							class={styles.popupWrap}
 | 
	
		
			
				|  |  | -							showArrow={false}
 | 
	
		
			
				|  |  | -							v-model:show={popup.staffShow}
 | 
	
		
			
				|  |  | -							trigger="click"
 | 
	
		
			
				|  |  | -							placement="bottom"
 | 
	
		
			
				|  |  | -							contentStyle={{ width: "320px" }}
 | 
	
		
			
				|  |  | -						>
 | 
	
		
			
				|  |  | -							{{
 | 
	
		
			
				|  |  | -								trigger: () => (
 | 
	
		
			
				|  |  | -									<div class={[styles.topBtn]}>
 | 
	
		
			
				|  |  | -										<div class={styles.btnImg}>
 | 
	
		
			
				|  |  | -											<img class={styles.topBtnIcon} src={getImage("icon_17.png")} />
 | 
	
		
			
				|  |  | +									),
 | 
	
		
			
				|  |  | +									default: () => <TheSpeed onChange={(val) => handleChange(val)} />,
 | 
	
		
			
				|  |  | +								}}
 | 
	
		
			
				|  |  | +							</NPopover>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +							<NPopover
 | 
	
		
			
				|  |  | +								class={styles.popupWrap}
 | 
	
		
			
				|  |  | +								showArrow={false}
 | 
	
		
			
				|  |  | +								v-model:show={popup.staffShow}
 | 
	
		
			
				|  |  | +								trigger="click"
 | 
	
		
			
				|  |  | +								placement="bottom"
 | 
	
		
			
				|  |  | +								contentStyle={{ width: "320px" }}
 | 
	
		
			
				|  |  | +							>
 | 
	
		
			
				|  |  | +								{{
 | 
	
		
			
				|  |  | +									trigger: () => (
 | 
	
		
			
				|  |  | +										<div class={[styles.topBtn]}>
 | 
	
		
			
				|  |  | +											<div class={styles.btnImg}>
 | 
	
		
			
				|  |  | +												<img class={styles.topBtnIcon} src={getImage("icon_17.png")} />
 | 
	
		
			
				|  |  | +											</div>
 | 
	
		
			
				|  |  | +											<div>谱面显示</div>
 | 
	
		
			
				|  |  |  										</div>
 | 
	
		
			
				|  |  | -										<div>谱面显示</div>
 | 
	
		
			
				|  |  | -									</div>
 | 
	
		
			
				|  |  | -								),
 | 
	
		
			
				|  |  | -								default: () => (
 | 
	
		
			
				|  |  | -									<>
 | 
	
		
			
				|  |  | -										<div class={styles.btnLineTitle}>乐谱大小</div>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -										<NSpace>
 | 
	
		
			
				|  |  | -											<NButton
 | 
	
		
			
				|  |  | -												type={abcData.abcOptions.staffwidth === 1200 ? "primary" : "default"}
 | 
	
		
			
				|  |  | -												secondary
 | 
	
		
			
				|  |  | -												onClick={() => {
 | 
	
		
			
				|  |  | -													abcData.abcOptions.staffwidth = 1200;
 | 
	
		
			
				|  |  | -													handleResetRender();
 | 
	
		
			
				|  |  | -												}}
 | 
	
		
			
				|  |  | -											>
 | 
	
		
			
				|  |  | -												小
 | 
	
		
			
				|  |  | -											</NButton>
 | 
	
		
			
				|  |  | -											<NButton
 | 
	
		
			
				|  |  | -												type={abcData.abcOptions.staffwidth === 800 ? "primary" : "default"}
 | 
	
		
			
				|  |  | -												secondary
 | 
	
		
			
				|  |  | -												onClick={() => {
 | 
	
		
			
				|  |  | -													abcData.abcOptions.staffwidth = 800;
 | 
	
		
			
				|  |  | -													handleResetRender();
 | 
	
		
			
				|  |  | -												}}
 | 
	
		
			
				|  |  | -											>
 | 
	
		
			
				|  |  | -												中
 | 
	
		
			
				|  |  | -											</NButton>
 | 
	
		
			
				|  |  | -											<NButton
 | 
	
		
			
				|  |  | -												type={abcData.abcOptions.staffwidth === 400 ? "primary" : "default"}
 | 
	
		
			
				|  |  | -												secondary
 | 
	
		
			
				|  |  | -												onClick={() => {
 | 
	
		
			
				|  |  | -													abcData.abcOptions.staffwidth = 400;
 | 
	
		
			
				|  |  | -													handleResetRender();
 | 
	
		
			
				|  |  | -												}}
 | 
	
		
			
				|  |  | -											>
 | 
	
		
			
				|  |  | -												大
 | 
	
		
			
				|  |  | -											</NButton>
 | 
	
		
			
				|  |  | -										</NSpace>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -										<div class={styles.btnLineTitle}>小节数</div>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -										<NSpace vertical>
 | 
	
		
			
				|  |  | -											<NInputNumber
 | 
	
		
			
				|  |  | -												min={1}
 | 
	
		
			
				|  |  | -												v-model:value={(abcData.abcOptions.wrap as any).preferredMeasuresPerLine}
 | 
	
		
			
				|  |  | -												placeholder="请输入小节数"
 | 
	
		
			
				|  |  | -												onUpdate:value={() => {
 | 
	
		
			
				|  |  | -													handleResetRender();
 | 
	
		
			
				|  |  | -												}}
 | 
	
		
			
				|  |  | -											/>
 | 
	
		
			
				|  |  | +									),
 | 
	
		
			
				|  |  | +									default: () => (
 | 
	
		
			
				|  |  | +										<>
 | 
	
		
			
				|  |  | +											<div class={styles.btnLineTitle}>乐谱大小</div>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -											{/* <NSpace style={{ marginTop: "20px" }} align="center" wrap={false} wrapItem={false}>
 | 
	
		
			
				|  |  | -												<NButton style={{ width: "48%" }} round onClick={() => (popup.staffShow = false)}>
 | 
	
		
			
				|  |  | -													取消
 | 
	
		
			
				|  |  | +											<NSpace>
 | 
	
		
			
				|  |  | +												<NButton
 | 
	
		
			
				|  |  | +													type={abcData.abcOptions.staffwidth === 1200 ? "primary" : "default"}
 | 
	
		
			
				|  |  | +													secondary
 | 
	
		
			
				|  |  | +													onClick={() => {
 | 
	
		
			
				|  |  | +														abcData.abcOptions.staffwidth = 1200;
 | 
	
		
			
				|  |  | +														handleResetRender();
 | 
	
		
			
				|  |  | +													}}
 | 
	
		
			
				|  |  | +												>
 | 
	
		
			
				|  |  | +													小
 | 
	
		
			
				|  |  |  												</NButton>
 | 
	
		
			
				|  |  |  												<NButton
 | 
	
		
			
				|  |  | -													style={{ width: "48%" }}
 | 
	
		
			
				|  |  | -													round
 | 
	
		
			
				|  |  | -													type="primary"
 | 
	
		
			
				|  |  | +													type={abcData.abcOptions.staffwidth === 800 ? "primary" : "default"}
 | 
	
		
			
				|  |  | +													secondary
 | 
	
		
			
				|  |  | +													onClick={() => {
 | 
	
		
			
				|  |  | +														abcData.abcOptions.staffwidth = 800;
 | 
	
		
			
				|  |  | +														handleResetRender();
 | 
	
		
			
				|  |  | +													}}
 | 
	
		
			
				|  |  |  												>
 | 
	
		
			
				|  |  | -													确定
 | 
	
		
			
				|  |  | +													中
 | 
	
		
			
				|  |  |  												</NButton>
 | 
	
		
			
				|  |  | -											</NSpace> */}
 | 
	
		
			
				|  |  | -										</NSpace>
 | 
	
		
			
				|  |  | -									</>
 | 
	
		
			
				|  |  | -								),
 | 
	
		
			
				|  |  | -							}}
 | 
	
		
			
				|  |  | -						</NPopover>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -						<NPopover
 | 
	
		
			
				|  |  | -							class={styles.popupWrap}
 | 
	
		
			
				|  |  | -							showArrow={false}
 | 
	
		
			
				|  |  | -							v-model:show={popup.barShow}
 | 
	
		
			
				|  |  | -							trigger="click"
 | 
	
		
			
				|  |  | -							placement="bottom"
 | 
	
		
			
				|  |  | -							contentStyle={{ width: "320px" }}
 | 
	
		
			
				|  |  | -						>
 | 
	
		
			
				|  |  | -							{{
 | 
	
		
			
				|  |  | -								trigger: () => (
 | 
	
		
			
				|  |  | -									<div class={[styles.topBtn]}>
 | 
	
		
			
				|  |  | -										<div class={styles.btnImg}>
 | 
	
		
			
				|  |  | -											<img class={styles.topBtnIcon} src={getImage("icon_18.png")} />
 | 
	
		
			
				|  |  | -										</div>
 | 
	
		
			
				|  |  | -										<div>添加小节</div>
 | 
	
		
			
				|  |  | -									</div>
 | 
	
		
			
				|  |  | -								),
 | 
	
		
			
				|  |  | -								default: () => (
 | 
	
		
			
				|  |  | -									<>
 | 
	
		
			
				|  |  | -										<div class={styles.btnLineTitle}>添加方式</div>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -										<NSpace>
 | 
	
		
			
				|  |  | -											<NButton
 | 
	
		
			
				|  |  | -												type={data.addMearseType === "pre" ? "primary" : "default"}
 | 
	
		
			
				|  |  | -												secondary
 | 
	
		
			
				|  |  | -												onClick={() => (data.addMearseType = "pre")}
 | 
	
		
			
				|  |  | -											>
 | 
	
		
			
				|  |  | -												当前小节前
 | 
	
		
			
				|  |  | -											</NButton>
 | 
	
		
			
				|  |  | -											<NButton
 | 
	
		
			
				|  |  | -												type={data.addMearseType === "next" ? "primary" : "default"}
 | 
	
		
			
				|  |  | -												secondary
 | 
	
		
			
				|  |  | -												onClick={() => (data.addMearseType = "next")}
 | 
	
		
			
				|  |  | -											>
 | 
	
		
			
				|  |  | -												当前小节后
 | 
	
		
			
				|  |  | -											</NButton>
 | 
	
		
			
				|  |  | -											<NButton
 | 
	
		
			
				|  |  | -												type={data.addMearseType === "finish" ? "primary" : "default"}
 | 
	
		
			
				|  |  | -												secondary
 | 
	
		
			
				|  |  | -												onClick={() => (data.addMearseType = "finish")}
 | 
	
		
			
				|  |  | -											>
 | 
	
		
			
				|  |  | -												曲谱末尾
 | 
	
		
			
				|  |  | -											</NButton>
 | 
	
		
			
				|  |  | -										</NSpace>
 | 
	
		
			
				|  |  | +												<NButton
 | 
	
		
			
				|  |  | +													type={abcData.abcOptions.staffwidth === 400 ? "primary" : "default"}
 | 
	
		
			
				|  |  | +													secondary
 | 
	
		
			
				|  |  | +													onClick={() => {
 | 
	
		
			
				|  |  | +														abcData.abcOptions.staffwidth = 400;
 | 
	
		
			
				|  |  | +														handleResetRender();
 | 
	
		
			
				|  |  | +													}}
 | 
	
		
			
				|  |  | +												>
 | 
	
		
			
				|  |  | +													大
 | 
	
		
			
				|  |  | +												</NButton>
 | 
	
		
			
				|  |  | +											</NSpace>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -										<div class={styles.btnLineTitle}>小节数</div>
 | 
	
		
			
				|  |  | +											<div class={styles.btnLineTitle}>小节数</div>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -										<NSpace vertical>
 | 
	
		
			
				|  |  | -											<NInputNumber
 | 
	
		
			
				|  |  | -												min={1}
 | 
	
		
			
				|  |  | -												v-model:value={data.addMearseNumber}
 | 
	
		
			
				|  |  | -												placeholder="请输入小节数"
 | 
	
		
			
				|  |  | -											/>
 | 
	
		
			
				|  |  | +											<NSpace vertical>
 | 
	
		
			
				|  |  | +												<NInputNumber
 | 
	
		
			
				|  |  | +													min={1}
 | 
	
		
			
				|  |  | +													v-model:value={(abcData.abcOptions.wrap as any).preferredMeasuresPerLine}
 | 
	
		
			
				|  |  | +													placeholder="请输入小节数"
 | 
	
		
			
				|  |  | +													onUpdate:value={() => {
 | 
	
		
			
				|  |  | +														handleResetRender();
 | 
	
		
			
				|  |  | +													}}
 | 
	
		
			
				|  |  | +												/>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -											<NSpace style={{ marginTop: "20px" }} align="center" wrap={false} wrapItem={false}>
 | 
	
		
			
				|  |  | -												<NButton style={{ width: "48%" }} round onClick={() => (popup.barShow = false)}>
 | 
	
		
			
				|  |  | +												{/* <NSpace style={{ marginTop: "20px" }} align="center" wrap={false} wrapItem={false}>
 | 
	
		
			
				|  |  | +												<NButton style={{ width: "48%" }} round onClick={() => (popup.staffShow = false)}>
 | 
	
		
			
				|  |  |  													取消
 | 
	
		
			
				|  |  |  												</NButton>
 | 
	
		
			
				|  |  |  												<NButton
 | 
	
		
			
				|  |  |  													style={{ width: "48%" }}
 | 
	
		
			
				|  |  |  													round
 | 
	
		
			
				|  |  |  													type="primary"
 | 
	
		
			
				|  |  | -													onClick={() => handleAddMearse()}
 | 
	
		
			
				|  |  |  												>
 | 
	
		
			
				|  |  |  													确定
 | 
	
		
			
				|  |  |  												</NButton>
 | 
	
		
			
				|  |  | +											</NSpace> */}
 | 
	
		
			
				|  |  |  											</NSpace>
 | 
	
		
			
				|  |  | -										</NSpace>
 | 
	
		
			
				|  |  | -									</>
 | 
	
		
			
				|  |  | -								),
 | 
	
		
			
				|  |  | -							}}
 | 
	
		
			
				|  |  | -						</NPopover>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -						<NPopover
 | 
	
		
			
				|  |  | -							class={styles.popupWrap}
 | 
	
		
			
				|  |  | -							v-model:show={popup.mearseDeleteShow}
 | 
	
		
			
				|  |  | -							trigger="click"
 | 
	
		
			
				|  |  | -							placement="bottom"
 | 
	
		
			
				|  |  | -						>
 | 
	
		
			
				|  |  | -							{{
 | 
	
		
			
				|  |  | -								trigger: () => (
 | 
	
		
			
				|  |  | -									<div class={[styles.topBtn]}>
 | 
	
		
			
				|  |  | -										<div class={styles.btnImg}>
 | 
	
		
			
				|  |  | -											<img class={styles.topBtnIcon} src={getImage("icon_19.png")} />
 | 
	
		
			
				|  |  | +										</>
 | 
	
		
			
				|  |  | +									),
 | 
	
		
			
				|  |  | +								}}
 | 
	
		
			
				|  |  | +							</NPopover>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +							<NPopover
 | 
	
		
			
				|  |  | +								class={styles.popupWrap}
 | 
	
		
			
				|  |  | +								showArrow={false}
 | 
	
		
			
				|  |  | +								v-model:show={popup.barShow}
 | 
	
		
			
				|  |  | +								trigger="click"
 | 
	
		
			
				|  |  | +								placement="bottom"
 | 
	
		
			
				|  |  | +								contentStyle={{ width: "320px" }}
 | 
	
		
			
				|  |  | +							>
 | 
	
		
			
				|  |  | +								{{
 | 
	
		
			
				|  |  | +									trigger: () => (
 | 
	
		
			
				|  |  | +										<div class={[styles.topBtn]}>
 | 
	
		
			
				|  |  | +											<div class={styles.btnImg}>
 | 
	
		
			
				|  |  | +												<img class={styles.topBtnIcon} src={getImage("icon_18.png")} />
 | 
	
		
			
				|  |  | +											</div>
 | 
	
		
			
				|  |  | +											<div>添加小节</div>
 | 
	
		
			
				|  |  |  										</div>
 | 
	
		
			
				|  |  | -										<div>删除小节</div>
 | 
	
		
			
				|  |  | -									</div>
 | 
	
		
			
				|  |  | -								),
 | 
	
		
			
				|  |  | -								default: () => (
 | 
	
		
			
				|  |  | -									<>
 | 
	
		
			
				|  |  | -										<div class={styles.btnLineTitle}>删除方式</div>
 | 
	
		
			
				|  |  | +									),
 | 
	
		
			
				|  |  | +									default: () => (
 | 
	
		
			
				|  |  | +										<>
 | 
	
		
			
				|  |  | +											<div class={styles.btnLineTitle}>添加方式</div>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -										<NSpace vertical>
 | 
	
		
			
				|  |  |  											<NSpace>
 | 
	
		
			
				|  |  |  												<NButton
 | 
	
		
			
				|  |  | -													type={data.deleteMearseType === "ing" ? "primary" : "default"}
 | 
	
		
			
				|  |  | +													type={data.addMearseType === "pre" ? "primary" : "default"}
 | 
	
		
			
				|  |  |  													secondary
 | 
	
		
			
				|  |  | -													onClick={() => (data.deleteMearseType = "ing")}
 | 
	
		
			
				|  |  | +													onClick={() => (data.addMearseType = "pre")}
 | 
	
		
			
				|  |  |  												>
 | 
	
		
			
				|  |  | -													当前选中小节
 | 
	
		
			
				|  |  | +													当前小节前
 | 
	
		
			
				|  |  |  												</NButton>
 | 
	
		
			
				|  |  |  												<NButton
 | 
	
		
			
				|  |  | -													type={data.deleteMearseType === "finish" ? "primary" : "default"}
 | 
	
		
			
				|  |  | +													type={data.addMearseType === "next" ? "primary" : "default"}
 | 
	
		
			
				|  |  |  													secondary
 | 
	
		
			
				|  |  | -													onClick={() => (data.deleteMearseType = "finish")}
 | 
	
		
			
				|  |  | +													onClick={() => (data.addMearseType = "next")}
 | 
	
		
			
				|  |  |  												>
 | 
	
		
			
				|  |  | -													末尾空白小节
 | 
	
		
			
				|  |  | +													当前小节后
 | 
	
		
			
				|  |  |  												</NButton>
 | 
	
		
			
				|  |  | -											</NSpace>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -											<NSpace style={{ marginTop: "20px" }} align="center" wrap={false} wrapItem={false}>
 | 
	
		
			
				|  |  |  												<NButton
 | 
	
		
			
				|  |  | -													style={{ width: "48%" }}
 | 
	
		
			
				|  |  | -													round
 | 
	
		
			
				|  |  | -													onClick={() => (popup.mearseDeleteShow = false)}
 | 
	
		
			
				|  |  | +													type={data.addMearseType === "finish" ? "primary" : "default"}
 | 
	
		
			
				|  |  | +													secondary
 | 
	
		
			
				|  |  | +													onClick={() => (data.addMearseType = "finish")}
 | 
	
		
			
				|  |  |  												>
 | 
	
		
			
				|  |  | -													取消
 | 
	
		
			
				|  |  | +													曲谱末尾
 | 
	
		
			
				|  |  |  												</NButton>
 | 
	
		
			
				|  |  | -												<NButton
 | 
	
		
			
				|  |  | -													style={{ width: "48%" }}
 | 
	
		
			
				|  |  | -													round
 | 
	
		
			
				|  |  | -													type="primary"
 | 
	
		
			
				|  |  | -													onClick={() => handleDeleteMearse()}
 | 
	
		
			
				|  |  | +											</NSpace>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +											<div class={styles.btnLineTitle}>小节数</div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +											<NSpace vertical>
 | 
	
		
			
				|  |  | +												<NInputNumber
 | 
	
		
			
				|  |  | +													min={1}
 | 
	
		
			
				|  |  | +													v-model:value={data.addMearseNumber}
 | 
	
		
			
				|  |  | +													placeholder="请输入小节数"
 | 
	
		
			
				|  |  | +												/>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +												<NSpace
 | 
	
		
			
				|  |  | +													style={{ marginTop: "20px" }}
 | 
	
		
			
				|  |  | +													align="center"
 | 
	
		
			
				|  |  | +													wrap={false}
 | 
	
		
			
				|  |  | +													wrapItem={false}
 | 
	
		
			
				|  |  |  												>
 | 
	
		
			
				|  |  | -													确定
 | 
	
		
			
				|  |  | -												</NButton>
 | 
	
		
			
				|  |  | +													<NButton
 | 
	
		
			
				|  |  | +														style={{ width: "48%" }}
 | 
	
		
			
				|  |  | +														round
 | 
	
		
			
				|  |  | +														onClick={() => (popup.barShow = false)}
 | 
	
		
			
				|  |  | +													>
 | 
	
		
			
				|  |  | +														取消
 | 
	
		
			
				|  |  | +													</NButton>
 | 
	
		
			
				|  |  | +													<NButton
 | 
	
		
			
				|  |  | +														style={{ width: "48%" }}
 | 
	
		
			
				|  |  | +														round
 | 
	
		
			
				|  |  | +														type="primary"
 | 
	
		
			
				|  |  | +														onClick={() => handleAddMearse()}
 | 
	
		
			
				|  |  | +													>
 | 
	
		
			
				|  |  | +														确定
 | 
	
		
			
				|  |  | +													</NButton>
 | 
	
		
			
				|  |  | +												</NSpace>
 | 
	
		
			
				|  |  |  											</NSpace>
 | 
	
		
			
				|  |  | -										</NSpace>
 | 
	
		
			
				|  |  | -									</>
 | 
	
		
			
				|  |  | -								),
 | 
	
		
			
				|  |  | -							}}
 | 
	
		
			
				|  |  | -						</NPopover>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -						<div class={styles.topLine}></div>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -						<div
 | 
	
		
			
				|  |  | -							style={{ marginLeft: "auto" }}
 | 
	
		
			
				|  |  | -							class={styles.topBtn}
 | 
	
		
			
				|  |  | -							onClick={() => togglePlay("reset")}
 | 
	
		
			
				|  |  | -						>
 | 
	
		
			
				|  |  | -							<div class={styles.btnImg}>
 | 
	
		
			
				|  |  | -								<img class={styles.topBtnIcon} src={getImage("icon_20.png")} />
 | 
	
		
			
				|  |  | +										</>
 | 
	
		
			
				|  |  | +									),
 | 
	
		
			
				|  |  | +								}}
 | 
	
		
			
				|  |  | +							</NPopover>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +							<NPopover
 | 
	
		
			
				|  |  | +								class={styles.popupWrap}
 | 
	
		
			
				|  |  | +								v-model:show={popup.mearseDeleteShow}
 | 
	
		
			
				|  |  | +								trigger="click"
 | 
	
		
			
				|  |  | +								placement="bottom"
 | 
	
		
			
				|  |  | +							>
 | 
	
		
			
				|  |  | +								{{
 | 
	
		
			
				|  |  | +									trigger: () => (
 | 
	
		
			
				|  |  | +										<div class={[styles.topBtn]}>
 | 
	
		
			
				|  |  | +											<div class={styles.btnImg}>
 | 
	
		
			
				|  |  | +												<img class={styles.topBtnIcon} src={getImage("icon_19.png")} />
 | 
	
		
			
				|  |  | +											</div>
 | 
	
		
			
				|  |  | +											<div>删除小节</div>
 | 
	
		
			
				|  |  | +										</div>
 | 
	
		
			
				|  |  | +									),
 | 
	
		
			
				|  |  | +									default: () => (
 | 
	
		
			
				|  |  | +										<>
 | 
	
		
			
				|  |  | +											<div class={styles.btnLineTitle}>删除方式</div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +											<NSpace vertical>
 | 
	
		
			
				|  |  | +												<NSpace>
 | 
	
		
			
				|  |  | +													<NButton
 | 
	
		
			
				|  |  | +														type={data.deleteMearseType === "ing" ? "primary" : "default"}
 | 
	
		
			
				|  |  | +														secondary
 | 
	
		
			
				|  |  | +														onClick={() => (data.deleteMearseType = "ing")}
 | 
	
		
			
				|  |  | +													>
 | 
	
		
			
				|  |  | +														当前选中小节
 | 
	
		
			
				|  |  | +													</NButton>
 | 
	
		
			
				|  |  | +													<NButton
 | 
	
		
			
				|  |  | +														type={data.deleteMearseType === "finish" ? "primary" : "default"}
 | 
	
		
			
				|  |  | +														secondary
 | 
	
		
			
				|  |  | +														onClick={() => (data.deleteMearseType = "finish")}
 | 
	
		
			
				|  |  | +													>
 | 
	
		
			
				|  |  | +														末尾空白小节
 | 
	
		
			
				|  |  | +													</NButton>
 | 
	
		
			
				|  |  | +												</NSpace>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +												<NSpace
 | 
	
		
			
				|  |  | +													style={{ marginTop: "20px" }}
 | 
	
		
			
				|  |  | +													align="center"
 | 
	
		
			
				|  |  | +													wrap={false}
 | 
	
		
			
				|  |  | +													wrapItem={false}
 | 
	
		
			
				|  |  | +												>
 | 
	
		
			
				|  |  | +													<NButton
 | 
	
		
			
				|  |  | +														style={{ width: "48%" }}
 | 
	
		
			
				|  |  | +														round
 | 
	
		
			
				|  |  | +														onClick={() => (popup.mearseDeleteShow = false)}
 | 
	
		
			
				|  |  | +													>
 | 
	
		
			
				|  |  | +														取消
 | 
	
		
			
				|  |  | +													</NButton>
 | 
	
		
			
				|  |  | +													<NButton
 | 
	
		
			
				|  |  | +														style={{ width: "48%" }}
 | 
	
		
			
				|  |  | +														round
 | 
	
		
			
				|  |  | +														type="primary"
 | 
	
		
			
				|  |  | +														onClick={() => handleDeleteMearse()}
 | 
	
		
			
				|  |  | +													>
 | 
	
		
			
				|  |  | +														确定
 | 
	
		
			
				|  |  | +													</NButton>
 | 
	
		
			
				|  |  | +												</NSpace>
 | 
	
		
			
				|  |  | +											</NSpace>
 | 
	
		
			
				|  |  | +										</>
 | 
	
		
			
				|  |  | +									),
 | 
	
		
			
				|  |  | +								}}
 | 
	
		
			
				|  |  | +							</NPopover>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +							<div class={styles.topLine}></div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +							<div
 | 
	
		
			
				|  |  | +								style={{ marginLeft: "auto" }}
 | 
	
		
			
				|  |  | +								class={styles.topBtn}
 | 
	
		
			
				|  |  | +								onClick={() => togglePlay("reset")}
 | 
	
		
			
				|  |  | +							>
 | 
	
		
			
				|  |  | +								<div class={styles.btnImg}>
 | 
	
		
			
				|  |  | +									<img class={styles.topBtnIcon} src={getImage("icon_20.png")} />
 | 
	
		
			
				|  |  | +								</div>
 | 
	
		
			
				|  |  | +								<div>重播</div>
 | 
	
		
			
				|  |  |  							</div>
 | 
	
		
			
				|  |  | -							<div>重播</div>
 | 
	
		
			
				|  |  | -						</div>
 | 
	
		
			
				|  |  | -						<div class={styles.topBtn}>
 | 
	
		
			
				|  |  | -							<NSpin show={data.loadingAudioSrouce} size="small">
 | 
	
		
			
				|  |  | -								<div class={styles.btnImg} onClick={() => togglePlay(data.playState ? "pause" : "play")}>
 | 
	
		
			
				|  |  | -									<img
 | 
	
		
			
				|  |  | -										style={{ display: data.playState ? "" : "none" }}
 | 
	
		
			
				|  |  | -										class={styles.topBtnIcon}
 | 
	
		
			
				|  |  | -										src={getImage("icon_21_1.png")}
 | 
	
		
			
				|  |  | -									/>
 | 
	
		
			
				|  |  | -									<img
 | 
	
		
			
				|  |  | -										style={{ display: data.playState ? "none" : "" }}
 | 
	
		
			
				|  |  | -										class={styles.topBtnIcon}
 | 
	
		
			
				|  |  | -										src={getImage("icon_21.png")}
 | 
	
		
			
				|  |  | -									/>
 | 
	
		
			
				|  |  | +							<div class={styles.topBtn}>
 | 
	
		
			
				|  |  | +								<NSpin show={data.loadingAudioSrouce} size="small">
 | 
	
		
			
				|  |  | +									<div
 | 
	
		
			
				|  |  | +										class={styles.btnImg}
 | 
	
		
			
				|  |  | +										onClick={() => togglePlay(data.playState ? "pause" : "play")}
 | 
	
		
			
				|  |  | +									>
 | 
	
		
			
				|  |  | +										<img
 | 
	
		
			
				|  |  | +											style={{ display: data.playState ? "" : "none" }}
 | 
	
		
			
				|  |  | +											class={styles.topBtnIcon}
 | 
	
		
			
				|  |  | +											src={getImage("icon_21_1.png")}
 | 
	
		
			
				|  |  | +										/>
 | 
	
		
			
				|  |  | +										<img
 | 
	
		
			
				|  |  | +											style={{ display: data.playState ? "none" : "" }}
 | 
	
		
			
				|  |  | +											class={styles.topBtnIcon}
 | 
	
		
			
				|  |  | +											src={getImage("icon_21.png")}
 | 
	
		
			
				|  |  | +										/>
 | 
	
		
			
				|  |  | +									</div>
 | 
	
		
			
				|  |  | +								</NSpin>
 | 
	
		
			
				|  |  | +								<div>{data.playState ? "暂停" : "播放"}</div>
 | 
	
		
			
				|  |  | +							</div>
 | 
	
		
			
				|  |  | +							<div
 | 
	
		
			
				|  |  | +								id="selectMearesBtn"
 | 
	
		
			
				|  |  | +								class={[styles.topBtn]}
 | 
	
		
			
				|  |  | +								onClick={() => (popup.selectMearesShow = !popup.selectMearesShow)}
 | 
	
		
			
				|  |  | +							>
 | 
	
		
			
				|  |  | +								<div class={[styles.btnImg, popup.selectMearesShow && styles.btnImgActive]}>
 | 
	
		
			
				|  |  | +									<img class={styles.topBtnIcon} src={getImage("icon_22.png")} />
 | 
	
		
			
				|  |  |  								</div>
 | 
	
		
			
				|  |  | -							</NSpin>
 | 
	
		
			
				|  |  | -							<div>{data.playState ? "暂停" : "播放"}</div>
 | 
	
		
			
				|  |  | -						</div>
 | 
	
		
			
				|  |  | -						<div
 | 
	
		
			
				|  |  | -							id="selectMearesBtn"
 | 
	
		
			
				|  |  | -							class={[styles.topBtn]}
 | 
	
		
			
				|  |  | -							onClick={() => (popup.selectMearesShow = !popup.selectMearesShow)}
 | 
	
		
			
				|  |  | -						>
 | 
	
		
			
				|  |  | -							<div class={[styles.btnImg, popup.selectMearesShow && styles.btnImgActive]}>
 | 
	
		
			
				|  |  | -								<img class={styles.topBtnIcon} src={getImage("icon_22.png")} />
 | 
	
		
			
				|  |  | +								<div>选段</div>
 | 
	
		
			
				|  |  |  							</div>
 | 
	
		
			
				|  |  | -							<div>选段</div>
 | 
	
		
			
				|  |  | -						</div>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -						<div class={[styles.topBtn, styles.btnDisabled]}>
 | 
	
		
			
				|  |  | -							<div class={styles.btnImg}>
 | 
	
		
			
				|  |  | -								<img class={styles.topBtnIcon} src={getImage("icon_23.png")} />
 | 
	
		
			
				|  |  | +							<div class={[styles.topBtn, styles.btnDisabled]}>
 | 
	
		
			
				|  |  | +								<div class={styles.btnImg}>
 | 
	
		
			
				|  |  | +									<img class={styles.topBtnIcon} src={getImage("icon_23.png")} />
 | 
	
		
			
				|  |  | +								</div>
 | 
	
		
			
				|  |  | +								<div>节拍器</div>
 | 
	
		
			
				|  |  |  							</div>
 | 
	
		
			
				|  |  | -							<div>节拍器</div>
 | 
	
		
			
				|  |  | -						</div>
 | 
	
		
			
				|  |  | -						<div class={[styles.topBtn]} onClick={() => (popup.settingShow = true)}>
 | 
	
		
			
				|  |  | -							<div class={styles.btnImg}>
 | 
	
		
			
				|  |  | -								<img class={styles.topBtnIcon} src={getImage("icon_24.png")} />
 | 
	
		
			
				|  |  | +							<div class={[styles.topBtn]} onClick={() => (popup.settingShow = true)}>
 | 
	
		
			
				|  |  | +								<div class={styles.btnImg}>
 | 
	
		
			
				|  |  | +									<img class={styles.topBtnIcon} src={getImage("icon_24.png")} />
 | 
	
		
			
				|  |  | +								</div>
 | 
	
		
			
				|  |  | +								<div>设置</div>
 | 
	
		
			
				|  |  |  							</div>
 | 
	
		
			
				|  |  | -							<div>设置</div>
 | 
	
		
			
				|  |  |  						</div>
 | 
	
		
			
				|  |  |  					</div>
 | 
	
		
			
				|  |  | -				</div>
 | 
	
		
			
				|  |  | -				<div class={styles.content}>
 | 
	
		
			
				|  |  | -					<div class={styles.slide}>
 | 
	
		
			
				|  |  | -						<Collapse v-model={data.slide} elevation={false} divider={false}>
 | 
	
		
			
				|  |  | -							<CollapseItem title="音符时值" name="note">
 | 
	
		
			
				|  |  | -								<div class={styles.wrapBox}>
 | 
	
		
			
				|  |  | -									{ABC_DATA.types.map((item) => (
 | 
	
		
			
				|  |  | -										<div
 | 
	
		
			
				|  |  | -											class={styles.topBtn}
 | 
	
		
			
				|  |  | -											onClick={() => handleChange({ type: "type", value: item.value })}
 | 
	
		
			
				|  |  | -										>
 | 
	
		
			
				|  |  | -											<div class={[styles.btnImg, data.noteType === item.value && styles.btnImgActive]}>
 | 
	
		
			
				|  |  | -												<TheIcon iconClassName={item.icon} />
 | 
	
		
			
				|  |  | -											</div>
 | 
	
		
			
				|  |  | -											<div>{item.name}</div>
 | 
	
		
			
				|  |  | -										</div>
 | 
	
		
			
				|  |  | -									))}
 | 
	
		
			
				|  |  | -									<div class={styles.topBtn} onClick={() => handleChange({ type: "note", value: "z" })}>
 | 
	
		
			
				|  |  | -										<div
 | 
	
		
			
				|  |  | -											class={[styles.btnImg, noteComputed.value.content === "z" && styles.btnImgActive]}
 | 
	
		
			
				|  |  | -										>
 | 
	
		
			
				|  |  | -											<img style={{ width: "20px", height: "20px" }} src={getImage("icon_rest.png")} />
 | 
	
		
			
				|  |  | -										</div>
 | 
	
		
			
				|  |  | -										<div>休止符</div>
 | 
	
		
			
				|  |  | -									</div>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -									<div class={styles.topBtn} onClick={() => handleChange({ type: "segno", value: " " })}>
 | 
	
		
			
				|  |  | -										<div
 | 
	
		
			
				|  |  | -											class={[styles.btnImg, noteComputed.value.segno === " " && styles.btnImgActive]}
 | 
	
		
			
				|  |  | -										>
 | 
	
		
			
				|  |  | -											{/* <img style={{ width: "20px", height: "20px" }} src={getImage("icon_rest.png")} /> */}
 | 
	
		
			
				|  |  | -										</div>
 | 
	
		
			
				|  |  | -										<div>分割</div>
 | 
	
		
			
				|  |  | -									</div>
 | 
	
		
			
				|  |  | -								</div>
 | 
	
		
			
				|  |  | -							</CollapseItem>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -							<CollapseItem title="拍号" name="meter">
 | 
	
		
			
				|  |  | -								<div class={styles.wrapBox}>
 | 
	
		
			
				|  |  | -									{ABC_DATA.meter.map((item) => (
 | 
	
		
			
				|  |  | -										<div
 | 
	
		
			
				|  |  | -											class={styles.topBtn}
 | 
	
		
			
				|  |  | -											onClick={() => handleChange({ type: "meter", value: item.value })}
 | 
	
		
			
				|  |  | -										>
 | 
	
		
			
				|  |  | -											<div class={[styles.btnImg]}>
 | 
	
		
			
				|  |  | -												<TheIcon iconClassName={item.icon} />
 | 
	
		
			
				|  |  | +					<div class={styles.content}>
 | 
	
		
			
				|  |  | +						<div class={styles.slide}>
 | 
	
		
			
				|  |  | +							<Collapse v-model={data.slide} elevation={false} divider={false}>
 | 
	
		
			
				|  |  | +								<CollapseItem title="音符时值" name="note">
 | 
	
		
			
				|  |  | +									<div class={styles.wrapBox}>
 | 
	
		
			
				|  |  | +										{ABC_DATA.types.map((item) => (
 | 
	
		
			
				|  |  | +											<div
 | 
	
		
			
				|  |  | +												class={styles.topBtn}
 | 
	
		
			
				|  |  | +												onClick={() => handleChange({ type: "type", value: item.value })}
 | 
	
		
			
				|  |  | +											>
 | 
	
		
			
				|  |  | +												<div
 | 
	
		
			
				|  |  | +													class={[styles.btnImg, data.noteType === item.value && styles.btnImgActive]}
 | 
	
		
			
				|  |  | +												>
 | 
	
		
			
				|  |  | +													<TheIcon iconClassName={item.icon} />
 | 
	
		
			
				|  |  | +												</div>
 | 
	
		
			
				|  |  | +												<div>{item.name}</div>
 | 
	
		
			
				|  |  |  											</div>
 | 
	
		
			
				|  |  | -											<div>{item.name}</div>
 | 
	
		
			
				|  |  | -										</div>
 | 
	
		
			
				|  |  | -									))}
 | 
	
		
			
				|  |  | -								</div>
 | 
	
		
			
				|  |  | -							</CollapseItem>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -							<CollapseItem title="力度记号" name="dynamics">
 | 
	
		
			
				|  |  | -								<div class={styles.wrapBox}>
 | 
	
		
			
				|  |  | -									{ABC_DATA.dynamics.slice(0, 8).map((item) => (
 | 
	
		
			
				|  |  | +										))}
 | 
	
		
			
				|  |  |  										<div
 | 
	
		
			
				|  |  |  											class={styles.topBtn}
 | 
	
		
			
				|  |  | -											onClick={() => handleChange({ type: "dynamics", value: item.value })}
 | 
	
		
			
				|  |  | +											onClick={() => handleChange({ type: "note", value: "z" })}
 | 
	
		
			
				|  |  |  										>
 | 
	
		
			
				|  |  |  											<div
 | 
	
		
			
				|  |  |  												class={[
 | 
	
		
			
				|  |  |  													styles.btnImg,
 | 
	
		
			
				|  |  | -													noteComputed.value.dynamics === item.value && styles.btnImgActive,
 | 
	
		
			
				|  |  | +													noteComputed.value.content === "z" && styles.btnImgActive,
 | 
	
		
			
				|  |  |  												]}
 | 
	
		
			
				|  |  |  											>
 | 
	
		
			
				|  |  | -												<TheIcon iconClassName={item.icon} size={["2em", "2em"]} />
 | 
	
		
			
				|  |  | +												<img style={{ width: "20px", height: "20px" }} src={getImage("icon_rest.png")} />
 | 
	
		
			
				|  |  |  											</div>
 | 
	
		
			
				|  |  | -											<div>{item.name}</div>
 | 
	
		
			
				|  |  | +											<div>休止符</div>
 | 
	
		
			
				|  |  |  										</div>
 | 
	
		
			
				|  |  | -									))}
 | 
	
		
			
				|  |  | -									<div
 | 
	
		
			
				|  |  | -										class={styles.topBtn}
 | 
	
		
			
				|  |  | -										onClick={() => handleChange({ type: "dynamics", value: ABC_DATA.dynamics[8].value })}
 | 
	
		
			
				|  |  | -									>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  										<div
 | 
	
		
			
				|  |  | -											class={[
 | 
	
		
			
				|  |  | -												styles.btnImg,
 | 
	
		
			
				|  |  | -												ABC_DATA.dynamics[8].value.includes(noteComputed.value.dynamics) &&
 | 
	
		
			
				|  |  | -													styles.btnImgActive,
 | 
	
		
			
				|  |  | -											]}
 | 
	
		
			
				|  |  | +											class={styles.topBtn}
 | 
	
		
			
				|  |  | +											onClick={() => handleChange({ type: "segno", value: " " })}
 | 
	
		
			
				|  |  |  										>
 | 
	
		
			
				|  |  | -											<TheIcon iconClassName={ABC_DATA.dynamics[8].icon} size={["2em", "2em"]} />
 | 
	
		
			
				|  |  | +											<div
 | 
	
		
			
				|  |  | +												class={[styles.btnImg, noteComputed.value.segno === " " && styles.btnImgActive]}
 | 
	
		
			
				|  |  | +											>
 | 
	
		
			
				|  |  | +												{/* <img style={{ width: "20px", height: "20px" }} src={getImage("icon_rest.png")} /> */}
 | 
	
		
			
				|  |  | +											</div>
 | 
	
		
			
				|  |  | +											<div>分割</div>
 | 
	
		
			
				|  |  |  										</div>
 | 
	
		
			
				|  |  | -										<div>{ABC_DATA.dynamics[8].name}</div>
 | 
	
		
			
				|  |  |  									</div>
 | 
	
		
			
				|  |  | -									<div
 | 
	
		
			
				|  |  | -										class={styles.topBtn}
 | 
	
		
			
				|  |  | -										onClick={() => handleChange({ type: "dynamics", value: ABC_DATA.dynamics[9].value })}
 | 
	
		
			
				|  |  | -									>
 | 
	
		
			
				|  |  | -										<div
 | 
	
		
			
				|  |  | -											class={[
 | 
	
		
			
				|  |  | -												styles.btnImg,
 | 
	
		
			
				|  |  | -												ABC_DATA.dynamics[9].value.includes(noteComputed.value.dynamics) &&
 | 
	
		
			
				|  |  | -													styles.btnImgActive,
 | 
	
		
			
				|  |  | -											]}
 | 
	
		
			
				|  |  | -										>
 | 
	
		
			
				|  |  | -											<TheIcon iconClassName={ABC_DATA.dynamics[9].icon} size={["2em", "2em"]} />
 | 
	
		
			
				|  |  | -										</div>
 | 
	
		
			
				|  |  | -										<div>{ABC_DATA.dynamics[9].name}</div>
 | 
	
		
			
				|  |  | +								</CollapseItem>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +								<CollapseItem title="拍号" name="meter">
 | 
	
		
			
				|  |  | +									<div class={styles.wrapBox}>
 | 
	
		
			
				|  |  | +										{ABC_DATA.meter.map((item) => (
 | 
	
		
			
				|  |  | +											<div
 | 
	
		
			
				|  |  | +												class={styles.topBtn}
 | 
	
		
			
				|  |  | +												onClick={() => handleChange({ type: "meter", value: item.value })}
 | 
	
		
			
				|  |  | +											>
 | 
	
		
			
				|  |  | +												<div class={[styles.btnImg]}>
 | 
	
		
			
				|  |  | +													<TheIcon iconClassName={item.icon} />
 | 
	
		
			
				|  |  | +												</div>
 | 
	
		
			
				|  |  | +												<div>{item.name}</div>
 | 
	
		
			
				|  |  | +											</div>
 | 
	
		
			
				|  |  | +										))}
 | 
	
		
			
				|  |  |  									</div>
 | 
	
		
			
				|  |  | -								</div>
 | 
	
		
			
				|  |  | -							</CollapseItem>
 | 
	
		
			
				|  |  | -							<CollapseItem title="反复与跳跃" name="repeat">
 | 
	
		
			
				|  |  | -								<div class={styles.wrapBox}>
 | 
	
		
			
				|  |  | -									{ABC_DATA.repeat.map((item) => (
 | 
	
		
			
				|  |  | +								</CollapseItem>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +								<CollapseItem title="力度记号" name="dynamics">
 | 
	
		
			
				|  |  | +									<div class={styles.wrapBox}>
 | 
	
		
			
				|  |  | +										{ABC_DATA.dynamics.slice(0, 8).map((item) => (
 | 
	
		
			
				|  |  | +											<div
 | 
	
		
			
				|  |  | +												class={styles.topBtn}
 | 
	
		
			
				|  |  | +												onClick={() => handleChange({ type: "dynamics", value: item.value })}
 | 
	
		
			
				|  |  | +											>
 | 
	
		
			
				|  |  | +												<div
 | 
	
		
			
				|  |  | +													class={[
 | 
	
		
			
				|  |  | +														styles.btnImg,
 | 
	
		
			
				|  |  | +														noteComputed.value.dynamics === item.value && styles.btnImgActive,
 | 
	
		
			
				|  |  | +													]}
 | 
	
		
			
				|  |  | +												>
 | 
	
		
			
				|  |  | +													<TheIcon iconClassName={item.icon} size={["2em", "2em"]} />
 | 
	
		
			
				|  |  | +												</div>
 | 
	
		
			
				|  |  | +												<div>{item.name}</div>
 | 
	
		
			
				|  |  | +											</div>
 | 
	
		
			
				|  |  | +										))}
 | 
	
		
			
				|  |  |  										<div
 | 
	
		
			
				|  |  | -											class={[styles.topBtn, styles.longTopBtn]}
 | 
	
		
			
				|  |  | -											onClick={() => handleChange({ type: "repeat", value: item.value })}
 | 
	
		
			
				|  |  | +											class={styles.topBtn}
 | 
	
		
			
				|  |  | +											onClick={() =>
 | 
	
		
			
				|  |  | +												handleChange({ type: "dynamics", value: ABC_DATA.dynamics[8].value })
 | 
	
		
			
				|  |  | +											}
 | 
	
		
			
				|  |  |  										>
 | 
	
		
			
				|  |  |  											<div
 | 
	
		
			
				|  |  |  												class={[
 | 
	
		
			
				|  |  |  													styles.btnImg,
 | 
	
		
			
				|  |  | -													measureComputed.value.repeat === item.value && styles.btnImgActive,
 | 
	
		
			
				|  |  | +													ABC_DATA.dynamics[8].value.includes(noteComputed.value.dynamics) &&
 | 
	
		
			
				|  |  | +														styles.btnImgActive,
 | 
	
		
			
				|  |  |  												]}
 | 
	
		
			
				|  |  |  											>
 | 
	
		
			
				|  |  | -												<TheIcon iconClassName={item.icon} size={["5em", "1em"]} />
 | 
	
		
			
				|  |  | +												<TheIcon iconClassName={ABC_DATA.dynamics[8].icon} size={["2em", "2em"]} />
 | 
	
		
			
				|  |  |  											</div>
 | 
	
		
			
				|  |  | -											<div>{item.name}</div>
 | 
	
		
			
				|  |  | +											<div>{ABC_DATA.dynamics[8].name}</div>
 | 
	
		
			
				|  |  |  										</div>
 | 
	
		
			
				|  |  | -									))}
 | 
	
		
			
				|  |  | -								</div>
 | 
	
		
			
				|  |  | -							</CollapseItem>
 | 
	
		
			
				|  |  | -							<CollapseItem title="小节线" name="line">
 | 
	
		
			
				|  |  | -								<div class={styles.wrapBox}>
 | 
	
		
			
				|  |  | -									{ABC_DATA.bar.map((item) => (
 | 
	
		
			
				|  |  |  										<div
 | 
	
		
			
				|  |  |  											class={styles.topBtn}
 | 
	
		
			
				|  |  | -											onClick={() => {
 | 
	
		
			
				|  |  | -												data.morePlay = false;
 | 
	
		
			
				|  |  | -												handleChange({ type: "barline", value: item.value });
 | 
	
		
			
				|  |  | -											}}
 | 
	
		
			
				|  |  | +											onClick={() =>
 | 
	
		
			
				|  |  | +												handleChange({ type: "dynamics", value: ABC_DATA.dynamics[9].value })
 | 
	
		
			
				|  |  | +											}
 | 
	
		
			
				|  |  |  										>
 | 
	
		
			
				|  |  |  											<div
 | 
	
		
			
				|  |  |  												class={[
 | 
	
		
			
				|  |  |  													styles.btnImg,
 | 
	
		
			
				|  |  | -													measureComputed.value.barline === item.value && styles.btnImgActive,
 | 
	
		
			
				|  |  | +													ABC_DATA.dynamics[9].value.includes(noteComputed.value.dynamics) &&
 | 
	
		
			
				|  |  | +														styles.btnImgActive,
 | 
	
		
			
				|  |  |  												]}
 | 
	
		
			
				|  |  |  											>
 | 
	
		
			
				|  |  | -												<TheIcon iconClassName={item.icon} size={["2em", "2em"]} />
 | 
	
		
			
				|  |  | +												<TheIcon iconClassName={ABC_DATA.dynamics[9].icon} size={["2em", "2em"]} />
 | 
	
		
			
				|  |  |  											</div>
 | 
	
		
			
				|  |  | -											<div>{item.name}</div>
 | 
	
		
			
				|  |  | +											<div>{ABC_DATA.dynamics[9].name}</div>
 | 
	
		
			
				|  |  |  										</div>
 | 
	
		
			
				|  |  | -									))}
 | 
	
		
			
				|  |  | -								</div>
 | 
	
		
			
				|  |  | -							</CollapseItem>
 | 
	
		
			
				|  |  | +									</div>
 | 
	
		
			
				|  |  | +								</CollapseItem>
 | 
	
		
			
				|  |  | +								<CollapseItem title="反复与跳跃" name="repeat">
 | 
	
		
			
				|  |  | +									<div class={styles.wrapBox}>
 | 
	
		
			
				|  |  | +										{ABC_DATA.repeat.map((item) => (
 | 
	
		
			
				|  |  | +											<div
 | 
	
		
			
				|  |  | +												class={[styles.topBtn, styles.longTopBtn]}
 | 
	
		
			
				|  |  | +												onClick={() => handleChange({ type: "repeat", value: item.value })}
 | 
	
		
			
				|  |  | +											>
 | 
	
		
			
				|  |  | +												<div
 | 
	
		
			
				|  |  | +													class={[
 | 
	
		
			
				|  |  | +														styles.btnImg,
 | 
	
		
			
				|  |  | +														measureComputed.value.repeat === item.value && styles.btnImgActive,
 | 
	
		
			
				|  |  | +													]}
 | 
	
		
			
				|  |  | +												>
 | 
	
		
			
				|  |  | +													<TheIcon iconClassName={item.icon} size={["5em", "1em"]} />
 | 
	
		
			
				|  |  | +												</div>
 | 
	
		
			
				|  |  | +												<div>{item.name}</div>
 | 
	
		
			
				|  |  | +											</div>
 | 
	
		
			
				|  |  | +										))}
 | 
	
		
			
				|  |  | +									</div>
 | 
	
		
			
				|  |  | +								</CollapseItem>
 | 
	
		
			
				|  |  | +								<CollapseItem title="小节线" name="line">
 | 
	
		
			
				|  |  | +									<div class={styles.wrapBox}>
 | 
	
		
			
				|  |  | +										{ABC_DATA.bar.map((item) => (
 | 
	
		
			
				|  |  | +											<div
 | 
	
		
			
				|  |  | +												class={styles.topBtn}
 | 
	
		
			
				|  |  | +												onClick={() => {
 | 
	
		
			
				|  |  | +													data.morePlay = false;
 | 
	
		
			
				|  |  | +													handleChange({ type: "barline", value: item.value });
 | 
	
		
			
				|  |  | +												}}
 | 
	
		
			
				|  |  | +											>
 | 
	
		
			
				|  |  | +												<div
 | 
	
		
			
				|  |  | +													class={[
 | 
	
		
			
				|  |  | +														styles.btnImg,
 | 
	
		
			
				|  |  | +														measureComputed.value.barline === item.value && styles.btnImgActive,
 | 
	
		
			
				|  |  | +													]}
 | 
	
		
			
				|  |  | +												>
 | 
	
		
			
				|  |  | +													<TheIcon iconClassName={item.icon} size={["2em", "2em"]} />
 | 
	
		
			
				|  |  | +												</div>
 | 
	
		
			
				|  |  | +												<div>{item.name}</div>
 | 
	
		
			
				|  |  | +											</div>
 | 
	
		
			
				|  |  | +										))}
 | 
	
		
			
				|  |  | +									</div>
 | 
	
		
			
				|  |  | +								</CollapseItem>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -							<CollapseItem title="谱号" name="clef">
 | 
	
		
			
				|  |  | -								<div class={styles.wrapBox}>
 | 
	
		
			
				|  |  | -									{ABC_DATA.clef.map((item) => (
 | 
	
		
			
				|  |  | -										<div
 | 
	
		
			
				|  |  | -											class={styles.topBtn}
 | 
	
		
			
				|  |  | -											onClick={() => handleChange({ type: "clef", value: item.value })}
 | 
	
		
			
				|  |  | -										>
 | 
	
		
			
				|  |  | -											<div class={[styles.btnImg]}>
 | 
	
		
			
				|  |  | -												<TheIcon iconClassName={item.icon} />
 | 
	
		
			
				|  |  | +								<CollapseItem title="谱号" name="clef">
 | 
	
		
			
				|  |  | +									<div class={styles.wrapBox}>
 | 
	
		
			
				|  |  | +										{ABC_DATA.clef.map((item) => (
 | 
	
		
			
				|  |  | +											<div
 | 
	
		
			
				|  |  | +												class={styles.topBtn}
 | 
	
		
			
				|  |  | +												onClick={() => handleChange({ type: "clef", value: item.value })}
 | 
	
		
			
				|  |  | +											>
 | 
	
		
			
				|  |  | +												<div class={[styles.btnImg]}>
 | 
	
		
			
				|  |  | +													<TheIcon iconClassName={item.icon} />
 | 
	
		
			
				|  |  | +												</div>
 | 
	
		
			
				|  |  | +												<div>{item.name}</div>
 | 
	
		
			
				|  |  |  											</div>
 | 
	
		
			
				|  |  | -											<div>{item.name}</div>
 | 
	
		
			
				|  |  | -										</div>
 | 
	
		
			
				|  |  | -									))}
 | 
	
		
			
				|  |  | -								</div>
 | 
	
		
			
				|  |  | -							</CollapseItem>
 | 
	
		
			
				|  |  | -							<CollapseItem title="调号" name="key">
 | 
	
		
			
				|  |  | -								<div class={styles.wrapBox}>
 | 
	
		
			
				|  |  | -									{ABC_DATA.key.map((item) => (
 | 
	
		
			
				|  |  | -										<div
 | 
	
		
			
				|  |  | -											class={styles.topBtn}
 | 
	
		
			
				|  |  | -											onClick={() => handleChange({ type: "key", value: item.value })}
 | 
	
		
			
				|  |  | -										>
 | 
	
		
			
				|  |  | -											<div class={[styles.btnImg]}>
 | 
	
		
			
				|  |  | -												<TheIcon iconClassName={item.icon} />
 | 
	
		
			
				|  |  | +										))}
 | 
	
		
			
				|  |  | +									</div>
 | 
	
		
			
				|  |  | +								</CollapseItem>
 | 
	
		
			
				|  |  | +								<CollapseItem title="调号" name="key">
 | 
	
		
			
				|  |  | +									<div class={styles.wrapBox}>
 | 
	
		
			
				|  |  | +										{ABC_DATA.key.map((item) => (
 | 
	
		
			
				|  |  | +											<div
 | 
	
		
			
				|  |  | +												class={styles.topBtn}
 | 
	
		
			
				|  |  | +												onClick={() => handleChange({ type: "key", value: item.value })}
 | 
	
		
			
				|  |  | +											>
 | 
	
		
			
				|  |  | +												<div class={[styles.btnImg]}>
 | 
	
		
			
				|  |  | +													<TheIcon iconClassName={item.icon} />
 | 
	
		
			
				|  |  | +												</div>
 | 
	
		
			
				|  |  | +												<div>{item.name}</div>
 | 
	
		
			
				|  |  |  											</div>
 | 
	
		
			
				|  |  | -											<div>{item.name}</div>
 | 
	
		
			
				|  |  | -										</div>
 | 
	
		
			
				|  |  | -									))}
 | 
	
		
			
				|  |  | -								</div>
 | 
	
		
			
				|  |  | -							</CollapseItem>
 | 
	
		
			
				|  |  | -						</Collapse>
 | 
	
		
			
				|  |  | -					</div>
 | 
	
		
			
				|  |  | +										))}
 | 
	
		
			
				|  |  | +									</div>
 | 
	
		
			
				|  |  | +								</CollapseItem>
 | 
	
		
			
				|  |  | +							</Collapse>
 | 
	
		
			
				|  |  | +						</div>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -					<div class={styles.box}>
 | 
	
		
			
				|  |  | -						<div class={styles.titleBox}>
 | 
	
		
			
				|  |  | -							<div class={styles.titleName} style={{ width: "50%", margin: "0 auto" }}>
 | 
	
		
			
				|  |  | -								<NInput
 | 
	
		
			
				|  |  | -									onKeyup={(e: Event) => e.stopPropagation()}
 | 
	
		
			
				|  |  | -									v-model:value={data.musicName}
 | 
	
		
			
				|  |  | -									placeholder="曲谱名称"
 | 
	
		
			
				|  |  | -								/>
 | 
	
		
			
				|  |  | +						<div class={styles.box}>
 | 
	
		
			
				|  |  | +							<div class={styles.titleBox}>
 | 
	
		
			
				|  |  | +								<div class={styles.titleName} style={{ width: "50%", margin: "0 auto" }}>
 | 
	
		
			
				|  |  | +									<NInput
 | 
	
		
			
				|  |  | +										onKeyup={(e: Event) => e.stopPropagation()}
 | 
	
		
			
				|  |  | +										v-model:value={data.musicName}
 | 
	
		
			
				|  |  | +										placeholder="曲谱名称"
 | 
	
		
			
				|  |  | +									/>
 | 
	
		
			
				|  |  | +								</div>
 | 
	
		
			
				|  |  | +								<div style={{ width: "30%", margin: "10px 0 0 auto" }}>
 | 
	
		
			
				|  |  | +									<NInput
 | 
	
		
			
				|  |  | +										onKeyup={(e: Event) => e.stopPropagation()}
 | 
	
		
			
				|  |  | +										v-model:value={data.creator}
 | 
	
		
			
				|  |  | +										placeholder="曲谱作者"
 | 
	
		
			
				|  |  | +									/>
 | 
	
		
			
				|  |  | +								</div>
 | 
	
		
			
				|  |  |  							</div>
 | 
	
		
			
				|  |  | -							<div style={{ width: "30%", margin: "10px 0 0 auto" }}>
 | 
	
		
			
				|  |  | -								<NInput
 | 
	
		
			
				|  |  | -									onKeyup={(e: Event) => e.stopPropagation()}
 | 
	
		
			
				|  |  | -									v-model:value={data.creator}
 | 
	
		
			
				|  |  | -									placeholder="曲谱作者"
 | 
	
		
			
				|  |  | +							<div id="paper"></div>
 | 
	
		
			
				|  |  | +							{!data.loading && (
 | 
	
		
			
				|  |  | +								<Keys
 | 
	
		
			
				|  |  | +									show={data.active ? true : false}
 | 
	
		
			
				|  |  | +									instrumentCode={abcData.abc.subjectCode}
 | 
	
		
			
				|  |  | +									onClick={(val) => handleChange(val)}
 | 
	
		
			
				|  |  |  								/>
 | 
	
		
			
				|  |  | -							</div>
 | 
	
		
			
				|  |  | +							)}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +							{/* <textarea ref={textAreaRef} class={styles.value} id="abc"></textarea> */}
 | 
	
		
			
				|  |  | +							<div id="audio" style={{ display: "none" }}></div>
 | 
	
		
			
				|  |  | +							<div id="warnings"></div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +							<p class="beat"></p>
 | 
	
		
			
				|  |  | +							<pre class="clicked-info"></pre>
 | 
	
		
			
				|  |  | +							<pre class="feedback"></pre>
 | 
	
		
			
				|  |  | +							<div id="container"></div>
 | 
	
		
			
				|  |  | +							{data.loadingAudioSrouce && (
 | 
	
		
			
				|  |  | +								<div class={styles.loading}>
 | 
	
		
			
				|  |  | +									<NSpin></NSpin>
 | 
	
		
			
				|  |  | +								</div>
 | 
	
		
			
				|  |  | +							)}
 | 
	
		
			
				|  |  |  						</div>
 | 
	
		
			
				|  |  | -						<div id="paper"></div>
 | 
	
		
			
				|  |  | -						{!data.loading && (
 | 
	
		
			
				|  |  | -							<Keys
 | 
	
		
			
				|  |  | -								show={data.active ? true : false}
 | 
	
		
			
				|  |  | -								instrumentCode={abcData.abc.subjectCode}
 | 
	
		
			
				|  |  | -								onClick={(val) => handleChange(val)}
 | 
	
		
			
				|  |  | -							/>
 | 
	
		
			
				|  |  | -						)}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -						{/* <textarea ref={textAreaRef} class={styles.value} id="abc"></textarea> */}
 | 
	
		
			
				|  |  | -						<div id="audio" style={{ display: "none" }}></div>
 | 
	
		
			
				|  |  | -						<div id="warnings"></div>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -						<p class="beat"></p>
 | 
	
		
			
				|  |  | -						<pre class="clicked-info"></pre>
 | 
	
		
			
				|  |  | -						<pre class="feedback"></pre>
 | 
	
		
			
				|  |  | -						<div id="container"></div>
 | 
	
		
			
				|  |  | -						{data.loadingAudioSrouce && (
 | 
	
		
			
				|  |  | -							<div class={styles.loading}>
 | 
	
		
			
				|  |  | -								<NSpin></NSpin>
 | 
	
		
			
				|  |  | -							</div>
 | 
	
		
			
				|  |  | -						)}
 | 
	
		
			
				|  |  |  					</div>
 | 
	
		
			
				|  |  | +					<div ref={downRef}></div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +					<TheSetting v-model:show={popup.settingShow} />
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +					{data.selectMeasures.state && (
 | 
	
		
			
				|  |  | +						<UseDraggable
 | 
	
		
			
				|  |  | +							initialValue={{ x: data.selectMeasures.x, y: data.selectMeasures.y }}
 | 
	
		
			
				|  |  | +							class={[styles.selectMearesBox, !popup.selectMearesShow && styles.selectMearesHidden]}
 | 
	
		
			
				|  |  | +						>
 | 
	
		
			
				|  |  | +							<div onKeyup={(e: Event) => e.stopPropagation()}>
 | 
	
		
			
				|  |  | +								<NSpace justify="space-between">
 | 
	
		
			
				|  |  | +									<div class={styles.btnLineTitle}>输入小节范围</div>
 | 
	
		
			
				|  |  | +									<NButton
 | 
	
		
			
				|  |  | +										circle
 | 
	
		
			
				|  |  | +										quaternary
 | 
	
		
			
				|  |  | +										size="small"
 | 
	
		
			
				|  |  | +										onClick={() => (popup.selectMearesShow = false)}
 | 
	
		
			
				|  |  | +									>
 | 
	
		
			
				|  |  | +										<NIcon size={16} component={<Close />} />
 | 
	
		
			
				|  |  | +									</NButton>
 | 
	
		
			
				|  |  | +								</NSpace>
 | 
	
		
			
				|  |  | +								<NSpace align="center" wrap={false} wrapItem={false}>
 | 
	
		
			
				|  |  | +									<div class={styles.mearesInput}>
 | 
	
		
			
				|  |  | +										<NInputNumber
 | 
	
		
			
				|  |  | +											min={1}
 | 
	
		
			
				|  |  | +											max={data.selectMeasures.max}
 | 
	
		
			
				|  |  | +											bordered={false}
 | 
	
		
			
				|  |  | +											placeholder="开始小节"
 | 
	
		
			
				|  |  | +											showButton={false}
 | 
	
		
			
				|  |  | +											onUpdate:value={(val) => handleSetSelectMeares(val, "start")}
 | 
	
		
			
				|  |  | +										></NInputNumber>
 | 
	
		
			
				|  |  | +										-
 | 
	
		
			
				|  |  | +										<NInputNumber
 | 
	
		
			
				|  |  | +											min={data.selectMeasures.start}
 | 
	
		
			
				|  |  | +											max={data.selectMeasures.max}
 | 
	
		
			
				|  |  | +											bordered={false}
 | 
	
		
			
				|  |  | +											placeholder="结束小节"
 | 
	
		
			
				|  |  | +											showButton={false}
 | 
	
		
			
				|  |  | +											onUpdate:value={(val) => handleSetSelectMeares(val, "end")}
 | 
	
		
			
				|  |  | +										></NInputNumber>
 | 
	
		
			
				|  |  | +									</div>
 | 
	
		
			
				|  |  | +									<div class={styles.topBtn}>
 | 
	
		
			
				|  |  | +										<NSpin show={data.loadingAudioSrouce} size="small">
 | 
	
		
			
				|  |  | +											<div
 | 
	
		
			
				|  |  | +												class={styles.btnImg}
 | 
	
		
			
				|  |  | +												onClick={() => togglePlay(data.playState ? "pause" : "play")}
 | 
	
		
			
				|  |  | +											>
 | 
	
		
			
				|  |  | +												<img
 | 
	
		
			
				|  |  | +													style={{ display: data.playState ? "" : "none" }}
 | 
	
		
			
				|  |  | +													class={styles.topBtnIcon}
 | 
	
		
			
				|  |  | +													src={getImage("icon_21_1.png")}
 | 
	
		
			
				|  |  | +												/>
 | 
	
		
			
				|  |  | +												<img
 | 
	
		
			
				|  |  | +													style={{ display: data.playState ? "none" : "" }}
 | 
	
		
			
				|  |  | +													class={styles.topBtnIcon}
 | 
	
		
			
				|  |  | +													src={getImage("icon_21.png")}
 | 
	
		
			
				|  |  | +												/>
 | 
	
		
			
				|  |  | +											</div>
 | 
	
		
			
				|  |  | +										</NSpin>
 | 
	
		
			
				|  |  | +									</div>
 | 
	
		
			
				|  |  | +								</NSpace>
 | 
	
		
			
				|  |  | +							</div>
 | 
	
		
			
				|  |  | +						</UseDraggable>
 | 
	
		
			
				|  |  | +					)}
 | 
	
		
			
				|  |  |  				</div>
 | 
	
		
			
				|  |  | -				<div ref={downRef}></div>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -				<TheSetting v-model:show={popup.settingShow} />
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -				{data.selectMeasures.state && (
 | 
	
		
			
				|  |  | -					<UseDraggable
 | 
	
		
			
				|  |  | -						initialValue={{ x: data.selectMeasures.x, y: data.selectMeasures.y }}
 | 
	
		
			
				|  |  | -						class={[styles.selectMearesBox, !popup.selectMearesShow && styles.selectMearesHidden]}
 | 
	
		
			
				|  |  | -					>
 | 
	
		
			
				|  |  | -						<div onKeyup={(e: Event) => e.stopPropagation()}>
 | 
	
		
			
				|  |  | -							<NSpace justify="space-between">
 | 
	
		
			
				|  |  | -								<div class={styles.btnLineTitle}>输入小节范围</div>
 | 
	
		
			
				|  |  | -								<NButton circle quaternary size="small" onClick={() => (popup.selectMearesShow = false)}>
 | 
	
		
			
				|  |  | -									<NIcon size={16} component={<Close />} />
 | 
	
		
			
				|  |  | -								</NButton>
 | 
	
		
			
				|  |  | -							</NSpace>
 | 
	
		
			
				|  |  | -							<NSpace align="center" wrap={false} wrapItem={false}>
 | 
	
		
			
				|  |  | -								<div class={styles.mearesInput}>
 | 
	
		
			
				|  |  | -									<NInputNumber
 | 
	
		
			
				|  |  | -										min={1}
 | 
	
		
			
				|  |  | -										max={data.selectMeasures.max}
 | 
	
		
			
				|  |  | -										bordered={false}
 | 
	
		
			
				|  |  | -										placeholder="开始小节"
 | 
	
		
			
				|  |  | -										showButton={false}
 | 
	
		
			
				|  |  | -										onUpdate:value={(val) => handleSetSelectMeares(val, "start")}
 | 
	
		
			
				|  |  | -									></NInputNumber>
 | 
	
		
			
				|  |  | -									-
 | 
	
		
			
				|  |  | -									<NInputNumber
 | 
	
		
			
				|  |  | -										min={data.selectMeasures.start}
 | 
	
		
			
				|  |  | -										max={data.selectMeasures.max}
 | 
	
		
			
				|  |  | -										bordered={false}
 | 
	
		
			
				|  |  | -										placeholder="结束小节"
 | 
	
		
			
				|  |  | -										showButton={false}
 | 
	
		
			
				|  |  | -										onUpdate:value={(val) => handleSetSelectMeares(val, "end")}
 | 
	
		
			
				|  |  | -									></NInputNumber>
 | 
	
		
			
				|  |  | -								</div>
 | 
	
		
			
				|  |  | -								<div class={styles.topBtn}>
 | 
	
		
			
				|  |  | -									<NSpin show={data.loadingAudioSrouce} size="small">
 | 
	
		
			
				|  |  | -										<div
 | 
	
		
			
				|  |  | -											class={styles.btnImg}
 | 
	
		
			
				|  |  | -											onClick={() => togglePlay(data.playState ? "pause" : "play")}
 | 
	
		
			
				|  |  | -										>
 | 
	
		
			
				|  |  | -											<img
 | 
	
		
			
				|  |  | -												style={{ display: data.playState ? "" : "none" }}
 | 
	
		
			
				|  |  | -												class={styles.topBtnIcon}
 | 
	
		
			
				|  |  | -												src={getImage("icon_21_1.png")}
 | 
	
		
			
				|  |  | -											/>
 | 
	
		
			
				|  |  | -											<img
 | 
	
		
			
				|  |  | -												style={{ display: data.playState ? "none" : "" }}
 | 
	
		
			
				|  |  | -												class={styles.topBtnIcon}
 | 
	
		
			
				|  |  | -												src={getImage("icon_21.png")}
 | 
	
		
			
				|  |  | -											/>
 | 
	
		
			
				|  |  | -										</div>
 | 
	
		
			
				|  |  | -									</NSpin>
 | 
	
		
			
				|  |  | -								</div>
 | 
	
		
			
				|  |  | -							</NSpace>
 | 
	
		
			
				|  |  | -						</div>
 | 
	
		
			
				|  |  | -					</UseDraggable>
 | 
	
		
			
				|  |  | -				)}
 | 
	
		
			
				|  |  | -			</div>
 | 
	
		
			
				|  |  | +				<div class={styles.exportPng}>
 | 
	
		
			
				|  |  | +					<div id="exportPng"></div>
 | 
	
		
			
				|  |  | +				</div>
 | 
	
		
			
				|  |  | +			</>
 | 
	
		
			
				|  |  |  		);
 | 
	
		
			
				|  |  |  	},
 | 
	
		
			
				|  |  |  });
 |