Browse Source

选择声部要求显示中文

liushengqiang 1 year ago
parent
commit
eb4d5fd3e4

+ 131 - 0
src/constant/instrmentsNames.json

@@ -0,0 +1,131 @@
+{
+    "acoustic_grand_piano": "三角大钢琴",
+    "bright_acoustic_piano": "明亮钢琴",
+    "electric_grand_piano": "电声大钢琴",
+    "honkytonk_piano": "梦幻电钢",
+    "electric_piano_1": "电子钢琴1",
+    "electric_piano_2": "电子钢琴2",
+    "harpsichord": "羽管键琴",
+    "clavinet": "古钢琴",
+    "celesta": "钢片琴",
+    "glockenspiel": "钟琴",
+    "music_box": "音乐盒",
+    "vibraphone": "颤音琴",
+    "marimba": "马林巴琴",
+    "xylophone": "木琴",
+    "tubular_bells": "管钟",
+    "dulcimer": "杜西莫琴",
+    "drawbar_organ": "拉杆管风琴",
+    "percussive_organ": "敲击管风琴",
+    "rock_organ": "摇滚管风琴",
+    "church_organ": "教堂管风琴",
+    "reed_organ": "簧片管风琴",
+    "accordion": "手风琴",
+    "harmonica": "口琴",
+    "tango_accordion": "探戈手风琴",
+    "acoustic_guitar_nylon": "古典吉他",
+    "acoustic_guitar_steel": "民谣吉他",
+    "electric_guitar_jazz": "爵士电吉他",
+    "electric_guitar_clean": "清音电吉他",
+    "electric_guitar_muted": "闷音电吉他",
+    "overdriven_guitar": "过载电吉他",
+    "distortion_guitar": "失真电吉他",
+    "guitar_harmonics": "泛音吉他",
+    "acoustic_bass": "原声贝司",
+    "electric_bass_finger": "手弹贝司",
+    "electric_bass_pick": "拨片贝司",
+    "fretless_bass": "无品贝司",
+    "slap_bass_1": "击弦贝司1",
+    "slap_bass_2": "击弦贝司2",
+    "synth_bass_1": "电贝司1",
+    "synth_bass_2": "电贝司2",
+    "violin": "小提琴",
+    "viola": "中提琴",
+    "cello": "大提琴",
+    "contrabass": "倍大提琴",
+    "tremolo_strings": "颤音弦乐",
+    "pizzicato_strings": "弹拨弦乐",
+    "orchestral_harp": "竖琴",
+    "timpani": "定音鼓",
+    "string_ensemble_1": "弦乐合奏1",
+    "string_ensemble_2": "弦乐合奏2",
+    "synth_strings_1": "合成弦乐1",
+    "synth_strings_2": "合成弦乐2",
+    "choir_aahs": "人声合唱“啊”",
+    "voice_oohs": "人声合唱“嘟”",
+    "synth_choir": "童声合唱",
+    "orchestra_hit": "打击交响乐",
+    "trumpet": "小号",
+    "trombone": "长号",
+    "tuba": "大号",
+    "muted_trumpet": "弱音小号",
+    "french_horn": "法国圆号",
+    "brass_section": "铜管乐合奏",
+    "synth_brass_1": "合成铜管1",
+    "synth_brass_2": "合成铜管2",
+    "soprano_sax": "高音萨克斯",
+    "alto_sax": "中音萨克斯",
+    "tenor_sax": "次中音萨克斯",
+    "baritone_sax": "上低音音萨克斯",
+    "oboe": "双簧管",
+    "english_horn": "英国管",
+    "bassoon": "巴松管",
+    "clarinet": "葫芦丝",
+    "piccolo": "口风琴",
+    "flute": "长笛",
+    "recorder": "竖笛",
+    "pan_flute": "排箫",
+    "blown_bottle": "陶笛",
+    "shakuhachi": "尺八",
+    "whistle": "口哨",
+    "ocarina": "瓶笛",
+    "lead_1_square": "合成器1(方形)",
+    "lead_2_sawtooth": "合成器2(锯齿波)",
+    "lead_3_calliope": "主音3(汽笛风琴主奏)",
+    "lead_4_chiff": "主音4(领奏)",
+    "lead_5_charang": "主音5(沙朗主奏)",
+    "lead_6_voice": "主音6(声音)",
+    "lead_7_fifths": "主音7(五度管乐)",
+    "lead_8_bass_lead": "主音8(贝司主奏)",
+    "pad_1_new_age": "长音1(新世纪音乐)",
+    "pad_2_warm": "长音2(温暖的音色)",
+    "pad_3_polysynth": "长音3(多合成音色)",
+    "pad_4_choir": "长音4(合唱)",
+    "pad_5_bowed": "长音5(弧形波)",
+    "pad_6_metallic": "长音6(金属感)",
+    "pad_7_halo": "长音7(光晕)",
+    "pad_8_sweep": "长音8(曲线波)",
+    "fx_1_rain": "特效1(雨声)",
+    "fx_2_soundtrack": "特效2(电影声效)",
+    "fx_3_crystal": "特效3(清澈)",
+    "fx_4_atmosphere": "特效4(气氛)",
+    "fx_5_brightness": "特效5(明亮)",
+    "fx_6_goblins": "特效6(哥布林)",
+    "fx_7_echoes": "特效7(回响)",
+    "fx_8_scifi": "特效8(科幻)",
+    "sitar": "西塔尔琴",
+    "banjo": "班卓琴",
+    "shamisen": "三弦琴",
+    "koto": "十三弦古筝",
+    "kalimba": "克林巴琴",
+    "bagpipe": "苏格兰风笛",
+    "fiddle": "古提琴",
+    "shanai": "响嘁",
+    "tinkle_bell": "铃铛",
+    "agogo": "摇摆舞铃",
+    "steel_drums": "钢鼓",
+    "woodblock": "木鱼",
+    "taiko_drum": "太鼓",
+    "melodic_tom": "通通鼓",
+    "synth_drum": "合成鼓",
+    "reverse_cymbal": "铜钹",
+    "guitar_fret_noise": "吉他换把杂音",
+    "breath_noise": "呼吸声",
+    "seashore": "海浪声",
+    "bird_tweet": "鸟鸣叫",
+    "telephone_ring": "手机铃声",
+    "helicopter": "直升机",
+    "applause": "鼓掌",
+    "gunshot": "射击",
+    "percussion": "打击乐"
+}

+ 4 - 15
src/pc/home/component/the-speed/index.tsx

@@ -10,7 +10,6 @@ export default defineComponent({
 	setup(props, { emit }) {
 		const data = reactive({
 			speed: 80,
-			status: "",
 		});
 		return () => (
 			<div>
@@ -18,11 +17,10 @@ export default defineComponent({
 					<NInputNumber
 						size="large"
 						v-model:value={data.speed}
-						showButton={false}
-						min={1}
-						onUpdateValue={(val) => {
-							console.log("🚀 ~ val:", val)
-							data.status = /^\+?[1-9]\d*$/.test(val + "") ? "" : "error";
+						min={45}
+						max={270}
+						onUpdate:value={() => {
+							emit("change", { type: "speeds", value: "Q:1/4=" + data.speed });
 						}}
 					>
 						{{
@@ -31,15 +29,6 @@ export default defineComponent({
 									<TheIcon iconClassName="icon-a-sudu-4fenyinfu" size={["2em", "1em"]} />
 								</div>
 							),
-							suffix: () => (
-								<NButton
-									text
-									type="primary"
-									onClick={() => emit("change", { type: "speeds", value: "Q:1/4=" + data.speed })}
-								>
-									使用
-								</NButton>
-							),
 						}}
 					</NInputNumber>
 				</div>

+ 19 - 5
src/pc/home/index.tsx

@@ -12,7 +12,15 @@ import { showConfirmDialog, showToast } from "vant";
 import Keys from "../component/keys";
 import { Collapse, CollapseItem } from "@varlet/ui";
 import { IAbc, IMeasure, INote, INoteActive } from "../types";
-import { ABC_DATA, createMeasure, createNote, getKeyStep, moveNoteKey, renderMeasures } from "./runtime";
+import {
+	ABC_DATA,
+	createMeasure,
+	createNote,
+	formateAbc,
+	getKeyStep,
+	moveNoteKey,
+	renderMeasures,
+} from "./runtime";
 import TheIcon from "/src/components/The-icon";
 import { cloneDeep } from "lodash";
 import TheSpeed from "./component/the-speed";
@@ -41,6 +49,7 @@ import FileBtn, { IFileBtnType } from "./component/file-btn";
 import TheSetting from "./component/the-setting";
 import { useRoute } from "vue-router";
 import { api_musicSheetCreationDetail, api_musicSheetCreationUpdate } from "../api";
+import instrumentsNames from "/src/constant/instrmentsNames.json";
 
 const allPitches = [
 	"C,,,,",
@@ -645,11 +654,11 @@ export default defineComponent({
 			// 临时升降记号
 			if (type === "accidentals") {
 				if (!data.active) {
-					showToast("请先选择音符");
+					message.warning("请先选择音符");
 					return;
 				}
 				if (activeNote.content === "z") {
-					showToast("休止符无法添加临时升降记号");
+					message.warning("休止符无法添加临时升降记号");
 					return;
 				}
 				activeNote.accidental = activeNote.accidental == value ? "" : value;
@@ -705,7 +714,7 @@ export default defineComponent({
 			//  演奏技法
 			if (type === "play") {
 				if (!data.active) {
-					showToast("请先选择音符");
+					message.warning("请先选择音符");
 					return;
 				}
 				if (!activeNote) return;
@@ -1041,7 +1050,10 @@ export default defineComponent({
 		};
 
 		const instruments = computed(() => {
-			return ABCJS.synth.instrumentIndexToName.map((name, index) => ({ label: name, value: index }));
+			return ABCJS.synth.instrumentIndexToName.map((name, index) => ({
+				label: instrumentsNames[name as keyof typeof instrumentsNames],
+				value: index,
+			}));
 		});
 		const getDetailData = async () => {
 			const res = await api_musicSheetCreationDetail(route.query.id);
@@ -1104,6 +1116,8 @@ export default defineComponent({
 					e.returnValue = "还有没保存的";
 				}
 			};
+
+			formateAbc(abcData.visualObj);
 		});
 		onUnmounted(() => {
 			document.removeEventListener("keyup", handleKeyUp);

+ 54 - 5
src/pc/home/runtime.ts

@@ -2,6 +2,7 @@ import { reactive } from "vue";
 import { IAbc, IMeasure, INote } from "../types";
 import { getImage } from "./images";
 import { ABC_KEYS, ABC_NOTE_DATA } from "./noteData";
+import { TuneObject } from "abcjs";
 
 export const ABC_DATA = {
 	/** 音符 */
@@ -244,19 +245,19 @@ export const getKeyStep = (key: string, oldKey: string, keyType: "inset" | "up"
 	return { step, move: _key.move };
 };
 export const moveNoteKey = (note: string, moveData: { step: number; move: number }) => {
-	let x = -1
-	for(let i = 0; i < ABC_NOTE_DATA.length; i++) {
+	let x = -1;
+	for (let i = 0; i < ABC_NOTE_DATA.length; i++) {
 		const notes = ABC_NOTE_DATA[i];
 		if (Array.isArray(notes) && notes.includes(note)) {
-			x = i
+			x = i;
 			break;
 		}
 		if (note === notes) {
-			x = i
+			x = i;
 			break;
 		}
 	}
-	console.log(note, moveData.step, x,);
+	console.log(note, moveData.step, x);
 	if (x >= 0) {
 		const _note = ABC_NOTE_DATA[x + moveData.step];
 		if (Array.isArray(_note)) {
@@ -267,3 +268,51 @@ export const moveNoteKey = (note: string, moveData: { step: number; move: number
 	}
 	return note;
 };
+
+export const formateAbc = (visualObj: TuneObject) => {
+	const abc = {
+		celf: "K:treble",
+		minUnit: "L:1/4",
+		meter: "M:4/4",
+		speed: "Q:1/4=60",
+		key: "K:C",
+		visualTranspose: 0,
+		subjectCode: "acoustic_grand_piano",
+	};
+	const list = [];
+	let measureIndex = 0;
+	for (let i = 0; i < visualObj.lines.length; i++) {
+		const line = visualObj.lines[i];
+		if (line.staff) {
+			for (let j = 0; j < line.staff.length; j++) {
+				const staff = line.staff[j];
+				if (i === 0){
+					if (staff.clef){
+						abc.celf = `K:${staff.clef.type}`;
+					}
+					if (staff.key){
+						abc.key = `K:${staff.key.root}${staff.key.acc}`;
+					}
+					if (staff.meter?.value?.[0]){
+						abc.meter = `M:${staff.meter.value[0].num}/${staff.meter.value[0].den}`;
+					}
+				}
+				if (staff.voices) {
+					for (let k = 0; k < staff.voices.length; k++) {
+						const voice = staff.voices[k];
+						for (let l = 0; l < voice.length; l++) {
+							const element = voice[l];
+							if (element.el_type === "bar"){
+								measureIndex++
+							}
+							if (element.el_type === "note") {
+								list.push(element);
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+	console.log(measureIndex)
+};