[{"data":1,"prerenderedAt":342},["ShallowReactive",2],{"navigation":3,"/grammars/macro":51,"/grammars/macro-surround":337},[4,20,43,47],{"title":5,"path":6,"stem":7,"children":8,"icon":19},"开始","/getting-started","1.getting-started/1.index",[9,11,15],{"title":10,"path":6,"stem":7},"介绍",{"title":12,"path":13,"stem":14},"下载和安装","/getting-started/installation","1.getting-started/2.installation",{"title":16,"path":17,"stem":18},"使用方法","/getting-started/usage","1.getting-started/3.usage",false,{"title":21,"path":22,"stem":23,"children":24,"icon":19},"Symi 语法","/grammars","2.grammars/1.index",[25,27,31,35,39],{"title":26,"path":22,"stem":23},"概述",{"title":28,"path":29,"stem":30},"控制信息","/grammars/control","2.grammars/2.control",{"title":32,"path":33,"stem":34},"音高","/grammars/pitch","2.grammars/3.pitch",{"title":36,"path":37,"stem":38},"时间","/grammars/time","2.grammars/4.time",{"title":40,"path":41,"stem":42},"宏","/grammars/macro","2.grammars/5.macro",{"title":44,"path":45,"stem":46},"LLM","/llm","3.llm",{"title":48,"path":49,"stem":50},"更新日志","/updating-log","4.updating-log",{"id":52,"title":40,"body":53,"description":330,"extension":331,"links":332,"meta":333,"navigation":334,"path":41,"seo":335,"stem":42,"__hash__":336},"docs/2.grammars/5.macro.md",{"type":54,"value":55,"toc":317},"minimark",[56,60,64,67,78,81,84,104,107,110,116,119,144,147,153,159,166,169,173,181,192,198,204,210,213,224,235,238,241,247,260,266,278,281,284,290,293],[57,58,59],"p",{},"宏是Symi中一种强大的抽象机制，允许你定义可重用的代码块，并在需要的地方调用它们，这在音乐的重复结构中尤其有用。",[61,62,63],"h2",{"id":63},"定义宏",[57,65,66],{},"宏定义的基本形式都是：",[68,69,74],"pre",{"className":70,"code":72,"language":73},[71],"language-text","宏名 = ...\n","text",[75,76,72],"code",{"__ignoreMap":77},"",[57,79,80],{},"其中宏名使用标识符（字母、数字、下划线组合，且不能以数字开头）。",[57,82,83],{},"当前版本中，宏分为三类：",[85,86,87,95,101],"ul",{},[88,89,90,91,94],"li",{},"alias macro：单行、无 ",[75,92,93],{},":","，表示一个音高链别名",[88,96,97,98,100],{},"simple macro：单行、含 ",[75,99,93],{},"，表示多个音高项",[88,102,103],{},"complex macro：多行片段（或以非音高标记开头的单行片段）",[61,105,106],{"id":106},"别名宏",[57,108,109],{},"别名(alias)宏的 body 是一个音高链：",[68,111,114],{"className":112,"code":113,"language":73},[71],"a = 3/2@5/4\nb = C4+\n",[75,115,113],{"__ignoreMap":77},[57,117,118],{},"别名宏可用于：",[85,120,121,128,138],{},[88,122,123,124,127],{},"在音高链中作为标识符被引用（例如 ",[75,125,126],{},"C4@a","）",[88,129,130,131,134,135,127],{},"直接作为宏调用（例如 ",[75,132,133],{},"a,","、",[75,136,137],{},"a@D4,",[88,139,140,141,127],{},"在基准音定义右侧被引用（例如 ",[75,142,143],{},"\u003CC4=a>",[61,145,146],{"id":146},"简单宏",[57,148,149,150,152],{},"简单(simple)宏用于定义一组音高项，内容由 ",[75,151,93],{}," 分隔，例如：",[68,154,157],{"className":155,"code":156,"language":73},[71],"arp = 1/1:3/2:2/1\n",[75,158,156],{"__ignoreMap":77},[57,160,161,162,165],{},"上例定义了一个名为 ",[75,163,164],{},"arp"," 的简单宏，内部是一个三音组。",[57,167,168],{},"简单宏只负责音高内容复用，不在定义处固定时间戳推进；实际时值与节奏由调用位置决定。",[170,171,172],"h3",{"id":172},"复杂宏",[57,174,175,176,180],{},"复杂(complex)宏用于定义完整的",[177,178,179],"strong",{},"行级片段","（可包含时间控制、和弦、分号细分、控制信息等）。",[57,182,183,184,187,188,191],{},"写法是将 ",[75,185,186],{},"="," 后换行，然后在下一行（或多行）书写宏体，",[177,189,190],{},"最后用一个额外的空白行结束","：",[68,193,196],{"className":194,"code":195,"language":73},[71],"riff =\n{4}C,E,G,E,\nD,F,A,F,\n\n",[75,197,195],{"__ignoreMap":77},[57,199,200,201,203],{},"如果宏体只有一行，也可以直接写在 ",[75,202,186],{}," 后，但是宏体必须以非音高标记开头：",[68,205,208],{"className":206,"code":207,"language":73},[71],"riff = {4}C,E,G,E,   // 这是合法的单行复杂宏定义\nriff = C,E,G,E,     // 这样写会被解析为 alias/simple 路径，而不是 complex 宏\n",[75,209,207],{"__ignoreMap":77},[57,211,212],{},"复杂宏的宏体在逻辑上是一段独立片段：",[85,214,215,218,221],{},[88,216,217],{},"宏体内部按自身内容推进时间；",[88,219,220],{},"调用时会将宏体事件整体平移到调用位置；",[88,222,223],{},"宏体可以包含多个小节（多行）。",[225,226,227],"tip",{},[57,228,229,234],{},[230,231,233],"a",{"href":232},"./time#%E5%B0%8F%E8%8A%82%E5%88%86%E9%9A%94%E8%AE%B0%E5%8F%B7","小节分隔记号","看起来就像是没有名字的单行复杂宏，其实它就是对复杂宏的一种特殊语法糖。",[61,236,237],{"id":237},"调用宏",[57,239,240],{},"宏调用的基础形式是直接写宏名：",[68,242,245],{"className":243,"code":244,"language":73},[71],"arp,\nriff,\na,\n",[75,246,244],{"__ignoreMap":77},[57,248,249,250,134,253,134,256,259],{},"调用时可以在宏名后追加音高链尾部（",[75,251,252],{},"@...",[75,254,255],{},"+",[75,257,258],{},"-","）：",[68,261,264],{"className":262,"code":263,"language":73},[71],"arp@D4,\narp@3/2@10c,\nriff@A3,\na+,\n",[75,265,263],{"__ignoreMap":77},[57,267,268,269,273,274,277],{},"其语义与",[230,270,272],{"href":271},"./pitch#%E9%9F%B3%E9%AB%98%E9%93%BE","音高链","一致：调用尾部会拼接到宏内每个音符（或 alias 链）的音高链末尾，再按 ",[75,275,276],{},"@"," 右结合计算最终频率。",[57,279,280],{},"这对 alias/simple/complex 三类宏都生效。",[170,282,283],{"id":283},"示例",[68,285,288],{"className":286,"code":287,"language":73},[71],"\u003CC4=261.63>\n\na = 3/2@5/4\narp = 1/1:3/2:2/1\nriff =\n{4}C,E,G,E,\nD,F,A,F,\n\n{1}a,\narp@D4,\nriff,\n,\nriff@A3,\n",[75,289,287],{"__ignoreMap":77},[57,291,292],{},"上例中：",[85,294,295,300,314],{},[88,296,297,299],{},[75,298,230],{}," 作为 alias 宏可直接调用；",[88,301,302,305,306,309,310,313],{},[75,303,304],{},"arp@D4"," 与 ",[75,307,308],{},"riff@A3"," 会把 ",[75,311,312],{},"@D4"," 追加到展开后的音高链末尾；",[88,315,316],{},"该调用尾部只影响当前调用，不影响后续内容。",{"title":77,"searchDepth":318,"depth":319,"links":320},1,2,[321,322,323,327],{"id":63,"depth":319,"text":63},{"id":106,"depth":319,"text":106},{"id":146,"depth":319,"text":146,"children":324},[325],{"id":172,"depth":326,"text":172},3,{"id":237,"depth":319,"text":237,"children":328},[329],{"id":283,"depth":326,"text":283},"宏定义和调用","md",null,{},true,{"title":40,"description":330},"nzSQpmNOBG94k7WIbcz0GJH3I4vDR7XXZo5aujBeB2M",[338,340],{"title":36,"path":37,"stem":38,"description":339,"children":-1},"时间戳和时值",{"title":44,"path":45,"stem":46,"description":341,"children":-1},"使用文档站内置的 LLM 支持",1773039576559]