# 云教练文档整合v2024.1.12

## 更新记录

更新内容 | 更新人 | 更新时间
--- | --- | ---
创建文档 | 辜临轩 | 2024年12月28日
新增前端&移动端交互-通用接口，评测相关suspendPlay接口不再使用 | 辜临轩 | 2024年1月11日
新增【后台功能点】相关文档 | 辜临轩 | 2023年1月12日
新增【乐器编码】内容 | 辜临轩 | 2024年1月19日

## 后台功能点

### 曲目管理

#### 曲目列表

1、功能描述

1）该页面用于查看内容管理平台中所有已上传曲目信息

2）支持搜索、添加曲目、批量停用、批量启用、适用项目配置、预览、查看、修改、停用、启用、生成图片、删除功能

2、业务规则

1）添加曲目后，曲目在内容管理平台默认状态为【停用】

2）内容管理平台【停用】曲目，在各业务系统中也不可使用

3）列表根据更新时间倒序排序

3、输入项

字段名称 | 是否必填 | 交互方式 | 输入限制 | 默认值 | 字符上限 | 备注
--- | --- | --- | --- | --- | --- | ---
关键字 | 否 | 文本输入 | 汉字、字母、数字 | -- | 10 | 支持查询曲目编号、曲目名称、音乐人
曲目类型 | 否 | 下拉单选 | 独奏/合奏 | -- | -- | --
声部 | 否 | 下拉单选 | -- | -- | -- | 可选择系统中设备的所有声部，无论启用停用
作者属性 | 否 | 下拉单选 | 平台/机构/个人 | -- | -- | --
项目 | 否 | 下拉单选 | -- | -- | -- | 可选择系统中配置项目名称
所属人 | 否 | 文本搜索 | 汉字、字母、数字 | -- | 10 | 1、与【项目】级联搜索 2、输入后模糊搜索【项目】中的用户名称，并反显，用户名称单选
适用项目 | 否 | 下拉单选 | -- | -- | -- | 可选择系统中配置项目名称
审核版本 | 否 | 下拉单选 | 是/否 | -- | -- | --
状态 | 否 | 下拉单选 | 启用/停用 | -- | -- | --
查询 | 否 | 按钮 | -- | -- | -- | 点击后根据所输入或选择的所有条件查询满足条件的曲目数据
重置 | 否 | 按钮 | -- | -- | -- | 点击后所有搜索条件置空，列表显示所有数据
添加曲目 | 否 | 按钮 | -- | -- | -- | 点击后弹出【添加曲目】弹窗
批量停用 | 否 | 按钮 | -- | -- | -- | 点击后将所有复选框选中的曲目停用，曲目停用后各项目客户端都不再显示该曲目
批量启用 | 否 | 按钮 | -- | -- | -- | 点击后将所有复选框选中的曲目启用，曲目启用后各项目客户端根据个项目中的启用停用状态判断是否显示
复选框 | 否 | 复选框 | -- | -- | -- | --
适用项目 | 否 | 按钮 | -- | -- | -- | 点击后弹出【适用项目】配置弹窗
预览 | 否 | 按钮 | -- | -- | -- | 点击后弹出【预览】弹窗，可使用云教练所有功能，并支持调整谱面元素
查看 | 否 | 按钮 | -- | -- | -- | 点击后弹出【查看】弹窗，可查看曲目详细配置信息
修改 | 否 | 按钮 | -- | -- | -- | 点击后弹出【修改】弹窗，可修改曲目配置信息
启用 | 否 | 按钮 | -- | -- | -- | 仅【停用】状态曲目可用，点击后启用该曲目，曲目启用后各项目客户端根据个项目中的启用停用状态判断是否显示
停用 | 否 | 按钮 | -- | -- | -- | 仅【启用】状态曲目可用，点击后停用该曲目，各项目客户端不显示该曲目
生成图片 | 否 | 按钮 | -- | -- | -- | 1、点击后渲染该曲目图片 2、根据乐器上配置的【是否支持简谱】判断渲染哪些谱面图片，不支持简谱则仅渲染五线谱图片；支持简谱则渲染五线谱、首调、固定调三套图片
删除 | 否 | 按钮 | -- | -- | -- | 1、仅停用曲目可用 2、删除时校验该曲目是否存在【适用项目】，若不存在则可删除

4、输出项

字段名称 | 输出限制 | 备注
--- | --- | ---
曲目编号 | 数字 | 曲目唯一编号，不可重复
曲目名称 | -- | --
封面图 | 图片 | 可点击放大预览
音乐人 | -- | --
曲目类型 | 独奏/合奏 | --
作者属性 | 平台/机构/个人 | --
所属人 | -- | --
上传人 | -- | 最后一次更新上传该曲目信息的内容管理平台账号名称
更新时间 | yyyy-MM-dd HH:mm | 最后一次更新上传该曲目信息的时间
审核版本 | 是/否 | 1、是，则移动端开启审核的版本显示该数据 2、否，则移动端非审核版本显示该数据
适用项目 | 可选择系统中配置项目名称 | 显示该曲目已配置的项目名称
状态 | 启用/停用 |

#### 新增曲目

1、功能描述

1）该功能用于在内容管理平台添加云教练曲目

2、业务规则

1）新添加的曲目默认为【停用】状态

2）新添加的曲目默认无【适用项目】

3）停用状态下支持预览、查看、修改、启用、生成图片、删除操作

3、输入项

字段名称 | 是否必填 | 交互方式 | 输入限制 | 默认值 | 字符上线 | 备注
--- | --- | --- | --- | --- | --- | ---
曲目名称 | 是 | 文本输入 | 汉字、字母、数字、符号 | -- | 40 | 曲目名称允许重复
音乐人 | 是 | 文本输入 | 汉字、字母、数字、符号 | -- | 14 | 音乐人允许重复
曲目描述 | 否 | 文本输入 | 汉字、字母、数字、符号 | -- | 140 | --
曲目封面 | 是 | 图片上传、裁切 | jpg、png、gif，1m以内 | -- | -- |
曲目类型 | 是 | 下拉单选 | 独奏/合奏 | 独奏 | -- | 1、选择【独奏】时须配置【页面渲染声轨】 2、选择【合奏】时须配置【可切换声轨】
作者属性 | 是 | 下拉单选 | 平台/机构/个人 | 平台 | -- | 1、与【所属人】级联选择，该字段为父级 2、输入【平台】时，不显示【所属人】字段，所属人默认为当前用户 3、输入【机构】时，显示【所属人】字段，根据应用选择对应应用下的用户 4、输入【个人】时，显示【所属人】字段，根据应用选择对应应用下的用户
所属人 | 是 | 按钮 | -- | -- | -- | 点击后弹出【所属人】弹窗
审核版本 | 是 | 单选框 | 是/否 | 否 | -- | 1、选择【是】时，各项目APP【审核版本】显示该数据 2、选择【否】时，各项目APP【审核版本】显示该数据
曲目分类 | 是 | 下拉单选 | -- | -- | -- | 可选择曲目分类中已配置的分类
评分标准 | 是 | 单选 | 标准评测/打击乐（振幅）/节奏（分贝） | 标准评测 | -- | 1、标准评测：该曲目支持评测音准、节奏、完整性得分 2、打击乐（振幅）：该曲目通过振幅评测，评测分数仅有节奏得分 3、节奏（分贝）：该曲目通过分贝评测，评测分数仅有节奏得分
是否重复节拍是时长 | 是 | 单选 | 重复/不重复 | 不重复 | -- | 用于判断该曲目节拍器是否重复播放
播放模式 | 是 | 单选 | MP3/Mid | MP3 | -- | 1、用于判断该曲目用那种方式播放，不同的播放模式需上传不同的文件 2、MP3：显示【伴奏】【原声】字段 3、Mid：显示【上传Mid】字段
伴奏类型 | 是 | 单选 | 自制伴奏/普通伴奏 | 自制伴奏 | -- |
上传Xml | 是 | 上传按钮 | XML、XMXL | -- | -- |
上传伴奏 | 否 | 上传按钮 | MP3 | -- | -- | 【播放模式】为【MP3】时显示
上传Mid | 是 | 上传按钮 | Mid | -- | -- | 【播放模式】为【Mid】时显示
可用乐器 | 是 | 下拉多选 | 乐器设置中配置的乐器名称 | 根据上传的XMl文件解析声轨名称，与系统中乐器设置中的【乐器编码】字段匹配，匹配结果默认反显 | -- | 反显结果支持修改
可用声部 | 是 | 下拉多选 | 声部设置中配置的声部名称 | 根据上传的XML文件解析声轨名称，与系统中乐器设置中的【乐器编码】字段匹配，再根据乐器与声部的关联关系判断该XML文件支持哪些声部，关联结果默认反显 | -- | 反显结果支持修改
页面渲染声轨 | 是 | 多选 | 乐器设置中配置的乐器名称 | 根据上传的XMl文件解析声轨名称，与系统中乐器设置中的【乐器编码】字段匹配，匹配结果为可选项，并默认全选 | -- | 1、【曲目类型】为【独奏】时显示该字段 2、该字段用于控制客户端谱面渲染哪些声轨
可切换声轨 | 是 | 多选 | 乐器设置中配置的乐器名称 | 根据上传的XMl文件解析声轨名称，与系统中乐器设置中的【乐器编码】字段匹配，匹配结果为可选项，并默认全选 |  | 1、【曲目类型】为【合奏】时显示该字段 2、该字段用于控制客户端切换声轨功能可选选择的声轨
节拍器 | 是 | 单选 | 播放/不播放 | 不播放 | -- | 用于控制该曲目从头播放时是否播放节拍器
播放方式 | 是 | 单选 | 系统节拍器/MP3节拍器 | MP3节拍器 | -- | 1、【节拍器】字段选择【播放】时显示 2、用于控制是否播放系统节拍器
原声 | 是 | 上传按钮 | MP3 | 根据【页面渲染声部】或【可切换声轨】字段所勾选的乐器显示，每个乐器一条，都需要上传该乐器的原声MP3文件 | -- | 【播放模式】为【MP3】时显示
确认 | 否 | 按钮 | -- | -- | -- | 1、点击确认时，校验校验必填项是否规范填写 2、校验通过后渲染谱面图片,所有图片渲染成功后保存完成 3、根据【可用声部】是否支持转简谱判断需要渲染哪些谱面
取消 | 否 | 按钮 | -- | -- | -- | 关闭该弹窗，不保存已填写信息

4、输出项

无

#### 预览曲目

1、功能描述

1）该功能用于预览谱面信息

2）支持调整谱面元素

2、业务规则

无

3、输入项

字段名称 | 是否必填 | 交互方式 | 输入限制 | 默认值 | 备注
--- | --- | --- | --- | --- | ---
谱面 | 是 | -- | -- | -- | --
删除元素 | 否 | 按钮 | -- | -- | 选中谱面元素后点击该按钮则将谱面中选中的元素删除
重置数据 | 否 | 按钮 | -- | -- | 点击后重置谱面为初始状态
保存数据 | 否 | 按钮 | -- | -- | 点击后保存已操作的所有内容，客户端根据最新保存的结果显示谱面
小节调整 | 是 | 单选 | 固定小节/自定义小节 | 固定小节 | 1、固定小节：谱面每一行的小节数量统一配置 2、自定义小节：可自由设置每一行的小节数量
每行小节数 | 是 | 文本 | 数字 | 4 | 1、【小节调整】字段为【固定小节】时显示 2、根据输入参数渲染谱面，每一行的小结束相同
末尾行是否与上一行合并 | 是 | 单选 | 是/否 | 是 | 该字段用于设置最后一行不足【每行小节数】时最后一行是否要与倒数第二行合并为一行
第n行小节数 | 是 | 文本 | 数字 | 4 | 单独设置每一行的小节数

4、输出项

略

#### 修改曲目

1、功能描述

1）该功能用于修改曲目信息

2、业务规则

1）无论曲目是否停用，都支持修改

3、输入项

同【新增曲目】

4、输出项

同【新增曲目】

### 曲目分类

#### 分类列表

1、功能描述

1）该页面用于查看内容管理平台已设置的曲目分类

2）支持添加、删除、修改、添加子分类

2、业务规则

1）未被曲目关联的分类支持删除

2）分类不限制层级

3、输入项

字段名称 | 是否必填 | 交互方式 | 输入限制 | 默认值 | 备注
--- | --- | --- | --- | --- | ---
添加分类 | 否 | 按钮 | -- | -- | 点击后弹出【新增分类】弹窗
删除 | 否 | 按钮 | -- | -- | 点击后校验还分类是否关联曲目，若未关联则将所选分类删除，若又关联则提示【该分类已关联曲目，无可删除】
修改 | 否 | 按钮 | -- | -- | 点击后弹出【修改分类】弹窗
添加子分类 | 否 | 按钮 | -- | -- | 点击后弹出【添加子分类】弹窗

4、输出项

字段名称 | 输出限制 | 备注
--- | --- | ---
分类名称 | -- |
曲目数量 | 数字 | 该分类及下级分类关联曲目数量总和
最后更新时间 | yyyy-MM-dd HH:mm | 最后修改该分类信息的时间
更新人 | -- | 最后修改该分类信息后台用户名称

#### 新增分类

1、功能描述

1）该功能用于添加内容管理平台中的曲目分类

2、业务规则

1）分类不限制层级，支持添加多级分类

2）同一分类下同一层级的分类名称不可重复

3）不同分类下统一层级的分类名称可重复

4）子分类名称不能与所有父级分类名称重复

3、输入项

字段名称 | 是否必填 | 交互方式 | 输入限制 | 默认值 | 备注
--- | --- | --- | --- | --- | ---
分类名称 | 是 | 文本输入 | 10字符 | -- | --
取消 | 否 | 按钮 | -- | -- | --
确认 | 否 | 按钮 | -- | -- | --

4、输出项

字段名称 | 输出限制 | 备注
--- | --- | ---
父级分类 | -- | --

#### 修改分类

1、功能描述

1）该功能用于修改分类名称

2、业务规则

1）同一分类下同一层级的分类名称不可重复

2）不同分类下统一层级的分类名称可重复

3）子分类名称不能与所有父级分类名称重复

3、输入项

同【新增分类】

4、输出项

略

#### 添加子分类

1、功能描述

1）该功能用于添加子分类

2、业务规则

1）分类不限制层级，支持添加多级分类

2）同一分类下同一层级的分类名称不可重复

3）不同分类下统一层级的分类名称可重复

4）子分类名称不能与所有父级分类名称重复

3、输入项

同【新增分类】

4、输出项

### 声部管理

#### 声部列表

1、功能描述

1）该页面用于查询内容管理平台已配置的声部信息

2）支持添加声部、修改、停用

2、业务规则

无

3、输入项

字段名称 | 是否必填 | 交互方式 | 输入限制 | 默认值 | 备注
--- | --- | --- | --- | --- | ---
关键词 | 否 | 文本输入 | -- | -- | 支持查询声部编号、声部名称
声部分类 | 否 | 下拉单选 | 【声部分类】中配置的分类 | -- | --
关联乐器 | 否 | 下拉单选 | 【乐器分类】中配置的乐器名称 | -- | --
操作人 | 否 | 下拉单选 | -- | -- | --
操作时间 | 否 | 日期时间段选择 | yyyy-MM-dd ~ yyyy-MM-dd | -- | --
查询 | 否 | 按钮 | -- | -- | 点击后根据已输入的所有搜索条件查询数据
重置 | 否 | 按钮 | -- | -- | 点击后将所有搜索条件置空，并更新列表数据
添加 | 否 | 按钮 | -- | -- | 点击后弹出【添加声部】弹窗
修改 | 否 | 按钮 | -- | -- | 点击后弹出【修改声部】弹窗
停用 | 否 | 按钮 | -- | -- | 1、点击后停用该声部 2、停用声部后，已关联数据不受影响，新增曲目时不可选择该声部

4、输出项

字段名称 | 输出限制 | 备注
--- | --- | ---
编号 | 数字 | 声部唯一编号
声部名称 | -- | --
声部分类 | -- | 该声部配置的分类
声部图片 | jpg、png | 点击可放大预览
关联乐器 | -- | 该声部关联的所有乐器名称
操作人 | -- | 最后一次更新该声部信息的内容管理平台账号名称
更新时间 | yyyy-MM-dd HH:mm | 最后一次更新该声部信息的时间

#### 添加声部

1、功能描述

1）该功能用于添加声部

2、业务规则

1）声部名称不可重复

2）多个声部可关联同一【声部分类】

3）一个声部可关联多个【乐器】

3、输入项

字段名称 | 是否必填 | 交互方式 | 输入限制 | 默认值 | 备注
--- | --- | --- | --- | --- | ---
声部分类 | 是 | 下拉单选 | 【声部分类】中配置的分类 | -- | --
声部名称 | 是 | 文本输入 | 汉字、字母，10字符 | -- | 声部名称不可重复
声部图片 | 是 | 图片上传、裁切 | jpg、png 1m以内 | -- | --
关联乐器 | 否 | 下拉多选，关联字搜索 | -- | -- | --
取消 | 否 | 按钮 | -- | -- | --
重置 | 否 | 按钮 | -- | -- | --
创建 | 否 | 按钮 | -- | -- | --

4、输出项

无

#### 修改声部

1、功能描述

1）该功能用于修改声部信息

2、业务规则

同【添加声部】

3、输入项

同【添加声部】

4、输出项

略

#### 声部分类

1、功能描述

1）用于查看、新增、修改声部分类

2、业务规则

1）分类仅支持一级

3、输入项

字段名称 | 是否必填 | 交互方式 | 输入限制 | 默认值 | 备注
--- | --- | --- | --- | --- | ---
添加 | 否 | 按钮 | -- | -- | 点击后弹出【添加分类】弹窗
修改 | 否 | 按钮 | -- | -- | 点击后弹出【修改分类】弹窗

4、输出项

字段名称 | 输出限制 | 备注
--- | --- | ---
分类编号 | 数字 | 声部分类唯一编号
分类名称 | 汉字 | --
操作人 | -- | 最后一次更新该分类的内容管理平台账号姓名
更新时间 | yyyy-MM-dd HH:mm:ss | 最后一次更新该分类的时间

#### 添加分类

1、功能描述

1）该功能用于添加声部分类

2、业务规则

1）声部分类名称、编号不可重复

3、输入项

字段名称 | 是否必填 | 交互方式 | 输入限制 | 默认值 | 备注
--- | --- | --- | --- | --- | ---
分类名称 | 是 | 文本输入 | 10字符 | -- | 不可重复
取消 | 否 | 按钮 | -- | -- | --
确认 | 否 | 按钮 | -- | -- | --

4、输出项

无

#### 修改分类

1、功能描述

1）功能功能用于修改分类名称

2、业务规则

1）分类名称不可重复

3、输入项

同【添加分类】

4、输出项

无

### 乐器管理

1、功能描述

1）用于查看、添加、修改、停用乐器信息

2）创建乐器与声部的关联关系

2、业务规则

1）乐器名称不可重复

2）乐器编码不可重复

3）多个乐器可关联同一个声部

4）停用的乐器不可在云教练中选择对应声轨

3、输入项

字段名称 | 是否必填 | 交互方式 | 输入限制 | 默认值 | 备注
--- | --- | --- | --- | --- | ---
关键词 | 否 | 文本输入 | -- | -- | 支持乐器编号、乐器名称、乐器编码搜索
默认谱面 | 否 | 下拉单选 | 五线谱/首调/固定调 | -- | --
操作人 | 否 | 文本输入 | -- | -- | --
操作时间 | 否 | 时间选择器 | yyyy-MM-dd ~ yyyy-MM-dd | -- | --
查询 | 否 | 按钮 | -- | -- | --
重置 | 否 | 按钮 | -- | -- | --
修改 | 否 | 按钮 | -- | -- | 点击后弹出【修改乐器】弹窗
停用 | 否 | 按钮 | -- | -- | --
启用 | 否 | 按钮 | -- | -- | --

4、输出项

字段名称 | 输出限制 | 备注
--- | --- | ---
编号 | 数字 | --
乐器名称 | -- | --
乐器编码 | -- | --
声部 | 【声部设置】中配置的声部名称，无论是否停用 | --
默认篇 | 五线谱/首调/固定调 | --
操作人 | -- | --
操作时间 | yyyy-MM-dd HH:mm:ss | --

#### 添加乐器

1、功能描述

1）该功能用于添加乐器，配置乐器参数

2、业务规则

1）乐器名称不可重复

2）【是否支持转简谱】设置为【是】时，须选择默认谱面；设置为【否】时，无需设置默认谱面，谱面默认为【五线谱】

3）【乐器编码】用于添加曲目时，与上传的XML文件中声轨名称匹配，匹配上后，显示对应乐器名称

3、输入项

字段名称 | 是否必填 | 交互方式 | 输入限制 | 默认值 | 备注
--- | --- | --- | --- | --- | ---
乐器名称 | 是 | 文本输入 | 汉字，10字符 | -- | 乐器名称不可重复
是否支持转简谱 | 是 | 下拉单选 | 是/否 | 是 | 选择【是】时，显示【默认谱面】字段
默认谱面 | 是 | 下拉单选 | 五线谱/首调/固定调 | 首调 | 1、【是否支持转简谱】选择【是】时显示 2、【是否支持转简谱】选择【是】时不显示，默认保存为【五线谱】
乐器编码 | 是 | 文本输入 | 英文、符号 | -- | 乐器编码不可重复

4、输出项

无

## 云教练功能点

### 曲目详情页

#### 转谱

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、示例

    xxxxxxxxxx{  "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隐藏保存演奏按钮

#### 通用接口

##### accompanyError

1、示例

    xxxxxxxxxx{  "api" : "accompanyError",  "content" : {    "type" : "playError",    "reson" : "播放异常中断",  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
type:异常类型 playError：播放出现异常中断 enterBackground：App退到后台 socketError：socket连接断开 micUnable、cameraUnable：无相关硬件权限) storageUnable：iOS相册权限，安卓存储权限 reson：异常描述，针对不同情况描述不同 | App | App出现异常调用相关API

##### checkSocketStatus

1、示例

    xxxxxxxxxx{  "api" : "checkSocketStatus",  "content" : {    "status" : "connected",  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
status：连接状态 connected：已连接 closed：未连接 | H5 | 检测socket连接状态

##### connectSocket

1、示例

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

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
| H5 | 连接webSocket

##### disconnectSocket

1、示例

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

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
| H5 | 断开socket连接

##### socketConnectSuccessReport

1、示例

    xxxxxxxxxx{  "api" : "socketConnectReport",  "content" : {    "status" : "connected"  }}

2、请求参数说明

参数 | 调用方 | 描述
--- | --- | ---
status：connected(已连接) | { "api" : "socketConnectReport", "content" : { "status" : "connected" } } | 连接成功状态回调

## 后端评测功能

### 时序图

### 流程说明

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

1、功能说明：

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

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

2、请求参数示例：

    {  "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 | 节奏分数

## 乐器编码

乐器名称 | 乐器编码
--- | ---
乐理 | MUSIC_THEORY
排箫 | Panpipes
陶笛 | Ocarina
葫芦丝 | Woodwind
德式竖笛 | Tenor Recorder
口风琴 | Nai
英式竖笛 | BaroqueRecorder
长笛 | Flute
中音萨克斯 | AltoSaxophone
单簧管 | Clarinet
小号 | Trumpet
圆号 | Horn
长号 | Trombone
上低音号 | UpBassHorn
大号 | Tuba
小军鼓 | Snare
排箫 | PanFlute
口风琴 | Melodica
葫芦丝 | Hulusi