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

2024-10-18 10:13:13 +08:00
 baojunz

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

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

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

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

在此十分感谢大家!

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

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

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

以上方法为本人瞎编的,不对结果的准确性负责。
baojunz
2024-10-18 16:23:52 +08:00
@BBrother 十分感谢,我尽可能的理解你提供的解决方案。
ETiV
2024-10-18 16:35:08 +08:00
笑死,我知道你要做啥。。。

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

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

编辑器的 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
2024-10-18 17:30:55 +08:00
十二平均律就是声音频率 直接 mic 获取声音分析出频率 再去对照一下 CDEFGAB 各个音的频率即可
catamaran
2024-10-18 18:13:05 +08:00
傅立叶变换到底干啥用的
rekulas
2024-10-18 18:14:50 +08:00
abcjs 确实很完善,坑就坑在它的音符设定很反人类。。。

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

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

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

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

© 2021 V2EX