# 云教练文档整合v2023.12.28

## 更新记录

- 2023年12月28日，辜临轩，创建文档

## 云教练功能点

### 曲目详情页

#### 转谱

1、功能描述

1）用户可使用该功能切换五线谱、固定调（简谱）、首调（简谱）显示

2、业务规则

1）判断曲目是否为合奏曲目，合奏曲目不可转换简谱（含固定调、首调），声部曲目根据该声部设置的是否支持转简谱判断是否呈现

2）声部曲目根据该声部后台设置是否支持转简谱判断。若该声部设置为不支持转简谱，则不显示该功能；若设置为支持转简谱，则显示该功能

3）不支持转简谱的曲目默认显示五线谱，支持转简谱的声部根据后台设置的默认谱面判断默认显示五线谱、首调、固定调

3、操作方式

1）点击转谱功能按钮

2）选择需要切换的谱面类型

3）页面显示的谱面切换为用户所选谱面

#### 切换声轨

1、功能描述

1）可使用该功能切换谱面显示那一条声轨

2、业务规则

1）仅合奏曲目支持切换声轨

2）可切换的声轨根据后台设置该曲目可切换的声轨显示

3、操作方式

1）点击切换声轨功能按钮

2）选择需要显示的声轨

3）页面显示的谱面切换为用户所选声轨谱面

#### 试听

1、功能描述

1）用户可使用该功能试听当前所选声轨的原声MP3

2、业务规则

1）Mid播放的曲目不支持该功能

2）根据用户所选声轨播放该声轨的MP3

3、操作方式

1）点击播放按钮

2）播放当前所选声轨播放该声轨的原声MP3

#### 下载曲目

1、功能描述

1）可使用该功能下载曲谱图片到设备相册

2、业务规则

1）根据当前选择的谱面（五线谱、首调、固定调）和声轨下载对应谱面图片

3、操作方式

1）点击下载按钮

2）切换需要下载的谱面页码

3）点击保存按钮

4）图片保存到设备相册

### 云教练通用功能

#### 模式切换

1、功能描述

1）用户可使用该功能切换云教练的三种模式

2）三种模式分别为：练习模式、跟练模式、评测模式

2、业务规则

1）当该曲目后台没有上传伴奏时，不支持评测模式

3、操作方式

1）点击模式按钮

2）显示该曲目可支持的模式

3）点击所需模式按钮

4）进入对应模式界面

#### 转谱

同【曲目详情页-切换声轨】

#### 切换声轨

同【曲目详情页-切换声轨】

#### 指法开关

1、功能描述

1）用户可使用该功能开启或关闭谱面指法显示

2）默认状态为开始指法显示

3）该功能仅练习模式、跟练模式可用

2、业务规则

无

3、操作方式

1）点击指法按钮

2）根据用户所切换的开启/关闭状态显示/关闭指法

#### 指针模式调整

1、功能描述

1）该功能用于调整谱面指针的播放方式，共分为三种：音符指针、节拍指针、关闭指针

2）音符指针：播放曲目时，指针跟随音符走动，例：指针走到二分音符时停留两拍后再走到下一个音符

3）节拍指针：播放曲目时，指针跟随节拍走动，例：指针走到二分音符时停留一拍，然后走到后面空白处停留一拍，再走到下一个音符

4）关闭指针：播放曲目时，不显示指针，当前播放小节需高亮显示

5）该功能仅练习模式、评测模式可用

6）默认为音符指针

2、业务规则

请自行学习乐理基础中音符、拍号、时值相关知识

3、操作方式

1）用户每点击一次切换指针按钮时，依照音符指针、节拍指针、关闭指针顺序切换到下一个

#### 节拍器开关

1、功能描述

1）用户可自行开启或关闭节拍器

2）开启时，当用户使用播放功能，系统根据当前曲目拍号播放节拍声音

3）该功能仅练习模式、跟练模式可用

2、业务规则

无

3、操作方式

无

#### 节拍器音量

1、功能描述

1）该功能用于调整节拍器的播放音量

2、业务规则

1）未开启节拍器时不显示该功能

2）开始节拍器后显示该功能

3、操作方式

无

#### 循环播放

1、功能描述

1）用户可自行开启或关闭该功能

2）功能开启时，用户播放曲目结束后，指针自动跳转第一个小节并自动再次播放

3）当用户使用选段功能选择部分小节播放时，播放结束后跳转所选小节前一个小节开始自动再次播放

4）循环播放时，当用户点击暂停按钮后停止播放

5）关闭该功能时，无论用户是否选段播放，播放结束指针都不跳转并停止播放

2、业务规则

1）开启时循环播放，直到用户点击暂停

2）开启且未选段时，播放结束后跳转第一小节再次播放

3）开启且选段时，播放结束后跳转所选小节的前一个小节再次播放

4）关闭时，无论是否选段，播放结束后都不再重复播放

3、操作方式

1）点击循环播放按钮，开启魂环播放

2）开启后，当用户正常结束后，指针自动跳转第一小节，再次播放

3）开启后，当用户选段播放结束后，指针自动跳转所选小节的迁移小节，再次播放（从所选小节的前一小节播放）

#### 护眼模式

1、功能描述

1）开启护眼模式可将谱面背景颜色改为护眼色

2、业务规则

无

3、操作方式

1）点击护眼模式开关，开启护眼模式

2）谱面背景颜色切换为护眼色

#### 投屏帮助

1、功能描述

1）用户可使用该功能查看设备画面如何投屏到电视上观看

2、业务规则

1）根据用户设备系统显示不同的帮助内容

3、操作方式

1）点击投屏帮助按钮

2）根据当前设备显示该设备的投屏帮助内容

### 练习模式

#### 原声伴奏切换

1、功能描述

1）用户可使用该功能切换播放时播放的是原声或伴奏

2、业务规则

1）该曲目是否上传伴奏，若上传则该功能可用；若未上传则该功能不可使用

3、操作方式

1）点击原声/伴奏切换按钮

2）点击播放按钮

3）播放用户所选MP3

#### 选段

1、功能描述

1）用户可使用该功能选择曲目中的部分小节反复播放练习

2）选段后开始播放时，从用户所选小节的前一小节（预备小节）开始播放

2、业务规则

无

3、操作方式

1）点击选段按钮

2）在谱面上选择开始小节

3）在谱面上点击结束小节

4）点击播放按钮

5）从开始小节的前一小节开始播放

#### 速度调整

1、功能描述

1）该功能用于显示和调整谱面小节速度

2）谱面指针移动到哪个小节，显示哪个小节的速度

3）默认速度显示优先级：小节标记速度 > 意大利文约定速度 > 框架默认速度（100）

4）用户在某个小节调整速度时，其他小节按照该小节调整前与调整后的速度比同步调整，例：A小节谱面速度100，B小节谱面速度50，当用户在A小节将速度调整到50时，播放到B小节时，速度显示为25

5）当其他小节速度按照调整后比例计算为小数时，系统按实际结算结果播放MP3及指针，但界面上显示速度为四舍五入取整后的数值

2、业务规则

无

3、操作方式

1）点击速度按钮

2）拖动滑动条或点击【+号】【-号】速度目标速度

3）点播播放按钮

4）谱面指针、播放速度按照调整后速度播放

#### 播放

1、功能描述

1）用户可使用该功能试听该曲目的原声、伴奏

2）播放时指针、指法、速度、音频跟随播放进度实时显示

2、业务规则

1）播放过程中可使用原声伴奏切换、指法显示功能

2）若开启循环播放，播放结束时，指针跳转第一小节再次播放，如此循环直到用户操作暂停

3）若用户选段播放，从所选段的前一小节（预备小节）开始播放

4）若用户选段播放，所选段落播放结束时，指针跳转所选段前一小节（预备小节）再次播放，如此循环直到用户操作暂停

3、操作方式

无

#### 暂停

1、功能描述

1）在播放的过程中用户可使用该功能暂停播放

2）暂停后可使用播放功能继续播放

2、业务规则

无

3、操作方式

无

#### 重播

1、功能描述

1）播放到一半暂停后，或点击谱面选择某个音符后，用户可使用该功能从头播放

2、业务规则

1）未选段时，从曲目第一小节开始播放

2）选段时，从所选段的前一小节（预备小节）开始播放

3、操作方式

无

### 跟练模式

#### 开始演奏

1、功能描述

1）该功能用于开始跟练，开始后，设备开始收音

2）用户演奏频率与谱面指针所指音符一致时，指针跳转下一个音符，不一致时显示【高了】或【低了】

2、业务规则

1）点击开始演奏后开始收音

2）用户演奏频率与谱面指针所指音符一致时，指针跳转下一个音符

3）用户演奏频率与谱面指针所指音符不一致时，若用户演奏频率比指针音符高，则界面提示【高了】

4）用户演奏频率与谱面指针所指音符不一致时，若用户演奏频率比指针音符低，则界面提示【低了】

3、操作方式

无

#### 结束演奏

1、功能描述

1）该功能用户停止跟练

2）用户开始演奏之后才可使用该功能

3）用户点击结束演奏后，设备停止收音

2、业务规则

1）未开始演奏时，不显示该功能按钮

2）开始演奏时，显示该功能按钮

3、操作方式

无

### 评测模式

#### 设备延迟检测

1、功能描述

1）该功能用于检测设备播放音频到设备接收音频中的时间差，用于评测时值与音频合成的默认校准时间

2、业务规则

1）进入评测模式时，校验本地是否储存该设备的延迟数据，若未储存则必须进行检测，若已存在延迟数据则不经过该流程

3、操作方式

1）点击评测模式，系统校验是否存在延迟数据，若存在则直接进入评测模式，若不存在则进行下一步

2）校验设备当前是否链接耳机，若已链接则提示用户断开耳机链接，若未链接则进行下一步

3）提示用户为了评测更加准确，即将开始设备延迟检测，点击开始检测按钮，进行下一步

4）校验用户手机音量是否≥75%，若小于75%则提示用户请将设备音量调整至75%，若≥75%则进行下一步

5）系统播放检测音效，并开始收音，计算从播放到收到音量的时间差，并记录在本地

6）记录数据后提示用户：检测完成，为了评测分数更加准确，请链接有线耳机后开始评测。用户点击开始评测按钮，进入评测模式。

#### 评测难度

1、功能描述

1）该功能用于切换评测打分标准，共分为三种标准：入门级、进阶级、大师级

2）默认为进阶级

3）用户可自行切换打分标准

2、业务规则

无

3、操作方式

1）在评测模式下点击设置按钮

2）切换到评测设置界面

3）选择需要的打分标准

4）点击确定按钮操作结束

#### 校音

1、功能描述

1）该功能用于让用户校准乐器声音，保障评测分数客观准确

2、业务规则

1）当用户开启校音提醒时，每次进入评测模式都需进行校音步骤

2）当用户关闭校音提示时，每次进入评测模式都不进行该步骤

3、操作方式

1）界面提示用户使用乐器演奏中央C

2）设备开始收音

3）使用收音频率与该声部中央C频率对比是否一致，不一致时，界面显示高了/低了，一致时显示准确，帮提示用户校音完成

4）校音完成后进入评测模式界面

#### 校音提醒

1、功能描述

1）该功能用于开启/关闭每次评测前是否需要进行校音

2、业务规则

无

3、操作方式

无

#### 开启摄像头

1、功能描述

1）该用能用于开启设备摄像头与相册权限

2）开启后，评测时需通过设备前置摄像头录制评测画面

3）默认为关闭状态

2、业务规则

1）用户是否授权摄像头

2）用户是否授权相册

3）摄像头、相册都授权时，功能开关亮起，任何一个权限未授权则功能按钮置灰

3、操作方式

1）点击开启摄像头功能，判断是否授权摄像头

2）若未授权，则提示是否授权摄像头，选择否则流程结束，功能按钮置灰；选择是则进行下一步

3）提示用户是否授权相册，若选择否则流程结束，功能按钮置灰，若选择是则功能按钮亮起，界面显示前置摄像头画面，界面UI变成75%半透明，流程结束

#### UI透明度调整

1、功能描述

1）该功能用于在评测模式开启摄像头的情况下调整界面UI透明度

2）仅调整UI背景透明度，谱面UI不受此影响

2、业务规则

1）用户是否开启摄像头且APP已获取到摄像头、相册权限，都获取到时显示该功能，其中一个未获取或用户关闭开启摄像头功能时，不显UI透明度调整功能

3、操作方式

无

#### 标准音高

1、功能描述

1）该功能用于切换评测音高标准

2、业务规则

1）可选项在后台乐器管理中配置

2）默认选项在后台乐器管理配置

3、操作方式

无

#### 反应时间

1、功能描述

1）该功能用于设置评测打分时的校准延迟

2）用户可根据自己的实际情况设置反应时间

2、业务规则

无

3、操作方式

无

#### 开始评测

1、功能描述

1）该功能用于正式开开始评测，开始后，设备开始收音并传输到后台，后台计算每小节分数并返回前端显示小节评分

2、业务规则

无

3、操作方式

无

#### 结束评测

1、功能描述

1）该功能用于在评测过程中终止评测

2）终止评测后，显示本次评测的总体评分，并生成评测报告，保存评测音频

2、业务规则

无

3、操作方式

无

#### 评测音频保存

1、功能描述

1）评测完成后系统自动保存本次评测的音频文件

2）评测音频文件可在评测报告中的回放功能查看

2、业务规则

1）本次评测结束时自动保存音频文件

2）用户通过结束评测功能手动结束时保存音频文件

3、操作方式

无

#### 评测报告

1、功能描述

1）评测结束后，生成评测报告

2）评测报告根据音准、节奏、完整性三个维度显示每个音符的用户演奏情况

3）音准包括：高了、低了、准确

4）节奏包括：快了、慢了、准确

5）完整性包括：时值不足、时值准确

6）三个维度具体结果样式请查看UI设计稿

2、业务规则

1）根据用户所选评测难度确定打分误差区间

2）音准、节奏、完整性具体评分规则请查看后台评测打分模块

3、操作方式

无

#### 音频合成

1、功能描述

1）评测完成后，用户可以通过该功能将演奏音频与曲目伴奏合成

2）可调整演奏音频与曲目伴奏对齐参数

3）以曲目伴奏时间走为标准，默认将设备延迟检测、反应时间相加，将演奏音频后移

4）用户可更换封面图片，发布作品、保存草稿

5）发布作评后，该音频/视频替换评测报告中的音频

6）发布作评后草稿自动移除

7）保存草稿后7填自动清理

2、业务规则

1）设备延迟检测参数

2）反应时间参数

3）用户自行调整时间差

3、操作方式

无

## 界面交互流程

### 曲目详情

### 选择模式

## 数据库表结构

### 曲谱表

DROP TABLE IF EXISTS `music_sheet`; CREATE TABLE `music_sheet` (

- `id_` bigint(20) NOT NULL AUTO_INCREMENT COMMENT ’主键‘
- `music_category_id_` bigint(20) NOT NULL COMMENT '曲谱分类ID'
- `music_cover_` varchar(255) DEFAULT NULL COMMEN T '曲谱封面图'
- `name_` varchar(255) NOT NULL COMMENT '曲谱名称'
- `musical_instrument_ids_` varchar(255) DEFAULT NULL COMMENT '曲谱乐器(多个,用逗号分隔)'
- `composer_` varchar(255) DEFAULT NULL COMMENT '作曲人'
- `music_sheet_type_` varchar(100) DEFAULT 'SINGLE' COMMENT '曲谱类型(SINGLE:单曲 CONCERT:合奏)'
- `is_use_system_beat_` tinyint(1) DEFAULT NULL COMMENT '是否使用系统节拍器(0:否;1:是)'
- `is_evaluated_` tinyint(1) DEFAULT NULL COMMENT '是否可评测(0:否;1:是)'
- `is_convertible_score_` tinyint(1) DEFAULT NULL COMMENT '是否可转谱(0:否; 1:是)'
- `is_show_fingering_` tinyint(1) DEFAULT NULL COMMENT '是否展示指法(0:否;1:是)'
- `is_play_beat_` tinyint(1) DEFAULT '1' COMMENT '是否播入节拍器(0: 否 1:是)'
- `multi_tracks_selection_` text COMMENT '多声轨选择'
- `play_speed_` int(4) DEFAULT NULL COMMENT '播放速度'
- `play_mode_` varchar(50) DEFAULT NULL COMMENT '播放模式(MIDI;MP3)'
- `xml_file_url_` varchar(255) DEFAULT NULL COMMENT 'XML文件'
- `midi_file_url_` varchar(255) DEFAULT NULL COMMENT 'MIDI文件(保留字段)'
- `music_json_` text COMMENT '曲谱JSON'
- `music_svg_json_` text COMMENT '曲谱缓存JSON(后续使用)'
- `music_svg_` varchar(255) DEFAULT NULL COMMENT '曲谱缓存'
- `music_jian_svg_` varchar(255) DEFAULT NULL COMMENT '简谱缓存'
- `music_first_svg_` varchar(255) DEFAULT NULL COMMENT '首调缓存'
- `music_img_json_` longtext COMMENT '谱面图片JSON(后续使用)'
- `music_img_` longtext COMMENT '五线谱图片'
- `music_first_img_` longtext COMMENT '首调图片'
- `music_jian_img_` longtext COMMENT '固定调图片'
- `ext_config_json_` longtext COMMENT '谱面参数设置'
- `ext_style_config_json_` longtext COMMENT '谱面样式参数设置'
- `available_type_` varchar(255) DEFAULT NULL COMMENT '可用类型(PLATFORM: 平台; ORG: 机构; PERSON: 个人)'
- `source_type_` varchar(255) DEFAULT NULL COMMENT '来源类型(PLATFORM: 平台; ORG: 机构; PERSON: 个人)'
- `audio_type_` varchar(200) DEFAULT NULL COMMENT '音频类型(HOMEMODE: 自制 COMMON: 普通)'
- `status_` tinyint(1) DEFAULT '1' COMMENT '曲目状态（0：停用，1：启用）'
- `reason_` varchar(255) DEFAULT NULL COMMENT '停用原因'
- `remark_` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '备注'
- `del_flag_` tinyint(1) DEFAULT '0' COMMENT '逻辑删除标识(0: 未删 1:已删)'
- `update_by_` bigint(20) DEFAULT NULL COMMENT '更新人'
- `update_time_` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
- `create_by_` bigint(20) DEFAULT NULL COMMENT '创建人'
- `create_time_` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' PRIMARY KEY (`id_`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=1711300065414127618 DEFAULT CHARSET=utf8mb4 COMMENT='曲谱表'

### 曲谱伴奏表

DROP TABLE IF EXISTS `music_sheet_accompaniment`; CREATE TABLE `music_sheet_accompaniment` (

- `id_` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键'
- `music_sheet_id_` bigint(20) NOT NULL COMMENT '曲谱ID'
- `musical_instrument_id_` varchar(200) DEFAULT NULL COMMENT '声轨乐器'
- `audio_file_url_` varchar(256) NOT NULL COMMENT '音频文件'
- `track_` varchar(255) DEFAULT NULL COMMENT '声轨名称'
- `sort_number_` int(11) DEFAULT '0' COMMENT '排序号'
- `create_by_` bigint(20) DEFAULT NULL COMMENT '创建人'
- `create_time_` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' PRIMARY KEY (`id_`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=28066 DEFAULT CHARSET=utf8mb4 COMMENT='曲谱伴奏表';

### 曲谱赏析表

DROP TABLE IF EXISTS `music_sheet_appreciation`; CREATE TABLE `music_sheet_appreciation` (

- `id_` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键'
- `music_sheet_id_` bigint(20) NOT NULL COMMENT '曲谱ID'
- `name_` varchar(255) NOT NULL COMMENT '名称'
- `audio_file_url_` varchar(255) NOT NULL COMMENT '原音文件'
- `introduction_` text COMMENT '简介说明'
- `sort_number_` int(11) DEFAULT '0' COMMENT '排序号'
- `del_flag_` tinyint(1) DEFAULT '0' COMMENT '删除标记'
- `create_by_` bigint(20) DEFAULT NULL COMMENT '创建人'
- `create_time_` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' PRIMARY KEY (`id_`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=14757 DEFAULT CHARSET=utf8mb4 COMMENT='曲谱赏析表';

### 曲谱分类

DROP TABLE IF EXISTS `music_sheet_categories`; CREATE TABLE `music_sheet_categories` (

- `id_` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID'
- `parent_id_` int(11) DEFAULT '0' COMMENT '父级ID'
- `name_` varchar(50) DEFAULT NULL COMMENT '名称'
- `order_` int(11) DEFAULT NULL COMMENT '排序编号'
- `enable_` tinyint(4) DEFAULT '0' COMMENT '启用标记'
- `cover_img_` varchar(250) DEFAULT NULL COMMENT '封面图片'
- `operator_id_` bigint(11) DEFAULT NULL COMMENT '操作人'
- `music_sheet_num_` int(11) DEFAULT '0' COMMENT '曲目数'
- `update_time_` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
- `create_time_` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' PRIMARY KEY (`id_`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=100001 DEFAULT CHARSET=utf8mb4 COMMENT='曲谱分类';

### 曲谱原声表

DROP TABLE IF EXISTS `music_sheet_sound`; CREATE TABLE `music_sheet_sound` (

- `id_` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键'
- `music_sheet_id_` bigint(20) NOT NULL COMMENT '曲谱ID'
- `musical_instrument_id_` varchar(32) DEFAULT NULL COMMENT '声轨乐器'
- `track_` varchar(255) DEFAULT NULL COMMENT '声轨名称'
- `audio_file_url_` varchar(255) NOT NULL COMMENT '原音文件'
- `sort_number_` int(11) DEFAULT '0' COMMENT '排序号'
- `create_by_` bigint(20) DEFAULT NULL COMMENT '创建人'
- `create_time_` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' PRIMARY KEY (`id_`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=71072 DEFAULT CHARSET=utf8mb4 COMMENT='曲谱原声表';

### 曲谱乐器

DROP TABLE IF EXISTS `musical_instrument`; CREATE TABLE `musical_instrument` (

- `id_` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键'
- `name_` varchar(45) CHARACTER SET utf8 NOT NULL COMMENT '名称'
- `code_` varchar(45) CHARACTER SET utf8 DEFAULT NULL COMMENT '编码'
- `parent_id_` int(11) DEFAULT '0' COMMENT '父级ID'
- `orientation_` tinyint(1) DEFAULT NULL COMMENT '横竖屏：1:竖 0:横'
- `img_` varchar(128) DEFAULT NULL COMMENT '图片'
- `logo_` varchar(255) DEFAULT NULL COMMENT '乐器logo'
- `media_` varchar(255) DEFAULT NULL COMMENT '音频'
- `del_flag_` tinyint(3) DEFAULT '0' COMMENT '删除标识'
- `enable_flag_` tinyint(3) NOT NULL DEFAULT '1' COMMENT '是否启用'
- `operator_` bigint(20) DEFAULT NULL COMMENT '操作人'
- `default_score_` varchar(50) DEFAULT NULL COMMENT '默认谱面(STAVE: 五线谱; JIAN: 固定调; FIRST: 首调)'
- `update_time_` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
- `create_time_` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' PRIMARY KEY (`id_`) USING BTREE, KEY `code_` (`code_`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=2121 DEFAULT CHARSET=utf8mb4 COMMENT='曲谱乐器';

SET FOREIGN_KEY_CHECKS = 1;

## 前端&移动端交互

### 交互流程

### API接口

#### 延迟检测

##### createMusicPlayer

1、示例

    {  "api" : "createMusicPlayer",  "content" : {    "tuneSrc" : "https:\/\/oss.dayaedu.com\/cloud-coach\/1686725501654check_music1_(1).mp3",    "musicSrc" : "https:\/\/oss.dayaedu.com\/cloud-coach\/你的名字叫什么-伴奏.mp3",    "uuid" : "1703560248534882202"  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
musicSrc 伴奏mp3 tuneSrc 延迟检测音频 tuneFrequence:检测频率（预留后续修改检测音频） | H5 | 告知App评测播放相关资源，App进行音频缓

##### startTune

1、延迟测试开始，开启音频录制示例

    xxxxxxxxxx{  "api" : "startTune",  "content" : {    "count" : "0",    "uuid" : "1703560356247268367"  }}

2、发送DELAY_CHECK 给服务端，携带当前检测声音hz示例

    xxxxxxxxxx{  "body" : {    "HZ" : 800  },  "header" : {    "commond" : "recordStart",    "type" : "DELAY_CHECK",    "status" : 200  }}

3、发送DELAY_CHECK recordEnd 消息示例

    xxxxxxxxxx{  "header" : {    "commond" : "recordEnd",    "type" : "DELAY_CHECK",    "status" : 200  }}

4、接收DELAY_CHECK延迟值，计算出延迟值保存下来示例

    xxxxxxxxxx{  "header" : {    "commond" : "recordEnd",    "status" : 200,    "type" : "DELAY_CHECK"  },  "body" : {    "firstNoteDelayDuration" : 2275.5556335449219  }}

5、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
count：第几次延迟检测，从0开始 | H5 | 1.延迟测试开始，开启音频录制 2.音频录制开始回调时，播放延迟检测声音 3.监听播放器进度，记录播放器播放延迟 4.发送DELAY_CHECK 给服务端，携带当前检测声音hz 5.发送DELAY_CHECK recordEnd 消息 6.接收DELAY_CHECK延迟值，计算出延迟值保存下来

##### endTune

1、示例

    xxxxxxxxxx{  "api" : "endTune",  "content" : {    "uuid" : "1703560480159115435"  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
| H5 | 停止延迟检测，停止播放延迟检测声音，发送DELAY_CHECK recordEnd消息给服务端

##### finishTune

1、示例

    xxxxxxxxxx{  "api" : "finishTune",  "content" : {    "uuid" : "170356059750712269"  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
| H5 | 结束延迟检测功能，App计算平均麦克风收音延迟值，存储下来

##### getDeviceDelay

1、示例

    xxxxxxxxxx{  "api" : "getDeviceDelay",  "content" : {    "value" : 123,    "uuid" : "170356059750712269"  }}

2、请求参数说明

参数 | 描述 | 描述
--- | --- | ---
value：当前设备麦克风收音延迟值 | H5 | App获取当前设备记录的延迟值, 返回给H5

#### 评测

##### startEvaluating

1、示例

    xxxxxxxxxx{  "api" : "startEvaluating",  "content" : {    "speed" : 100,    "beatLength" : 0,    "clientId" : "student",    "uuid" : "1703561058076864652",    "evaluationCriteria" : "frequency",    "xmlUrl" : "https:\/\/oss.dayaedu.com\/cloud-coach\/你的名字叫什么.xml",    "subjectId" : "2",    "examSongId" : "1688446805041012737",    "heardLevel" : "ADVANCED",    "platform" : "IOS",    "hertz" : 442,    "detailId" : "1688446805041012737",    "partIndex" : 0,    "reactionTimeMs" : 0,    "musicXmlInfos" : [      {        "prevFrequency" : -2,        "frequency" : -2,        "measureIndex" : 0,        "measureRenderIndex" : 0,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 500,        "duration" : 500,        "musicalNotesIndex" : 0,        "nextFrequency" : -2      },      {        "prevFrequency" : -2,        "frequency" : -2,        "measureIndex" : 0,        "measureRenderIndex" : 1,        "denominator" : 2,        "isOrnament" : false,        "timeStamp" : 1000,        "duration" : 1000,        "musicalNotesIndex" : 1,        "nextFrequency" : -2      },      {        "prevFrequency" : -2,        "frequency" : -2,        "measureIndex" : 1,        "measureRenderIndex" : 2,        "denominator" : 2,        "isOrnament" : false,        "timeStamp" : 2000,        "duration" : 1000,        "musicalNotesIndex" : 2,        "nextFrequency" : -2      },      {        "prevFrequency" : -2,        "frequency" : -2,        "measureIndex" : 2,        "measureRenderIndex" : 3,        "denominator" : 2,        "isOrnament" : false,        "timeStamp" : 3000,        "duration" : 1000,        "musicalNotesIndex" : 3,        "nextFrequency" : -2      },      {        "prevFrequency" : -2,        "frequency" : -2,        "measureIndex" : 3,        "measureRenderIndex" : 4,        "denominator" : 2,        "isOrnament" : false,        "timeStamp" : 4000,        "duration" : 1000,        "musicalNotesIndex" : 4,        "nextFrequency" : -2      },      {        "prevFrequency" : 743.35243108428358,        "frequency" : 787.55446683605999,        "measureIndex" : 4,        "measureRenderIndex" : 5,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 5000,        "duration" : 500,        "musicalNotesIndex" : 5,        "nextFrequency" : 834.38489241061711      },      {        "prevFrequency" : 884,        "frequency" : 936.56537541361718,        "measureIndex" : 4,        "measureRenderIndex" : 5,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 5500,        "duration" : 500,        "musicalNotesIndex" : 6,        "nextFrequency" : 992.2564507054858      },      {        "prevFrequency" : 743.35243108428358,        "frequency" : 787.55446683605999,        "measureIndex" : 5,        "measureRenderIndex" : 6,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 6000,        "duration" : 500,        "musicalNotesIndex" : 7,        "nextFrequency" : 834.38489241061711      },      {        "prevFrequency" : 884,        "frequency" : 936.56537541361718,        "measureIndex" : 5,        "measureRenderIndex" : 6,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 6500,        "duration" : 500,        "musicalNotesIndex" : 8,        "nextFrequency" : 992.2564507054858      },      {        "prevFrequency" : 589.99921554315517,        "frequency" : 625.08239456890794,        "measureIndex" : 6,        "measureRenderIndex" : 7,        "denominator" : 8,        "isOrnament" : false,        "timeStamp" : 7000,        "duration" : 750,        "musicalNotesIndex" : 9,        "nextFrequency" : 662.25172797949324      },      {        "prevFrequency" : 662.25172797949324,        "frequency" : 701.63126496994425,        "measureIndex" : 6,        "measureRenderIndex" : 7,        "denominator" : 8,        "isOrnament" : false,        "timeStamp" : 7750,        "duration" : 250,        "musicalNotesIndex" : 10,        "nextFrequency" : 743.35243108428358      },      {        "prevFrequency" : 743.35243108428358,        "frequency" : 787.55446683605999,        "measureIndex" : 7,        "measureRenderIndex" : 8,        "denominator" : 2,        "isOrnament" : false,        "timeStamp" : 8000,        "duration" : 1000,        "musicalNotesIndex" : 11,        "nextFrequency" : 834.38489241061711      },      {        "prevFrequency" : 743.35243108428358,        "frequency" : 787.55446683605999,        "measureIndex" : 8,        "measureRenderIndex" : 9,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 9000,        "duration" : 500,        "musicalNotesIndex" : 12,        "nextFrequency" : 834.38489241061711      },      {        "prevFrequency" : 884,        "frequency" : 936.56537541361718,        "measureIndex" : 8,        "measureRenderIndex" : 9,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 9500,        "duration" : 500,        "musicalNotesIndex" : 13,        "nextFrequency" : 992.2564507054858      },      {        "prevFrequency" : 743.35243108428358,        "frequency" : 787.55446683605999,        "measureIndex" : 9,        "measureRenderIndex" : 10,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 10000,        "duration" : 500,        "musicalNotesIndex" : 14,        "nextFrequency" : 834.38489241061711      },      {        "prevFrequency" : 884,        "frequency" : 936.56537541361718,        "measureIndex" : 9,        "measureRenderIndex" : 10,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 10500,        "duration" : 500,        "musicalNotesIndex" : 15,        "nextFrequency" : 992.2564507054858      },      {        "prevFrequency" : 589.99921554315517,        "frequency" : 625.08239456890794,        "measureIndex" : 10,        "measureRenderIndex" : 11,        "denominator" : 8,        "isOrnament" : false,        "timeStamp" : 11000,        "duration" : 750,        "musicalNotesIndex" : 16,        "nextFrequency" : 662.25172797949324      },      {        "prevFrequency" : 743.35243108428358,        "frequency" : 787.55446683605999,        "measureIndex" : 10,        "measureRenderIndex" : 11,        "denominator" : 8,        "isOrnament" : false,        "timeStamp" : 11750,        "duration" : 250,        "musicalNotesIndex" : 17,        "nextFrequency" : 834.38489241061711      },      {        "prevFrequency" : 662.25172797949324,        "frequency" : 701.63126496994425,        "measureIndex" : 11,        "measureRenderIndex" : 12,        "denominator" : 2,        "isOrnament" : false,        "timeStamp" : 12000,        "duration" : 1000,        "musicalNotesIndex" : 18,        "nextFrequency" : 743.35243108428358      },      {        "prevFrequency" : 589.99921554315517,        "frequency" : 625.08239456890794,        "measureIndex" : 12,        "measureRenderIndex" : 13,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 13000,        "duration" : 500,        "musicalNotesIndex" : 19,        "nextFrequency" : 662.25172797949324      },      {        "prevFrequency" : 884,        "frequency" : 936.56537541361718,        "measureIndex" : 12,        "measureRenderIndex" : 13,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 13500,        "duration" : 500,        "musicalNotesIndex" : 20,        "nextFrequency" : 992.2564507054858      },      {        "prevFrequency" : 884,        "frequency" : 936.56537541361718,        "measureIndex" : 13,        "measureRenderIndex" : 14,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 14000,        "duration" : 500,        "musicalNotesIndex" : 21,        "nextFrequency" : 992.2564507054858      },      {        "prevFrequency" : 884,        "frequency" : 936.56537541361718,        "measureIndex" : 13,        "measureRenderIndex" : 14,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 14500,        "duration" : 500,        "musicalNotesIndex" : 22,        "nextFrequency" : 992.2564507054858      },      {        "prevFrequency" : 743.35243108428358,        "frequency" : 787.55446683605999,        "measureIndex" : 14,        "measureRenderIndex" : 15,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 15000,        "duration" : 500,        "musicalNotesIndex" : 23,        "nextFrequency" : 834.38489241061711      },      {        "prevFrequency" : 884,        "frequency" : 936.56537541361718,        "measureIndex" : 14,        "measureRenderIndex" : 15,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 15500,        "duration" : 500,        "musicalNotesIndex" : 24,        "nextFrequency" : 992.2564507054858      },      {        "prevFrequency" : 884,        "frequency" : 936.56537541361718,        "measureIndex" : 15,        "measureRenderIndex" : 16,        "denominator" : 8,        "isOrnament" : false,        "timeStamp" : 16000,        "duration" : 250,        "musicalNotesIndex" : 25,        "nextFrequency" : 992.2564507054858      },      {        "prevFrequency" : 884,        "frequency" : 936.56537541361718,        "measureIndex" : 15,        "measureRenderIndex" : 16,        "denominator" : 8,        "isOrnament" : false,        "timeStamp" : 16250,        "duration" : 250,        "musicalNotesIndex" : 26,        "nextFrequency" : 992.2564507054858      },      {        "prevFrequency" : 884,        "frequency" : 936.56537541361718,        "measureIndex" : 15,        "measureRenderIndex" : 16,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 16500,        "duration" : 500,        "musicalNotesIndex" : 27,        "nextFrequency" : 992.2564507054858      },      {        "prevFrequency" : 884,        "frequency" : 936.56537541361718,        "measureIndex" : 16,        "measureRenderIndex" : 17,        "denominator" : 8,        "isOrnament" : false,        "timeStamp" : 17000,        "duration" : 750,        "musicalNotesIndex" : 28,        "nextFrequency" : 992.2564507054858      },      {        "prevFrequency" : 992.2564507054858,        "frequency" : 1051.2590896624054,        "measureIndex" : 16,        "measureRenderIndex" : 17,        "denominator" : 8,        "isOrnament" : false,        "timeStamp" : 17750,        "duration" : 250,        "musicalNotesIndex" : 29,        "nextFrequency" : 1113.7702081070679      },      {        "prevFrequency" : 884,        "frequency" : 936.56537541361718,        "measureIndex" : 17,        "measureRenderIndex" : 18,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 18000,        "duration" : 500,        "musicalNotesIndex" : 30,        "nextFrequency" : 992.2564507054858      },      {        "prevFrequency" : 743.35243108428358,        "frequency" : 787.55446683605999,        "measureIndex" : 17,        "measureRenderIndex" : 18,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 18500,        "duration" : 500,        "musicalNotesIndex" : 31,        "nextFrequency" : 834.38489241061711      },      {        "prevFrequency" : 662.25172797949324,        "frequency" : 701.63126496994425,        "measureIndex" : 18,        "measureRenderIndex" : 19,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 19000,        "duration" : 500,        "musicalNotesIndex" : 32,        "nextFrequency" : 743.35243108428358      },      {        "prevFrequency" : 662.25172797949324,        "frequency" : 701.63126496994425,        "measureIndex" : 18,        "measureRenderIndex" : 19,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 19500,        "duration" : 500,        "musicalNotesIndex" : 33,        "nextFrequency" : 743.35243108428358      },      {        "prevFrequency" : 589.99921554315517,        "frequency" : 625.08239456890794,        "measureIndex" : 19,        "measureRenderIndex" : 20,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 20000,        "duration" : 500,        "musicalNotesIndex" : 34,        "nextFrequency" : 662.25172797949324      },      {        "prevFrequency" : -2,        "frequency" : -2,        "measureIndex" : 19,        "measureRenderIndex" : 20,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 20500,        "duration" : 500,        "musicalNotesIndex" : 35,        "nextFrequency" : -2      },      {        "prevFrequency" : -2,        "frequency" : -2,        "measureIndex" : 20,        "measureRenderIndex" : 21,        "denominator" : 2,        "isOrnament" : false,        "timeStamp" : 21000,        "duration" : 1000,        "musicalNotesIndex" : 36,        "nextFrequency" : -2      },      {        "prevFrequency" : -2,        "frequency" : -2,        "measureIndex" : 21,        "measureRenderIndex" : 22,        "denominator" : 2,        "isOrnament" : false,        "timeStamp" : 22000,        "duration" : 1000,        "musicalNotesIndex" : 37,        "nextFrequency" : -2      },      {        "prevFrequency" : -2,        "frequency" : -2,        "measureIndex" : 22,        "measureRenderIndex" : 23,        "denominator" : 2,        "isOrnament" : false,        "timeStamp" : 23000,        "duration" : 1000,        "musicalNotesIndex" : 38,        "nextFrequency" : -2      },      {        "prevFrequency" : -2,        "frequency" : -2,        "measureIndex" : 23,        "measureRenderIndex" : 24,        "denominator" : 2,        "isOrnament" : false,        "timeStamp" : 24000,        "duration" : 1000,        "musicalNotesIndex" : 39,        "nextFrequency" : -2      },      {        "prevFrequency" : 743.35243108428358,        "frequency" : 787.55446683605999,        "measureIndex" : 24,        "measureRenderIndex" : 25,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 25000,        "duration" : 500,        "musicalNotesIndex" : 40,        "nextFrequency" : 834.38489241061711      },      {        "prevFrequency" : 884,        "frequency" : 936.56537541361718,        "measureIndex" : 24,        "measureRenderIndex" : 25,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 25500,        "duration" : 500,        "musicalNotesIndex" : 41,        "nextFrequency" : 992.2564507054858      },      {        "prevFrequency" : 743.35243108428358,        "frequency" : 787.55446683605999,        "measureIndex" : 25,        "measureRenderIndex" : 26,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 26000,        "duration" : 500,        "musicalNotesIndex" : 42,        "nextFrequency" : 834.38489241061711      },      {        "prevFrequency" : 884,        "frequency" : 936.56537541361718,        "measureIndex" : 25,        "measureRenderIndex" : 26,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 26500,        "duration" : 500,        "musicalNotesIndex" : 43,        "nextFrequency" : 992.2564507054858      },      {        "prevFrequency" : 589.99921554315517,        "frequency" : 625.08239456890794,        "measureIndex" : 26,        "measureRenderIndex" : 27,        "denominator" : 8,        "isOrnament" : false,        "timeStamp" : 27000,        "duration" : 750,        "musicalNotesIndex" : 44,        "nextFrequency" : 662.25172797949324      },      {        "prevFrequency" : 662.25172797949324,        "frequency" : 701.63126496994425,        "measureIndex" : 26,        "measureRenderIndex" : 27,        "denominator" : 8,        "isOrnament" : false,        "timeStamp" : 27750,        "duration" : 250,        "musicalNotesIndex" : 45,        "nextFrequency" : 743.35243108428358      },      {        "prevFrequency" : 743.35243108428358,        "frequency" : 787.55446683605999,        "measureIndex" : 27,        "measureRenderIndex" : 28,        "denominator" : 2,        "isOrnament" : false,        "timeStamp" : 28000,        "duration" : 1000,        "musicalNotesIndex" : 46,        "nextFrequency" : 834.38489241061711      },      {        "prevFrequency" : 743.35243108428358,        "frequency" : 787.55446683605999,        "measureIndex" : 28,        "measureRenderIndex" : 29,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 29000,        "duration" : 500,        "musicalNotesIndex" : 47,        "nextFrequency" : 834.38489241061711      },      {        "prevFrequency" : 884,        "frequency" : 936.56537541361718,        "measureIndex" : 28,        "measureRenderIndex" : 29,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 29500,        "duration" : 500,        "musicalNotesIndex" : 48,        "nextFrequency" : 992.2564507054858      },      {        "prevFrequency" : 743.35243108428358,        "frequency" : 787.55446683605999,        "measureIndex" : 29,        "measureRenderIndex" : 30,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 30000,        "duration" : 500,        "musicalNotesIndex" : 49,        "nextFrequency" : 834.38489241061711      },      {        "prevFrequency" : 884,        "frequency" : 936.56537541361718,        "measureIndex" : 29,        "measureRenderIndex" : 30,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 30500,        "duration" : 500,        "musicalNotesIndex" : 50,        "nextFrequency" : 992.2564507054858      },      {        "prevFrequency" : 589.99921554315517,        "frequency" : 625.08239456890794,        "measureIndex" : 30,        "measureRenderIndex" : 31,        "denominator" : 8,        "isOrnament" : false,        "timeStamp" : 31000,        "duration" : 750,        "musicalNotesIndex" : 51,        "nextFrequency" : 662.25172797949324      },      {        "prevFrequency" : 743.35243108428358,        "frequency" : 787.55446683605999,        "measureIndex" : 30,        "measureRenderIndex" : 31,        "denominator" : 8,        "isOrnament" : false,        "timeStamp" : 31750,        "duration" : 250,        "musicalNotesIndex" : 52,        "nextFrequency" : 834.38489241061711      },      {        "prevFrequency" : 662.25172797949324,        "frequency" : 701.63126496994425,        "measureIndex" : 31,        "measureRenderIndex" : 32,        "denominator" : 2,        "isOrnament" : false,        "timeStamp" : 32000,        "duration" : 1000,        "musicalNotesIndex" : 53,        "nextFrequency" : 743.35243108428358      },      {        "prevFrequency" : 589.99921554315517,        "frequency" : 625.08239456890794,        "measureIndex" : 32,        "measureRenderIndex" : 33,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 33000,        "duration" : 500,        "musicalNotesIndex" : 54,        "nextFrequency" : 662.25172797949324      },      {        "prevFrequency" : 884,        "frequency" : 936.56537541361718,        "measureIndex" : 32,        "measureRenderIndex" : 33,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 33500,        "duration" : 500,        "musicalNotesIndex" : 55,        "nextFrequency" : 992.2564507054858      },      {        "prevFrequency" : 884,        "frequency" : 936.56537541361718,        "measureIndex" : 33,        "measureRenderIndex" : 34,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 34000,        "duration" : 500,        "musicalNotesIndex" : 56,        "nextFrequency" : 992.2564507054858      },      {        "prevFrequency" : 884,        "frequency" : 936.56537541361718,        "measureIndex" : 33,        "measureRenderIndex" : 34,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 34500,        "duration" : 500,        "musicalNotesIndex" : 57,        "nextFrequency" : 992.2564507054858      },      {        "prevFrequency" : 743.35243108428358,        "frequency" : 787.55446683605999,        "measureIndex" : 34,        "measureRenderIndex" : 35,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 35000,        "duration" : 500,        "musicalNotesIndex" : 58,        "nextFrequency" : 834.38489241061711      },      {        "prevFrequency" : 884,        "frequency" : 936.56537541361718,        "measureIndex" : 34,        "measureRenderIndex" : 35,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 35500,        "duration" : 500,        "musicalNotesIndex" : 59,        "nextFrequency" : 992.2564507054858      },      {        "prevFrequency" : 884,        "frequency" : 936.56537541361718,        "measureIndex" : 35,        "measureRenderIndex" : 36,        "denominator" : 8,        "isOrnament" : false,        "timeStamp" : 36000,        "duration" : 250,        "musicalNotesIndex" : 60,        "nextFrequency" : 992.2564507054858      },      {        "prevFrequency" : 884,        "frequency" : 936.56537541361718,        "measureIndex" : 35,        "measureRenderIndex" : 36,        "denominator" : 8,        "isOrnament" : false,        "timeStamp" : 36250,        "duration" : 250,        "musicalNotesIndex" : 61,        "nextFrequency" : 992.2564507054858      },      {        "prevFrequency" : 884,        "frequency" : 936.56537541361718,        "measureIndex" : 35,        "measureRenderIndex" : 36,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 36500,        "duration" : 500,        "musicalNotesIndex" : 62,        "nextFrequency" : 992.2564507054858      },      {        "prevFrequency" : 884,        "frequency" : 936.56537541361718,        "measureIndex" : 36,        "measureRenderIndex" : 37,        "denominator" : 8,        "isOrnament" : false,        "timeStamp" : 37000,        "duration" : 750,        "musicalNotesIndex" : 63,        "nextFrequency" : 992.2564507054858      },      {        "prevFrequency" : 992.2564507054858,        "frequency" : 1051.2590896624054,        "measureIndex" : 36,        "measureRenderIndex" : 37,        "denominator" : 8,        "isOrnament" : false,        "timeStamp" : 37750,        "duration" : 250,        "musicalNotesIndex" : 64,        "nextFrequency" : 1113.7702081070679      },      {        "prevFrequency" : 884,        "frequency" : 936.56537541361718,        "measureIndex" : 37,        "measureRenderIndex" : 38,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 38000,        "duration" : 500,        "musicalNotesIndex" : 65,        "nextFrequency" : 992.2564507054858      },      {        "prevFrequency" : 743.35243108428358,        "frequency" : 787.55446683605999,        "measureIndex" : 37,        "measureRenderIndex" : 38,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 38500,        "duration" : 500,        "musicalNotesIndex" : 66,        "nextFrequency" : 834.38489241061711      },      {        "prevFrequency" : 662.25172797949324,        "frequency" : 701.63126496994425,        "measureIndex" : 38,        "measureRenderIndex" : 39,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 39000,        "duration" : 500,        "musicalNotesIndex" : 67,        "nextFrequency" : 743.35243108428358      },      {        "prevFrequency" : 662.25172797949324,        "frequency" : 701.63126496994425,        "measureIndex" : 38,        "measureRenderIndex" : 39,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 39500,        "duration" : 500,        "musicalNotesIndex" : 68,        "nextFrequency" : 743.35243108428358      },      {        "prevFrequency" : 589.99921554315517,        "frequency" : 625.08239456890794,        "measureIndex" : 39,        "measureRenderIndex" : 40,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 40000,        "duration" : 500,        "musicalNotesIndex" : 69,        "nextFrequency" : 662.25172797949324      },      {        "prevFrequency" : -2,        "frequency" : -2,        "measureIndex" : 39,        "measureRenderIndex" : 40,        "denominator" : 4,        "isOrnament" : false,        "timeStamp" : 40500,        "duration" : 500,        "musicalNotesIndex" : 70,        "nextFrequency" : -2      }    ]  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---

musicXml 评测相关数据
beatLength：需要剔除多余检测录音文件时长，如果从第一小节，音频文件自带节拍器，该时长为节拍器时长，如果是中间选段，则时长为预备小节时长
speed：音频基准播放速度
evaluationCriteria：评测打分标准：frequency（默认-频率）、amplitude（声部打击乐-振幅）、decibels（节奏练习-分贝）
xmlUrl：曲子xml地址
subjectId：曲子声部ID
examSongId：曲子ID 同detailId
detailId：曲子ID
partIndex：曲子分轨索引
heardLevel：评测级别'入门 BEGINNER'|'进阶 ADVANCED'|'大师 PERFORMER'
platform：评测客户端平台：iOS、安卓
hertz：A4基准赫兹HZ（440|442）
reactionTimeMs：反应时间ms
musicXmlInfos：评测音符信息
{
prevFrequency：上一个音符的频率 休止符为-1
frequency：当前音符的频率
nextFrequency：下一个音符的频率
measureRenderIndex：评测小节索引（默认值0，同一个小节的音符索引相同）
measuerRenderIndex：实际渲染的小节索引，从渲染的谱面开始，代表当前小节再谱面实际的位置
musicalNotesIndex：当前实际评测音符索引，从0开始
denominator：多少分音符
isOrnament：是否装饰音
donEvaluating：是否打分的标记（Listen，纯率、如果是打击乐和节奏练习，连音线后面的音符都不打分，如果是普通吹奏，连音线后面的音符和前面的音符同音高都不打分）
timeStamp：当前音符开始的时间ms（参数评测第一个音符为0）
duration：当前音符持续时间ms
}

H5

开始评测，该API会判断是否连接scoket，如果连上，会发送SOUND_COMPARE 包含 musicXml信息给service同时回执信息给H5，如果没有连上，会建立连接，成功后发送SOUND_COMPARE 至服务端，同时回执信息给H5

##### endEvaluating

1、示例

    xxxxxxxxxx{  "api" : "endEvaluating",  "content" : {    "musicScoreId" : "1688446805041012737",    "uuid" : "1703561228193776197"  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
musicScoreId:同startEvaluating examSongId表示 曲目ID | H5 | 接收到该消息，会发送SOUND_COMPARE recordEnd消息至服务端，同时回执给H5，同时停止mp3播放

##### cancelEvaluating

1、示例

    xxxxxxxxxx{  "api" : "cancelEvaluating",  "content" : {    "uuid" : "1703561228193776197"  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
| H5 | 取消评测，同endEvaluating，只是不发生SOUND_COMPARE recordEnd至服务端

##### startRecording

1、示例

    xxxxxxxxxx{  "api" : "startRecording",  "content" : {    "firstNoteTime" : 2667,    "uuid" : "1703562044162971287",    "accompanimentState" : 1  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
accompanimentState:是否静音评测 firstNoteTime：评测播放MP3开始时间（选段模式：firstNoteTime应该取预备小节的第一个音符的开始播放的时间，正常评测 取值为0） | H5 | 1.开始音频录制功能，同时判断accompanimentState是否静音播放mp3 2.在开始录制时，评测场景，如果是App播放mp3，这个时候App开启播放功能 3.录制开始接收到第一段音频时，会发送SOUND_COMPARE recordStart信息给服务端，同时回执recordStartTime至H5

##### endRecording

1、示例

    xxxxxxxxxx{  "api" : "endRecording",  "content" : {    "uuid" : "1703561966859113931"  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
目前没有使用 | H5 | 停止音频录制功能，回执endRecording给H5

##### playProgress

1、示例

    xxxxxxxxxx{  "api" : "playProgress",  "content" : {    "totalDuration" : 6000,    "currentTime" : 10  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
Mp3播放器进度回调： currentTime:当前播放进度（时间 ms） totalDuration：全曲时长（ms） | APP | 1.评测功能：原生mp3播放器进度回调给前端 2.在进度回调中，计算延迟值，发送SOUND_COMPARE audioPlayStart至服务端

##### pauseRecording

1、示例

无

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
可能用不上 | H5 | 暂停音频录制

##### resumeRecording

1、描述

无

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
可能用不上 | H5 | 恢复音频录制

##### suspendPlay

1、示例

    xxxxxxxxxx{  "api" : "suspendPlay"}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
| H5 | App退到后台暂停播放，通知H5

##### isWiredHeadsetOn

1、示例

    xxxxxxxxxx{  "api" : "isWiredHeadsetOn",  "content" : {    "checkIsWired" : true,    "type" : "蓝牙耳机",    "uuid" : "1703561404357134809"  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
checkIsWired:是否带耳机 type：耳机类型名称：蓝牙耳机、有线耳机 | H5 | 获取输出是否未耳机 type：有线耳机、蓝牙耳机 checkIsWired（是否带耳机）

##### listenerWiredStatus

1、示例

    xxxxxxxxxx{  "api" : "listenerWiredStatus",  "content" : {    "checkIsWired" : true,    "type" : "蓝牙耳机",    "uuid" : "1703561404357134809"  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
checkIsWired:是否带耳机 type：耳机类型名称：蓝牙耳机、有线耳机 | APP | App监听扬声器通道变化通知给H5

##### proxyMessage

1、示例

    xxxxxxxxxx已废弃

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
| H5 | H5调用发送消息至服务端，将content放在body，header 设置proxyMessage，发送给服务等

##### proxyServiceMessage

1、示例

    xxxxxxxxxx{  "api" : "proxyServiceMessage",  "content" : {    "header" : {      "commond" : "recordCancel",      "type" : "SOUND_COMPARE",      "status" : 200    },    "uuid" : "1703561640785920599"  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
通用接口 header：Object commond：请求命令。目前支持的请求命令：musicXml(同步music xml信息),recordStart(开始评测)，recordCancel(取消评测),recordEnd(结束评测)、videoUpload（上传 评测视频） 请求类型，目前支持的请求类型：SOUND_COMPARE(评测)，DELAY_CHECK(延迟检查)，PITCH_DETECTION(校音) status：状态码，默认200 | H5 | H5调用发送消息至服务端，将content直接发送给服务等

##### sendResult

1、示例

    ​x{  "api" : "sendResult",  "content" : {    "uuid" : "1703561640785920599",    "body" : {      "url" : "https:\/\/oss.dayaedu.com\/cloud-coach\/202401\/103732_2401021407268.wav",      "score" : 0,      "playTime" : 0,      "integrity" : 0,      "intonation" : 0,      "scoreData" : {        "musicalNotesPlayStats" : {          "notesData" : [
              ],          "examSongId" : "1688446805041012737",          "xmlUrl" : "https:\/\/oss.dayaedu.com\/cloud-coach\/你的名字叫什么.xml",          "detailId" : "1688446805041012737"        },        "userMeasureScore" : {
            }      },      "cadence" : 0    },    "header" : {      "commond" : "recordCancel",      "type" : "SOUND_COMPARE",      "status" : 200    }  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---

通用接口
header：Object
commond：请求命令。目前支持的请求命令：musicXml(同步music xml信息),recordStart(开始评测)，recordCancel(取消评测),recordEnd(结束评测)、videoUpload（上传 评测视频）
请求类型，目前支持的请求类型：SOUND_COMPARE(评测)，DELAY_CHECK(延迟检查)，PITCH_DETECTION(校音)
status：状态码，默认200
body:body内容更具返回内容不同，数据不同，如检测返回：{"body":{"firstNoteDelayDuration":185.7596435546875}
小节评分：{
"body": {
"score": 0,
"measureIndex": 5,
"measureRenderIndex": 5
},
"header": {
"commond": "measureScore",
"status": 200,
"type": "SOUND_COMPARE"
}
}
结束评测打分：

APP

App接收服务端消息传递给H5(传递服务端socket消息)

##### openCamera

1、示例

    xxxxxxxxxx{  "api" : "openCamera",  "content" : {    "uuid" : "1703561966859113931"  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
| H5 | 开启摄像头，App收到后会检测摄像头相关权限，渲染摄像头捕捉画面

##### closeCamera

1、示例

    xxxxxxxxxx{  "api" : "closeCamera",  "content" : {    "uuid" : "1703561996652345199"  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
| H5 | 关闭摄像头，停止渲染摄像头捕捉画面

##### startCapture

1、示例

    xxxxxxxxxx{  "api" : "startCapture",  "content" : {    "uuid" : "1703562200341909531"  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
| H5 | 开启摄像头录制

##### endCapture

1、示例

    xxxxxxxxxx{  "api" : "endCapture",  "content" : {    "uuid" : "1703562234983517772"  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
| H5 | 关闭摄像头录制

##### setCaptureMode

1、示例

    xxxxxxxxxx{  "api" : "setCaptureMode",  "content" : {    "mode" : "evaluating",    "uuid" : "1703561966859113931"  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
mode:播放（practice）还是评测（evaluating） | H5 | iOS 使用该功能，modeString 如果是评测，录制视频时，不会采集麦克风声音（声音交给录音功能去实现）

##### videoUpdate

1、示例

    xxxxxxxxxx{  "api" : "videoUpdate",  "content" : {    "type" : "success",    "message" : "上传成功",    "filePath" : "https:\/\/www.cdn.dayaedu.com\/ssl.wav"  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
type:是否成功（success｜ error） message：上传成功 filePath: 视频地址 | H5 | 上传录制的视频，无合成功能的app中使用

#### 校音

##### startSoundCheck

1、示例

    xxxxxxxxxx{  "api" : "startSoundCheck",  "content" : {    "uuid" : "1703561966859113931"  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
| H5 | 开始校音，开始音频录制，录制第一段声音回调时，会发送PITCH_DETECTION recordStart消息给服务端

##### endSoundCheck

1、示例

    xxxxxxxxxx{  "api" : "endSoundCheck",  "content" : {    "uuid" : "1703561966859113931"  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
| 描述 | 结束校音，停止音频录制

#### Mid播放

##### cloudDetail

1、示例

    xxxxxxxxxx{  "api" : "cloudDetail",  "content" : {    "numerator" : 4,    "midi" : "",    "interval" : 50,    "denominator" : 4,    "originalSpeed" : 90  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
midi :midi文件Url originalSpeed ：mid原始速度 denominator：多少分音符 numerator：小节拍数 interval：回调间隔ms | H5 | 1.获取mid相关播放信息，同时下载mid文件 2.初始化mid播放器成后回调播放总时长midiDuration回调给H5

##### cloudGetMediaStatus

1、示例

    xxxxxxxxxx{  "api" : "cloudGetMediaStatus",  "content" : {    "status" : "suspend"  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
status: mid 播放器状态 'init' | ’play‘ | ’suspend‘ | H5 | 获取mid播放器状态

##### cloudPlay

1、示例

    xxxxxxxxxx{  "api" : "cloudPlay",  "content" : {    "startTime" : 0,    "hertz" : 440,    "songID" : 0,    "speed" : 90,    "originalSpeed" : 90  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
songID: 当前曲目id originalSpeed: xml整体原始速度 speed: 当前选择速度 startTime: 开始时间(ms) hertz:播放频率 | H5 | mid播放器----播放、播放结束位置、跳转指定位置

##### cloudSuspend

1、示例

    xxxxxxxxxx{  "api" : "cloudSuspend",  "content" : {    "songID" : 0  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
songID:当前曲目id | H5 | 暂停mid播放

##### cloudSetCurrentTime

1、示例

    xxxxxxxxxx{  "api" : "cloudSetCurrentTime",  "content" : {    "songID" : 0,    "currentTime" : 0  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
songID:当前曲目id currentTime：播放进度 | H5 | 跳转指定位置

##### cloudChangeSpeed

1、示例

    xxxxxxxxxx{  "api" : "cloudChangeSpeed",  "content" : {    "speed" : 90,    "songID" : 0,    "originalSpeed" : 120  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
songID:当前曲目id speed:调整速度 originalSpeed：曲子原速 | H5 | mid播放调速

##### cloudVolume

1、示例

    xxxxxxxxxx{  "api" : "cloudVolume",  "content" : {"activeMidiId":"12","activeMidiVolume":100    "parts" : [      {        "name" : "长笛",        "volume" : 90      }    ]  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
activeMidiId:轨道ID activeMidiVolume：播放音了 parts：所有轨道音量参数：（暂未使用） name:声轨名称 volume：音量（0～100） | H5 | 设置每个轨道音量

##### cloudMetronome

1、示例

    xxxxxxxxxx{  "api" : "cloudDetail",  "content" : {    "numerator" : 4,    "supplement" : 0,    "denominator" : 4,    "repeat" : 1  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
supplement：补拍 repeat：重复节拍次数 denominator：多少分音符 numerator：小节拍数 | H5 | 1.节拍器播放功能，获取播放节拍，速度 2.播放回调，cancel finish的回调

##### cloudDestroy

1、示例

    xxxxxxxxxx{  "api" : "cloudDestroy",  "content" : {  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
| H5 | 销毁mid播放器

##### cloudTimeUpdae

1、示例

    xxxxxxxxxx{  "api" : "cloudTimeUpdae",  "content" : {    "songID" : 0,    "currentTime" : 0  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
songID:曲目ID currentTime：当前播放进度ms | H5 | mid播放器进度回调给H5

##### cloudplayed

1、示例

    xxxxxxxxxx{  "api" : "cloudplayed",  "content" : {    "songID" : 0  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
songID：曲目id | App | mid播放结束回调给H5

#### 跟音功能

##### cloudToggleFollow

1、示例

    xxxxxxxxxx{  "api" : "cloudToggleFollow",  "content" : {    "state" : "start",  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
status: 开始、结束跟音（start｜ end） | H5 | 跟音功能，开启调音器声音检测功能，接收到频率回调时，发送cloudFollowTime 将获取到的frequency 传给H5

##### cloudFollowTime

1、示例

    xxxxxxxxxx{  "api" : "cloudFollowTime",  "content" : {    "frequency" : 587.31,  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
frequency：录音音频频率 | App | App回调跟音录制频率回调给H5

#### 合成相关

##### openAdjustRecording

1、示例

    xxxxxxxxxx{  "api" : "openAdjustRecording",  "content" : {    "title" : "欢乐颂",    "coverImg" : "https:\/\/www.cdn.dayaedu.com\/sdfsfs.png",    "recordId" : "1231312313213123",    "uuid" : "1703561966859113931"  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
recordId : 评测记录id title: 曲目名 coverImg : 曲目封面 | H5 | App进入合成功能页面

##### hideComplexButton

1、示例

    xxxxxxxxxx{  "api" : "hideComplexButton",  "content" : {      }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
| APP | 合成发布作品成功后App回调，H5隐藏保存演奏按钮

## 后端评测功能

### 时序图

### 流程说明

#### 客户端点击开始评测

1、功能说明：

1）Websocket客户端发送曲目XML文件信息到服务端

2）开始评测前，前端传入需要评测的曲目相关数据和延迟时间，由后端保存，没有返回数据。

2、请求参数示例：

    xxxxxxxxxx{  "header": {    "commond": "musicXml",    "type": "SOUND_COMPARE",    "status": 200  },  "body": {    "musicXmlInfos": [      {        "timeStamp": 0,        "duration": 2400,        "frequency": 175.40781624248606,        "nextFrequency": 185.83810777107092,        "prevFrequency": 165.5629319948733,        "measureIndex": 0,        "measureRenderIndex": 0,        "dontEvaluating": false,        "musicalNotesIndex": 0,        "denominator": 1      },      {        "timeStamp": 2400,        "duration": 2400,        "frequency": 196.88861670901497,        "nextFrequency": 208.59622310265428,        "prevFrequency": 185.83810777107092,        "measureIndex": 1,        "measureRenderIndex": 1,        "dontEvaluating": false,        "musicalNotesIndex": 1,        "denominator": 1      },      {        "timeStamp": 36000,        "duration": 2400,        "frequency": 350.8156324849721,        "nextFrequency": 371.67621554214185,        "prevFrequency": 331.1258639897466,        "measureIndex": 15,        "measureRenderIndex": 15,        "dontEvaluating": false,        "musicalNotesIndex": 15,        "denominator": 1      }    ],    "firstNoteTime": 0,    "id": "1113",    "subjectId": 4,    "detailId": 1103,    "examSongId": 1113,    "xmlUrl": "https:\/\/oss.dayaedu.com\/daya\/202108\/SfYmJZ2.xml",    "partIndex": 0,    "behaviorId": "1703729242379352905",    "tenantId": 1,    "platform": "ANDROID",    "clientId": "student",    "speed": 100,    "heardLevel": "ADVANCED",    "beatLength": 2480,    "evaluationCriteria": "frequency",    "uuid": "1703730337571345881"  }}

3、请求参数说明：

参数 | 类型 | 说明
--- | --- | ---
header | Object | 请求信息
commond | String | 请求命令。目前支持的请求命令：musicXml(同步music xml信息),recordStart(开始评测)，recordCancel(取消评测),recordEnd(结束评测)
type | String | 请求类型，目前支持的请求类型：SOUND_COMPARE(评测)，DELAY_CHECK(延迟检查)，PITCH_DETECTION(校音)
status | Integer | 固定值200
body | Object | 曲目信息
musicXmlInfos | Array | 曲目音符信息
timeStamp | double | 音符起始时间戳,单位:ms(第一个音符是0ms)
duration | double | 当前音符持续的播放时间（ms）
frequency | float | 当前音符的频率
nextFrequency | float | 下一个音的频率（不是乐谱中下一个音符的频率）,当前音符加上100音分
prevFrequency | float | 上一个音的频率（不是乐谱中上一个音符的频率）,当前音符减去100音分
measureIndex | Integer | 当前音符所在的小节下标（从0开始）
dontEvaluating | boolean | 当前音符是否需要评测
musicalNotesIndex | Integer | 当前音符在整个曲谱中的下标（从0开始）
denominator | Integer | 多少分音符
measureRenderIndex | Integer |
firstNoteTime | Integer | 第一个音符开始时间
id | String | 曲目ID
subjectId | Integer | 声部ID
detailId | Integer | 曲目伴奏ID
examSongId | Integer | 曲目ID
xmlUrl | String | 曲目xml的url路径
partIndex | String |
behaviorId | String | 行为编号，同一编号为一次
tenantId | Integer | 机构ID
platform | String | 请求来源（设备类型）ANDROID，IOS
clientId | String | 客户端类型（student,teacher）
speed | Integer | 曲目评测速度
heardLevel | String | 曲目评测难度（BEGINNER：入门级，ADVANCED：进阶级，PERFORMER：大师级）
beatLength | Integer | 节拍延迟时间
evaluationCriteria | String | 曲目评估标准：AMPLITUDE("振幅"),FREQUENCY("频率"),DECIBELS("分贝")
uuid | String | 请求唯一ID

4、应答返回

无

#### 开始评测

1、功能说明：

1）Websocket客户端发送曲目XML文件信息到服务端

2）开始评测，前端传入评测开的的命令信息，没有返回数据。

2、请求参数示例:

    xxxxxxxxxx{  "header": {    "commond": "recordStart",    "type": "SOUND_COMPARE",    "status": 200  }}

3、参数请求说明：

参数 | 类型 | 说明
--- | --- | ---
header | Object | 请求信息
commond | String | 请求命令。目前支持的请求命令：musicXml(同步music xml信息),recordStart(开始评测)，recordCancel(取消评测),recordEnd(结束评测)
type | String | 请求类型，目前支持的请求类型：SOUND_COMPARE(评测)，DELAY_CHECK(延迟检查)，PITCH_DETECTION(校音)
status | Integer | 固定值200

4、应答返回

无

#### 发送音频数据流

1、功能说明：

1）Websocket客户端发送曲目XML文件信息到服务端

2）评测开始后，前端将录制的音频数据流通过Websockt发送到服务端。服务端解析数据流，当数据流满足一个小节长度后，返回当前小节的分数。

2、请求参数示例：

无

3、应答返回:

当数据流满足一个小节长度后，返回当前小节的分数：

    xxxxxxxxxx{  "body": {    "score": 0,    "measureIndex": 5,    "measureRenderIndex": 5  },  "header": {    "commond": "measureScore",    "status": 200,    "type": "SOUND_COMPARE"  }}

4、返回参数说明：

参数 | 类型 | 说明
--- | --- | ---
header | Object | 请求信息
commond | String | 固定值measureScore
type | String | 请求类型，目前支持的请求类型：SOUND_COMPARE(评测)，DELAY_CHECK(延迟检查)，PITCH_DETECTION(校音)
status | Integer | 固定值200
body | Object | 返回小节分数信息
score | Integer | 小节分数
measureIndex | Integer | 第几小节
measureRenderIndex | Integer | 第几小节

#### 取消评测/结束评测

1、功能说明：

1）Websocket客户端发送取消评测/结束评测命令信息到服务端

2）前端发送取消评测/结束评测命令给后端，后端接收到命令后生成评测报告和录音文件、并保存到数据库中。返回评测结果给客户端。

2、请求参数示例：

结束评测

    xxxxxxxxxx{  "header": {    "commond": "recordEnd",    "type": "SOUND_COMPARE",    "status": 200  }}

取消评测

    xxxxxxxxxx{  "header": {    "commond": "recordCancel",    "type": "SOUND_COMPARE",    "status": 200  }}

3、请求参数说明：

参数 | 类型 | 说明
--- | --- | ---
header | Object | 请求信息
commond | String | 请求命令。目前支持的请求命令：musicXml(同步music xml信息),recordStart(开始评测)，recordCancel(取消评测),recordEnd(结束评测)
type | String | 请求类型，目前支持的请求类型：SOUND_COMPARE(评测)，DELAY_CHECK(延迟检查)，PITCH_DETECTION(校音)
status | Integer | 固定值200

4、应答返回：

    xxxxxxxxxx{  "recordId": 9248,  "score": 0,  "intonation": 0,  "integrity": 0,  "totalPlayTimeOfCurrentDate": 42,  "playTime": 4800,  "cadence": 0}

5、应答参数说明：

参数 | 类型 | 说明
--- | --- | ---
recordId | Integer | 评测记录ID
score | Integer | 评测总分
intonation | String | 音准分数
integrity | Integer | 完成度分数
totalPlayTimeOfCurrentDate | Object | 总演奏时长
playTime | Integer | 演奏时长（ms）
cadence | Integer | 节奏分数

###