公司动态

10行Clojurescript做一个钟琴:Klangmeister乐器合成技巧详解(Bell/Organ/Wah/打击乐)

📅 2026/8/26 19:58:49
10行Clojurescript做一个钟琴:Klangmeister乐器合成技巧详解(Bell/Organ/Wah/打击乐)
10行Clojurescript做一个钟琴Klangmeister乐器合成技巧详解Bell/Organ/Wah/打击乐【免费下载链接】klangmeisterA musical scratchpad.项目地址: https://gitcode.com/gh_mirrors/kl/klangmeisterKlangmeister 是一个浏览器里的音乐草稿本a musical scratchpad用 Clojurescript 编写乐器与旋律零安装即可在线实时编码live-coding出声音。本文带你读懂它内置的 Bell钟琴、Organ风琴、Wah哇音与打击乐四大合成技巧学会后只需十行代码就能造出自己的钟琴音色。 什么是 KlangmeisterKlangmeister 的四大设计目标写得很直白目标说明零安装实时编码打开浏览器就能写音乐代码可接近的合成器设计用函数式风格连线信号无需硬件知识音乐教育内置逐步教程从正弦波讲到调式现场表演就绪支持循环、图谱化编辑它不是基于 OvertoneSupercollider而是直接使用浏览器的Web Audio API因此任何合法的 Clojurescript 都能在运行时参与音乐定义和声与调式部分由乐理库 Leipzig 提供。核心能力一览信号源sine正弦波、square、sawtooth、triangle、white-noise塑形器gain增益、high-pass/low-pass高通/低通滤波包络percussive打击包络、adsr四段包络组合器add叠加信号、connect-串联处理链这些函数清单在 klangmeister/ui/reference.cljs 中以表格形式内置为在线参考页。 快速上手本地运行 Klangmeister项目使用 Leiningen Figwheel 热重载开发project.clj 定义了 dev/prod 两套构建# 开发模式热重载浏览器中编译 Clojurescript lein figwheel # 打开 http://localhost:3449/klangmeister/index.html运行后会看到三个核心页面路由见 klangmeister/core.cljssynthesis合成器教程从(sine 440)一步步加增益、包络、滤波直到 ADSR 延音composition作曲教程phrase→then/with→times→tempo→ 调式performance把乐器和旋律组合起来循环播放并实时观察音符图谱 10 行代码做一个钟琴Bell 合成剖析Klangmeister 的全部内置乐器集中在 klangmeister/sound/instruments.cljs 中。先看bell钟琴/仿铃——这就是标题里10 行的来源(defn bell An imitation bell, made by adding together harmonics. [{:keys [pitch]}] (let [harmonic (fn [n proportion] (connect- (sine (* n pitch)) ; 每个泛音都是一个正弦波 (percussive 0.01 proportion) ; 每个泛音的起音与衰减 (gain 0.05)))] ; 控制单个泛音音量 (- (map harmonic [1.0 2.0 3.0 4.1 5.2] ; 泛音是基频的整数近似倍 [1.0 0.6 0.4 0.3 0.2]) ; 越高泛音越弱 (apply add))))三个关键合成思想泛音叠加 音色。钟琴的金属感来自一列频率成整数倍的正弦波1x、2x、3x、4.1x、5.2x——4.1、5.2 的轻微偏移正是真实金属铃腔的非整数泛音让音色更真。每个泛音独立包络。percussive 0.01 proportion给出极快的起音0.01 秒和按泛音递减的衰减模拟敲击后由强到弱的余韵。只返回合成器定义。函数本身无副作用最后apply add把所有泛音串成一个合成器交给播放引擎实例化——这一点在 klangmeister/sound/music.cljs 的play!中体现每条音符携带:instrument键播放时才真正连线到音频输出。 Organ 风琴滤波也能呼吸organ展示了比 bell 更高级的玩法——用信号驱动滤波器的截止频率(defn organ [note] (connect- (add (sine (* 0.5 (:pitch note))) (triangle (:pitch note))) (low-pass (* 4 (:pitch note)) (connect- (sine 3) (gain 3))) (adsr 0.1 0 1 0.3) (gain 0.2)))基频一半0.5x的正弦波 基频三角波叠加获得温暖的基色low-pass的截止频率被一个 3Hz 的正弦波信号调制产生风琴特有的风箱式起伏adsr 0.1 0 1 0.3表示0.1 秒起音、0 秒衰减、100% 延音、0.3 秒释放——这是可持续音符区别于打击包络的典型写法。 Wah 哇音让滤波器说话wah模仿吉他哇音踏板核心是让低通滤波的截止频率随 ADSR 包络扫动(defn wah [{:keys [pitch]}] (connect- (sawtooth pitch) (low-pass (connect- (constant (* 4 pitch)) (adsr 0.1 0.2 0.4 0.3)) 5) (adsr 0.3 0.5 0.8 0.3) (gain 0.3)))锯齿波富含泛音经过截止频率从 4 倍基频张开又收拢的低通后就形成了呜——哇的喉音感。两个 ADSR 一个塑造音色轨迹一个塑造音量轨迹这是专业合成器设计的经典分法。 打击乐Hi-Hat 与 Kick Drum打击乐完全用噪声 快包络 滤波构建(defn high-hat 用白噪声仿制踩镲 [decay] (fn [_] (connect- white-noise (percussive 0.01 decay) (high-pass 3000) ; 只留高频沙沙声 (low-pass 4500) (gain 0.1)))) (def open-hat (high-hat 0.4)) ; 开镲长衰减 (def closed-hat (high-hat 0.05)) ; 关镲短衰减tom嗵鼓更有意思两个锯齿波叠加其中一个的频率被envelope [0 1] [0.5 0.5]从基频快速下滑模拟鼓皮被击打后音高下沉的物理过程再经低通与 0.005 秒超快起音(defn tom [pitch decay] (fn [_] (connect- (add (sawtooth pitch) (sawtooth (connect- (constant pitch) (envelope [0 1] [0.5 0.5])))) (low-pass (* 4 pitch)) (percussive 0.005 decay) (gain 0.3)))) (def kick (tom 55 0.1)) ; 55Hz 的低音嗵 底鼓marimba马林巴则是三根正弦波1x、基频1、2x加adshr五段包络含 hold 段音色清脆中带延续与 bell 的纯衰减形成对比。 从乐器到整首歌组合与循环乐器只是声音发生器把它和旋律绑定并循环起来就成了一首可现场修改的曲子。演奏流程见 klangmeister/sound/music.cljs每条音符是{time duration pitch instrument}结构play!把每条音符的:pitch转成等比律频率取出:instrument调用出合成器定义synthesis/connect将其接到音频输出并调度到指定的time时刻。作曲侧使用 Leipzig 提供的组合器参考 klangmeister/ui/composition.cljs 的内置教程(- (phrase [3/3 3/3 2/3 1/3 3/3] [0 0 0 1 2]) ; 旋律时值 调内音级 (with (phrase [2/3 1/3 2/3 1/3 3/3] [2 1 2 3 4])) ; 叠加和声 (times 2) ; 重复两遍 (tempo (bpm 90)) ; 设 90 BPM (where :pitch (comp high C major))) ; 定位 C 大调高八度在performance页面klangmeister/ui/jam.cljs中笔记会被图谱化展示按下Loop后边改乐器代码边听变化——这正是 Klangmeister 音乐草稿本的定位像改 PPT 一样改声音。✅ 小结Klangmeister 乐器合成速查音色文件位置核心技巧bell钟琴instruments.cljs5 个泛音正弦波 独立 percussive 包络organ风琴instruments.cljs半频正弦 三角波3Hz 正弦调制低通wah哇音instruments.cljs锯齿波 ADSR 驱动滤波截止频率high-hat/kick打击乐instruments.cljs白噪声/下滑锯齿 快包络 带通marimba马林巴instruments.cljs三正弦叠加 adshr 五段包络一句话心法Klangmeister 里音色 信号源 × 包络 × 滤波把connect-链条想成乐高管线改一个参数就是换一个音色——这也是它零安装、浏览器内编译 Clojurescript 却足以支撑现场表演的原因。【免费下载链接】klangmeisterA musical scratchpad.项目地址: https://gitcode.com/gh_mirrors/kl/klangmeister创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考