midiPlay.tsx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. /**
  2. * app播放midi
  3. */
  4. import { ref } from 'vue'
  5. import { getDuration } from "/src/helpers/formateMusic";
  6. import state, { onPlay } from "/src/state";
  7. import { OpenSheetMusicDisplay } from "/osmd-extended/src";
  8. import { api_cloudDestroy, api_cloudDetail, api_cloudVolume, api_cloudGetMediaStatus,
  9. api_cloudPlay, api_cloudSuspend, } from "/src/helpers/communication";
  10. import { audioData } from "/src/view/audio-list"
  11. export type IMode = 'background' | 'music'
  12. export const initMidi = (durationNum: number, midiUrl?: string) => {
  13. const initial = ref(false)
  14. if (midiUrl) {
  15. console.log('曲谱为midi,使用app播放')
  16. initial.value = true
  17. state.midiPlayIniting = true
  18. const duration: any = getDuration(state.osmd as unknown as OpenSheetMusicDisplay);
  19. // 销毁播放器
  20. api_cloudDestroy();
  21. // 发送初始化信息
  22. api_cloudDetail({
  23. api: 'cloudDetail',
  24. content: {
  25. midi: midiUrl,
  26. denominator: duration.denominator,
  27. numerator: duration.numerator,
  28. originalSpeed: state.originSpeed,
  29. interval: 50,
  30. duration: durationNum * 1000,
  31. }
  32. }, () => {
  33. state.midiPlayIniting = false
  34. initial.value = false
  35. if (midiUrl) {
  36. changeMode('music')
  37. }
  38. })
  39. state.durationNum = durationNum
  40. }
  41. return {
  42. initial,
  43. }
  44. }
  45. /** 获取当前MidiId */
  46. export const getActiveMidiId = () => {
  47. return state.osmd?.sheet?.instruments?.[0]?.subInstruments?.[0]?.midiInstrumentID ?? 0
  48. }
  49. /**
  50. * 修改原音或伴奏
  51. * @param val IMode
  52. */
  53. export const changeMode = async (val: IMode, type?: string | undefined) => {
  54. const cm: IMode = val === 'background' ? 'music' : 'background'
  55. console.log(!state.songs[val], val, cm)
  56. if (state.isAppPlay) {
  57. const data = new Map()
  58. for (const name of state.partListNames) {
  59. data.set(name, 60)
  60. }
  61. // for (const name of getVoicePartInfo().partListNames) {
  62. // data.set(name, cm === 'background' ? 100 : 0)
  63. // }
  64. api_cloudVolume({
  65. activeMidiId: getActiveMidiId(),
  66. activeMidiVolume: cm === 'background' ? 100 : 0,
  67. parts: Array.from(data.keys()).map((item) => ({
  68. name: item,
  69. volume: data.get(item),
  70. })),
  71. })
  72. }
  73. state.playSource = val
  74. if (type === 'all') {
  75. state.audiosInstance?.setMute(true, state.songs[cm])
  76. state.audiosInstance?.setMute(true, state.songs[val])
  77. } else {
  78. state.audiosInstance?.setMute(true, state.songs[cm])
  79. state.audiosInstance?.setMute(false, state.songs[val])
  80. }
  81. }
  82. /**
  83. * 切换midi播放状态
  84. */
  85. export const cloudToggleState = async () => {
  86. const cloudGetMediaStatus = await api_cloudGetMediaStatus();
  87. const status = cloudGetMediaStatus?.content.status
  88. if (status === 'init') {
  89. return
  90. }
  91. if (status === 'suspend') {
  92. await api_cloudPlay({
  93. songID: state.examSongId,
  94. startTime: audioData.progress * 1000,
  95. originalSpeed: state.originSpeed, // midi初始速度
  96. speed: state.speed, // 实际速度
  97. hertz: 440, //SettingState.sett.hertz,
  98. })
  99. // startCapture()
  100. onPlay()
  101. } else {
  102. await api_cloudSuspend({
  103. songID: state.examSongId,
  104. })
  105. // endCapture()
  106. }
  107. const cloudGetMediaStatused = await api_cloudGetMediaStatus()
  108. state.playState = cloudGetMediaStatused?.content.status
  109. console.log(cloudGetMediaStatused, 'cloudGetMediaStatused')
  110. }