ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

用Python和MuseScore工程化扒谱《Deltarune》的Sunset of Seven Suns

用Python和MuseScore工程化扒谱《Deltarune》的Sunset of Seven Suns 如果你第一次尝试扒《Deltarune》的曲子大概率会卡在同一个地方旋律明明听得出手一放到钢琴卷帘上就不知道从哪写起低音糊成一片和弦更是“好像有这个音又好像没有”。尤其是《Sunset of Seven Suns》这种氛围感很强的曲子混音里铺了多层和声耳朵很容易被最响的旋律带走结果扒出来的谱子薄得像一张纸。这篇文章想给你的不是一个“标准答案谱”而是一套可复用的扒谱工程方法。把扒谱拆成定速、定调、扒旋律、扒低音、扒和声、整理结构六个步骤再用 Python 和 MuseScore 做辅助工具每一步都有对应的验证方式。扒完之后你得到的不仅是一份 MIDI 或五线谱更是一套能迁移到其他游戏原声曲目的工作流。1. 为什么扒谱值得当成一个工程问题来做很多人觉得扒谱靠天赋耳朵好的人一遍就能听出所有音耳朵不好的人怎么练都白搭。这个说法只对了一半。乐器演奏层面的扒谱确实依赖经验但现代数字音频出现之后扒谱已经变成了“信号分离 结构拆解 反复验证”的工程问题。你要做的不是用耳朵去硬刚整个混音而是把一条完整音频拆成单声部逐个击破。具体到《Sunset of Seven Suns》这首曲子扒谱的难点不在主旋律。标题里的“Sunset”指向的是黄昏感场景音乐这类曲子往往使用了比较长的和弦持续、多层的合成器铺底和缓慢的低音线条。真正难的是和声层你听到的“氛围”并不是一个和弦而是几个同时发声的声部叠在一起。如果一上来就想把全部音都听出来大脑会过载。把扒谱当工程问题处理意味着先定目标。你需要先问自己扒这份谱子是为了什么为了做钢琴改编那就优先扒旋律、低音和和弦走向织体可以简化。为了做 MIDI 还原那就要尽量还原每个声部包括打击乐和音色层。为了学习 Toby Fox 的写作手法重点应该是动机变化、转调方式和节奏型。为了给音游或谱面类项目提供素材那最终交付物应该是严格对齐网格的 MIDI。目标不同工作流完全不同。这也是为什么很多人下载了别人的 MIDI 之后觉得“和自己听到的不一样”的根本原因对方扒谱的目标和你不一样。所以动工之前先写下你想要的最终交付物形式再决定要在每个声部上投入多少时间。从技术角度看扒谱的核心难点有三个音频是多轨混合后的结果单一声部会被其他声部掩蔽。真实乐器的音色包含大量泛音频谱上会出现很多“看起来像音符”的峰值。游戏音乐经常有意弱化节拍的听觉强度尤其是氛围场景曲目鼓点不明显导致对齐网格困难。这三个难点都有对应工具。掩蔽问题用分频段听音解决泛音误判用基频分析解决节拍问题用频谱图和节拍器联动解决。后面会逐一展开。2. 扒谱前的基本概念与曲目分析不要急着开软件先把扒谱要用到的音乐概念理清。即使你不是科班出身只要理解下面这几个术语就可以开始扒谱。术语含义在扒谱中的作用BPM每分钟拍数决定音符时值长度让所有音符对齐到网格拍号每小节的拍数比如 4/4、3/4决定小节划分和强弱规律调性一组音高作为曲子的中心比如 C 大调判断旋律里哪些音“正常”哪些是变化音主旋律最突出、承担主题的声部扒谱最先要抓住的骨架低音音区最低的声部通常是根音的基础决定和弦性质是扒和声的关键和弦两个以上音同时发声和声层的主要内容织体声部的组织和运动方式决定还原时用多少轨、怎么排列声像声音在立体声场中的左右位置从混音中分离声部的重要线索动机不断重复变化的短小旋律片段Toby Fox 作曲的核心手法在开始听《Sunset of Seven Suns》之前先看曲名能获得不少线索。“Sunset”通常意味着慢速、长线条、大动态范围的场景音乐可能带有小调或调式音阶的忧郁感。“Seven Suns”暗示了“七”这个数字很可能会被结构化为四小节或七小节的重复单元。当然这只是分析起点必须以实际音频为准。打开音频之前建议先做一次盲听后记录。不要打开频谱图也不要看波形只用耳机完整听三遍第一遍记录整体情绪、速度感、乐器类型。第二遍只注意低音区尝试哼出低音线条。第三遍注意声像位置听哪些乐器在左边哪些在右边。这三遍的价值在于建立全局图景。否则一上来就盯着频谱图很容易陷入局部把某个合成器音色当成主旋律扒到后面才发现方向错了。3. 环境准备与工具链扒谱工具不需要多贵重点是“能反复播放一段音频”和“能看到声音内部结构”。下面这套工具组合足够从零开始完成一份 MIDI 谱且全部免费。3.1 硬件与基础软件监听耳机或声音还原较准的耳机不建议用手机外放。Audacity免费音频编辑器用于截取片段、慢放、升降调。Spek 或 Sonic Visualiser显示频谱图帮助判断音高和打击点。MuseScore 4免费记谱软件可以把 MIDI 转成五线谱也可以手动记谱。任意一个 DAW比如 FL Studio、Reaper、LMMS用于循环播放和 MIDI 编辑。这里最容易被忽略的是 DAW 里的“循环选区播放”功能。扒谱时最常见的操作就是选中四个小节然后让它无限循环。Audacity 也能做但 DAW 的体验更顺手而且能直接在钢琴卷帘上试音符听到的音高立刻写进去验证。3.2 Python 环境Python 主要用于速度检测、频谱分析和批量生成 MIDI。需要的库是librosa、pretty_midi、soundfile和matplotlib。其中librosa负责音频分析pretty_midi负责生成 MIDI 文件。python -m venv venv source venv/bin/activate # Windows 系统使用venv\Scripts\activate pip install --upgrade pip pip install librosa pretty_midi soundfile matplotlib如果你准备在 Python 里处理 MP3 文件建议先转成 WAV。可以使用 Audacity 导出也可以用ffmpeg转换ffmpeg -i sunset_of_seven_suns.mp3 sunset_of_seven_suns.wav这里不绑定具体版本号因为 Python 库更新很快。如果你安装时报依赖冲突只需把numpy、scipy等额外装一遍即可。4. 核心流程拆解从音频到一份可播放的乐谱扒谱的正确顺序不是从主旋律开始而是从节奏骨架开始。先定速度和拍号再定调性最后才去逐个声部地听音高。顺序错了后面所有的音符都是飘在空中的。4.1 第一步确定 BPM 与拍号打开音频先不要管音高。用节拍器手动对速度或者用算法先估算一个参考值。对 BPM 的工具很多DAW 里自带节拍检测librosa 也能做。关键判断在于拍号这曲子是 4/4、3/4 还是 6/8一个实用技巧是听低音鼓和底鼓的重复周期。如果每两个强拍之间听到“咚、咚”的均匀间隔通常是 4/4 或 2/2。如果强拍呈现“强、弱、弱”的循环3/4 的可能性更大。氛围类游戏音乐经常使用 6/8 或 12/8 的复合拍特点是每一拍内部还能再拆成三个八分音符听起来像流水一样连贯。不要急着把 BPM 锁死。先用 DAW 里的 Tap Tempo 功能点击对拍再结合算法结果取一个最舒服的数值。如果原曲有细微的变速以主歌段落的稳定区域为准。4.2 第二步确定调性确定调性之前先确定主音。方法是把旋律里反复出现、结尾时最有“稳定感”的音找出来。大多数曲子的结尾音就是主音。比如旋律最后停在了 C且整首曲子听起来没有强烈的离调感那调性大概率是 C 大调或 A 小调。C 大调和 A 小调的区别在于小三度音程是哪个音。你只需要看旋律中频繁出现的是 F 还是 G准确说是看小三度落在哪里。更实用的方法是把扒出来的几个音列成音阶观察它们对应哪个调号的习惯组合。如果关键音有升降号再逐个确认。《Sunset of Seven Suns》这种偏氛围的曲子通常不会只用自然大调或自然小调很可能加入调式音阶比如多利亚调式或混合利底亚调式。多利亚的特点是大六度混合利底亚的特点是降七级。遇到这种情况不要强行把变化音改成“临时变音”最好在谱面上标明使用的调式否则后续检查会越看越乱。4.3 第三步扒低音这是整个扒谱流程里最值得你先做的声部。低音决定了和弦的根音而根音决定了和弦的性质。如果低音扒错上层和声全部错位。先把音频整体降调比如在 Audacity 或 DAW 里降一个八度让自己更容易听到低音线条。然后单独播放左声道或右声道观察低音乐器是否集中在某一侧。接着用频谱图找最低的基频峰值把每个强拍的音高记录下来。一个低音听辨技巧不要试图在混音里听出低音“长什么样”而是听它的走向。比如你听到低音从 C 走到 A再走到 F最后到 G基本就能推断出和弦是 C 小调、A 降大调、F 小调、G 属和弦这样的功能走向。先把根音序列写出来比一次性把低音节奏也写出来更重要。4.4 第四步扒主旋律主旋律是听众记忆最强的部分也最容易确认。当你把低音已经扒好相当于有了轨道旋律里的每个音都能放在和声背景里去检验。扒主旋律时建议把音频截成 4 到 8 小节的小段循环播放。每一段只扒 2 到 4 个音先写音名再写节奏。最怕的是边听边写音符还没听清就下笔结果节奏完全错位。如果某个音听不准可以把音频慢放 50%同时保持音高不变。Audacity 的变速功能可以做到不改变音高。慢放之后单个音符之间会拉开距离耳朵负担大幅降低。4.5 第五步扒和声层和声层是《Sunset of Seven Suns》这类曲子最丰富也最烦恼的部分。混音里可能同时存在三四个和声层长音铺垫、分解和弦、对位旋律。处理办法是“分频段听音”。把音频用 EQ 切成三段低频段0 到 200Hz主要听低音。中频段200Hz 到 2kHz主要听和弦和主旋律。高频段2kHz 以上主要听打击乐、镲片和高八度装饰音。在每个频段里单独循环播放你会发现原本混在一起的声部被分开了。在 DAW 里实现也不难打开均衡器把其他频段静音或者直接给轨道加一个低通/高通滤波器。和声听辨遵循“先根音再五音再三音”的顺序。先根据地上的低音确定根音再听这个和弦是空洞的纯五度还是饱满的大三和弦或者带忧伤色彩的小三和弦。如果听起来既不像大三也不像小三很有可能是挂留和弦或加六和弦。4.6 第六步扒鼓组和节奏层如果最终目标是 MIDI 还原打击乐不能跳过。先确定底鼓位置因为它是节拍的锚点。底鼓通常在每个重拍上出现一次用频谱图看 50Hz 左右有没有密集的低频冲击。然后是军鼓通常分布在 2kHz 附近有明显噪声感。踩镲是连续的沙沙声位置在高频 6kHz 以上。如果歌曲的打击乐比较弱可以降低要求只把主要的底鼓和军鼓写出来不必追求每个细节。4.7 第七步整理曲式结构把声部都扒完之后回到全局。用字母标记段落A 段、B 段、间奏、尾奏。观察每个段落里动机是否有变化。这是《Deltarune》配乐最有价值的地方。Toby Fox 的作曲习惯是把一个短小动机反复变化可能改变节奏、改变和声、改变配器。比如同一个旋律材料前一次是钢琴独奏后一次变成了重奏原本落在强拍的主题第二次出现时落在弱拍。把这些变化记录在谱面的注释里你的扒谱作品就从“复制音频”升级成了“分析创作”。5. 用 Python 辅助扒谱完整示例代码人工扒完框架之后可以用 Python 快速验证几个数据点。下面三段代码分别解决速度估计、频谱可视化和 MIDI 生成。5.1 速度检测代码将音频文件放在和脚本同一目录下执行下面代码import os import numpy as np import librosa audio_path sunset_of_seven_suns.wav if not os.path.exists(audio_path): raise FileNotFoundError(请先准备 wav 格式音频文件) y, sr librosa.load(audio_path, sr22050, monoTrue) tempo, beat_frames librosa.beat.beat_track(yy, srsr) tempo float(np.atleast_1d(tempo)[0]) print(f估计 BPM: {tempo:.2f}) beat_times librosa.frames_to_time(beat_frames, srsr) print(f检测到拍点数: {len(beat_times)}) onset_env librosa.onset.onset_strength(yy, srsr) print(Onset 强度序列长度:, len(onset_env))这段代码的原理是检测音频中的瞬态强度再在瞬态序列里找到周期性规律。它给出的 BPM 只是算法估计值实际对拍时仍要以你的听感为准。如果结果和你心中速度明显不一致可以检查音频是否带有大段静音。5.2 生成频谱图代码频谱图是判断音高和打击点的利器。下面代码将输出一张 PNG 图片import librosa import librosa.display import matplotlib.pyplot as plt import numpy as np audio_path sunset_of_seven_suns.wav y, sr librosa.load(audio_path, sr22050) D librosa.stft(y) DB librosa.amplitude_to_db(np.abs(D), refnp.max) plt.figure(figsize(16, 8)) librosa.display.specshow(DB, srsr, x_axistime, y_axislog) plt.colorbar(format%2.0f dB) plt.title(Sunset of Seven Suns - Spectrum) plt.tight_layout() plt.savefig(spectrum.png, dpi120) print(频谱图已保存为 spectrum.png)观察频谱图时横向是时间纵向是频率。每个音高都会显示为一条水平亮线。你可以直接在图上读出一个音对应的大致频率再用下面的公式转成 MIDI 音高MIDI 音高 69 12 * log2(频率 / 440)比如图中某个强亮线出现在 440Hz 附近那它对应的就是 A4。这种方法尤其适合扒低音只观察 50Hz 到 200Hz 区间的亮线就能快速确认根音走向。5.3 生成 MIDI 文件代码当你已经用耳朵扒出了音符可以用 pretty_midi 把它们整理成 MIDI。这里以 C 大调一段简单旋律为例import pretty_midi midi pretty_midi.PrettyMIDI() piano pretty_midi.Instrument(program0) # 旋律列表格式(开始拍, 结束拍, MIDI音高, 力度) melody [ (0.0, 1.0, 60, 96), (1.0, 2.0, 62, 96), (2.0, 3.0, 64, 96), (3.0, 4.0, 65, 96), (4.0, 6.0, 67, 96), (6.0, 8.0, 69, 96), ] for start, end, pitch, velocity in melody: note pretty_midi.Note( velocityvelocity, pitchpitch, startstart, endend ) piano.notes.append(note) midi.instruments.append(piano) midi.write(sunset_transcription.mid) print(MIDI 文件已生成)这段代码的逻辑非常直接把扒好的音符按“开始时间、结束时间、音高、力度”写成 MIDI 事件。你可以用自己的旋律数据替换melody列表低音声部用另一个pretty_midi.Instrument添加最后统一导出。关于 MIDI 音高对照60 是中央 C62 是 D64 是 E65 是 F67 是 G69 是 A。钢琴键盘从左到右每相邻两个键相差 1。6. 运行结果与效果验证代码跑完后你要做两件事来验证结果是否可靠。6.1 验证速度检测把 Python 输出的 BPM 输入到 DAW 或 MuseScore 的节拍器循环播放原曲听节拍器和音乐是否贴合。如果节拍器比音乐快说明 BPM 偏大比音乐慢则偏小。还有一个更细的验证方式观察beat_times的前几个拍点。如果第一个拍点不是音乐开始的第一个强拍可能是检测到了弱拍。不要紧只要节拍间隔正确在后处理时把整个 MIDI 平移即可。6.2 验证 MIDI 和乐谱将生成的 MIDI 文件导入 MuseScore。在 MuseScore 的导入设置里可以选择是否保留力度、是否变为五线谱。导入后你会看到音符出现在钢琴谱表上。验证谱面对不对不要只看单个音要看整体线条低音声部是否呈自然的二度或四度下行旋律声部的最高点和最低点是否和原曲听感一致每个和弦的根音是否都在低音谱表上如果某个和弦听起来别扭优先检查根音位置而不是去改上方音符。很多扒谱错误都来自低音错位导致整个和弦判断失误。如果导入后音符乱成一团先检查 MIDI 里音符的时间单位是否统一。pretty_midi 的时间单位是秒不是拍这一点经常导致节拍对不上。7. 常见问题与排查思路问题现象可能原因排查方式解决方案节拍器对不上歌曲原曲存在速度渐变或自由速度用频谱图观察底鼓间隔是否均匀分段设定 BPM或者以段落为单位独立对齐旋律音高总差半音漏听了变化音或调性判断错误列出整段旋律的音名对比调号把可能的变化音逐一听辨确认调性后再修改低音完全听不清低频被其他乐器掩蔽用 EQ 切掉 200Hz 以上频段单独循环低频段使用频谱图确认基频听出和弦却写不出来柱式和声密集音色很厚把片段降速 50%按“根音-五音-三音-其他色彩音”顺序逐个记录Python 检测 BPM 结果离谱音频带大段静音或人声干扰截取鼓点清晰的 30 秒片段用 Audacity 截取稳定片段后再检测自动提取的音符过多泛音被当成多个独立音符查看频谱确认基频位置不要依赖全自动提取改用手动听写MIDI 导入 MuseScore 后出现大量休止符音符之间有空隙检查音符的结束时间是否连续在 MIDI 编辑面板里统一音符边界整体音区偏高把合成器高八度听写了对比低音谱表的最低音降低八度以基频为准8. 最佳实践与工程建议8.1 给每个声部建立清晰命名扒谱越往后声部越多命名混乱会导致你自己都找不到东西。建议在 DAW 或 MuseScore 里按下面的规则命名00_Drums01_Bass02_Lead_Melody03_Chord_Pad04_Counter_Melody这样即使隔了一周再打开工程也能一眼看清整体结构。8.2 先粗后细先骨架后装饰不要期待一次写出完整谱面。第一轮只记录强拍上的根音和旋律主干第二轮补和弦第三轮补装饰音。如果你一开始就纠结装饰音很可能把主干还搞不清楚。8.3 用声像信息辅助声部分离《Sunset of Seven Suns》这类游戏混音通常会把不同声部摆在不同声像位置。扒谱时经常切换单声道和立体声。单声道模式下左右两侧的声音会混在一起立体声模式下可以靠声像定位来区分声部。比如主旋律通常居中铺底和弦靠两侧低音居中但声像偏宽。8.4 自动化工具只能辅助不能替代Python 的 BPM 检测、音符识别算法确实方便但对混合音频的准确度有限。你的最终决定权始终在耳朵和逻辑分析上。自动化结果更合适的角色是“初步参考”和“二次确认”而不是“标准答案”。8.5 版权与发布规范《Deltarune》的原声版权归 Toby Fox 所有。扒谱属于个人学习和二次创作范畴公开发布时应在标题或简介中标注“扒谱”字样、原曲出处、作者信息并以非商业、学习交流为用途。这既是对原作者的尊重也让你的作品更容易获得社区认可。8.6 完善工程元数据一份专业扒谱交付物不只是一个 MIDI。建议在文件夹里附上 README记录原曲名和出处BPM、拍号、调性扒谱日期各声部命名说明使用的主要工具和版本这些元数据对你复现工程非常重要也是团队协作时的交接基础。9. 总结与后续学习方向把《Sunset of Seven Suns》扒完你手里的收获不只是一份 MIDI。你为了抓到低音线条学会了分频段听音为了确认调性列出了旋律里的所有变化音为了对齐节拍用 Python 跑了 BPM 检测。这些能力可以原样迁移到任何一首游戏原声曲目上。下一步建议做三件事。第一把你扒出来的 MIDI 导入 DAW尝试用合成器音色重新还原原曲氛围这一步能训练你对音色和混音的理解。第二把同一首曲子的不同段落拆出来对比动机关系学习写音乐里如何通过变化重复来推动情绪。第三试着把谱面转成五线谱用 MuseScore 排版看看哪些位置需要连音线、哪些位置需要强弱记号。扒谱是一种需要反复练习的技能但练习并不等于痛苦地硬听。搭好工具流养成先骨架后细节的习惯再复杂的曲子也会被一步步拆开。下次再遇到喜欢的游戏音乐你就能直接从截图频谱图开始而不是在钢琴卷帘前发呆。
返回列表