|  | @@ -32,6 +32,8 @@ export default defineComponent({
 | 
	
		
			
				|  |  |  			subject: subject,
 | 
	
		
			
				|  |  |  			realKey: 0,
 | 
	
		
			
				|  |  |  			notes: [] as IFIGNER_INSTRUMENT_Note[],
 | 
	
		
			
				|  |  | +			tones: [] as IFIGNER_INSTRUMENT_Note[],
 | 
	
		
			
				|  |  | +			activeTone: "",
 | 
	
		
			
				|  |  |  			soundFonts: {} as any,
 | 
	
		
			
				|  |  |  			viewIndex: 0,
 | 
	
		
			
				|  |  |  			noteAudio: null as unknown as Howl,
 | 
	
	
		
			
				|  | @@ -53,7 +55,17 @@ export default defineComponent({
 | 
	
		
			
				|  |  |  		const getNotes = () => {
 | 
	
		
			
				|  |  |  			const fignerData = FIGNER_INSTRUMENT_DATA[data.subject as keyof typeof FIGNER_INSTRUMENT_DATA];
 | 
	
		
			
				|  |  |  			if (fignerData) {
 | 
	
		
			
				|  |  | -				data.notes = fignerData.list;
 | 
	
		
			
				|  |  | +				data.tones = fignerData.tones || [];
 | 
	
		
			
				|  |  | +				if (data.tones.length) {
 | 
	
		
			
				|  |  | +					data.activeTone = data.tones[0].realName;
 | 
	
		
			
				|  |  | +					setNotes();
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		};
 | 
	
		
			
				|  |  | +		const setNotes = () => {
 | 
	
		
			
				|  |  | +			const fignerData = FIGNER_INSTRUMENT_DATA[data.subject as keyof typeof FIGNER_INSTRUMENT_DATA];
 | 
	
		
			
				|  |  | +			if (fignerData) {
 | 
	
		
			
				|  |  | +				data.notes = fignerData[`list${data.activeTone}`];
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  |  		};
 | 
	
		
			
				|  |  |  		const getFingeringData = async () => {
 | 
	
	
		
			
				|  | @@ -232,6 +244,38 @@ export default defineComponent({
 | 
	
		
			
				|  |  |  								替指
 | 
	
		
			
				|  |  |  							</div>
 | 
	
		
			
				|  |  |  						</div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +						<div class={styles.tones}>
 | 
	
		
			
				|  |  | +							{data.tones.map((tone: IFIGNER_INSTRUMENT_Note) => {
 | 
	
		
			
				|  |  | +								const steps = new Array(Math.abs(tone.step)).fill(1);
 | 
	
		
			
				|  |  | +								return (
 | 
	
		
			
				|  |  | +									<div
 | 
	
		
			
				|  |  | +										draggable={false}
 | 
	
		
			
				|  |  | +										class={styles.note}
 | 
	
		
			
				|  |  | +										onClick={() => {
 | 
	
		
			
				|  |  | +											data.activeTone = tone.realName;
 | 
	
		
			
				|  |  | +											setNotes();
 | 
	
		
			
				|  |  | +										}}
 | 
	
		
			
				|  |  | +									>
 | 
	
		
			
				|  |  | +										{data.activeTone === tone.realName ? (
 | 
	
		
			
				|  |  | +											<img draggable={false} src={icons.icon_btn_ylow} />
 | 
	
		
			
				|  |  | +										) : (
 | 
	
		
			
				|  |  | +											<img draggable={false} src={icons.icon_btn_blue} />
 | 
	
		
			
				|  |  | +										)}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +										<div class={[styles.noteKey, data.activeTone === tone.realName && styles.keyActive]}>
 | 
	
		
			
				|  |  | +											{tone.step > 0 ? steps.map((n) => <span class={styles.dot}></span>) : null}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +											<div class={styles.noteName}>
 | 
	
		
			
				|  |  | +												<sup>{tone.mark && (tone.mark === "rise" ? "#" : "b")}</sup>
 | 
	
		
			
				|  |  | +												{tone.key}
 | 
	
		
			
				|  |  | +											</div>
 | 
	
		
			
				|  |  | +											{tone.step < 0 ? steps.map((n) => <span class={styles.dot}></span>) : null}
 | 
	
		
			
				|  |  | +										</div>
 | 
	
		
			
				|  |  | +									</div>
 | 
	
		
			
				|  |  | +								);
 | 
	
		
			
				|  |  | +							})}
 | 
	
		
			
				|  |  | +						</div>
 | 
	
		
			
				|  |  |  					</div>
 | 
	
		
			
				|  |  |  					<div class={styles.notes}>
 | 
	
		
			
				|  |  |  						{/* <Button>
 |