utils.ts 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632
  1. import numeral from 'numeral';
  2. import dayjs from 'dayjs';
  3. import qs from 'query-string';
  4. export function vaildMusicScoreUrl() {
  5. const url: string = window.location.hostname;
  6. let returnUrl = '';
  7. if (/test/.test(url) || /localhost/.test(url)) {
  8. // test 环境
  9. returnUrl = 'https://test.kt.colexiu.com';
  10. } else if (/dev/.test(url)) {
  11. returnUrl = 'https://dev.kt.colexiu.com';
  12. } else if (/kt.colexiu.com/.test(url)) {
  13. returnUrl = 'https://mec.colexiu.com';
  14. } else {
  15. returnUrl = 'https://mec.colexiu.com';
  16. }
  17. return returnUrl;
  18. }
  19. export function vaildPPTUrl() {
  20. const url: string = window.location.hostname;
  21. let returnUrl = '';
  22. if (/test/.test(url)) {
  23. returnUrl = 'https://test.kt.colexiu.com/classroom-ppt';
  24. } else if (/dev/.test(url)) {
  25. returnUrl = 'https://dev.kt.colexiu.com/classroom-ppt';
  26. } else if (/localhost/.test(url)) {
  27. returnUrl = 'http://localhost:9527';
  28. } else {
  29. returnUrl = 'https://mec.colexiu.com/classroom-ppt';
  30. }
  31. return returnUrl;
  32. }
  33. export const browser = () => {
  34. // https://blog.csdn.net/qq_19309473/article/details/124138954
  35. const u = navigator.userAgent;
  36. const isAndroid = /(?:Android)/.test(u);
  37. const isFireFox = /(?:Firefox)/.test(u);
  38. function isIpadFun() {
  39. const ua = window.navigator.userAgent;
  40. let IsIPad = false;
  41. if (/ipad/i.test(ua)) {
  42. IsIPad = true;
  43. }
  44. // iPad from IOS13
  45. const macApp = ua.match(/Macintosh/i) != null;
  46. if (macApp) {
  47. // need to distinguish between Macbook and iPad
  48. const canvas = document.createElement('canvas');
  49. if (canvas != null) {
  50. const context: any =
  51. canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
  52. if (context) {
  53. const info = context.getExtension('WEBGL_debug_renderer_info');
  54. if (info) {
  55. const renderer = context.getParameter(info.UNMASKED_RENDERER_WEBGL);
  56. if (renderer.indexOf('Apple') != -1) IsIPad = true;
  57. }
  58. }
  59. }
  60. }
  61. return IsIPad;
  62. }
  63. // || navigator?.userAgent?.includes("UAWEIVRD-W09")
  64. return {
  65. trident: u.indexOf('Trident') > -1, //IE内核
  66. presto: u.indexOf('Presto') > -1, //opera内核
  67. webKit: u.indexOf('AppleWebKit') > -1, //苹果、谷歌内核
  68. gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1, //火狐内核
  69. mobile: !!u.match(/AppleWebKit.*Mobile.*/), //是否为移动终端
  70. ios: !!u.match(/Mac OS X/), //ios终端
  71. // ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端
  72. android: u.indexOf('COLEXIUSTUDENT') > -1 || u.indexOf('Adr') > -1, //android终端
  73. iPhone: u.indexOf('COLEXIUAPPI') > -1, //是否为iPhone或者QQHD浏览器
  74. isApp:
  75. u.indexOf('COLEXIUAPPI') > -1 ||
  76. u.indexOf('COLEXIUAPPA') > -1 ||
  77. u.indexOf('Adr') > -1,
  78. isTablet:
  79. /(?:iPad|PlayBook)/.test(u) ||
  80. (isAndroid && !/(?:Mobile)/.test(u)) ||
  81. (isFireFox && /(?:Tablet)/.test(u)) ||
  82. isIpadFun(),
  83. iPad: u.indexOf('iPad') > -1, //是否iPad
  84. webApp: u.indexOf('Safari') == -1, //是否web应该程序,没有头部与底部
  85. weixin: u.indexOf('MicroMessenger') > -1, //是否微信 (2015-01-22新增)
  86. alipay: u.indexOf('AlipayClient') > -1, //是否支付宝
  87. huawei:
  88. !!u.match(/huawei/i) || !!u.match(/honor/i) || !!u.match(/HarmonyOS/i),
  89. xiaomi: !!u.match(/mi\s/i) || !!u.match(/redmi/i) || !!u.match(/mix/i)
  90. };
  91. };
  92. // 获取授权的code码
  93. export const getUrlCode = (name = 'code') => {
  94. // 截取url中的code方法
  95. // const url = location.search;
  96. // const theRequest: any = new Object();
  97. // if (url.indexOf('?') != -1) {
  98. // const str = url.substr(1);
  99. // const strs = str.split('&');
  100. // for (let i = 0; i < strs.length; i++) {
  101. // theRequest[strs[i].split('=')[0]] = strs[i].split('=')[1];
  102. // }
  103. // }
  104. // console.log(theRequest, 'theRequest');
  105. // return theRequest[name];
  106. let search: any = {};
  107. try {
  108. search = {
  109. ...qs.parse(location.search),
  110. ...qs.parse(location.hash.split('?')[1])
  111. };
  112. } catch (error) {
  113. //
  114. }
  115. return search[name];
  116. };
  117. export const getRandomKey = () => {
  118. const key = '' + new Date().getTime() + Math.floor(Math.random() * 1000000);
  119. return key;
  120. };
  121. export function checkPhone(phone: string) {
  122. const phoneRule =
  123. /^((13[0-9])|(14(0|[5-7]|9))|(15([0-3]|[5-9]))|(16(2|[5-9]))|(17[0-8])|(18[0-9])|(19([0-3]|[5-9])))\d{8}$/;
  124. return phoneRule.test(phone);
  125. }
  126. /**
  127. * @description 格式化日期控件显示内容
  128. * @param type
  129. * @param option
  130. * @returns OBJECT
  131. */
  132. export const formatterDatePicker = (type: any, option: any) => {
  133. if (type === 'year') {
  134. option.text += '年';
  135. }
  136. if (type === 'month') {
  137. option.text += '月';
  138. }
  139. if (type === 'day') {
  140. option.text += '日';
  141. }
  142. return option;
  143. };
  144. /**
  145. * 数字转成汉字
  146. * @params num === 要转换的数字
  147. * @return 汉字
  148. * */
  149. export const toChinesNum = (num: any) => {
  150. const changeNum = [
  151. '零',
  152. '一',
  153. '二',
  154. '三',
  155. '四',
  156. '五',
  157. '六',
  158. '七',
  159. '八',
  160. '九'
  161. ];
  162. const unit = ['', '十', '百', '千', '万'];
  163. num = parseInt(num);
  164. const getWan = (temp: any) => {
  165. const strArr = temp.toString().split('').reverse();
  166. let newNum = '';
  167. const newArr: string[] = [];
  168. strArr.forEach((item: any, index: any) => {
  169. newArr.unshift(
  170. item === '0' ? changeNum[item] : changeNum[item] + unit[index]
  171. );
  172. });
  173. const numArr: number[] = [];
  174. newArr.forEach((m, n) => {
  175. if (m !== '零') numArr.push(n);
  176. });
  177. if (newArr.length > 1) {
  178. newArr.forEach((m, n) => {
  179. if (newArr[newArr.length - 1] === '零') {
  180. if (n <= numArr[numArr.length - 1]) {
  181. newNum += m;
  182. }
  183. } else {
  184. newNum += m;
  185. }
  186. });
  187. } else {
  188. newNum = newArr[0];
  189. }
  190. return newNum;
  191. };
  192. const overWan = Math.floor(num / 10000);
  193. let noWan: any = num % 10000;
  194. if (noWan.toString().length < 4) {
  195. noWan = '0' + noWan;
  196. }
  197. return overWan ? getWan(overWan) + '万' + getWan(noWan) : getWan(num);
  198. };
  199. // 秒转分
  200. export const getSecondRPM = (second: number, type?: string) => {
  201. if (isNaN(second)) return '00:00';
  202. const mm = Math.floor(second / 60)
  203. .toString()
  204. .padStart(2, '0');
  205. const dd = Math.floor(second % 60)
  206. .toString()
  207. .padStart(2, '0');
  208. if (type === 'cn') {
  209. return mm + '分' + dd + '秒';
  210. } else {
  211. return mm + ':' + dd;
  212. }
  213. };
  214. export const getWeekCh = (week: number, type = 0) => {
  215. const template = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
  216. const template2 = [
  217. '星期天',
  218. '星期一',
  219. '星期二',
  220. '星期三',
  221. '星期四',
  222. '星期五',
  223. '星期六'
  224. ];
  225. return type ? template2[week] : template[week];
  226. };
  227. export const getGradeCh = (grade: number) => {
  228. const template = [
  229. '一年级',
  230. '二年级',
  231. '三年级',
  232. '四年级',
  233. '五年级',
  234. '六年级',
  235. '七年级',
  236. '八年级',
  237. '九年级'
  238. ];
  239. return template[grade];
  240. };
  241. export const numberFormat = (num: number, type?: string) => {
  242. if (type === 'percent') {
  243. return numeral(num).format('0.0%');
  244. }
  245. return numeral(num).format('0,0');
  246. };
  247. export const moneyFormat = (value: number, format = '0,0.00') => {
  248. return numeral(value).format(format);
  249. };
  250. export const dateFormat = (
  251. value: string | Date,
  252. format = 'YYYY-MM-DD HH:mm:ss'
  253. ) => {
  254. return dayjs(value).format(format);
  255. };
  256. const instruments: any = {
  257. 'Acoustic Grand Piano': '大钢琴',
  258. 'Bright Acoustic Piano': '明亮的钢琴',
  259. 'Electric Grand Piano': '电钢琴',
  260. 'Rhodes Piano': '柔和的电钢琴',
  261. 'Chorused Piano': '加合唱效果的电钢琴',
  262. Harpsichord: '羽管键琴',
  263. Clavichord: '科拉维科特琴',
  264. Celesta: '钢片琴',
  265. Glockenspiel: '钢片琴',
  266. 'Music box': '八音盒',
  267. Vibraphone: '颤音琴',
  268. Marimba: '马林巴',
  269. Xylophone: '木琴',
  270. 'Tubular Bells': '管钟',
  271. Dulcimer: '大扬琴',
  272. 'Hammond Organ': '击杆风琴',
  273. 'Percussive Organ': '打击式风琴',
  274. 'Rock Organ': '摇滚风琴',
  275. 'Church Organ': '教堂风琴',
  276. 'Reed Organ': '簧管风琴',
  277. Accordian: '手风琴',
  278. Harmonica: '口琴',
  279. 'Tango Accordian': '探戈手风琴',
  280. 'Acoustic Guitar': '钢弦吉他',
  281. 'Electric Guitar': '闷音电吉他',
  282. 'Overdriven Guitar': '加驱动效果的电吉他',
  283. 'Distortion Guitar': '加失真效果的电吉他',
  284. 'Guitar Harmonics': '吉他和音',
  285. 'Acoustic Bass': '大贝司',
  286. 'Electric Bass': '电贝司',
  287. 'Fretless Bass': '无品贝司',
  288. 'Slap Bass': '掌击',
  289. 'Synth Bass': '电子合成',
  290. Violin: '小提琴',
  291. Viola: '中提琴',
  292. Cello: '大提琴',
  293. Contrabass: '低音大提琴',
  294. 'Tremolo Strings': '弦乐群颤音音色',
  295. 'Pizzicato Strings': '弦乐群拨弦音色',
  296. 'Orchestral Harp': '竖琴',
  297. Timpani: '定音鼓',
  298. 'String Ensemble': '弦乐合奏音色',
  299. 'Synth Strings': '合成弦乐合奏音色',
  300. 'Choir Aahs': '人声合唱',
  301. 'Voice Oohs': '人声',
  302. 'Synth Voice': '合成人声',
  303. 'Orchestra Hit': '管弦乐敲击齐奏',
  304. Trumpet: '小号',
  305. Trombone: '长号',
  306. Tuba: '大号',
  307. 'Muted Trumpet': '加弱音器小号',
  308. 'French Horn': '法国号',
  309. 'Brass Section': '铜管组',
  310. 'Synth Brass': '合成铜管音色',
  311. 'Soprano Sax': '高音萨克斯管',
  312. 'Alto Sax': '中音萨克斯管',
  313. 'Tenor Sax': '次中音萨克斯管',
  314. 'Baritone Sax': '低音萨克斯管',
  315. Oboe: '双簧管',
  316. 'English Horn': '英国管',
  317. Bassoon: '巴松',
  318. 'Soprano Saxophone': '高音萨克斯管',
  319. 'Alto Saxophone': '中音萨克斯管',
  320. 'Tenor Saxophone': '次中音萨克斯管',
  321. 'Baritone Saxophone': '低音萨克斯管',
  322. Piccolo: '短笛',
  323. Flute: '长笛',
  324. Recorder: '竖笛',
  325. 'Soprano Recorder': '高音竖笛',
  326. 'Pan Flute': '排箫',
  327. 'Bottle Blow': '瓶木管',
  328. Whistle: '口哨声',
  329. Ocarina: '陶笛',
  330. Lead: '合成主音',
  331. 'Lead lead': '合成主音',
  332. 'Pad age': '合成音色',
  333. Pad: '合成音色',
  334. FX: '合成效果 科幻',
  335. Sitar: '西塔尔',
  336. Banjo: '班卓琴',
  337. Shamisen: '三昧线',
  338. Koto: '十三弦筝',
  339. Kalimba: '卡林巴',
  340. Bagpipe: '风笛',
  341. Fiddle: '民族提琴',
  342. Shanai: '山奈',
  343. 'Tinkle Bell': '叮当铃',
  344. Agogos: '阿戈戈铃',
  345. 'Steel Drums': '钢鼓',
  346. 'Taiko Drum': '太鼓',
  347. 'Melodic Toms': '嗵嗵鼓',
  348. 'Synth Drums': '合成鼓',
  349. 'Reverse Cymbals': '反向镲',
  350. 'Agogo Bells': '阿戈戈铃',
  351. 'Taiko Drums': '太鼓',
  352. Bongos: '邦戈鼓',
  353. 'Bongo Bell': '邦戈铃',
  354. Congas: '康加鼓',
  355. Guiro: '刮壶',
  356. 'Guitar Fret Noise': '吉他换把杂音',
  357. 'Breath Noise': '呼吸声',
  358. Seashore: '海浪声',
  359. 'Bird Tweet': '鸟鸣',
  360. 'Telephone Ring': '电话铃',
  361. Helicopter: '直升机',
  362. Applause: '鼓掌声',
  363. Gunshot: '枪声',
  364. 'Acoustic Bass Drum': '大鼓',
  365. 'Bass Drum': '大鼓',
  366. 'Side Drum': '小鼓鼓边',
  367. 'Acoustic Snare': '小鼓',
  368. 'Hand Claps': '拍手',
  369. 'Electric Snare': '小鼓',
  370. 'Low Floor Tom': '低音嗵鼓',
  371. 'Closed Hi-Hat': '闭合踩镲',
  372. 'High Floor Tom': '高音落地嗵鼓',
  373. 'Pedal Hi-Hat': '脚踏踩镲',
  374. 'Low Tom': '低音嗵鼓',
  375. 'Open Hi-Hat': '开音踩镲',
  376. 'Low-Mid Tom': '中低音嗵鼓',
  377. 'Hi Mid Tom': '高音鼓',
  378. 'Crash Cymbals': '对镲',
  379. 'High Tom': '高音嗵鼓',
  380. 'Ride Cymbals': '叮叮镲',
  381. 'Chinese Cymbals': '中国镲',
  382. 'Ride Bell': '圆铃',
  383. Tambourine: '铃鼓',
  384. 'Splash Cymbal': '溅音镲',
  385. Cowbell: '牛铃',
  386. 'Crash Cymbal': '强音钹',
  387. 'Vibra-Slap': '颤音器',
  388. 'Ride Cymbal': '打点钹',
  389. 'Hi Bongo': '高音邦戈鼓',
  390. 'Low Bongo': '低音邦戈鼓',
  391. 'Mute Hi Conga': '弱音高音康加鼓',
  392. 'Open Hi Conga': '强音高音康加鼓',
  393. 'Low Conga': '低音康加鼓',
  394. 'High Timbale': '高音天巴鼓',
  395. 'Low Timbale': '低音天巴鼓',
  396. 'High Agogo': '高音阿戈戈铃',
  397. 'Low Agogo': '低音阿戈戈铃',
  398. Cabasa: '卡巴萨',
  399. Maracas: '沙锤',
  400. 'Short Whistle': '短口哨',
  401. 'Long Whistle': '长口哨',
  402. 'Short Guiro': '短刮壶',
  403. 'Long Guiro': '长刮壶',
  404. Claves: '响棒',
  405. 'Hi Wood Block': '高音木鱼',
  406. 'Low Wood Block': '低音木鱼',
  407. 'Mute Triangle': '弱音三角铁',
  408. 'Open Triangle': '强音三角铁',
  409. 'Drum Set': '架子鼓',
  410. 'Hulusi flute': '葫芦丝',
  411. Melodica: '口风琴',
  412. 'Snare Drum': '小军鼓',
  413. 'Horn in F': '圆号',
  414. Triangle: '三角铁',
  415. Vibrato: '颤音琴',
  416. 'Suspend Cymbals': '吊镲',
  417. 'Suspended Cymbals': '吊镲',
  418. 'Tom-Toms': '嗵嗵鼓',
  419. Bell: '铃铛',
  420. Bells: '铃铛',
  421. 'Alto Clarinet': '中音单簧管',
  422. 'Bass Clarinet': '低音单簧管',
  423. Clarinet: '单簧管',
  424. Cornet: '短号',
  425. Euphonium: '上低音号',
  426. 'crash cymbals': '对镲',
  427. Castanets: '响板',
  428. Shaker: '沙锤',
  429. 'Mark tree': '音树',
  430. Chimes: '管钟',
  431. 'Mark Tree': '音树',
  432. 'Tom-toms': '嗵嗵鼓',
  433. 'Hi-Hat': '踩镲',
  434. 'Sleigh Bells': '雪橇铃',
  435. Flexatone: '弹音器',
  436. 'Brake drum': '闸鼓',
  437. Gong: '锣',
  438. 'concert tom': '音乐会嗵嗵鼓',
  439. 'brake drum': '车轮鼓',
  440. 'finger cymbal': '指钹',
  441. 'ride cymbal': '叮叮镲',
  442. 'Concert Toms': '音乐会嗵嗵鼓',
  443. Vibraslap: '弹音器',
  444. 'Wood Blocks': '木鱼',
  445. 'Temple Blocks': '木鱼',
  446. 'Wood Block': '木鱼',
  447. 'Field Drum': '军鼓',
  448. 'Quad-Toms': '筒鼓',
  449. Quads: '筒鼓',
  450. 'Drums set': '架子鼓',
  451. 'High Bongo': '邦戈',
  452. Timbales: '天巴鼓',
  453. 'rain stick': '雨棒',
  454. 'String Bass': '弦乐低音',
  455. 'Floor Tom': '侧嗵鼓',
  456. 'Brake Drum': '闸鼓',
  457. 'Tam-tam': '大锣',
  458. Cymbal: '镲',
  459. Cymbals: '镲'
  460. };
  461. /** 获取分轨名称 */
  462. export const getInstrumentName = (name = '') => {
  463. name = name.toLocaleLowerCase().replace(/ /g, '');
  464. if (!name) return '';
  465. for (let key in instruments) {
  466. const _key = key.toLocaleLowerCase().replace(/ /g, '');
  467. if (_key.includes(name)) {
  468. return instruments[key];
  469. }
  470. }
  471. for (let key in instruments) {
  472. const _key = key.toLocaleLowerCase().replace(/ /g, '');
  473. if (name.includes(_key)) {
  474. return instruments[key];
  475. }
  476. }
  477. return '';
  478. };
  479. /**
  480. * 乐器排序
  481. * 排序顺序:长笛、单簧管、中音单簧管、低音单簧管、高音萨克斯风、中音萨克斯风、次中音萨克斯风、低音萨克斯风、小号、长号、圆号、大号、上低音号
  482. * */
  483. export const sortMusical = (name: string, index: number) => {
  484. let sortId = 0;
  485. switch (name) {
  486. case '长笛':
  487. sortId = 1;
  488. break;
  489. case '单簧管':
  490. sortId = 2;
  491. break;
  492. case '中音单簧管':
  493. sortId = 3;
  494. break;
  495. case '低音单簧管':
  496. sortId = 4;
  497. break;
  498. case '高音萨克斯风':
  499. sortId = 5;
  500. break;
  501. case '中音萨克斯风':
  502. sortId = 6;
  503. break;
  504. case '次中音萨克斯风':
  505. sortId = 7;
  506. break;
  507. case '低音萨克斯风':
  508. sortId = 8;
  509. break;
  510. case '小号':
  511. sortId = 9;
  512. break;
  513. case '长号':
  514. sortId = 10;
  515. break;
  516. case '圆号':
  517. sortId = 11;
  518. break;
  519. case '大号':
  520. sortId = 12;
  521. break;
  522. case '上低音号':
  523. sortId = 13;
  524. break;
  525. default:
  526. sortId = index + 14;
  527. break;
  528. }
  529. return sortId;
  530. };
  531. /** debounce */
  532. export const debounce = (fn: Function, ms = 0) => {
  533. let timeoutId: number | undefined;
  534. return function (...args: any[]) {
  535. clearTimeout(timeoutId);
  536. // @ts-ignore
  537. timeoutId = setTimeout(() => fn.apply(this, args), ms);
  538. };
  539. };
  540. // 课堂乐器声轨名称集合
  541. const trackNames: any = {
  542. Piccolo: 'Tenor Recorder',
  543. flute: 'Flute',
  544. Flute: 'Flute',
  545. 'Flute 1': 'Flute',
  546. 'Flute 2': 'Flute',
  547. Oboe: 'Clarinet',
  548. oboe: 'Clarinet',
  549. clarinet: 'Clarinet',
  550. 'Clarinet in Bb': 'Clarinet',
  551. 'Clarinet in Bb 1': 'Clarinet',
  552. 'Clarinet in Bb 2': 'Clarinet',
  553. 'Alto Clarinet in Eb': 'Clarinet',
  554. 'Bass Clarinet in Bb': 'Clarinet',
  555. Bassoon: 'Bassoon',
  556. 'Alto Saxophone': 'Alto Saxophone',
  557. 'Tenor Saxophone': 'Alto Saxophone',
  558. 'Baritone Saxophone': 'Alto Saxophone',
  559. altosaxophone: 'Alto Saxophone',
  560. tenorsaxophone: 'Alto Saxophone',
  561. saxophone: 'Alto Saxophone',
  562. 'Trumpet in Bb 1': 'Trumpet',
  563. 'Trumpet in Bb 2': 'Trumpet',
  564. trumpet: 'Trumpet',
  565. 'Horn in F': 'Horn',
  566. 'Horn in F 1': 'Horn',
  567. 'Horn in F 2': 'Horn',
  568. horn: 'Horn',
  569. trombone: 'Trombone',
  570. 'Trombone 1': 'Trombone',
  571. 'Trombone 2': 'Trombone',
  572. 'Trombone 3': 'Trombone',
  573. Euphonium: 'Baritone',
  574. upbasshorn: 'Baritone',
  575. Tuba: 'Tuba',
  576. tuba: 'Tuba',
  577. Chimes: 'Chimes',
  578. Bells: 'Bells',
  579. Xylophone: 'Xylophone',
  580. 'Snare Drum': 'Snare Drum',
  581. 'Bass Drum': 'Bass Drum',
  582. Triangle: 'Triangle',
  583. 'Suspended Cymbal': 'Suspended Cymbal',
  584. 'Crash Cymbals': 'Crash Cymbals',
  585. 'Concert Toms': 'Concert Toms',
  586. Timpani: 'Timpani',
  587. 'Drum Set': 'Drum Set',
  588. Marimba: 'Marimba',
  589. Vibraphone: 'Vibraphone',
  590. 'Tubular Bells': 'Tubular Bells',
  591. Mallets: 'Mallets',
  592. recorder: 'Piccolo',
  593. tenorrecorder: 'piccolo',
  594. melodica: 'melodica',
  595. hulusiFlute: 'hulusiFlute',
  596. panflute: 'panflute',
  597. ukulele: 'ukulele',
  598. mouthorgan: 'mouthorgan',
  599. piano: 'piano',
  600. woodwind: 'Woodwind',
  601. panpipes: 'Panpipes',
  602. ocarina: 'Ocarina',
  603. nai: 'Nai',
  604. BaroqueRecorder: 'Baroque Recorder'
  605. };
  606. /** 声轨track转换成乐器code */
  607. export const trackToCode = (track: any) => {
  608. return trackNames[track] || track;
  609. };