|
简介% I2 E% O! F1 k& k 3 H6 \/ ^, [9 M) J! n9 R 我做声音玩具的时间已经有很长一段时间了,并且受到demoscene的极端限制的启发,去年我开始最终回到低级编码,探索ARM / STM32平台的可能性。随着我对Forth和其他面向堆栈语言的不断研究,我很快想到可以为这些便宜的嵌入式ARM设备创建一个可编程(最终可实时编码)合成器环境。 1 y$ T# ^9 ^6 |* i j9 _( P& `3 p 我们的目标不是构建一个经典的VSTi类型的synth UI,而是构建一个音频引擎和类似于forth的DSL,用于定义DSP堆栈,并可选地为各种参数生成触摸屏GUI元素(如图所示),甚至是GPIO/sensor映射。DSL还允许集成传感器,更好地利用平台提供的外围设备……2 P( _$ r6 R9 Y 到目前为止,synth体系结构已经接近完成,并且已经重写了几次。DSL实现仍处于早期阶段 8 N$ [4 N+ C4 ^8 O3 ~- R' A 原始synth代码的中期发布和8月研讨会6 t: S# W! q$ h8 P7 h + O; }6 J+ O2 B9 d& \- S2 Y 作为一个临时的解决方案,由于最近几个月的工作阻碍了这个项目的研究,我决定将一些早期的、更稳定的版本放到这个Github repo中:http://thi.ng/synstack4 N: i9 K* G9 J) _7 M6 C 4 @( U( ?1 ^( C7 V 目前,这个repo包括一个基于早期节点图的迭代,但功能更丰富的synth引擎(包括8个示例)和第4个VM & REPL的早期版本。但是请注意,这个repo只包含可移植的synth代码,没有STM32细节。相反,为了让更多的人更容易地进行实验,所有的演示都使用Portaudio来支持在OSX/Linux上运行(Windows也是,但是没有经过测试)。" Q2 _; z7 y2 B. Q 6 N5 t& q1 | ~6 T+ _ 下个周末,我将运行STM32 synth workshop的另一个迭代,它可能会在这方面产生更多的更新…5 r) d9 L/ c$ l 7 `2 F( e. K) r- A 正确的项目名称和100%的例子 " |" w) G! k5 u1 C* r 由于该项目最近的所有工作都围绕着一个用于定义音频操作和生成synth语音的第4风格堆栈VM的想法,所以我最终决定将该项目命名为:Synstack。 3 k+ U/ E& u; ]+ j, I 堆栈VM相当功能现在也严重受经典JonesForth的线程代码实现,尽管到目前为止仍然用c语言编写更有用指导来自@phaendal很棒documentation-forth(即使它是日本)——这两个可能是我所知道的最有用的。到目前为止,还没有考虑到以实现ANS Forth兼容性为目标。; e7 m7 L4 t9 q% c9 L' p ; m; X0 l' D+ F5 [3 ~- S! v Synstack VM当前的大小为24-27KB。这包括一些音频相关的东西:振荡器、ADSR、IIR滤波器、回折失真,所有这些都是通过本身用途实现的。VM还具有浮点数支持、基本字符串操作和用户可定制的第四个单词内联(例如,加快var查找)例如:控制结构,变量和一个基本的反汇编器等特点。8 o' _ u& j! p L, k8 f6 q 以下单声道合成器代码的一些变化的音频结果可以在这里收听: 8 Y7 y7 W/ H: u. b4 `1 L; V9 Z http://soundcloud.com/forthcharlie/synstack-forth-seq-variations6 T& u( p" V6 {$ ^1 E7 j" _* z 音频管理器重复调用最后一个“update”单词,以提供32个样本的下一个时间片。到目前为止,我发现这是数十个操作符(特别是复调操作符)使用RAM和满足Cortex M-7高速缓存线之间的最佳平衡点,但是缓冲区大小是可定制的。在本例中,“update”字还充当简单的概率排序器,每150ms w/ 60%的概率触发一次新记录。在STM32上,所有这些都是通过DMA ISR回调触发的,在OSX上,我使用Portaudio作为测试的音频后端,它使用类似的方法…… ![]() MIDI支持和2x 8步音序器演示4 q/ `+ u: T7 }' ]* g- K; A 3 N+ ~6 C) y6 C9 e7 E 只是移植和扩展了MIDI步骤排序器演示从以前的STM32F401迭代到STM32F746,并更新了repo。7 a i6 Z7 ?4 u& s: F! ] Korg Nanokontrol配置如下: , ^$ Z+ U2 [" `! {- u1 |3 M" D9 @+ u# s -第一行按钮(“S”)用于音轨1的8步音序器 -第二行按钮(“M”)=>音轨2/ H# J1 e8 q% b3 Q! z) A% c T# |. { 7 K3 K. l) u. o/ u& K - 2最左滑块控制滤波器截止频率的音轨1和2 - m9 F7 z# L* x1 B4 B4 } - 2最左边的刻度盘控制每个滤波器的共振 $ a0 U' `& G% Q; e5 o - 3拨=>延时反馈 3 o/ Y0 w2 X2 a. y -第4和第5拨=音轨1和2的>攻击时间4 K! q2 P: i; e& v1 \& o -标记左/右=振荡器1的>变化波形(全磁道): `( |9 Q- y' s% `1 U -轨道左/右=>转置电流序列由-12,-5,0,+7或+12半音 -倒带,停止和播放按预期(当应用程序启动时,它处于暂停模式-你需要按下播放并激活至少一个“S”或“M”按钮)& z {% X: i) e% B 每个音序器音轨中播放的音符是从源代码中定义的音阶中随机选择的。如果你不喜欢一个音符,只需简单地去激活,然后再按下“S”或“M”按钮,得到另一个半随机音符…* f) {3 ]$ U, l+ J 伦敦工作坊 / t7 Q, F6 S$ ^/ T" x$ C; g 在光州ACT Festival的一个工作坊授课一周后,我们在伦敦的经验和例子上进行了重复和扩展,利用Korg NanoKontrol MIDI控制器及其faders上的按钮,构建了一个8步/ 2轨的音序器,用来控制各种滤波器和振荡器参数。从参与者那里得到了一些很好的反馈,然后专注于使用更通用的DSP操作符进行重新开发。还订购了STM32F7板与更快的CPU和触摸屏…4 _8 Q) ^; e) M9 W& b3 x 6 {4 R% N# V% g4 b+ ?& q 第一车间w/ STM32F746 2 u z& v9 h! J 使用synth最新迭代的第一个研讨会于上周末举行。Outcomes是一个新的轻量级GUI模块(即将作为单独的库发布),它也是第一次将synth与STM32F7 disco板的触摸屏设置结合起来。事实证明,轮询touchevents是一项非常昂贵的操作(就CPU周期而言),并迫使使用高优先级计时器(每2ms)来保持DMA半缓冲区中充满了新的音频数据。我录制了上次workshop的一个小现场会话,并上传到了这里: , r+ O5 M; @' D1 o+ U1 B! s 随着synth现在相当稳定,不久的将来将集中精力准备synth DSL的可用实现……+ g- y" d$ e, A0 G. U$ S1 | / e1 a Z% |; h: f) }* p" l% k3 W
20160215-synstack.pdf
(463.3 KB, 下载次数: 0)
|
【福利三:雨露均沾·逢7狂欢】之四:用一个定时器同步另外两个定时器输出PWM
【逢7发帖赢大礼】STM32开发之WIFI实时时钟
【逢7发帖赢大礼】STM32开发之指纹识别!
【逢7发帖赢大礼】STM32开发之环境空气质量监测
【逢7发帖赢大礼】STM32开发之人体实时运动信息监测!
【逢7发帖赢大礼】STM32开发之IC门禁卡UID读取方法!
【逢7发帖赢大礼】全网最简单的Arduino_STM32开发环境搭建教程!
STM32F4中文用户手册
STM32F400、STM32F402 Cortex-M4超值单片机
SPI 高温读错最后一位?STM32F42xx 官方根治方案
微信公众号
手机版