fingering-config.ts 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379
  1. import { CSSProperties } from "vue";
  2. import relationships from "./fingering-relationships";
  3. export type ITypeFingering = {
  4. json: any;
  5. relationship: any;
  6. height?: number | string;
  7. width?: number | string;
  8. maxWidth?: number;
  9. styles?: CSSProperties;
  10. } | null;
  11. export type IFingering = {
  12. name?: IVocals;
  13. direction?: "vertical" | "transverse";
  14. width?: string;
  15. height?: string;
  16. /** 禁用替指 */
  17. disabledFinger?: boolean;
  18. /** 横竖屏 0:横屏 1: 竖屏 */
  19. orientation?: number;
  20. code?: string;
  21. /** 是否有替指 */
  22. hasTizhi?: boolean;
  23. transform?: string;
  24. };
  25. type ITypeContent = {
  26. [key: string | number]: IFingering;
  27. };
  28. export type IVocals =
  29. | "flute"
  30. | "clarinet"
  31. | "saxophone"
  32. | "trumpet"
  33. | "horn"
  34. | "trombone"
  35. | "up-bass-horn"
  36. | "small-drum"
  37. | "tuba"
  38. | "piccolo"
  39. | "hulusi-flute"
  40. | "pan-flute"
  41. | "pan-flute1"
  42. | "pan-flute2"
  43. | "ocarina"
  44. | "melodica";
  45. /** 映射声部ID */
  46. export const mappingVoicePart = (
  47. id: number | string,
  48. soruce: "GYM" | "COLEXIU" | "ORCHESTRA" | "INSTRUMENT"
  49. ): number => {
  50. if (soruce === "GYM") {
  51. return Number(id);
  52. } else if (soruce === "COLEXIU") {
  53. const subject: { [_key: string | number]: number } = {
  54. Flute: 2,
  55. Clarinet: 4,
  56. Trombone: 14,
  57. Tuba: 17,
  58. Trumpet: 12,
  59. Horn: 13,
  60. AltoSaxophone: 6,
  61. TenorSaxophone: 6,
  62. Saxophone: 6,
  63. UpBassHorn: 15,
  64. Melodica: 137,
  65. HulusiFlute: 136,
  66. PanFlute: 135,
  67. Ocarina: 134,
  68. Recorder: 120,
  69. Ukulele: 130,
  70. Mouthorgan: 140,
  71. Piano: 150,
  72. };
  73. return subject[id];
  74. } else if (soruce === "ORCHESTRA") {
  75. const subject: { [_key: string | number]: number } = {
  76. 1: 23,
  77. 2: 2,
  78. 3: 5,
  79. 4: 4,
  80. 5: 12,
  81. 6: 14,
  82. 7: 13,
  83. 8: 15,
  84. 9: 17,
  85. };
  86. return subject[id];
  87. } else if (soruce === "INSTRUMENT") {
  88. let code = id
  89. if (typeof code === 'string') {
  90. code = code.toLocaleLowerCase().replace(/ /g, '')
  91. }
  92. const subject: { [_key: string | number]: any } = {
  93. flute: 2,
  94. clarinet: 4,
  95. trombone: 14,
  96. tuba: 17,
  97. trumpet: 12,
  98. horn: 13,
  99. altosaxophone: 6,
  100. tenorsaxophone: 6,
  101. saxophone: 6,
  102. upbasshorn: 15,
  103. melodica: 137,
  104. hulusiFlute: 136,
  105. panflute: 135,
  106. recorder: 120,
  107. ukulele: 130,
  108. mouthorgan: 140,
  109. piano: 150,
  110. 4: "piccolo",
  111. 3: "hulusi-flute",
  112. 1: "pan-flute",
  113. 2: "ocarina",
  114. 5: "melodica",
  115. tenorrecorder: "piccolo",
  116. woodwind: "hulusi-flute",
  117. panpipes: "pan-flute",
  118. ocarina: "ocarina",
  119. nai: "melodica",
  120. };
  121. return subject[code] || 0;
  122. }
  123. return 0;
  124. };
  125. /** 声部的指法配置信息 */
  126. export const subjectFingering = (subjectId: number | string): IFingering => {
  127. switch (subjectId) {
  128. case 2: // 长笛
  129. return {
  130. name: "flute",
  131. direction: "transverse",
  132. height: "1.6rem",
  133. hasTizhi: true,
  134. };
  135. case 4: // 单簧管
  136. return {
  137. name: "clarinet",
  138. direction: "vertical",
  139. width: "3rem",
  140. hasTizhi: true,
  141. };
  142. case 5: // 萨克斯
  143. case 6: // 中音萨克斯
  144. return {
  145. name: "saxophone",
  146. direction: "vertical",
  147. width: "4.34rem",
  148. hasTizhi: true,
  149. };
  150. case 12: // 小号
  151. return {
  152. name: "trumpet",
  153. direction: "transverse",
  154. height: "1.6rem",
  155. hasTizhi: false,
  156. };
  157. case 13: // 圆号
  158. return {
  159. name: "horn",
  160. direction: "vertical",
  161. width: "4.98rem",
  162. hasTizhi: false,
  163. };
  164. case 14: // 长号
  165. return {
  166. name: "trombone",
  167. direction: "transverse",
  168. height: "1.6rem",
  169. hasTizhi: false,
  170. };
  171. case 15: // 上低音号
  172. return {
  173. name: "up-bass-horn",
  174. direction: "vertical",
  175. width: "4.34rem",
  176. hasTizhi: false,
  177. };
  178. case 17: // 大号
  179. return {
  180. name: "tuba",
  181. direction: "vertical",
  182. width: "4.34rem",
  183. hasTizhi: false,
  184. };
  185. case 120: // 短笛
  186. return {
  187. name: "piccolo",
  188. direction: "vertical",
  189. width: "3rem",
  190. orientation: 1,
  191. hasTizhi: true,
  192. };
  193. case "piccolo": // 竖笛
  194. return {
  195. name: "piccolo",
  196. direction: "vertical",
  197. width: "3rem",
  198. orientation: 1,
  199. code: '竖笛',
  200. hasTizhi: true,
  201. };
  202. case "hulusi-flute": // 葫芦丝
  203. return {
  204. name: "hulusi-flute",
  205. direction: "vertical",
  206. width: "3rem",
  207. orientation: 1,
  208. code: '葫芦丝',
  209. hasTizhi: false,
  210. };
  211. case "pan-flute": // 排箫
  212. return {
  213. name: "pan-flute",
  214. direction: "transverse",
  215. height: "2.6rem",
  216. disabledFinger: true,
  217. orientation: 0,
  218. code: '排箫',
  219. hasTizhi: false,
  220. transform: 'scale(1.9) translateY(22px)',
  221. };
  222. case "ocarina": // 陶笛
  223. return {
  224. name: "ocarina",
  225. direction: "vertical",
  226. width: "3rem",
  227. disabledFinger: true,
  228. orientation: 0,
  229. code: '陶笛',
  230. hasTizhi: false,
  231. };
  232. case "melodica": // 口风琴
  233. return {
  234. name: "melodica",
  235. direction: "transverse",
  236. height: "1.8rem",
  237. orientation: 0,
  238. code: '口风琴',
  239. hasTizhi: false,
  240. };
  241. default:
  242. return {};
  243. }
  244. };
  245. export const getFingeringConfig = async (type: IVocals | undefined): Promise<ITypeFingering> => {
  246. switch (type) {
  247. case "flute":
  248. const flute = await import(`./fingering-img/flute/index.json`);
  249. return {
  250. json: flute.default,
  251. relationship: relationships.flute,
  252. height: "60px",
  253. styles: {},
  254. };
  255. case "clarinet":
  256. const clarinet = await import(`./fingering-img/clarinet/index.json`);
  257. return {
  258. json: clarinet.default,
  259. relationship: relationships.clarinet,
  260. styles: {
  261. marginLeft: ".4rem",
  262. marginRight: ".7rem",
  263. },
  264. };
  265. case "trumpet":
  266. const trumpet = await import(`./fingering-img/trumpet/index.json`);
  267. return {
  268. json: trumpet.default,
  269. relationship: relationships.trumpet,
  270. // maxWidth: 150,
  271. };
  272. case "horn":
  273. const horn = await import(`./fingering-img/horn/index.json`);
  274. return {
  275. json: horn.default,
  276. relationship: relationships.horn,
  277. height: "212px",
  278. width: "252px",
  279. };
  280. case "tuba":
  281. const tuba = await import(`./fingering-img/tuba/index.json`);
  282. return {
  283. json: tuba.default,
  284. relationship: relationships.tuba,
  285. };
  286. case "piccolo":
  287. const piccolo = await import(`./fingering-img/piccolo/index.json`);
  288. return {
  289. json: piccolo.default,
  290. relationship: relationships.piccolo,
  291. };
  292. case "up-bass-horn":
  293. const upBassHorn = await import(`./fingering-img/up-bass-horn/index.json`);
  294. return {
  295. json: upBassHorn.default,
  296. relationship: relationships["up-bass-horn"],
  297. };
  298. case "trombone":
  299. const trombone = await import(`./fingering-img/trombone/index.json`);
  300. return {
  301. json: trombone.default,
  302. relationship: relationships["trombone"],
  303. };
  304. case "saxophone":
  305. const saxophone = await import(`./fingering-img/saxophone/index.json`);
  306. return {
  307. json: saxophone.default,
  308. relationship: relationships["saxophone"],
  309. styles: {
  310. marginLeft: ".2rem",
  311. marginRight: ".3rem",
  312. },
  313. };
  314. case "small-drum":
  315. const smallDrum = await import(`./fingering-img/small-drum/index.json`);
  316. return {
  317. json: smallDrum.default,
  318. relationship: relationships["up-bass-horn"],
  319. width: "180px",
  320. };
  321. case "hulusi-flute":
  322. const hulusi = await import(`./fingering-img/hulusi-flute/index.json`);
  323. return {
  324. json: hulusi.default,
  325. relationship: relationships.hulusi,
  326. // width: '180px',
  327. styles: {
  328. marginLeft: ".6rem",
  329. marginRight: ".7rem",
  330. },
  331. };
  332. case "pan-flute":
  333. const pan = await import(`./fingering-img/pan-flute/index.json`);
  334. return {
  335. json: pan.default,
  336. relationship: relationships.pan,
  337. };
  338. case "pan-flute1":
  339. const pan1 = await import(`./fingering-img/pan-flute1/index.json`);
  340. return {
  341. json: pan1.default,
  342. relationship: relationships.pan,
  343. };
  344. case "pan-flute2":
  345. const pan2 = await import(`./fingering-img/pan-flute2/index.json`);
  346. return {
  347. json: pan2.default,
  348. relationship: relationships.pan,
  349. };
  350. case "ocarina":
  351. const ocarina = await import(`./fingering-img/ocarina/index.json`);
  352. return {
  353. json: ocarina.default,
  354. relationship: relationships.ocarina,
  355. width: "180px",
  356. styles: {
  357. marginTop: "auto",
  358. },
  359. };
  360. case "melodica":
  361. const melodica = await import(`./fingering-img/melodica/index.json`);
  362. return {
  363. json: melodica.default,
  364. relationship: relationships.melodica,
  365. height: "80px",
  366. styles: {
  367. marginTop: "auto",
  368. },
  369. };
  370. default:
  371. return null;
  372. }
  373. };