十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

MIDI转简谱全攻略:调性判断、时值量化与MuseScore/Python实操

MIDI转简谱全攻略:调性判断、时值量化与MuseScore/Python实操 作为一个常年跟乐谱打交道的人MIDI转简谱这件事我做过太多次了。搜“MIDI转简谱”能找到的答案大多是把MIDI文件拖进某个打谱软件再手动收拾真正能把流程讲透、把原理说清顺带把五线谱和简谱之间那层窗户纸捅破的文章确实不多。这篇我就把自己平时干活最顺手的套路完整写出来从MIDI里的调性怎么判断、时值怎么量化到如何把五线谱的固定音高思维切换成简谱的首调思维再到MuseScore和Python脚本两条实操路径尽量让没有乐理基础的人也能跟着走一遍。如果你手里攒了一堆MIDI文件想快速变成能看能唱能上课用的简谱或者你是音乐老师想给学生扒一首伴奏的旋律线又或者你只是好奇MIDI这种“机器谱”和简谱到底怎么互相翻译这篇都值得读完。我尽量不绕弯子直接把能落地的步骤和参数给你。1. 为什么非要把MIDI转成简谱1.1 简谱是“首调思维”MIDI是“绝对音高”先说一个很多人忽略的本质问题MIDI和简谱记录的压根不是同一种信息。MIDI文件里存的是事件的序列每个音符对应一个绝对音高数字。C4是60C5是72D4是62这些数字是死的跟调性无关。你用一个MIDI文件播放《小星星》无论它在C大调还是G大调MIDI里记录的始终是“哪个键被按下了”。简谱恰恰相反。简谱里的“1、2、3、4、5、6、7”不是绝对音名而是调内的级数。C大调里的“1”是CG大调里的“1”是G。同一份简谱从C调移到G调谱面上的数字一行都不用改变的只有左上角那个“1C”或“1G”。这就是首调记谱法它记录的是音与音之间的相对关系而不是绝对音高。这个差异决定了转换的核心难点把MIDI的绝对音高翻译成简谱的相对级数中间必须插一步“确定调性”。调性定错了后面全盘皆错。很多人转出来谱子乱七八糟问题十有八九出在调性判断上而不是软件操作上。1.2 几个最典型的应用场景MIDI转简谱这件事在不同人群手里的诉求完全不一样但归结起来大概是这几类第一类是音乐教学。学校乐理课、合唱团、老年大学普遍用简谱上课。老师拿到一首歌的伴奏MIDI想把主旋律抽出来做成简谱发给学生这是最刚需的场景。五线谱很多学生看不利索简谱拿来就能唱。第二类是器乐入门。吉他、口琴、葫芦丝、笛子这类乐器很多教材和网络曲谱都是简谱。你找到一个不错的MIDI版本里面有旋律也有伴奏但你只想提取旋律线转成简谱照着练。第三类是改编和扒谱。编曲爱好者惯用MIDI做草稿但和声、转调、节奏全混在一个文件里。用简谱输出一遍等于把整首歌的结构重新梳理了一遍主旋律、副旋律一目了然。第四类是存档与分享。简谱文件小、跨平台兼容性好做成图片或文本就能随处传播。你不想每次打开工程文件都带个DAW转成简谱丢进笔记软件里随时随地能看。不管属于哪种场景转换的本质都是同一件事把MIDI里的绝对音高、精确时值翻译成人类最容易读的调性化记谱格式。2. 转换前必须搞明白的两件事调性与时值2.1 从MIDI里判断调性很多人拿到MIDI第一步就想着“怎么导”我建议先想“是什么调”。判断调性有三种办法从省事到硬核排序。第一种看MIDI文件里有没有key signature元事件。MIDI规范里有一个专门记录调号的事件类型是FF 59后面跟着一个字节表示升降号数量正数是升号负数是降号。规范上写了DAW导出MIDI时应该把这个信息写进去。但现实是很多宿主软件、扒谱网站导出的MIDI根本没有这条事件或者一律写成C大调。所以这个方法只能作为参考不能盲信。第二种用耳朵听。把MIDI放一遍找到最后一个结束音或者整首曲子反复出现的那个稳定音那个音多半就是主音。老话说“结尾听终止感”旋律停在哪个音上最踏实哪个就是主音。这个办法最土但对单旋律特别准。第三种用算法分析。music21这个Python库内置了Krumhansl-Schmuckler调性分析算法能根据音符的分布概率推断最可能的调性。后面我会给一段可以直接跑的代码这属于半自动方案准确率在大多数流行歌曲上还不错。这里还要说一句和大小调相关的。简谱里大调写“1C”关系小调通常写成“6A”意思是把A当主音从la开始唱。判断完调性后要分清是大调还是小调否则级数会整体错位。比如一段A小调的旋律你按C大调去记谱la音就变成了do整个旋律的性质就变了。2.2 MIDI里的时值逻辑MIDI的时值不是秒也不是几分音符而是“tick”时钟刻度。每个MIDI文件头里有一个ticks_per_beat参数常见值是480和960意思是一拍拆成480或960个tick。音符的时长用开始事件的tick和结束事件的tick之差来表示。转换时你需要把tick换算成拍。“音符长度 ÷ ticks_per_beat”得到的是拍数。拍数等于1就是四分音符等于0.5就是八分音符等于2就是二分音符这个逻辑和简谱里的时值符号是一一对应的。但这里有个大坑真实演奏或编曲里录出来的MIDI时值往往不干净。音符可能提前一点进也可能拖后一点出卡在两个网格之间。直接转换的话简谱会出现一堆莫名其妙的附点和三十二分音符谱面惨不忍睹。所以在转换之前一定要做“量化”quantize把音符对齐到最近的拍子网格上。量化精度怎么选看歌曲最短的常用音符。旋律线主要以八分音符为主就量化到八分音符要是密集的十六分音符片段就量化到十六分。量化精度设成比最短音符更短的档位会保留多余的中间值设得过于宽松又会把真正的短音符合并掉。我的经验是绝大多数流行歌选八分或十六分量化档位最稳。3. 五线谱转简谱的老办法正是MIDI转换的思路3.1 调号→主音→do的位置在没有电脑的年代人手抄五线谱转简谱有一套固定流程这套流程放到MIDI转简谱上依然适用只是把“看调号”换成了“判断调性”。第一步确定主音。五线谱看调号几个升号或几个降号对应什么调有“五度循环”的口诀能推算。MIDI没有调号可看就用上一节说的三种办法确定主音。第二步确定“1”的位置。如果主音是C那么1CC音记作“1”。如果主音是G那么1GG音记作“1”D音就记作“2”以此类推。换算规则很简单先算出主音到目标音符之间的音程看它落在自然音阶的第几级。举个例子一段旋律里有E4、F#4、G4、A4。判断调性是G大调那么G是第1级A是第2级B是第3级C是第4级D是第5级E是第6级F#是第7级。所以这四个音翻译成简谱就是6、7、1、2其中E4和G4之间差了三度所以E4的“6”下面要加低音点G4的“1”不加点。第三步处理升降号。简谱里临时变音记作“#1”“b7”这样的小标记写在数字左上角。五线谱里的调号音在简谱里通常不写升降号因为已经被“1某调”消化掉了。但临时升降音必须写清楚这是很多新手容易漏的地方。3.2 节奏符号的换算五线谱的节奏和简谱的节奏是同一套数学关系只是写法不同。下面这张对照表是转换时的关键依据时值五线谱写法简谱写法全音符空心音符无符干数字加三个增时线如 1 - - -二分音符空心音符带符干数字加一个增时线如 1 -四分音符实心音符带符干单个数字如 1八分音符实心音符带一条符尾数字下方一条下划线十六分音符实心音符带两条符尾数字下方两条下划线休止符各种休止符号用 0 代替数字节奏规则相同有附点的音符简谱里同样用附点表示。连线延音线也一样跨小节的音在简谱里用弧线连起来。换气记号、反复记号在简谱里也有对应的记法和五线谱基本同构。这套老方法手工做起来很慢尤其是一首多声部的曲子。但如果你理解了这套换算逻辑再去看自动转换工具你就能明白工具帮你省了哪些事、哪些事工具其实做不了——比如装饰音怎么简化、和弦怎么取舍这些需要人来做判断。4. 实操MuseScore导入MIDI三步出简谱4.1 工具选型市面上的打谱软件我基本摸过一遍。国外主流的是MuseScore、Sibelius、Finale、Dorico国内常用的是谱谱风Jianpu、易谱、音乐梦想家。选型逻辑很简单如果你希望流程全自动导入MIDI后直接出简谱可以试易谱和音乐梦想家这类国产软件它们原生支持简谱但MIDI的导入引擎和谱面修正能力不如MuseScore。如果你要稳定性、通用性和可扩展性主推MuseScore。免费开源MIDI导入和MusicXML导入都很成熟社区还有简谱插件能实现从MIDI到简谱的相对自动化。如果你只处理单旋律扒谱也可以用一些在线转换工具但我实测下来在线工具的量化算法普遍粗糙稍微复杂一点的节奏就经常识别错。我的主力方案是MuseScore导入MIDI并整理五线谱 → 确认调性和时值 → 用简谱插件或导出MusicXML进简谱软件排版。这条路径最稳每一步都能人工把关。4.2 导入设置与量化打开MuseScore选择“文件 → 导入 → MIDI”会弹出一个导入选项窗口。这几个选项需要留意音轨选择如果MIDI里有多轨比如主旋律、钢琴伴奏、贝斯、鼓建议按轨道分开导入或者只勾选你要转简谱的那一轨。全选导入的话后续声部混杂简谱会乱成一锅粥。量化QuantizeMuseScore的导入选项里有量化精度设置默认可能是四分音符。我建议根据你手里的曲子风格手动改。抒情慢歌选八分快歌扫弦部分多选十六分。宁可先选更细的精度导入后自己手动合并时值也别选太粗导致丢音。降噪Reduce noise这个选项会忽略掉过于短促的音符针对MIDI里常见的“幽灵音符”和杂音。如果导入后发现少音优先检查是不是这个选项被勾得太狠。导入后第一件事就是听一遍。MuseScore的播放会和MIDI原文件有细微差别但整体轮廓应该对得上。如果发现音符错位、多了或少了优先做“工具 → 量化”再整理一次。4.3 调号和拍号校正这一步是转换成败的关键也是最容易被跳过的一步。MuseScore导入MIDI后默认调号经常是C大调拍号往往是4/4。如果原曲是G大调、6/8拍你不改直接导出简谱结果就是错。我的习惯是导入后先看左上角的调号和拍号再用第一节的三种方法确认主音手动拖入正确的调号。具体操作把调号面板里的调号直接拖到谱首MuseScore会询问是否移调选择“不移调”或“移调”取决于你是否要保持播放音高。这里有个细节如果你只是改调号而不移调简谱的“1”位置会变但五线谱里的音高不变。如果你选了移调五线谱音高会整体挪动。做简谱转换时正确的做法通常是“把MIDI原始音高保持住只改首调标记”也就是不改音高只改调号。这样五线谱可能看起来多变音记号但简谱标记反而对了。理解不了的话就记住简谱看的是级数不是音名。4.4 简谱插件与后续整理MuseScore本身不自带简谱排版但社区有简谱插件。装好插件后选中要转换的片段运行插件就能在谱面上显示数字化的简谱。插件的具体名称和安装路径随着MuseScore版本更新会变搜“MuseScore 简谱插件”就能找到对应版本。如果插件效果不理想或者你需要更精细的简谱排版比如加指法、加歌词、加和弦标记我建议走另一条路在MuseScore里整理好五线谱确认调性、拍号、时值、声部都没问题。导出MusicXML文件 → 导出 → MusicXML。把MusicXML导入易谱或谱谱风这类国产简谱软件。在简谱软件里调整排版、加歌词最后输出图片或PDF。这条路径多了一步但每一步都可控。MusicXML是目前乐谱互转最通用的格式MuseScore导出质量很高国产简谱软件对它的支持也比较成熟。我实际测试过这一步基本上能保留绝大部分的调号、拍号、连线、延音线和歌词位置比直接让国产软件导入MIDI靠谱得多。整体流程走完你手里就有了一份可以打印教学、可以直接照着弹的简谱。第一次做可能耗时十几分钟熟练后三五分钟就能搞定一首歌。5. 进阶用Python脚本自动转简谱5.1 基本思路打谱软件能解决80%的需求但如果你批量处理几十个MIDI文件或者想把简谱直接输出成文本、嵌入到自己的工具里那就得上脚本了。用Python处理MIDI转简谱核心思路分三步解析MIDI提取音符音高、起止tick、轨道。用调性分析算法确定主音把绝对音高换算成7个级数。把tick换算成拍数匹配简谱时值记号输出“1某调、拍号、每小节竖线”的文本格式。我用的是mido负责底层MIDI解析music21负责调性分析。这两个库都是Python生态里最成熟的音乐信息处理工具。5.2 代码实现先看第一步读MIDI基本信息import mido mid mido.MidiFile(example.mid) print(ticks_per_beat:, mid.ticks_per_beat) for i, track in enumerate(mid.tracks): print(f音轨{i}: {track.name}) for msg in track: if msg.type time_signature: print(拍号:, msg.numerator, /, msg.denominator) if msg.type key_signature: print(调号:, msg.key)这段代码能立刻告诉你MIDI里有没有写拍号和调号。大部分情况下拍号是有的调号经常缺失或为C别慌后面用music21来兜底。第二步用music21做调性分析from music21 import converter score converter.parse(example.mid) key_obj score.analyze(key) print(检测到调性:, key_obj.tonic.name, key_obj.mode)analyze(key)背后的算法会统计所有音符的时值加权分布和已知调性的典型分布做匹配返回最可能的调。对流行歌曲旋律来说这个结果通常八九不离十。如果结果明显不对就说明这个文件的和声色彩很弱或者转调太多算法被迷惑了。第三步把音符映射成简谱级数。下面是一个极简的示范只处理单声部、无转调的情况# 简谱音级映射C大调视角下的自然音阶 scale_names [C, C#, D, D#, E, F, F#, G, G#, A, A#, B] degree_map {0: 1, 2: 2, 4: 3, 5: 4, 7: 5, 9: 6, 11: 7} def midi_note_to_jianpu(midi_pitch, tonic_pc): note_pc midi_pitch % 12 semitone_diff (note_pc - tonic_pc) % 12 if semitone_diff not in degree_map: return None # 半音需要进一步处理升降号 degree degree_map[semitone_diff] octave midi_pitch // 12 - 5 # 以C4为基准 return degree, octave # 示例C大调(tonic_pc0)下MIDI的67(G4) 5高音点无 print(midi_note_to_jianpu(67, 0)) # (5, 0)这个函数只处理了自然音级遇到升降号要另外加逻辑。把半音映射到带升降的级数时我一般用semitone_diff去对比degree_map里最近的自然级再标注升或降。比如F#在C大调里是4级升高半音输出为“#4”。第四步时值转换。遍历mido音符事件用“tick差值/ticks_per_beat”得到拍数然后按拍数映射简谱符号def ticks_to_jianpu_duration(ticks, ppq): beats ticks / ppq if abs(beats - 4.0) 0.05: return 1 - - - if abs(beats - 2.0) 0.05: return 1 - if abs(beats - 1.0) 0.05: return 1 if abs(beats - 0.5) 0.05: return 1_ # 下划线示意 if abs(beats - 0.25) 0.05: return 1__ # 双下划线示意 return f1[? {beats:.2f}拍] # 异常值标出这里用abs()容差判断是因为量化不彻底时会有微小偏差直接比较会漏判。完整的脚本还会处理休止符、延音线、多小节分组和强弱拍位置但核心骨架就是上面这几段。5.3 这套脚本的局限我得坦白说脚本不是万能的。它目前最稳的场景是干净的MIDI文件比如一轨主旋律、速度和量化都规整。遇到以下情况自动脚本容易翻车多声部混在同一轨。左右手音符叠在一起脚本没法自动判断哪个是旋律、哪个是伴奏。转调频繁的曲子。调性分析是针对全曲的转调之后级数会错。复杂节奏尤其是三连音、五连音。这类时值和常规拍子不整除简谱符号也难表达通常需要改成近似时值或拆组。所以我的建议是脚本适合批量处理“干净”的MIDI出初稿最终谱面一定要经过打谱软件人工复核。两个工具配合效率和准确率都能兼顾。6. 常见问题与排查技巧实录6.1 转换出来全是最基础的C调这是最高频的问题几乎没有之一。原因很直接太多MIDI文件的调号元事件是缺失的或写成了CMuseScore导入后默认用C大调转换出的简谱自然全在C调上。排查顺序先听一遍判断主音再用music21跑一遍analyze(key)最后手动在MuseScore里修正调号。记住简谱左上角那个“1X”必须是你自己确认过的不能信任导入默认值。6.2 谱面音符对不齐时值乱七八糟大概率是量化出了问题。MIDI来源如果是人手弹录的时值不可能绝对均匀。建议在导入前用DAW或MuseScore的量化功能重新对齐。量化精度选择参考曲风流行歌音符八分居多选1/8有大量十六分律动的选1/16。量化时要注意不要对延音线中间的音符下手否则会切断连音造成后续跨小节线错位。6.3 和弦和伴奏声部混在旋律里简谱乱成麻MIDI文件经常是多音的一个时间戳上同时有多个音高。简谱本质上是单声部记谱偶有二声部你把十几个音全塞进一行没人能读。解决办法是导入前先做声部分离在DAW里把MIDI按乐器或音区拆分旋律轨单独导出一个文件。或者在MuseScore导入后用“工具 → 分离声部”之类的功能把谱面拆开。和弦部分如果非要转简谱里通常记作纵向叠置的数字但这属于高级记谱技巧新手不建议碰。我的一般原则是简谱只转主旋律和必要的副旋律伴奏部分保留在五线谱或和弦标记里。毕竟简谱的核心目的是让人快速唱出旋律而不是复现完整的管弦乐总谱。6.4 MIDI文件从哪来更靠谱很多读者问“MIDI乐谱下载网址”“MIDI库免费下载”靠不靠谱。我分享几个相对正规的渠道MuseScore官方社区大量用户上传的曲谱很多支持导出MIDI质量良莠不齐但热门曲子基本都能找到。IMSLP这种公共版权乐谱库虽然主要是PDF乐谱但古典作品居多你可以下载后自己用打谱软件转成MIDI版权风险低。自己制作用DAV电子琴输入或MIDI键盘弹录然后修量化这个最省心也不存在版权和音画不同步的困扰。网络上确实有不少免费MIDI站点但来源不明的文件里可能夹带错误音符、诡异的控制器数据甚至恶意脚本下载之前留个心眼。我见过最离谱的“免费MIDI”下载下来速度标记全是乱的播放起来忽快忽慢这种文件转出来的简谱基本不能用。6.5 一个容易被忽略的细节速度变化MIDI里如果有大量tempo事件速度变化比如Rubato风格的演奏转换出来的简谱小节长度是一致的但实际播放速度和谱面标记会对不上。简谱里没有“渐快渐慢”的精确记号只有文字提示。遇到这种情况我的做法是保留拍号和音符把速度变化写成“渐慢”“回原速”这类文字标记让演奏者自己处理。7. 几条用下来的私房经验最后分享几条我踩过坑之后总结的习惯不按条理铺开想到哪说到哪。第一转简谱之前先听三遍原曲。第一遍听调性和情绪第二遍跟着唱旋律第三遍重点盯节奏型。这不是仪式感是能在接下来处理MIDI时让你一眼发现工具转错了哪里。我就曾经因为没听直接转把一首6/8拍的歌唱成了4/4拍谱面看起来毫无问题唱起来完全不是那个味。第二所有自动转换的结果都要当草稿看待。无论是打谱软件的简谱插件还是Python脚本它们解决的是“把音高变成数字”的机械劳动但音乐里的乐句分句、呼吸记号、强弱规律机器目前还无法替你决定。转换完成后逐小节过一遍该加的连线加上该拆的小节拆开才算真正的成品。第三建议给自己维护一个“调性速查表”。把常用的调C、G、D、A、E、F、降B和它们对应的升降号、简谱“1”位置、关系小调都列成一张表贴在手边。做多了以后看到五线谱调号或者听到主音你就能条件反射地说出“1X”了。这一步熟练了MIDI转简谱的速度会成倍提升。对我来说MIDI转简谱这件事本质上是两套音乐思维之间的翻译。MIDI是精确的机器语言简谱是贴近人声和直觉的记谱方式。掌握翻译的规则比记住任何一个软件按钮的位置都重要。工具年年变规则不会变。希望这篇能帮你少走几段弯路。
返回列表