V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
baojunz
V2EX  ›  程序员

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

  •  
  •   baojunz · 18 天前 · 1768 次点击

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

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

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

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

    在此十分感谢大家!

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

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

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

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

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

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

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

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

    随便找了个视频,你参考下 UI/UX ……


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

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

    游戏过程中就是把你检测到的音高+时长,和你编辑器里导出的谱子去做比较就行了
    raphaelsoul
        18
    raphaelsoul  
       18 天前
    十二平均律就是声音频率 直接 mic 获取声音分析出频率 再去对照一下 CDEFGAB 各个音的频率即可
    catamaran
        19
    catamaran  
       18 天前
    傅立叶变换到底干啥用的
    rekulas
        20
    rekulas  
       18 天前
    abcjs 确实很完善,坑就坑在它的音符设定很反人类。。。
    ibuki233
        21
    ibuki233  
       18 天前
    楼主是单纯要 KTV 、音游的那种音高比对系统,还是要把这种音高识别对应到 [五线谱] 这个特定媒介上?
    jadeborner
        22
    jadeborner  
       17 天前
    顺便问下有没有简谱转五线谱,各调转 c 调的接口
    dapang1221
        23
    dapang1221  
       17 天前
    原唱去伴奏,留人声轨,转时频图,然后用户声音实时转时频图,这样你就得出了某一时刻,原唱和用户的频域特征,这俩计算就行了,是简单粗暴相减还是算平方差等等,看你们需求的精细程度了。时频图可以做 FFT 变换算出来
    dapang1221
        24
    dapang1221  
       17 天前
    噢没看清,输入是五线谱啊。其实每个音高(或者说每个五线谱的小蝌蚪)都有自己的频域特征,有五线谱数据就能直接计算出来了,然后再和用户的时频图计算
    baojunz
        25
    baojunz  
    OP
       17 天前
    @ETiV 是的,我就是要做这个需求,请问您是使用的什么技术方案呢?
    baojunz
        26
    baojunz  
    OP
       17 天前
    @ETiV 十分感谢,我看一下您提供的内容!
    baojunz
        27
    baojunz  
    OP
       17 天前
    @ETiV 十分感谢,我仔细看一下
    baojunz
        28
    baojunz  
    OP
       17 天前
    @ibuki233 属于后者
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3726 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 10:31 · PVG 18:31 · LAX 02:31 · JFK 05:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.