资讯动态

Strudel REPL 上手:浏览器 Live Coding 音乐实操指南

发布时间:2026/10/26 18:32:26 来源:尧图企业网站定制
做现场编程Live Coding音乐这件事最劝退新手的往往不是乐理而是工具链装环境、配音频驱动、编译工程一套流程下来灵感早没了。Strudel REPL 把这一整套压缩成了一个网页打开浏览器敲几行代码按一下快捷键声音就出来了。这篇文章围绕 Strudel REPL 的上手体验展开结合视频教程里常见的演示节奏整理成一份可以直接照着敲的实操笔记。不管你是完全没接触过音乐制作的后端开发还是已经会用 Tidal Cycles、Sonic Pi想找一个更轻量的练手环境下面这套从语法到完整作品的流程都可以直接复用。读完之后你应该能独立写出一个带鼓组、贝斯、和声、旋律和空间效果的循环段落并且知道循环跑不起来、没有声音、节奏对不齐时该从哪里排查。1. 用代码写音乐Strudel REPL 到底解决了什么问题1.1 从 Live Coding 说起Live Coding现场编程是一种把写代码本身当成表演形式的音乐创作方式。表演者面对投影的大屏幕一边敲代码一边改声音观众看到的是字符在跳动听到的是节奏在变化。它和传统 DAW数字音频工作站的思路完全不同DAW 里你拖一个鼓点循环界面上是一条条音轨Live Coding 里你写的是描述这一段时间内事件如何分布的表达式声音是表达式求值的结果。这个差异听起来抽象落到实际使用中区别很大。DAW 适合精雕细琢一个 4 小节的段落可以磨一下午Live Coding 适合快速试错和即兴改动一行代码就能立刻听到变化不满意就改回来整个过程不需要停下来重新导出。Strudel 就是这条路线在浏览器里的一个实现。1.2 Strudel 与 Tidal Cycles 的关系理解 Strudel 最快的方式是把它当成 Tidal Cycles 的浏览器版本。Tidal Cycles 是一套运行在 Haskell 环境里的 Live Coding 音乐库语法以精简著称社区积累了大量作品和演出实践。但 Haskell 的门槛摆在那里光是装 GHC、配 SuperDirt、配 SuperCollider就能劝退一多半想尝试的人。Strudel 换了一条路它用 JavaScript 重新实现了 Tidal 的核心模式Pattern模型把音频渲染交给浏览器的 Web Audio API于是安装这个步骤直接消失了。你在编辑器里写的是 JavaScript 风格的函数调用表达节奏用的是 Tidal 的 mini-notation两者拼在一起写起来像这样s(bd sd hh cp)这行的含义是在当前一个循环cycle里依次触发底鼓bd、军鼓sd、闭镲hh、拍手cp四个采样。四个采样平均分配这个循环的时间这就是 Strudel 里最基本的节奏概念。这里要特别注意循环cycle这个词。在 Strudel 里一个 cycle 不是固定几拍而是一个抽象的时间单位。一个 cycle 里面塞几个事件完全由你写的模式决定。想让它听起来像 4/4 的一个小节就靠速度设置来对齐这一点后面会详细讲。1.3 什么样的场景适合用 StrudelStrudel 的优势场景很明确。第一是教学和演示它没有任何安装成本把链接发给别人就能一起玩。第二是快速验证想法比如你想试试三连音底鼓配半速军鼓是什么感觉敲两行就有答案不用在 DAW 里找半天。第三是生成式的段落铺底Strudel 的随机和欧几里得节奏函数很适合做出那种一直在变但又在一个调上的循环。它不适合的场景也要说清楚。需要精细混音、需要多轨自动化曲线、需要处理人声录音的项目还是应该回到 DAW。Strudel 的定位是想法发生器和现场表演工具不是完整的音乐制作套件。把定位搞清楚用起来才不会拧巴。2. 环境准备与界面速览2.1 运行环境要求Strudel 的运行环境要求很低一个现代浏览器就够。推荐使用较新版本的 Chrome、Edge 或 FirefoxSafari 也能跑但部分音频特性在旧版本上表现可能不一致。操作系统不限Windows、macOS、Linux 都行平板上的浏览器也能勉强用只是敲代码体验会差很多。硬件方面能出声的耳机或音箱是必须的。如果要认真玩建议戴耳机因为 Strudel 的很多效果尤其是pan、jux这类左右声道分离的函数在外放时听不出来。如果手上有 MIDI 键盘新版 Strudel 支持 MIDI 输入输出但这属于进阶内容本文不展开。关于版本Strudel 目前仍在快速迭代中函数名和参数在不同时期可能有调整比如早期常见的是sound()后来s()成了更常用的简写两者在多数版本里都可用。本文示例以当前比较通行的写法为准如果你在页面上执行时报函数不存在优先去页面自带的示例库和音色面板里对照一下当前版本的正确写法而不是怀疑自己的逻辑。2.2 界面分区与快捷键打开 Strudel 的 REPL 页面后界面大致可以分成几个区域理解每个区域的作用能少走很多弯路。左侧或主区域是代码编辑器用来写模式代码。代码是分块评估的一个块通常以$:开头或者以空行分隔。右侧一般是侧边栏提供音色与采样列表、示例曲目、音阶与和弦参考、函数速查。侧边栏在实际使用中非常关键因为你不可能记住所有采样名直接在侧边栏搜索bd、hh这类关键词点一下就能把名字插进去。快捷键是最需要先记住的部分。常用的几个快捷键作用Ctrl Enter执行编辑器里的代码按块评估Ctrl . 句号立刻停止所有正在播放的声音Ctrl Shift Enter只执行当前选中的代码块不同版本的快捷键可能略有差异页面右下角或帮助面板里通常会给出当前版本的准确提示第一次用的时候花十秒看一眼比后面反复试错划算。2.3 第一次出声三行代码新建一个空白编辑器把下面三行敲进去然后按 Ctrl Enters(bd sd hh cp)如果听到咚、哒、次、啪四声依次响起并且自动循环说明音频链路已经正常。如果没有任何声音最常见的两个原因是浏览器拦截了自动播放需要你点一下页面上的播放按钮或者做一次点击操作以及系统音量或者浏览器标签页被静音了。这两种情况都不涉及代码问题先确认这两点再往下走。接着我们加一点变化感受一下改一行就变声的即时反馈s(bd sd hh cp).gain(0.9 0.6 0.5 0.7)gain控制音量这里的参数不是单个数而是一个和主模式等长的模式于是四个采样分别用了不同的音量。这是 Strudel 里非常重要的一个思维习惯几乎所有的参数都可以是模式不只是一个固定值。你写0.8是恒定音量写0.9 0.6 0.5 0.7就是四个事件各自不同的音量写0.5 1就是每两个循环交替一次音量。这个特性贯穿整个 Strudel后面所有的效果器都遵循同样的规则。3. Mini-notationStrudel 的节奏书写语言mini-notation 是 Tidal 家族最有辨识度的部分也是新手最容易卡住的地方。它的核心思想是用一套极简的符号描述一个循环里的事件怎么分布。学会它写节奏的速度会比点钢琴卷帘快得多。3.1 序列、休止与空格最基本的写法就是空格分隔的序列每个元素平分当前循环的时间s(bd sd hh cp)四个元素各占四分之一循环。想跳过某一拍用~表示休止s(bd ~ sd ~)这时候bd占第一和第三格的位置sd占第三格第二和第四格是静音。注意休止符也占位置它不会让后面的元素往前挤这是理解 mini-notation 的关键。很多人第一次写错节奏就是以为空着不写就等于休止实际上空着不写只会让前面那个元素变长必须显式写~。想重复同一个元素用*s(bd*4)bd*4等效于bd bd bd bd但写起来短得多。想要某几个音更快、其余不变把*用在小括号或者方括号里s(hh*8 bd sd)这行的意思是前半部分塞 8 个 hi-hat后半部分是两个鼓。注意这里hh*8整体占一半的循环时间剩下的一半被bd和sd平分。这种局部加密在写鼓组的时候用得特别多。3.2 方括号、尖括号与步进方括号[ ]表示一个子序列它整体被当作一个元素参与外层的时间分配s(bd [sd sd] hh cp)外层四个元素第二个元素是一个内部有两个sd的小组所以它会在一格的时间里触发两次。方括号可以嵌套[[bd bd] [sd sd]]这种写法在复杂鼓组里很常见。尖括号 表示每个循环切换一次的交替序列s(bd sd hh cp)第一个位置在第 1 个循环是bd第 2 个循环变成sd第 3 个循环又回到bd。这个符号是做长段落变化的利器因为它不需要写任何条件判断就能让某条轨道每几个小节自动变一次。/表示放慢bd/2意味着这个bd用两倍的时间间隔触发也就是跨两个循环才响一次。!是复制bd!3等于连续写三遍bd。是加权bd3 sd表示底鼓占这个循环的四分之三军鼓占四分之一。这几个符号组合起来几乎能表达所有常见的节奏型。3.3 随机与不确定性Live Coding 的趣味很大一部分来自受控的随机。mini-notation 里用?表示这个元素有一半概率被丢弃s(hh*8?).gain(0.6)八个 hi-hat 里平均丢掉一半听起来就有自然的疏密感。想要控制概率可以写hh*8?0.3表示 30% 的概率保留。这个写法在生成式节奏里非常好用因为它每次循环的结果都不一样但整体密度是稳定的。还有一个,符号表示在同一个时间点上叠加多个模式s(bd*4, hh*8)逗号两边的内容同时播放各自的时长独立计算。这实际上是一种在一行里写两轨的写法后面讲多轨的时候会再遇到它。4. 声音来源采样、合成器、音符与和弦知道了怎么写节奏下一步是搞清楚声音从哪来。Strudel 的声源大致分三类内置采样、合成波形、音符与和弦系统。这三类可以混用也是做出有层次的作品的基础。4.1 鼓组采样与 banks()函数最常用的场景就是触发采样。Strudel 默认预加载了一套鼓组采样常见的缩写有缩写含义bd底鼓bass drum / kicksd军鼓snare drumhh闭镲closed hi-hatoh开镲open hi-hatcp拍手claprim边击rimshotlt / mt / ht低/中/高嗵鼓cr / rd吊镲 / 军鼓滚奏不同采样库的命名不完全一致用之前最好在侧边栏搜一下确认。切换整套鼓组的音色用bank()s(bd sd hh oh).bank(RolandTR909)bank的效果依赖对应的采样库是否已加载。有些 bank 在默认环境里就有有些需要先通过samples()加载外部采样包。如果你写了bank之后听起来和没写一样或者直接没有声音先去侧边栏的采样列表里确认这套鼓是否存在而不是反复改代码。外部采样的加载写法大致是samples(github:tidalcycles/dirt-samples)这行会从网络拉取采样包第一次加载需要等几秒加载完成后才能用里面包含的音色。由于网络环境差异这一步偶尔会慢或者失败遇到这种情况可以先用内置采样把想法写完最后再统一换音色。4.2 合成波形除了采样Strudel 可以直接用振荡器发声。把s()的参数换成波形名就行s(sawtooth).note(c3 e3 g3 b3)常见的波形名包括sine正弦音色纯净、triangle三角柔和、sawtooth锯齿明亮厚实、square方波偏复古游戏音、white白噪声、pink粉红噪声、brown布朗噪声。噪声类在做打击乐质感、风声、扫频效果时特别有用。这里的写法和采样不同波形需要配合音高才有意义。只写s(sawtooth)会得到一个固定频率的持续音加上.note()之后才变成旋律。这是新手常见的困惑点——为什么我写了 sawtooth 但听起来只有一个嗡嗡声答案就是缺了音高信息。4.3 音符、音阶与和弦音高有两种表达方式绝对音名和相对音级。绝对音名用note()note(c3 e3 g3 b3).s(triangle)小写字母表示音名数字表示八度c4是中央 C 附近。升号用#比如c#4降号可以用eb4这种写法。这套记法和大多数音乐软件一致不需要额外记忆。相对音级用n()配合.scale()n(0 2 4 7).scale(C:major).s(sawtooth)这里的0 2 4 7是音阶内的索引C:major指定了音阶。这样写的好处是换调特别方便——把C:major改成D:minor整段旋律立刻换调不需要逐个改音名。写生成式音乐时这一点非常重要因为你经常需要在不同调性之间快速试听。和弦用chord()加.voicing()chord(Cmaj7 Am7 Dm7 G7).voicing().s(sawtooth)voicing()会把和弦符号转换成一组具体的音符排列让和弦连接听起来更自然避免声部大幅跳动。这是 Strudel 相对其他 Live Coding 环境比较方便的一点写和声进行不需要手动算出每个音。5. 完整实战写一段 8 小节的循环前面都是零件这一节把它们组装成一个能循环听的作品。我们做一个中等速度、带一点氛围感的段落风格接近 downtempo / lo-fi。整个流程分五步每一步都可以单独执行试听。5.1 第一步定速度与节奏骨架先设速度。setcpm()设置的是每分钟多少个循环如果希望一个循环等于一个 4/4 小节那么 120 BPM 对应的就是 30 cpmsetcpm(120/4)这行的算术含义值得解释一下120 BPM 是每分钟 120 拍4/4 拍下一个小节是 4 拍所以每分钟 30 个小节也就是 30 个循环。写成120/4而不是直接写30好处是以后想改 BPM只改前一个数字就行可读性也更好。接着写鼓组。底鼓用四踩军鼓落在二四拍hi-hat 用十六分音符铺底并且在第三拍位置加一点变化$: s(bd*4).gain(0.9) $: s(~ sd ~ sd).room(0.2) $: s(hh*8 [~ hh] hh*5).gain(0.45)$:是 Strudel 里定义并行轨道的语法糖多个$:块会同时播放等价于把它们放进一个stack()。这三行分别对应底鼓、军鼓、hi-hat。第三行的hh*8 [~ hh] hh*5值得拆开看外层是三个元素第一个是 8 个 hi-hat第二个是先空一下再打一下第三个是 5 个 hi-hat。三个元素平分循环所以整体节奏会有轻微的疏密变化不会像纯八分音符那样机械。5.2 第二步加入低音线低音是撑起整个段落的部分。这里用锯齿波通过低通滤波把高频削掉做出那种闷闷的贝斯质感$: note(c2 ~ c2 eb2 ~ g1 ~) .s(sawtooth) .lpf(400) .gain(0.7)音高走向是 C - C - Eb - G属于小调色彩。~制造了断奏感让贝斯不至于糊成一片。.lpf(400)把 400Hz 以上的频率衰减掉这是合成贝斯最常见的处理方式能让低频更干净也不会和上面的和声打架。5.3 第三步铺一层和声和声用和弦进行速度比鼓组慢一倍四个循环走完一遍$: chord(Cm7 Am7 Dm7 G7) .voicing() .s(triangle) .gain(0.35) .room(0.6) .slow(2) 在这里的作用是每个循环换一个和弦.slow(2)让每个和弦持续两个循环。room(0.6)加了比较明显的混响把和声推到背景位置形成前景鼓组 背景和声的空间层次。如果和声太抢把gain降到 0.25 左右会更融合。5.4 第四步加一条旋律旋律用音阶索引写方便换调$: n(0 4 2 7 4 2 0 ~) .scale(C4:minor) .s(square) .gain(0.3) .delay(0.4) .delayfeedback(0.3) .pan(0.3 0.7)scale(C4:minor)里带了八度所以音符落在 C4 附近。.delay()加延迟.delayfeedback()控制反馈量这两个参数共同决定回声的拖尾长度。.pan(0.3 0.7)让音符在左右声道之间轻微摆动听感上会更宽。这里有个实用技巧延迟和混响都有累积效应如果旋律本身音符很密再加上高反馈的延迟很容易糊成一团。判断标准很简单——关掉其他所有轨道只留旋律单独听如果已经听不清音符边界那就是效果给多了。5.5 第五步整体验证与调整把上面五段代码放进同一个编辑器按 Ctrl Enter 执行。预期结果是一个中等速度的循环自动播放鼓组稳定推进贝斯在低频撑住和声缓慢变化旋律带一点回声在上方飘。如果某条轨道没有声音单独选中那一块按 Ctrl Shift Enter 执行先确认它自己能出声再放回整体。这是排查多轨问题最有效的方法因为整体执行时多条轨道同时发声很难判断是哪一条出了问题。调整顺序上建议先调音量平衡gain再调空间感room/delay最后调滤波和音色。反过来的话你会在音色上花很多时间最后发现只是某条轨道太响。6. 模式变换让循环不无聊一个纯粹重复的循环听两遍就腻了。Strudel 提供了一批模式变换函数作用是把已有模式改造成新模式而且大部分都可以嵌套组合。这一节挑几个最常用的讲。6.1 fast、slow 与 revfast()和slow()改变播放速度参数是倍数s(bd sd hh cp).fast(2)这会让整个模式在两倍速下播放相当于把一个循环压缩成半循环。slow(2)反之会把模式拉伸到两个循环。这两个函数可以直接传模式做成速度的渐变s(hh*8).fast(1 1 2 1)这样每四个循环里有一个循环的 hi-hat 会变成双倍速听感上像是一个小 break。rev()把整个模式反向播放s(bd sd hh cp).rev()它在鼓组上的效果特别明显把咚哒次啪变成啪次哒咚是很常用的加花手段。6.2 every、sometimes 与 chunkevery(n, f)表示每 n 个循环对模式应用一次函数 fs(hh*8).every(4, x x.fast(2))每 4 个循环hi-hat 提速一倍。这种每几小节变一次的写法是做段落结构最直接的方式。sometimes(f)是概率版本每次循环有一定概率应用变换s(sd*4).sometimes(x x.rev())军鼓时不时倒放一次制造出意外的重音。同类还有often()、rarely()、always()、never()概率梯度不同可以按需选用。chunk(n, f)更巧妙它把模式按循环位置切成 n 份然后对每一份逐步应用变换s(hh*8).chunk(4, x x.fast(2))效果是第 1 个循环原样第 2 个循环加速第 3 个循环……依次轮转下去。这类函数能做出逐渐演变的感觉比生硬的切换自然得多。6.3 jux、off 与 stackjux(f)是非常有 Strudel 特色的函数。它把模式复制一份原始版本放左声道应用了f的版本放右声道note(c3 e3 g3).s(sawtooth).jux(x x.rev())结果是一边正放一边倒放同时在左右耳响起。戴耳机听的时候空间感非常明显这也是为什么前面建议用耳机——外放时这个效果基本听不出来。off(时间, f)生成一个延迟的副本并叠加note(c3 e3 g3).s(triangle).off(0.125, x x.add(note(12)))偏移 0.125 个循环后叠加一个高八度的版本。add(note(12))是音高加法12 个半音等于一个八度。这个技巧在氛围音乐里用得极多能用两行代码做出卡农的效果。stack()把多个模式叠在一起stack( s(bd*4), s(~ sd ~ sd), s(hh*8).gain(0.5) )这等价于用$:写三个块只是在代码更复杂的时候stack()的结构更清晰也方便整体套一层变换。6.4 欧几里得节奏 euclideuclid(命中数, 总步数)按照欧几里得算法把 n 个音符尽可能均匀地分布在 m 个步进里s(bd).euclid(3, 8)3 个底鼓分布在 8 个步进上得到的是很经典的tresillo式节奏在世界各地的传统音乐里都能找到类似的分布。把这个函数用在 hi-hat 上做密度变化是最省力的加花方式s(hh).euclid(3 5 7 5, 16).gain(0.5)四个循环里hi-hat 的命中数在 3、5、7、5 之间轮换节奏密度自然起伏不需要写任何条件判断。7. 常见问题与排查思路Strudel 的报错通常比较直接但新手容易在没有声音和节奏不对这两类问题上卡住。下面按现象整理一份排查表。问题现象常见原因解决思路按了执行但完全没声音浏览器未获得音频播放权限先在页面上做一次点击操作再执行代码只有部分轨道有声音某条轨道语法错误整块评估失败单独选中该块执行看是否有报错提示提示函数不存在版本差异函数已改名或移除对照侧边栏函数速查使用当前版本写法采样名报错或无声采样未加载或名称拼写不符在侧边栏音色列表里搜索确认名称节奏整体太快或太慢setcpm的值与实际 BPM 换算不对用BPM/4的写法重新核对声音糊成一团混响和延迟叠加过多逐条轨道关闭效果找出过量的一条执行后旧声音还在响旧代码块仍在运行按 Ctrl . 停止全部再重新执行左右声道听不出区别使用外放或单声道设备换耳机检查系统是否开启单声道输出关于只有部分轨道有声音这一条值得展开说。Strudel 是按块评估的一个块里有语法错误这个块整体不会生效但其他块可能已经执行成功。所以听到少了一轨的时候第一反应不应该是调音量而是单独执行那一块看看有没有报错。另一个高频问题是节奏对不齐。mini-notation 的时间分配是相对的一个循环里的所有元素平分时间加上*、/、[ ]之后分配关系会变复杂。如果觉得某条轨道总是差一点最有效的排查方式是把这条轨道单独拿出来换成一个最简单的bd*4作为参照确认速度设置是对的再逐步加回原来的复杂度。8. 最佳实践与工程建议用 Strudel 写代码和写业务代码有一些共通的工程习惯也有一些这个场景特有的注意事项。这一节整理几条实践中比较有用的建议。8.1 代码组织一轨一块命名清晰虽然 Strudel 允许把所有内容塞进一个表达式但可维护性会急剧下降。推荐每个声部单独用一个$:块并且在块的上方用注释标注这一轨的作用// 鼓组底鼓四踩 $: s(bd*4).gain(0.9) // 鼓组军鼓二四拍 $: s(~ sd ~ sd).room(0.2) // 贝斯小调走向 $: note(c2 ~ c2 eb2 ~ g1 ~).s(sawtooth).lpf(400).gain(0.7)这样改起来目标明确也方便临时注释掉某一块做对比试听。注释在 Strudel 里是标准的//和 JavaScript 一致。8.2 音量与动态给每条轨道留出空间新手最常见的问题是把所有轨道的gain都设成 1结果整体削波失真。合理的做法是先确定底鼓和贝斯的电平其他轨道在此基础上往下压。一个经验值是底鼓 0.8~0.9贝斯 0.6~0.7军鼓 0.6hi-hat 0.4~0.5和声 0.3~0.4旋律 0.3 左右。这些数值不是标准答案不同采样本身的响度差别很大最终还是要靠耳朵调。但有一个原则是通用的给主音留出至少 30% 的动态余量否则所有元素挤在同一个响度上听感会非常平。另外gain是可以用模式控制的这让重音变得很好写。比如给 hi-hat 加一个轻重交替的模式比固定音量有律动感得多s(hh*8).gain(0.5 0.3)8.3 性能与稳定性控制同时发声的数量浏览器做音频合成性能上限比想象中低。同时跑十几条轨道、每条都带混响和延迟在低配设备上可能出现爆音或者卡顿。控制手段有几个减少同时发声的采样数量慎用高反馈的delayfeedbackroom的值不要每条轨道都开到 1。如果不确定是不是性能问题可以按 Ctrl . 全部停止然后一条一条轨道加回来观察在哪一条上开始出现卡顿。这个方法虽然笨但定位非常准。8.4 保存与分享把代码当作品管理Strudel 的代码本身就是作品。养成把成型的段落保存下来的习惯可以是本地的文本文件也可以是浏览器书签。分享的方式也很直接把代码贴给别人对方粘贴到 REPL 里就能听到一模一样的结果不需要传输任何音频文件。这里有个小建议保存的时候顺手在文件头写清速度、调性、风格备注过一段时间回来看能省下大量回忆时间。// 速度120 BPM4/4 // 调性C minor // 风格downtempo setcpm(120/4)三行注释的成本换来的是几个月后还能直接接着改。9. 学习路线与后续方向回头看这篇文章覆盖的内容Strudel 的定位和它解决的问题、运行环境和界面快捷键、mini-notation 的序列与休止与分组与交替、采样与合成器与音符与和弦三类声源、一个完整的八小节循环、模式变换函数、以及排查和工程实践。如果按难度排一个练习顺序比较合理的路径是先用s(bd sd hh cp)把发声链路跑通然后花时间把 mini-notation 练熟——这是投入产出比最高的一段因为它决定了你能不能把脑子里的节奏准确写出来。接着练音高相关的部分note()和scale()配合起来能覆盖绝大部分旋律需求。最后再上模式变换和效果器因为这两块在基础不牢的时候容易越调越乱。继续往下走可以关注几个方向。一是采样加载和自定义音色把自己的素材引入进来作品辨识度会立刻提升。二是 MIDI 相关的能力把 Strudel 接到外部合成器或者硬件上。三是把这个环境当成节奏生成器用它产出 MIDI 片段再导入 DAW 里做精细编曲——这种混合工作流在实际项目中很常见也绕开了浏览器音频的性能天花板。真正卡住人的往往不是语法而是不知道下一步该试什么。比较有效的做法是找一个自己喜欢的曲子试着用 Strudel 复现它的鼓组哪怕只有两小节。这个过程会逼着你去查函数、试参数、对比听感比看十篇教程都管用。代码写坏了也没关系按 Ctrl . 停下来改一行再执行这就是 Live Coding 最舒服的地方。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑