Parcourir la source

增加合奏选择

liushengqiang il y a 1 an
Parent
commit
27a4b74be9
2 fichiers modifiés avec 303 ajouts et 6 suppressions
  1. 228 0
      src/constant/instruments.ts
  2. 75 6
      src/views/accompany/music-list.tsx

+ 228 - 0
src/constant/instruments.ts

@@ -0,0 +1,228 @@
+const instruments = {
+  'Acoustic Grand Piano': '大钢琴',
+  'Bright Acoustic Piano': '明亮的钢琴',
+  'Electric Grand Piano': '电钢琴',
+  'Rhodes Piano': '柔和的电钢琴',
+  'Chorused Piano': '加合唱效果的电钢琴',
+  Harpsichord: '羽管键琴',
+  Clavichord: '科拉维科特琴',
+  Celesta: '钢片琴',
+  Glockenspiel: '钢片琴',
+  'Music box': '八音盒',
+  Vibraphone: '颤音琴',
+  Marimba: '马林巴',
+  Xylophone: '木琴',
+  'Tubular Bells': '管钟',
+  Dulcimer: '大扬琴',
+  'Hammond Organ': '击杆风琴',
+  'Percussive Organ': '打击式风琴',
+  'Rock Organ': '摇滚风琴',
+  'Church Organ': '教堂风琴',
+  'Reed Organ': '簧管风琴',
+  Accordian: '手风琴',
+  Harmonica: '口琴',
+  'Tango Accordian': '探戈手风琴',
+  'Acoustic Guitar': '钢弦吉他',
+  'Electric Guitar': '闷音电吉他',
+  'Overdriven Guitar': '加驱动效果的电吉他',
+  'Distortion Guitar': '加失真效果的电吉他',
+  'Guitar Harmonics': '吉他和音',
+  'Acoustic Bass': '大贝司',
+  'Electric Bass': '电贝司',
+  'Fretless Bass': '无品贝司',
+  'Slap Bass': '掌击',
+  'Synth Bass': '电子合成',
+  Violin: '小提琴',
+  Viola: '中提琴',
+  Cello: '大提琴',
+  Contrabass: '低音大提琴',
+  'Tremolo Strings': '弦乐群颤音音色',
+  'Pizzicato Strings': '弦乐群拨弦音色',
+  'Orchestral Harp': '竖琴',
+  Timpani: '定音鼓',
+  'String Ensemble': '弦乐合奏音色',
+  'Synth Strings': '合成弦乐合奏音色',
+  'Choir Aahs': '人声合唱',
+  'Voice Oohs': '人声',
+  'Synth Voice': '合成人声',
+  'Orchestra Hit': '管弦乐敲击齐奏',
+  Trumpet: '小号',
+  Trombone: '长号',
+  Tuba: '大号',
+  'Muted Trumpet': '加弱音器小号',
+  'French Horn': '法国号',
+  'Brass Section': '铜管组',
+  'Synth Brass': '合成铜管音色',
+  'Soprano Sax': '高音萨克斯管',
+  'Alto Sax': '中音萨克斯管',
+  'Tenor Sax': '次中音萨克斯管',
+  'Baritone Sax': '低音萨克斯管',
+  Oboe: '双簧管',
+  'English Horn': '英国管',
+  Bassoon: '巴松',
+  Clarinet: '单簧管',
+  'Soprano Saxophone': '高音萨克斯管',
+  'Alto Saxophone': '中音萨克斯管',
+  'Tenor Saxophone': '次中音萨克斯管',
+  'Baritone Saxophone': '低音萨克斯管',
+  Piccolo: '短笛',
+  Flute: '长笛',
+  Recorder: '竖笛',
+  'Soprano Recorder': '高音竖笛',
+  'Pan Flute': '排箫',
+  'Bottle Blow': '瓶木管',
+  Whistle: '口哨声',
+  Ocarina: '陶笛',
+  Lead: '合成主音',
+  'Lead lead': '合成主音',
+  'Pad age': '合成音色',
+  Pad: '合成音色',
+  FX: '合成效果  科幻',
+  Sitar: '西塔尔',
+  Banjo: '班卓琴',
+  Shamisen: '三昧线',
+  Koto: '十三弦筝',
+  Kalimba: '卡林巴',
+  Bagpipe: '风笛',
+  Fiddle: '民族提琴',
+  Shanai: '山奈',
+  'Tinkle Bell': '叮当铃',
+  Agogos: '阿戈戈铃',
+  'Steel Drums': '钢鼓',
+  'Taiko Drum': '太鼓',
+  'Melodic Toms': '嗵嗵鼓',
+  'Synth Drums': '合成鼓',
+  'Reverse Cymbals': '反向镲',
+  'Agogo Bells': '阿戈戈铃',
+  'Taiko Drums': '太鼓',
+  Bongos: '邦戈鼓',
+  'Bongo Bell': '邦戈铃',
+  Congas: '康加鼓',
+  Guiro: '刮壶',
+  'Guitar Fret Noise': '吉他换把杂音',
+  'Breath Noise': '呼吸声',
+  Seashore: '海浪声',
+  'Bird Tweet': '鸟鸣',
+  'Telephone Ring': '电话铃',
+  Helicopter: '直升机',
+  Applause: '鼓掌声',
+  Gunshot: '枪声',
+  'Acoustic Bass Drum': '大鼓',
+  'Bass Drum': '大鼓',
+  'Side Drum': '小鼓鼓边',
+  'Acoustic Snare': '小鼓',
+  'Hand Claps': '拍手',
+  'Electric Snare': '小鼓',
+  'Low Floor Tom': '低音嗵鼓',
+  'Closed Hi-Hat': '闭合踩镲',
+  'High Floor Tom': '高音落地嗵鼓',
+  'Pedal Hi-Hat': '脚踏踩镲',
+  'Low Tom': '低音嗵鼓',
+  'Open Hi-Hat': '开音踩镲',
+  'Low-Mid Tom': '中低音嗵鼓',
+  'Hi Mid Tom': '高音鼓',
+  'Crash Cymbals': '对镲',
+  'High Tom': '高音嗵鼓',
+  'Ride Cymbals': '叮叮镲',
+  'Chinese Cymbals': '中国镲',
+  'Ride Bell': '圆铃',
+  Tambourine: '铃鼓',
+  'Splash Cymbal': '溅音镲',
+  Cowbell: '牛铃',
+  'Crash Cymbal': '强音钹',
+  'Vibra-Slap': '颤音器',
+  'Ride Cymbal': '打点钹',
+  'Hi Bongo': '高音邦戈鼓',
+  'Low Bongo': '低音邦戈鼓',
+  'Mute Hi Conga': '弱音高音康加鼓',
+  'Open Hi Conga': '强音高音康加鼓',
+  'Low Conga': '低音康加鼓',
+  'High Timbale': '高音天巴鼓',
+  'Low Timbale': '低音天巴鼓',
+  'High Agogo': '高音阿戈戈铃',
+  'Low Agogo': '低音阿戈戈铃',
+  Cabasa: '卡巴萨',
+  Maracas: '沙锤',
+  'Short Whistle': '短口哨',
+  'Long Whistle': '长口哨',
+  'Short Guiro': '短刮壶',
+  'Long Guiro': '长刮壶',
+  Claves: '响棒',
+  'Hi Wood Block': '高音木鱼',
+  'Low Wood Block': '低音木鱼',
+  'Mute Triangle': '弱音三角铁',
+  'Open Triangle': '强音三角铁',
+  'Drum Set': '架子鼓',
+  'Hulusi flute': '葫芦丝',
+  Melodica: '口风琴',
+  'Snare Drum': '小军鼓',
+  Cymbal: '镲',
+  Cymbals: '镲',
+  'Horn in F': '圆号',
+  Triangle: '三角铁',
+  Vibrato: '颤音琴',
+  'Suspend Cymbals': '吊镲',
+  'Suspended Cymbals': '吊镲',
+  'Tom-Toms': '嗵嗵鼓',
+  Bell: '铃铛',
+  Bells: '铃铛',
+  'Alto Clarinet': '中音单簧管',
+  'Bass Clarinet': '低音单簧管',
+  Cornet: '短号',
+  Euphonium: '上低音号',
+  'crash cymbals': '对镲',
+  Castanets: '响板',
+  Shaker: '沙锤',
+  'Mark tree': '音树',
+  Chimes: '管钟',
+  'Mark Tree': '音树',
+  'Tom-toms': '嗵嗵鼓',
+  'Hi-Hat': '踩镲',
+  'Sleigh Bells': '雪橇铃',
+  Flexatone: '弹音器',
+  'Brake drum': '闸鼓',
+  Gong: '锣',
+  'concert tom': '音乐会嗵嗵鼓',
+  'brake drum': '车轮鼓',
+  'finger cymbal': '指钹',
+  'ride cymbal': '叮叮镲',
+  'Concert Toms': '音乐会嗵嗵鼓',
+  Vibraslap: '弹音器',
+  'Wood Blocks': '木鱼',
+  'Temple Blocks': '木鱼',
+  'Wood Block': '木鱼',
+  'Field Drum': '军鼓',
+  'Quad-Toms': '筒鼓',
+  Quads: '筒鼓',
+  'Drums set': '架子鼓',
+  'High Bongo': '邦戈',
+  Timbales: '天巴鼓',
+  'rain stick': '雨棒',
+  'String Bass': '弦乐低音',
+  'Floor Tom': '侧嗵鼓',
+  'Brake Drum': '闸鼓',
+  'Tam-tam': '大锣'
+}
+
+/**
+ * 获取乐器名称
+ * @param instrumentName 乐器code
+ * @returns 
+ */
+export const getInstrumentName = (instrumentName: string) => {
+  const _instrumentName = instrumentName.replace(/ /g, ' ').toLocaleLowerCase()
+  const _instrument = Object.keys(instruments)
+  for (let i = 0; i < _instrument.length; i++) {
+    const _name = _instrument[i].replace(/ /g, ' ').toLocaleLowerCase()
+    if (_name === _instrumentName) {
+      return instruments[_instrument[i]] || ''
+    }
+  }
+  for (let i = 0; i < _instrument.length; i++) {
+    const _name = _instrument[i].replace(/ /g, ' ').toLocaleLowerCase()
+    if (_instrumentName.includes(_name)) {
+      return instruments[_instrument[i]] || ''
+    }
+  }
+  return ''
+}

+ 75 - 6
src/views/accompany/music-list.tsx

@@ -3,7 +3,19 @@ import { postMessage } from '@/helpers/native-message'
 import request from '@/helpers/request'
 import { state } from '@/state'
 import OFullRefresh from '@/components/o-full-refresh'
-import { Cell, CellGroup, DropdownItem, DropdownMenu, Icon, List } from 'vant'
+import {
+  Cell,
+  CellGroup,
+  DropdownItem,
+  DropdownMenu,
+  Icon,
+  List,
+  Picker,
+  Popup,
+  Toast,
+  closeToast,
+  showLoadingToast
+} from 'vant'
 import { defineComponent, reactive, ref, onMounted, nextTick, computed } from 'vue'
 import { useRoute } from 'vue-router'
 import { getImage } from './images'
@@ -11,6 +23,7 @@ import styles from './index.module.less'
 import OSticky from '@/components/o-sticky'
 import OSearch from '@/components/o-search'
 import OHeader from '@/components/o-header'
+import { getInstrumentName } from '@/constant/instruments'
 
 export default defineComponent({
   name: 'accompany-music-list',
@@ -133,9 +146,9 @@ export default defineComponent({
       getList()
     }
     //进入云教练
-    const openView = (item: any) => {
-      const src = `${location.origin}/orchestra-music-score/?id=${item.id}`
-      console.log("🚀 ~ src:", src)
+    const openView = async (item: any) => {
+      const src = `${location.origin}/orchestra-music-score/?id=${item.id}&part-index=${staffData.partIndex}`
+      console.log('🚀 ~ src:', src)
       postMessage({
         api: 'openAccompanyWebView',
         content: {
@@ -148,11 +161,50 @@ export default defineComponent({
       })
     }
     onMounted(() => {
-      if(state.platformType == 'STUDENT'){
+      if (state.platformType == 'STUDENT') {
         getUserInfo()
       }
       getTree()
     })
+
+    const staffData = reactive({
+      open: false,
+      musicXml: {} as any,
+      instrumentName: '',
+      partIndex: 0,
+      partList: [] as any[]
+    })
+    const getPartNames = async (xmlUrl: string) => {
+      let partNames: any[] = []
+      showLoadingToast('加载中...')
+      try {
+        const res = await fetch(xmlUrl).then((response) => response.text())
+        const xml = new DOMParser().parseFromString(res, 'text/xml')
+        const parts = Array.from(xml.getElementsByTagName('part-name'))
+        for (let i = 0; i < parts.length; i++) {
+          const name = getInstrumentName(parts[i].textContent || '')
+          if (name) {
+            partNames.push({ text: name ? (parts[i].textContent + `(${name})`) : '', value: i })
+          }
+        }
+        closeToast()
+      } catch (error) {
+        console.log(error)
+      }
+      partNames = partNames.filter((n) => n.text)
+      return partNames
+    }
+
+    const openMutilPart = async (item: any) => {
+      if (staffData.musicXml[item.id]) {
+        staffData.open = true
+        return Promise.resolve()
+      }
+      staffData.musicXml[item.id] = await getPartNames(item.xmlFileUrl)
+      staffData.instrumentName = item.id
+      staffData.open = true
+    }
+
     return () => (
       <div class={styles['accompany-music-list']}>
         <OSticky
@@ -214,7 +266,13 @@ export default defineComponent({
                     center
                     title={item.musicSheetName}
                     isLink
-                    onClick={() => openView(item)}
+                    onClick={() => {
+                      if (route.query.categorieid == '40') {
+                        openMutilPart(item)
+                        return
+                      }
+                      openView(item)
+                    }}
                   >
                     {{
                       icon: () => (
@@ -228,6 +286,17 @@ export default defineComponent({
           </List>
           {!data.loading && !data.list.length && <OEmpty tips="暂无曲谱" />}
         </OFullRefresh>
+        <Popup teleport="body" position="bottom" round v-model:show={staffData.open}>
+          <Picker
+            columns={staffData.musicXml[staffData.instrumentName]}
+            onConfirm={(value) => {
+              staffData.open = false
+              staffData.partIndex = value.selectedValues[0]
+              openView({id: staffData.instrumentName})
+            }}
+            onCancel={() => (staffData.open = false)}
+          />
+        </Popup>
       </div>
     )
   }