utils.ts 19 KB

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