
很多人第一次看到“浅水ShallowEnd 服务器农场(Server Farm) 鼓谱”这个标题时第一反应可能是服务器农场Server Farm不是一个数据中心的概念吗它和鼓谱有什么关系但如果顺着这个线索去听原曲、去找谱、去尝试练习你会发现真正让人卡住的地方从来不是“找不到谱”而是“拿到谱后不会用”。静态鼓谱图片能看却没法变速没法循环某一小节没法把底鼓和军鼓分别单独导出来听。对初学者来说这是练习效率低下的根源对程序员来说这更像一个数据表达问题。鼓谱本质上是一组带时间坐标的节奏事件只要把它当成数据来建模就能用 MIDI、JSON、Web Audio 这些技术手段让一份普通鼓谱变成可播放、可编辑、可变速练习的“动态乐谱”。这篇文章会从一个比较特别的角度来处理这份鼓谱先讲清楚鼓谱的最基础记谱法再给出一套从原曲扒谱的完整流程然后分别用 MIDI、JSON、Web Audio API 把它数字化最后落到练习方法和常见问题排查。全程不需要深厚的乐理基础只要能看懂最简单的鼓谱符号再有一点 Python 和 JavaScript 经验就能在本地完整跑通。1. 为什么一份鼓谱值得用技术手段重新处理如果只看表面鼓谱就是一张写着打击乐节奏的纸。但真正开始练的时候大家都会遇到几个很现实的问题。第一速度适应问题。原曲如果很快初学者直接跟着原速打一定会乱。正确的做法是从慢速开始比如原速的 65%、75%再逐步逼近 100%。但静态图片做不到这件事你需要自己一边数拍子一边往慢了弹节奏稍微一乱前面的努力就白费。如果鼓谱是数据那么变速只是一个参数而已BPM 从 80 改成 100整段谱子的时间轴会自动重新计算。第二循环练习问题。副歌那两小节如果是难点你需要把那两小节单独摘出来反复打 50 遍。纸上的谱子没法做“选中某两小节循环播放”但做成数据之后循环是一个天然的功能甚至可以把底鼓音轨静音只保留军鼓和踩镲专门练手脚配合。第三可视化问题。鼓谱的五线谱记谱法对新手来说并不算特别直观尤其是底鼓、军鼓、踩镲在五线谱上的位置需要反复记忆。如果把鼓谱变成网页里的动态播放器音符走到哪、当前该打哪个鼓一眼就能看出来。这种“跟着亮灯打鼓”的方式确实能降低初学门槛。从这些角度看数字化的价值就不是“花哨”而是实实在在地改变了练习方式。这也正是“浅水ShallowEnd 服务器农场(Server Farm) 鼓谱”这个主题值得用技术文章来处理的原因它表面上是音乐内容底子里其实是数据建模、格式转换和音频播放的工程问题。CSDN 的读者不一定都会打鼓但一定都接触过 JSON、MIDI 和 Web Audio把架子鼓乐谱映射到这套技术栈上是一次很有意思的跨界练习。1.1 这份鼓谱适合谁我认为有三类人最应该往下读。一类是正在学架子鼓、又缺一份电子化练习谱的人。你不用真的懂 MIDI 细节只需要按文章步骤把 MIDI 文件导进鼓机软件或者 DAW就能获得一份可变速的电子鼓谱。另一类是熟悉编程、但对音乐数据处理感兴趣的开发者。你可能会惊讶地发现一首歌的节奏部分用 JSON 建模后和一份业务数据结构没有本质区别同样需要定义字段、处理事件排序、考虑时值精度。还有一类是正在做音乐类小工具、音游或者交互式教学产品的开发者。文章里的 Web Audio 鼓机虽然只是一个最小实现但已经构成了一个可扩展的“节奏播放引擎”雏形换成真实采样之后完全可以继续做成谱面编辑器。1.2 从“服务器农场”到节奏意象再聊一个稍显感性的角度。服务器农场Server Farm这个词指的是成百上千台服务器集中部署、协同计算的数据中心集群。机器之间有心跳检测、有负载均衡、有任务调度整个机房是持续在“运转”的。而鼓组恰好也是乐队里负责稳定运转的“基础设施”底鼓给重音军鼓给反拍踩镲维持节拍骨架听起来确实和机房里的脉冲信号有几分意象上的共通。这个联想不是严谨的乐理分析但它能帮助我们在扒谱时建立一种感觉这份谱子的节奏型很可能是稳定、密集、持续前进的而不是松散随意的。当然具体风格和速度以原曲为准扒谱时还是要靠耳朵和工具来验证。2. 鼓谱基础打击乐记谱法快速入门在开始扒谱或者写代码之前先补一下鼓谱的入门知识。鼓谱用的不是吉他的六线谱而是打击乐记谱法本质上是在五线谱的基础上给每个鼓件分配了固定的线间位置。2.1 一套基础鼓组有哪些成员现代架子鼓通常包含底鼓Kick、军鼓Snare、踩镲Hi-Hat、节奏嗵鼓Tom Tom常见有高音嗵、中音嗵、落地嗵以及叮叮镲Ride和碎音镲Crash。在一首歌里底鼓负责节奏重音军鼓通常在第二拍和第四拍踩镲负责高频时的时值划分嗵鼓和镲片用来做加花过渡。写程序的时候我们一般不会直接写鼓的英文名而是用 GM 标准里的 MIDI 音符编号。比如 36 是底鼓38 是军鼓42 是闭踩镲46 是开踩镲。这套编号是后面把鼓谱转成 MIDI 的桥梁非常重要。2.2 鼓谱上的位置对应关系下面是架子鼓在五线谱上的常见位置对照也一并附上 GM MIDI 音符编号方便后面编程时查阅。鼓件/镲片五线谱位置说明GM MIDI 音符底鼓 Kick第一间下加一线附近声音低沉常见于正拍36军鼓 Snare第三间声音清脆通常在第2、4拍38闭踩镲 Closed Hi-Hat第五线上方短促的“呲”声42开踩镲 Open Hi-Hat第五线上方带圈持续更长常用于强拍46高音嗵 High Tom第二间音高较高50中音嗵 Mid Tom第二线音高中等48落地嗵 Floor Tom第一间音高较低41碎音镲 Crash上加一线强音开场或段落标记49叮叮镲 Ride上加一间持续节奏“叮叮”声51需要注意的是不同记谱软件和乐谱出版方会对位置有细微差异比如有的把底鼓记在下加一间有的记在下加一线。但大体规律一致低音鼓在五线谱下方高音乐器在上方。看到谱子时先确认图例不要只看一个位置就下结论。2.3 时值、小节和重复记号鼓谱的时值和其他乐谱一样全音符、二分音符、四分音符、八分音符、十六分音符。架子鼓练习里最常见的组合是八分音符踩镲底鼓军鼓配合也就是我们常说的“动次打次”节奏底鼓在正拍军鼓在反拍踩镲均匀划分拍子。小节用竖线分开通常 4/4 拍意味着一小节四拍。谱面上如果有带两点的小节线它表示重复记号意思是把前面这对小节再打一遍。扒谱时遇到这种结构可以直接用“A 段重复两次”来建模省得在数据里重复展开两份完全一样的 JSON。3. 从原曲到鼓谱扒谱前的分析与准备拿到《服务器农场(Server Farm)》原曲后不要急着找谱。先做一次完整的“听感分析”这能帮你建立结构地图后面扒谱会快很多。3.1 听歌的目标不是“感觉”而是“结构”普通听众听歌关注的是好不好听扒谱的人听歌关注的是结构。第一遍完整听的时候可以做这几件事数段。前奏大概多少秒主歌多少秒副歌多少秒间奏从哪里开始标重音。哪个位置有明显的底鼓重音哪个位置军鼓特别突出找变化。哪一段踩镲从闭镲变成了开镲哪一段变成了嗵鼓加花。不用一次全部做完先记录大概时间点。比如“00:00-00:12 前奏鼓组弱”“00:12 进主歌底鼓开始稳定输出”“00:35 进入副歌镲片变亮”。这些文字记录后面会转换成鼓谱的段落标记。3.2 确定拍号和 BPM拍号一般从听感上就能判断。绝大多数流行、摇滚、电子风格歌曲是 4/4 拍也就是一小节四拍每拍是四分音符。少数歌是 3/4 拍或者 6/8 拍但只要不是爵士华尔兹这种特殊风格先按 4/4 处理通常没问题。BPM 的检测可以用节拍器 App、DAW 里的 Tap Tempo 功能或者 Python 的 librosa 库做节拍追踪。手动测的话在 20 秒内连续点击节拍器对应正拍次数乘以 3大概就是每分钟拍数。建议多测几次取平均值因为手点有误差。有了 BPM 和拍号鼓谱的时间基准就确定了。MIDI 和 JSON 里的时间都能换算成拍和 tick后面的数字化就有了统一刻度。3.3 段落划分与主 Loop 识别扒谱最忌从头到尾一个音一个音地死磕。正确做法是先找“主 Loop”也就是整首歌里反复出现的基本节奏型。通常在主歌部分会有一个稳定循环的鼓节奏比如底鼓规律分布在正拍军鼓固定在第 2、4 拍踩镲八分音符均匀分布。主 Loop 确定后其他段落都可以理解成“主 Loop 的变体”副歌可能加了开镲桥段可能突然抽掉底鼓只留军鼓和镲片前奏可能只有踩镲。扒谱时先把主 Loop 记下来再针对每个段落记录“加了什么、减了什么、哪里换了”效率会高得多。4. 扒谱核心流程从音频到乐谱的六步法这一节把扒谱动作拆成六个可直接执行的步骤。不管你是手写记录、用 Guitar Pro 还是直接用代码建模流程都是一样的。4.1 工具准备耳机封闭式头戴耳机优先能比音箱更清楚地听到低频底鼓。DAW 或音频播放器支持慢放和 A-B 循环。Audacity 免费且跨平台Reaper 有全功能试用版都够用。节拍器手机 App 即可。记谱工具Guitar Pro、MuseScore甚至纸质五线谱都可以。这一步不需要一次性装很多软件关键是掌握“慢放”和“区域循环”两个操作。很多扒谱困难根源是音频放太快人耳来不及分辨底鼓和贝斯的重叠频段。4.2 六步扒谱法第一步听全曲定骨架。确定 BPM、拍号、段落数量和各段落起止时间。第二步扒主 Loop。选一个鼓组最稳定的段落把它当成模板。先听踩镲确认是四分音符还是八分音符再听军鼓通常锁定第 2、4 拍最后补底鼓听它落在第几拍、有没有切分。第三步处理段落变体。副歌、桥段、间奏分别和主 Loop 对比记录差异。差异通常集中在底鼓密度、踩镲开闭、加花位置三个维度。第四步标记加花。鼓手在两段之间经常用嗵鼓和镲片做连接这些是扒谱最容易漏的部分。把音频速度降到 70%反复循环加花前后的两三个小节一个音一个音地辨听。第五步验证过渡段。把相邻段落接在一起播放确认换段位置的鼓点是否顺畅有没有遗漏的 Crash 或小军鼓装饰音。第六步回放和修正。把扒好的谱子在鼓机软件里按原速回放与原曲叠轨播放。如果听起来有明显差异定位到具体小节的某个鼓件对照音频反复修正。4.3 关于扒谱的版权边界自己扒谱用于个人练习、学习是没问题的但把完整扒谱公开发布、销售或者声称这是官方谱就可能涉及版权问题。更稳妥的做法是只做私人练习谱不上传未经授权的原曲音频如果要公开发布教学尽量只展示自己的练习片段不完整传播原曲如果追求完全合规可以直接寻找官方出版的谱本或使用获得了授权的谱源。这篇文章里的所有方法都是为了帮助读者建立自己的练习工具而不是鼓励传播盗版谱。5. 鼓谱数字化用 MIDI、JSON 与浏览器播放扒谱完成后你会得到一份文字或纸质谱。接下来要做的是把它转成程序能处理的数据结构。这一步是整个流程最“程序员友好”的地方。5.1 用 MIDI 表示节奏数据MIDI 不是音频文件它记录的是一串“事件”。比如“在第 0 拍启动音符 36力度 100”。文件体积小和 DAW、鼓机软件的兼容性也最好。GM 标准把第 10 通道固定给打击乐不同鼓件对应不同音符编号我们在第 2 章已经列过常用映射。生成 MIDI 文件最简单的方式是用 Python 的 mido 库# 文件路径midi_drum.py import mido from mido import Message, MidiFile, MidiTrack # 创建 MIDI 文件默认每拍 480 tick mid MidiFile() track MidiTrack() mid.tracks.append(track) # 设置 120 BPM tempo mido.bpm2tempo(120) track.append(Message(set_tempo, tempotempo, time0)) # GM 打击乐在通道 10mido 中从 0 开始计数所以 channel9 # 36底鼓38军鼓42闭踩镲 # 这是一个简单的演示节奏不代表原曲鼓谱 drum_events [ (0, 36, 100), # 第 0 拍底鼓 (0, 42, 90), # 第 0 拍踩镲 (240, 38, 100), # 第 1 拍军鼓 (240, 42, 90), # 第 1 拍踩镲 (480, 36, 100), # 第 2 拍底鼓 (480, 42, 90), # 第 2 拍踩镲 (720, 38, 100), # 第 3 拍军鼓 (720, 42, 90), # 第 3 拍踩镲 ] # 事件按时间顺序写入使用相对 tick for tick, note, velocity in drum_events: track.append(Message(note_on, notenote, velocityvelocity, timetick, channel9)) track.append(Message(note_off, notenote, velocity0, time20, channel9)) mid.save(demo_drum.mid) print(已生成 demo_drum.mid)这段代码生成的是一个最简单的一小节 4/4 拍“底鼓军鼓踩镲”律动用来演示 MIDI 鼓轨的创建过程。在真实使用中你应该用自己扒出来的鼓点数据替换drum_events。运行前先安装依赖pip install mido python midi_drum.py生成后用支持 MIDI 的播放器、DAW 或在线工具打开demo_drum.mid就能听到基本节奏。如果你听到的和原曲对不上这是正常的因为这里只是为了说明 MIDI 数据如何组织。5.2 用 JSON 描述鼓谱结构MIDI 适合机器播放但不方便人类阅读和编辑。JSON 更适合作为“源文件”来管理鼓谱。我们可以设计一个包含标题、BPM、拍号和小节事件的 JSON 结构。{ title: Server Farm Demo Loop, bpm: 120, beats_per_bar: 4, ticks_per_beat: 480, bars: [ { bar: 1, drumEvents: [ { position: 0, note: 36, velocity: 110 }, { position: 0, note: 42, velocity: 80 }, { position: 240, note: 38, velocity: 100 }, { position: 240, note: 42, velocity: 80 }, { position: 480, note: 36, velocity: 110 }, { position: 480, note: 42, velocity: 80 }, { position: 720, note: 38, velocity: 100 }, { position: 720, note: 42, velocity: 80 } ] } ] }这里的position单位是 tick480 表示一拍。每一小节内部从 0 开始不跨小节累计时间。这样做的好处是修改某一小节时不需要重新计算前面所有小节的时间程序可以把“小节序号 × 每小节 tick 数”作为该小节的绝对起点。这个 JSON 文件就是鼓谱的数字源文件可以纳入 Git 版本管理方便和队友协作也可以根据它派生 MIDI、可视化页面或者练习题。5.3 JSON 转 MIDI 的 Python 脚本有了 JSON就可以写一个通用脚本把 JSON 鼓谱转成 MIDI。这样你以后不管扒多少首曲子只要维护同一份 JSON 结构就能生成可播放文件。# 文件路径json_to_midi.py import json import mido from mido import Message, MidiFile, MidiTrack def json_to_midi(json_path, midi_path): with open(json_path, encodingutf-8) as f: sheet json.load(f) ticks_per_beat sheet.get(ticks_per_beat, 480) beats_per_bar sheet.get(beats_per_bar, 4) bpm sheet.get(bpm, 120) mid MidiFile(ticks_per_beatticks_per_beat) track MidiTrack() mid.tracks.append(track) track.append(Message(set_tempo, tempomido.bpm2tempo(bpm), time0)) # 把每个小节内的事件转成全局绝对 tick events [] for bar in sheet[bars]: bar_index bar[bar] - 1 bar_start bar_index * beats_per_bar * ticks_per_beat for ev in bar[drumEvents]: events.append(( bar_start ev[position], ev[note], ev[velocity] )) events.sort(keylambda x: x[0]) last_tick 0 for tick, note, velocity in events: delta tick - last_tick last_tick tick track.append(Message(note_on, notenote, velocityvelocity, timedelta, channel9)) track.append(Message(note_off, notenote, velocity0, time20, channel9)) mid.save(midi_path) print(f已生成 {midi_path}) if __name__ __main__: json_to_midi(server_farm_demo.json, server_farm_demo.mid)把上一节的 JSON 保存为server_farm_demo.json然后运行python json_to_midi.py脚本会生成server_farm_demo.mid。你可以用 DAW 打开这个文件修改乐器音色、调整 BPM或者把这段节奏导出成音频。这里的核心思路是JSON 负责“表达”MIDI 负责“播放”两者通过一个简单的转换脚本连接。以后如果在网页端做记录也可以直接用浏览器读取 JSON不必依赖本地 Python。5.4 在浏览器里播放鼓谱MIDI 播放依赖本地软件如果想做一个纯网页鼓谱可以直接用 Web Audio API。它不依赖任何插件Chrome、Edge、Firefox 都支持。下面是一个最简单的鼓机页面。!DOCTYPE html html langzh-CN head meta charsetUTF-8 title鼓谱播放器 Demo/title /head body button idplayBtn播放示例节奏/button script // 36: 底鼓38: 军鼓42: 闭踩镲 let audioCtx null; function ensureAudioContext() { if (!audioCtx) { audioCtx new (window.AudioContext || window.webkitAudioContext)(); } return audioCtx; } function playDrum(note, when) { const ctx ensureAudioContext(); const osc ctx.createOscillator(); const gain ctx.createGain(); let freq, duration; if (note 36) { freq 55; duration 0.25; } else if (note 38) { freq 180; duration 0.2; } else { freq 800; duration 0.1; } osc.frequency.setValueAtTime(freq, when); gain.gain.setValueAtTime(0.6, when); gain.gain.exponentialRampToValueAtTime(0.001, when duration); osc.connect(gain); gain.connect(ctx.destination); osc.start(when); osc.stop(when duration); } document.getElementById(playBtn).addEventListener(click, () { const ctx ensureAudioContext(); if (ctx.state suspended) { ctx.resume(); } const bpm 120; const beat 60 / bpm; const startTime ctx.currentTime 0.1; for (let i 0; i 8; i) { const t startTime i * beat; if (i % 2 0) { playDrum(36, t); } else { playDrum(38, t); } playDrum(42, t); } }); /script /body /html把上面代码保存为drum_player.html直接双击用浏览器打开点击“播放示例节奏”就能听到一个 8 拍的基础节奏。这个实现里没有使用任何音频采样文件而是用振荡器近似模拟鼓声音色当然不如真实鼓组但用于验证 JSON 鼓谱事件、做节奏预览已经足够。如果想用真实鼓声只需要把playDrum改成加载短音频文件比如kick.wav、snare.wav、hat.wav用AudioBufferSourceNode播放对应采样。这样网页端播 JSON 鼓谱的能力就完整了。6. 练习方法变速、循环、分段与录音回听数字化鼓谱只是一个工具最终目标还是把节奏打稳。这一节讲的是如何利用前面做好的 MIDI/JSON 文件进行高效练习。6.1 变速练习把鼓谱放进支持变速的软件里初始速度建议设为目标速度的 65% 到 75%。如果原曲是 120 BPM就先从 80 BPM 左右开始。标准是在某个速度下连续打三遍不出错才提速 5%。不要一上来就原速动作变形之后再纠正要花更多时间。变速练习的最终目的不是“能跟上 MIDI”而是“在任何速度下肌肉记忆都稳定”。6.2 分段拆解与循环把整首歌拆成几段每段单独建一个练习文件。比如前奏两小节、主歌四小节、副歌四小节、加花两小节。先练主 Loop它是最常用的节奏型。然后练段落切换处的两到四小节过渡因为这里的鼓点变化最容易卡壳。在 DAW 里开启 A-B 循环把循环区域设为一个难点片段连续循环 30 遍。每 10 遍停下来回想一下底鼓是不是踩在正拍军鼓有没有拖拍踩镲的力度是否均匀不要盲目重复要带着问题循环。6.3 录音回听与节奏校准练习时录下自己的演奏不用专业录音设备手机放在鼓组前方两米左右即可。回听时重点检查三点底鼓和军鼓是否和节拍器严格重合可以看波形或者凭听感判断加花位置的鼓点和后面正拍之间的间隔是不是稳定踩镲的长短是否一致有没有在闭镲位置上出现意外开镲。录音回听还有一个额外好处能发现自己“以为打对了但实际上抢拍”的问题。很多鼓手跟节拍器练习时感觉良好一录音就能听出问题。建议每次练习后保留录音文件对比一周内的进步情况。7. 常见问题与排查思路问题现象可能原因排查方式解决方案扒谱时听不清底鼓贝斯和底鼓频段重叠或耳机低频响应差用耳机听在 DAW 里对音频做低通滤波降低原曲速度反复循环正拍位置必要时看频谱图辨认低频能量MIDI 文件没有鼓声播放器没用对通道或鼓轨被静音检查 MIDI 通道是否为第 10 通道在 DAW 中新建打击乐轨道导入确认通道为 10Web Audio 页面点击没声音浏览器自动播放策略限制打开开发者工具 Console 看报错必须先点击按钮初始化 AudioContext确认代码有resume()打击乐音高不对使用了错误音符编号对照 GM 映射表检查 note 值36 底鼓、38 军鼓、42 闭镲不要搞混JSON 转 MIDI 后节奏错乱事件时间排序错误或小节起点计算有误打印转换前后的事件列表确认事件按绝对 tick 排序且小节从 0 开始累加变速练习没效果速度提升过快或练习时间太短记录每天的速度和正确率按“连续三遍不出错才提速”原则每次最多提 5 BPM循环练习总是断在段落切换处对过门加花不熟切换位置意识不够单独循环切换前一小节和切换后一小节重点慢练过门把加花和下一段正拍的位置关系背下来排查时第一原则是“先确认工具链路再怀疑耳朵”。如果数字化鼓谱没有声音先检查数据格式和通道如果扒谱扒不准先确认监听设备和播放速度而不是反复折磨自己的听力。8. 最佳实践与工程建议最后补充一些在实际项目、日常练习和团队协作中容易踩坑的地方。8.1 文件组织与版本管理鼓谱一旦数字化就是代码工程的一部分。建议为每首歌建立统一目录server-farm/ ├── audio/ │ └── original.mp3 # 原曲仅个人练习使用 ├── sheet/ │ └── server_farm.json # 鼓谱源文件 ├── midi/ │ └── server_farm.mid # 生成的 MIDI 文件 └── scripts/ ├── json_to_midi.py # 转换脚本 └── server_farm_demo.json # JSON 数据这样无论是个人积累还是多人协作都能快速定位文件。JSON 纳入 Git 版本管理后每次改谱都能回滚比反复另存为final_v2.mid可靠得多。8.2 鼓谱格式选择从工程角度看鼓谱有几种不同格式MIDI 适合交换和播放但可读性差MusicXML 适合与专业记谱软件互通但结构更复杂JSON 适合自定义工具链和网页展示扩展性强Guitar Pro 格式在乐队圈普及但是二进制格式不方便版本对比。如果你的目标是做工具建议用 JSON 作为中间格式按需导出 MIDI 或 MusicXML。如果只是为了记录直接用 Guitar Pro 也未尝不可但要注意保存一份可导出的中间格式。8.3 关于采样、安全和分享边界播放鼓谱时如果用了真实采样要确认采样素材是否有使用授权。免费采样也需要看清许可协议不能默认“网上能下载就能用于视频或商业制作”。公开发布完整扒谱、原曲音频都存在版权风险。最安全的方式是个人练习用本地文件教学展示只做节奏分析不传播原曲本身。另外涉及音频处理和浏览器音频接口时要遵循浏览器权限策略必须由用户主动点击或交互后才能创建AudioContext。把这种情况处理成“无障碍降级”而不是“报错”产品体验会更稳。8.4 从鼓谱工程到更完整的软件如果想把这里的最小实现扩展成完整产品可以考虑三条路径。第一把 JSON 鼓谱编辑器做成可视化网页支持点击增删鼓点、拖拽调整力度第二把 Web Audio 播放器升级为采样播放器并为每个鼓件配置独立的音量、声像和通道第三加入音频对齐功能让鼓谱和原曲按时间轴同步播放自动滚动高亮当前音符。这些方向每一个都能成为独立的练习工具也都值得投入时间。这篇文字从“浅水ShallowEnd 服务器农场(Server Farm) 鼓谱”这个具体主题出发最后落到了数据建模、格式转换、Web 音频编程和练习方法论上。希望你在拿到任何一份鼓谱时都能不只看到纸面节奏还能想到如何把它变成自己可以掌握和操控的数据资产。下一步你可以先把示例代码跑通再把自己正在练的鼓谱整理成 JSON慢慢搭建一套属于自己的鼓谱工作流。