agentleFS
Akunda123Akunda123/SVIXAGENT/skills/sv-texture/SKILL.md

sv-texture

Skill33 starsChanged 35 days agoMITView on GitHub

织体(texture / 伴奏型)配方手册 —— 专门讲"同一串和弦怎么铺开",并落到 AKDAgent 的工具与音符。含:织体类型学(柱式 / 分解 / 琶音 / 切分 / ostinato / 对位 / 长音铺底 / riff)· 段落↔织体对应与推进手法(加减层 / 换型 / 改密度 / 留白)· 落到 `sv_write_chords` 的 block / broken / arpeggio 与参数(segBeats · startMeasure · pattern · 建组规则)· **按乐器生成织体 `sv_write_texture`(主要给 IX)**:和弦来源(工程内音符分析 / 显式进行)· 两条交互路子(**推荐→用户选** / **用户写首小节→模仿写其余**)· **管乐+弦乐 13 件推荐表** · 硬约束(管乐留气口 / 弦乐换弓 / 音域)· IX 上用和弦自动创建织体(main 组不可 addNote)· 六张配方卡(钢琴分解抒情 / 吉他扫弦 / 弦乐长音+琶音 / 电子 arp / ostinato 推进 / riff 驱动)· 常见毛病诊断(太空 / 太满 / 没推进 / 与旋律打架 / 低音撞车)。触发:伴奏怎么编、用什么织体、副歌怎么铺、要琶音或分解和弦、柱式怎么写、编曲太空或太乱或没推进、ostinato、riff、IX 自动织体、按乐器铺伴奏、给我用弦乐/圆号/长笛铺一层、模仿这一小节写下去、`sv_write_texture` 怎么用、`sv_write_chords` 怎么用、和弦怎么铺开、伴奏型、texture / accompaniment pattern / arpeggio / ostinato / block chord。

The file

Files
SKILL.md

织体(Texture / 伴奏型)

分工一句话:composition 管配器 / 音色 / 结构性判断 / 混音;本 skill 只管同一串和弦怎么铺开。 规矩:每条判断都要落成具体音符或一次工具调用 —— "要有层次感""要更丰满"这类话等于没说(同 composition 的纪律)。

0. 三句话上手

  1. 先定"一格几拍、一拍几个音"(节奏密度),再选型(柱式/分解/琶音/…),最后定音区与层数。
  2. 一段只能用 1~2 种主织体;变化靠加层 / 换型 / 改密度,不要每小节都换花样。
  3. 织体的职责是"托住旋律":给和声与律动,不抢旋律音区、不抢重音(旋律在哪,织体就让开那一层)。

1. 织体类型学(八类)

类型长什么样常见乐器最适段落技术要点(可直接落音符)
柱式(block)和弦音同时下,一拍或半拍一下钢琴、弦乐组、pad副歌、结尾推进4/4 常用 ♩ 或 ♩.;低音单独一层(根音)比整块下移更好听
分解(broken)和弦音按序流出,每拍 2~4 音钢琴、竖琴、吉他主歌、预副歌4/4 八分:低-中-高-中(1 3 5 3 型);每小节首音留给低音根音
琶音(arpeggio)逐音上行/下行铺满时值(十六分常见)合成器 arp、竖琴、拨弦主歌到预副歌、电子副歌十六分 1-3-5-8(含八度)上行;速度感来自细分而不是音量
切分(syncopated)重音错开拍点(♩ ♪♪ 移位、后半拍进)钢琴、电钢、吉他预副歌、副歌只改重音位置、不改和弦;与鼓的底鼓错开才有推动力
固定音型(ostinato)一小节音型无限重复,和声换它不换弦乐、合成器、吉他 riff全曲黏合剂、桥段音型要单数拍或跨小节才有"滚"的感觉;换和弦时只改音高不改节奏
对位式(counter-line)一条独立的低音/副旋律线与主旋律反向或错位大提琴、贝斯、合成器 bass主歌第二遍、桥段与旋律反向进行最安全;同向时用三/六度并保持节奏差
长音铺底(pad / sustain)长音或长音+缓动,不参与律动pad、弦乐长音、风琴intro、主歌、桥段一个和弦一个音或两音(根音+五音最稳);不要与分解层同音区堆
节奏型 riff短促、有律动的动机反复(常为单音+八度)电吉他、Synth lead、铜管副歌、drop、hook动机 ≤ 2 拍,重复 4 次后在第 4 次尾加花;音高只跟和弦的根/五

组合原则:一个段落通常 = 低音层(长音或走句)+ 和声层(分解/柱式)+ 色彩层(琶音/对位/加花),最多三层。 层数够了就别再加,改成"换型"(例:主歌 2 层 → 副歌把和声层从分解换成柱式)。

2. 段落 ↔ 织体 与推进手法

段落主织体密度(4/4)推进手法常见错误
Intro长音铺底 / 单乐器分解稀疏(♩ 级)只给色彩,留悬念一上来就全奏(后面没得加)
Verse 主歌分解 或 ostinato八分第二遍加对位低音太满 ⇒ 副歌无处可去
Pre-chorus 预副歌切分 / 密度递增的分解八分→十六分① 密度爬升 ② 低音级进上行 ③ 去掉一层留白 2 拍直接抄副歌织体(推进感消失)
Chorus 副歌柱式 / 宽琶音 / riff四分柱式或十六分琶音加层(弦乐/pad)+ 抬音区只靠"变响"而不是"变型 + 加层"
Bridge 桥段长音铺底 / 对位式最稀疏拆掉节奏层("静场")再重建继续堆 ⇒ 听不出桥段
Outro柱式渐稀 / ostinato 收束递减反着走 intro 的路突然全停

推进三招(缺推进感时按顺序试):

  1. 加层:低音 → 加和声层 → 加色彩层(每次只加一层)。
  2. 换型:同一层从分解换柱式 / 从长音换切分(听感变化最大、成本最低)。
  3. 改密度:八分→十六分、或反过来在关键一小节留白。

3. 落到工具(AKDAgent)

3.1 和弦从哪来

  • 音频轨在场:sv_analyze_chord(务必先用伴奏,人声混着的 chroma 不准 → sv_separate_vocals)
  • 用户给了进行:直接用(如 ['C','G','Am','F'])
  • 声部内部进行(IX 织体/和声组):sv_create_harmony_group 另有其用(给主旋律配和声声部,不是伴奏织体)

3.2 sv_write_chords(把和弦铺成音符)

参数作用织体侧建议
input伴奏 WAV(分析和弦)用纯伴奏
bpm / keyRoot / keyMode拍速与调性检测有歧义时显式给,避免小节线错位
segBeats每段拍数(默认 4 = 一小节)想"两拍一和弦"就设 2
patternblock 柱式 / broken 分解 / arpeggio 琶音主歌优先 broken,副歌优先 block,电子段用 arpeggio
startMeasure从第几小节开始写有前奏就跳过,别盖住 intro
trackIndex / groupName目标轨与组名永远写进新建的独立组,名字带用途(如 Pad-broken)

⚠️ 能力边界(如实说):sv_write_chords 输出的是和弦骨架(按 pattern 铺开), 不是成品织体 —— 切分、ostinato、对位、加花这些要在骨架上再改音符(run_script 批量改,或让用户在钢琴窗微调)。 别拿"我们有织体库"来承诺(本 skill v1 = 类型学 + 配方 + 诊断,不是一键生成器)。

3.3 写音符的宿主规矩(和 sv-project-format / akdagent-playbook 一致)

  • 判据看 get_current_group.hostIsSv2,别看组名(音频轨的组也叫 main,用户也能把任意组改名 main)
  • SV1 ⇒ 写主组(hostIsSv2 == false):主组可写,织体也写主组(用户 2026-09-25 定);主组非空要先问用户
  • SV2 / IX ⇒ 必须新建组(hostIsSv2 == true):IX 的 main 组不能 addNote、SV2 主组不可编辑 ⇒ write_chords / create_harmony_group 本来就是新建组;run_script 也不豁免这条
  • 写完读回校验:音符数、onset 是否对齐小节、音高范围是否超出乐器音域
  • 改工程文件(.ixp/.svp)走安全三步:用户先保存 → 我们改写 → 用户重载
  • 宿主版本要留意:node tools/known-bugs.cjs --list 看当前已知缺陷/平台约束(IX 1.0.0 的读点类 API 会冻桥 ⇒ 桥报 hostOutdated 时先让用户升级宿主)

3.4 按乐器生成织体:sv_write_texture(主要给 IX 用,2026-09-19 立项)

📌 这一节管"给定乐器 + 段落 + 和弦来源,把织体铺出来"。它跟 §1–§2 的关系: §1 的类型学/§2 的段落表是判断依据,这里是执行落点。代码在 server/src/texture/,离线回归 cd server && npm run test:texture(50 项)。

两条交互路子(用户二选一)

路子谁定织体怎么走
推荐 → 用户选我先给候选,用户挑工具返回 suggestion(乐器 × 段落的候选 + 每个候选的理由);用户点头后再带 texture 调一次
首小节 → 模仿用户自己写第一小节用户写好一小节(或几小节)→ 我把它当模板,按每个目标小节的和弦重建(texture:"imitate")—— 与 IX 侧边栏 [IX]模板织体生成.js 同一套映射

和弦来源三种(chordSource)

  • notes(默认)= 从工程内音符按小节推和弦(与 IX 侧边栏「旋律和弦生成」同口径:音高类向量 → detectChord + Krumhansl 调性)⇒ 适合"工程里已经有旋律/钢琴,照着配织体"。
  • progression = 用户直接给进行(['C','G','Am','F'])⇒ 不依赖工程内容,适合"先铺伴奏"。
  • audio = 分析音频 WAV(audioPath 必填)⇒ 走与 sv_write_chords 同一套扒带链路:先 analyzeAudio 拿调性/BPM,再 extractChordTrack 逐段出和弦。⚠️ 必须先拿调性(实测:跳过这步 key 会是空的、A# 也不会被校正成 Bb);扒带结果会归整成"每小节一个窗口":起点量化到十六分(治浮点误差,实测 7.99 拍那种)、横跨多小节的段展开到每一小节、没有段覆盖的小节沿用前一个和弦并标 carried(analysisFromSegs 的三个坑都已在 test:texture 里立了回归)。
  • 「音频 + 音符结合」(音频定骨架、音符纠错)本版未实现,需要时按 sv_analyze_chord / 音符分析各跑一次再人工取舍。

乐器 → 织体(管乐 + 弦乐 13 件;"先做这两族")

乐器首选织体备选基本不用要点
长笛 / 短笛broken(分解)· arpeggiosustain · riffcounter中高音区快速音型;低音区没共鸣
双簧管 / 英国管sustain · counterbrokenarpeggio · ostinato音色太突出 ⇒ 长音/对位,密集会抢旋律
单簧管broken · sustaincounter · block—音域宽、音色温 ⇒ 内声部首选
巴松 / 大管sustain · counterblockarpeggio · ostinato木管低音层:根音长音 / 对位走句
萨克斯riff · brokensustainblockriff 与切分最出味;密柱式会糊
小号riff · blocksustainarpeggio · ostinato短促有力;连续分解换气跟不上
圆号sustain · blockcounterriff · arpeggio柔和中音区;快速音型不适合
长号 / 大号sustain · blockriff · counterarpeggio低音铜管长音/柱式;大号不要走句
小提琴sustain · brokenblock · counter—主歌长音/分解、副歌柱式齐奏
中提琴broken · countersustain—内声部;与一提琴同度会干涉
大提琴counter · blocksustainarpeggio低音线首选;长音只给根音
低音提琴sustain · counter—broken · arpeggio · riff只做长音根音或行走低音
弦乐群block · sustainostinato · counter—群奏柱式/长音;群奏分解会散

表是推荐的起点,真正的定案走"推荐 → 用户选"。加乐器 = 往 server/src/texture/instruments.ts 的 INSTRUMENTS 加一条(别在别处硬编码乐器名)。

三条硬约束(工具自动套,applied 里如实回报,可用 applyInstrumentRules:false 关掉)

  1. 管乐必须留气口 —— 每 2 小节为一组,组尾那口气要 ≥ 0.5 拍;晚于该点的尾音会被丢掉(否则歌手没地方换气)。
  2. 弦乐要换弓 —— 连续同音型最多 2 小节,第 3 小节自动镜像(以该小节和弦根音为轴);镜像后越界的音先整八度移入音域、挪不进去才丢(2026-09-21 起)。
  3. 音域 —— 超出该乐器实用音域的音先整八度上/下移入音域(liftIntoRange;2026-09-21 真机验收后改 —— 旧行为"一越界就丢"会让长笛在 C 和弦上整小节无音),挪不进去才丢并计数;管乐低音区、低音提琴高音区最容易踩。 · octaveShift 现在对具名织体也生效(同日修:此前 block/broken/arpeggio 三条路线把它写死成 0,只有 template/imitate 读它);plan.liftedIntoRange 报移八度的音数,sustain/counter 的移八度数在 warnings 里如实写出。

🆕 技法(articulations?,2026-09-21 · 仅 IX):统一给本次写入的所有音符设同一组技法(如整段 ["Pizz."]、或 ["Con Sordino","Tenuto"])。

  • 写入前按 实测全局互斥图做组内自洽化(保前丢后 + 去重),结果与剔除原因进回包 articulations.requested/used/dropped(剔除项另进 warnings)。
  • ⚠️ 只解自相冲突:该轨到底支不支持读不出来(IX API 读不到乐器)⇒ 回包里明说「写入成功 ≠ 可用」;要逐音确认请用 sv_apply_articulations(默认 dry-run,读 getArticulationState().incompatible)。
  • ⚠️ setArticulations 会把音符永久置 articulationsFixed=true(连写空表也一样,API 清不掉)⇒ 织体是"新组",写了就是显式指定。
  • 逐音精修(按旋律走向 / 按段落开关)仍走 sv_apply_articulations(见 sv-ix 技能)—— 本参数只解决"整组统一一个音色开关"。

和弦来源(chordSource,三选一)· 织体(texture)· 乐器(instrument)· 范围由段落定(rangeStartBar/rangeEndBar)

// ① 先看:不写工程,只要推荐 + 计划
{ "instrument": "圆号", "section": "chorus", "chordSource": "notes", "dryRun": true }

// ② 推荐→用户选:用户点了 block,范围由段落定(第 9–16 小节是副歌)
{ "instrument": "圆号", "texture": "block", "section": "chorus",
  "rangeStartBar": 9, "rangeEndBar": 16, "groupName": "Horn-block" }

// ③ 首小节→模仿:用户已写好第 1 小节,铺满 2–16 小节
{ "instrument": "小提琴", "texture": "imitate", "templateBars": 1,
  "rangeStartBar": 2, "rangeEndBar": 16 }

// ④ 和弦来自伴奏音频(先拿调性再扒带,逐小节展开)
{ "instrument": "弦乐群", "texture": "block", "chordSource": "audio",
  "audioPath": "D:/song/accompaniment.wav", "rangeStartBar": 1, "rangeEndBar": 16 }

宿主规矩(按宿主分):SV2 / IX 一律新建组(IX 的 main 组不能 addNote、SV2 主组不可编辑),组名默认 <乐器>-<织体>、同名幂等替换;SV1 上织体也写主组(判据 hostIsSv2 == false;主组非空先问用户)。写完读回校验(音符数 / onset 对齐 / 音域)。IX 侧那个侧边栏 .js 仍可用于手动作业,两边算法同源。

v1 如实边界(别当成已覆盖)

  • 未实现:riff 的加花、真正的 counter 对位旋律线(现在 counter 是"根—五 四分走句"简单版);这两种会降级为骨架并告知。
  • ostinato / riff 与 imitate 是同一条映射(差别只在语义与乐器取向):模板允许多个小节,按模板小节数周期循环(2 小节音型就 2 小节一轮)。没有模板时会降级成 broken 并告知。
  • sustain = 根音+五音长音(简单版,没有内声部处理)。
  • **音频 + 音符"结合"**的和弦来源未做(见上)。
  • 真机验收(IX 上听感)尚未做 —— 只跑了离线回归+ 真实 WAV 的扒带探针;听感一律由用户判。

4. 配方卡(六张,可直接照抄)

卡 1 · 钢琴分解抒情(主歌)

  • 和弦:每小节 1 个(I–V–vi–IV 类)
  • 低音层:根音在 ♩1 与 ♩3(八度不重复更好)
  • 和声层:八分 1-5-8-5(根-五-八度-五)或 1-3-5-3
  • 音区:低音 C2–C3,和声层 C3–C5;旋律常在 C4–C5 ⇒ 和声层走到 C5 时改用五/八度避开三音

卡 2 · 吉他扫弦(副歌)

  • 和弦:每小节 1~2 个
  • 节奏:↓ ↓↑ ↑↓↑(4/4 下扫在 ♩1、♩3,反扫在 ♪2、♪4)
  • 音区:C3–C4 的开放和弦音型;低音只留根音与五音
  • 要点:扫弦靠重音移位推进,不靠加到十六分

卡 3 · 弦乐长音 + 琶音(副歌加层)

  • 长音层:每和弦一个根音+五音长音(跨小节),力度中弱
  • 琶音层:十六分上行 1-3-5-8,每小节最后半拍留白给旋律换气
  • 音区:长音 C3–C4,琶音 C4–C6(要低于旋律最高音)

卡 4 · 电子 arp(主歌→预副歌)

  • 和弦:每 2 拍换一个
  • 音型:十六分 1-5-8-5 循环;奇数拍重音(与底鼓错开)
  • 推进:预副歌把音型改成 1-3-5-8-10(加九音)或提高八度
  • 要点:arp 的"劲"来自细分与固定音型,不是音量

卡 5 · ostinato 推进(全曲黏合剂)

  • 音型:一小节 4 音(♩ 级)或 6 音(跨小节的三连感)
  • 和声跟随:节奏不动、只改音高(和弦换根就换根,音型骨架不变)
  • 用法:主歌出现 → 桥段拆掉 → 末副歌回来("消失再回来"比一直响更有效)

卡 6 · riff 驱动(副歌 hook)

  • 动机:≤2 拍,单音+八度,重复 4 次
  • 第 4 次尾加花(♪ 上行 3 音);音高跟根音与五音,避免三音与大三/小三打架
  • 要点:riff 与主旋律不同时占最强拍 —— 旋律在 ♩1,riff 就从 ♪2 进

5. 编曲体检清单(症状 → 判据 → 改法)

🔴 纪律(与旋律/作词两侧一致)

  • 触发:由用户提出才开始查("这段编曲帮我看看 / 是不是太满了 / 没推进感")—— 不主动查、不当生成后的验收门;
  • 只列不改:把问题一条一行列出来给用户挑,不要逐项确认、不要弹面板提问;用户点到哪条才说那条的细节与改法,之后一次只改一处;
  • 给改法方向,不是只报症状。

判据分两类:能看的(层数 / 音区占用 / 节奏层是否全同 / 同向同度 / 低音是否撞车 —— 打开工程就能数);要听的(空 / 满 / 糊 / 没推进 —— 主观,必须放着听,别拿数字硬套)。

症状多半是(判据)怎么修深挖去哪
太满、听不清唱什么层数 > 3;织体占满 C4–C5;全在强拍砍到 2 层;给旋律让出音区;把和声层重音挪到后半拍composition/references/编曲配器.md §4 · 混音与母带.md(空间预算/临界频带)
太空、散只有长音、没有律动层;每小节只响一下就停加一层分解/ostinato;把长音的换和弦点对齐小节composition/references/编曲配器.md §4(先查细节再谈件数)
没推进感主歌与副歌织体相同,只靠音量差换型(分解→柱式)+ 加层 + 抬音区(§2 三招);进副歌前先减一层composition/references/段落结构.md §3/§5
与旋律打架织体音与旋律音撞在小二度(大二度可放过);同向同节奏让开旋律那一层(换音区或换和弦音);改反向composition/examples/编曲太满-音区打架.md
低音糊低音层同时有根音+三音+五音;跨度过大低音只留根音(必要时 + 五音);相邻和弦低音走最近音composition/references/和声进行.md §6(转位)
节奏一顿一顿各层全走四分音符,没有长短错开拆节奏层:柱式走二分、分解走八分、长音铺底(§3.2 配方卡)本文件 §2/§4
每小节都换花样变化太勤一段定 1~2 种主织体,变化集中在段落交界与第 4/8 小节尾本文件 §2
织体把鼓的律动盖住织体重音与底鼓/军鼓重音全程重合织体重音挪到后半拍或让开 2、4 拍composition/references/律动与鼓组.md

报告格式(照 composition/references/主旋律生成.md §7 的交付形态):N. [严重度] 症状 · 位置(第几小节/哪一层)· 判据 · 一句改法方向。

6. 边界、分工与维护

  • 与 composition 的分工:配器/音色/段落结构/混音 ⇒ composition;本 skill 只回答"这串和弦怎么铺开"。
  • 与 sv-project-format 的分工:音符/组/自动化怎么写进工程(含宿主差异与危险 API)⇒ sv-project-format。
  • 与 akdagent-playbook 的分工:开工自检、什么时候该问用户、交接规范 ⇒ akdagent-playbook(其 0.4c 已指向本 skill)。
  • v1 范围(如实):类型学 + 段落对应 + 工具落点(sv_write_chords 出骨架 · 🆕 sv_write_texture 按乐器/模板生成)+ 6 张配方 + 诊断。 已覆盖:管乐 / 弦乐 13 件的推荐表与三条硬约束(§3.4)。尚未覆盖:按风格(爵士/国风/摇滚/电子子风格)的细分织体库、 riff 加花与真正的对位旋律线(§3.4 里会降级并告知)、鼓组与织体的配合、真实成品曲目的织体拆解。需要时按 composition 的 references/ 增补,不要假装已覆盖。
  • 来源: composition(references/编曲配器.md·和声进行.md·电子编曲.md)现有条目 + 通用编曲常识摘要改写; 工具参数以 server/src/tools.ts 与 skills/sv-scripting 为准;宿主规矩以 sv-project-format 的实测结论为准。
  • 维护:新配方/新诊断先写进本 skill;含中文的文件只用编辑工具改;改完同步镜像(只有 dsh-runtime/dsh/skills 一个目标, robocopy skills dsh-runtime\dsh\skills /MIR 后逐文件比 SHA256)。⚠️ 不要对 ~\.dsh\skills 跑 /MIR —— 那是用户的技能目录(另有 PPT/STL/教学等无关技能,会全删);那边要更新就单文件覆盖。

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.