GitHub - lfnoise/sapf: 声音作为纯粹形式 - 一种用于音频合成的类似 Forth 的语言,使用惰性列表和类似 APL 的自动映射。

这是一个名为“A tool for exploring sound as pure form.”或“sound as pure form”或“sapf”的程序,是用于创建和转换声音的语言的解释器。

  • 语言特点: mostly functional,stack based,使用类似 FORTH 的后缀表示法,用惰性、可能无限的序列表示音频和控制事件,能对惰性序列进行高级操作,几乎所有程序员可访问的数据类型都是不可变的,易于运行多个线程。
  • 灵感来源:APL、Joy[1]、Haskell、Piccola[2]、Nyquist[3]、SuperCollider[4]。APL 虽因怪异符号和语法遭诟病,但因其自动映射操作和数组内迭代的方式而强大。Joy 语言引入了连接式函数式编程,后缀表示法语法最少。
  • 快速设置:将 sapf 程序放入 ~/bin 或其他命令保存位置,移除 Apple 的 quarantine 属性,设置环境变量,如 SAPF_HISTORY、SAPF_LOG 等,阅读 README。
  • 命令行:sapf [-r sample-rate][-p prelude-file],-r 设置会话采样率,默认 96000Hz,-p 加载前奏文件,-h 打印帮助,还有环境变量如 SAPF_PRELUDE 等。
  • 内置函数帮助:输入“helpall”获取所有定义函数列表,“\`someword help”获取特定内置函数帮助。
  • 示例:播放 800Hz 正弦波等,可在“examples”文件中查看更多。
  • 数据类型:有 Real(64 位双精度浮点数)、String(字符字符串)、List(有序值列表,可作为数组和惰性无限序列)、Form(映射符号名到值的对象)、Function(函数值)、Ref(可变值容器)。
  • 语法:表达式为后缀形式的单词序列,按左到右顺序执行,单词执行时查找绑定值,函数值应用,非函数值压入栈。
  • 注释:以分号开头,到行末结束。
  • 数字:有多种写法,如科学计数法、后缀缩放等。
  • 字符串:用双引号括起来,有换行和制表符表示。
  • 引号:不同引号有不同作用,如反引号不应用函数,单引号推送符号本身,逗号从栈顶对象中查找符号值并压入栈,点从栈顶对象中查找符号值并应用等。
  • 函数:以反斜杠开头,后跟参数名列表和函数体,可使用!运算符应用,可赋值给单词,可选帮助字符串,函数体在空栈上执行,参数值通过命名参数访问。
  • 列表:用方括号创建,有值列表(“streams”)和数字列表(“signals”),信号用#开头,列表可自动映射。
  • Forms:类似字典,用花括号括起来,键用冒号前缀,支持继承,可用于函数返回多个值的绑定。
  • 自动映射:许多内置运算符可对信号或列表自动映射,多个参数自动映射时结果长度为最短列表长度,可对无限列表进行自动映射。
  • “each”运算符:用@标记栈顶值,使后续函数对其值进行操作,可用于做外积等,还有有序 each 运算符可进行嵌套循环,可使用@@等进行多层映射,列表的 Forms 可通过 each 运算符构建,列表的列表可在列表构造语法中使用 each 运算符创建。
  • 多通道扩展:用于处理信号的运算符的自动映射,如 saw 振荡器可对列表进行立体声扩展。
  • 减少和扫描数学运算符:对于双参数数学运算符,添加正斜杠变为列表减少运算符,添加反斜杠变为列表扫描运算符,添加脱字符以成对方式工作。
  • 参考文献:列出了相关语言和相关论文的链接。
阅读 9
0 条评论