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

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

  •  
  •   baojunz · 3 天前 · 1537 次点击

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

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

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

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

    在此十分感谢大家!

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

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

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

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

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

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

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