请教一个关于音乐五线谱相关的问题

36 天前
 baojunz

各位朋友们好,公司在承接一个项目,这个项目是和五线谱相关,其主要目的是答题环节。

目前定的技术方案是:uniapp+ webview+abcjs 实现五线谱的展示和编辑,但目前有个技术问题,想请教各位:

1 、需要实现一个和 KTV 实时评分类似的功能:一个是标准音线,另外一个是获取用户发出的音调音线,通过实时对比两条音线,来评判用户发出的声音是否符合标准音。

有没有大佬提供思路,或者相关的开源代码供其参考和研究。 另外不知有没有人使用过 abcjs ,这里面存不存在什么坑,可以提前告知一下。

在此十分感谢大家!

1921 次点击
所在节点    程序员
28 条回复
baojunz
36 天前
另外还有一个问题,就是实现 abcjs 实现在音符的编辑和插入的功能,找到了 abcjs quick editor 相关源码,但是不知道内部是如何实现的。我们想在此添加一些事件
a67793581
36 天前
付费咨询了解一下
jipfqf
36 天前
应该参考在线吉他或尤克里里这种的调音器吧,本质都是对比音调
Davy
36 天前
问过 ai 了吗?
baojunz
36 天前
@Davy 过问 gpt 了,没有找到
NoDataNoBB
36 天前
找个网页版的调音器,看看代码
maybedk
36 天前
玩过一些音乐,了解一点乐理。人类唱歌发音是泛音不是单音,KTV 那个非常不准,只能是娱乐。如果想做唱歌音准识别的话感觉会涉及一些非常专业的算法。
baojunz
36 天前
@maybedk 是的,但是目前我无从下手,不知道如何搜索相关的这种关键字或者相关的源码。导致找不到合适的答案。
p3ngb0
36 天前
baojunz
36 天前
@p3ngb0 十分感谢,我看一下。
BBrother
36 天前
这跟五线谱有什么关系?然后识别单音还是一段旋律?需不需要时值完全对应?

如果时值需要完全对应那就:
1. 根据音符时值截取人声音频
2. 傅里叶变换
3. 找出主音频率
4. 跟音符对应的频率对比

如果不需要在时值上进行对应只需要识别音高的准确性:
1. 根据当前音符时值设置时间窗口
2. 在超时范围内滑动时间窗口获取若干段音频
3. 傅里叶变换
4. 找出主音频率跟音符对应的频率对比
5. 找到匹配的就进行下一个音符的匹配
6. 否则在超时前重复之前步骤
7. 超时判定为当前音符不匹配

以上方法为本人瞎编的,不对结果的准确性负责。
baojunz
36 天前
@BBrother 十分感谢,我尽可能的理解你提供的解决方案。
ETiV
36 天前
笑死,我知道你要做啥。。。

这是我当年在盛大《巨星》项目组的时候传到 YouTube 上的游戏内录视频……

<amp-youtube data-videoid="-gflC21bMxw" layout="responsive" width="480" height="270"></amp-youtube>
shadowyue
36 天前
和五线谱没啥关系的啦
你从获取麦克风的录音数据开始入手,先看看获取到的音频数据是怎么样的,
然后补充一些声音相关的物理知识,尝试把收到的声音能画出你想要的声音图像。
你能做到这一步应该基本就有整体思路和方案。
csulyb
36 天前
就是频率对比 用 fast 傅里叶时域转频域就可以了
之前写过调音的程序 就是这样做的
可以提供付费咨询
ccpp132
36 天前
分时做傅立叶变换,可以找点数字信号处理或者数字音频输出的资料看看,应该都有
ETiV
36 天前
你要做的应该分两部分,谱面编辑器(你以为跟五线谱有关系的)、主游戏流程

编辑器的 UI 你参考一下音乐编辑软件( GarageBand 、FL Studio 、初音……),他们的样子都是横向的钢琴卷帘窗,横轴表示时间、纵轴表示音高;交互也可以参考一下,一般是鼠标拖动 note 在激活新的音高的时候会播放对应的音高。

这都是标准界面,扒谱的人应该也用得来这个东西,用不来就换一个人。。。

随便找了个视频,你参考下 UI/UX ……
<amp-youtube data-videoid="AcHsGo0LP7E" layout="responsive" width="480" height="270"></amp-youtube>

在 Web 上做编辑器的话,音频播放,Chrome 支持 Web MIDI API ,可以低延迟的播放对应的音高,对应的库么,看看 https://github.com/mudcube/MIDI.js

游戏主流程就是波形转频率了 可以看这个 demo …… https://cwilso.github.io/PitchDetect/

游戏过程中就是把你检测到的音高+时长,和你编辑器里导出的谱子去做比较就行了
raphaelsoul
36 天前
十二平均律就是声音频率 直接 mic 获取声音分析出频率 再去对照一下 CDEFGAB 各个音的频率即可
catamaran
36 天前
傅立叶变换到底干啥用的
rekulas
36 天前
abcjs 确实很完善,坑就坑在它的音符设定很反人类。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1081391

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX