如何开始为Mutable Instruments Clouds编写自己的固件

在过去的几个月中,我一直在学习使用Mutable Instruments Clouds合成模块进行DSP编程的基础。 这很有趣,并且想分享我学到的东西。

我的业余编码背景主要是在Arduino上使用其非常友好的编程环境,因此对C ++的使用和命令行工具的使用对我来说是新的。

我对此主题的所有了解都在这篇文章中,所以除了这里所写的内容,我无济于事。 阅读Mutable Instruments Clouds开源页面上的免责声明:

“到目前为止,我们假设您知道自己在做什么,并且对模块的任何损坏不承担任何责任!”

您需要开始什么:硬件

  • 可变仪器云模块(我从Post Modular购买了我的模块)
  • 一台电脑。 这些说明假定您使用的是Mac,但也可以使用PC或Linux计算机。
  • 程序员。 我使用的是ST-Link V2,价格约为60英镑。 Olivier Gillet使用的Olimex ARM-USB-OCD-H JTAG价格大致相同。 还有更便宜的方法-您可以在亚马逊上以7.99英镑的价格购买其他品牌的ST-Link V2,或者某些内置有硬件的开发板。这些更便宜的工具可能有用,我不知道。 我希望少做一件事情,所以买了真实的东西。
  • 您还需要此Olimex JTAG适配器以适合Mutable Instruments模块背面的细针。 它的价格约为8英镑。

PS:您无需购买程序员就可以开始使用。 我们将要使用的工具可以为Clouds手册中描述的音频固件更新方法创建.wav文件。 但是,整个过程(创建.wav并将其上传到模块中)需要3-4分钟,在尝试编写和测试代码时,我会觉得很烦。

PPS:如果您只是想学习DSP编码,还有许多其他便宜的平台,包括Teensy,Axoloti或Bela。

入门:安装环境

可变开发环境由Olivier Gillet创建,旨在帮助人们为可变模块编写固件。

它是这样工作的:使用名为VirtualBox和Vagrant的免费工具,在运行Linux的计算机内部创建虚拟机。 所有艰苦的工作-编译固件,将其上传到模块中-由Linux机器完成。 您可以使用Terminal通过命令行控制计算机。

对于任何想要为Mutable Instruments模块编写固件的人来说,这都是一种很好的方式,它无需安装和配置许多工具即可访问Olivier Gillet的安装程序的复印本。

一个目录(在本例中为GitHub上整个Mutable Instruments Eurorack固件存储库的副本)在虚拟机和普通OSX系统之间共享-因此您可以编辑该文件夹中的文件,虚拟机可以查看并使用它们来编译固件。

该系统已经很好地编写了文档,并且对我来说运行良好,对于Linux来说是一个完整的菜鸟,命令行或设置环境-请阅读这些说明以及环境GitHub页面上的说明。

  1. 下载Mutable Environment文件。单击此链接到GitHub页面,然后单击绿色的“克隆或下载”按钮。 选择“下载ZIP”。 打开zip文件,并将文件夹放在安全的地方。 我在Documents中创建了一个“ MutableEnvironment”文件夹,其中的“ mutable-dev-environment-master”文件夹未更改。
  2. 安装软件请遵循Mutable Development Environment GitHub页面中有关VirtualBox,VirtualBox Extension Pack和Vagrant的链接。 我发现所有这三个组件均已正常安装,并且不需要使用扩展包的命令行。
  3. 获取一个我一直在使用Text Wrangler 的文本编辑器 ,它是免费的,并且可以正常运行,就像其他许多版本一样。
  4. 在终端中打开将文件保留在其中的文件夹。如果像我在终端上一样笨拙,则可以这样做:
    1.启动终端。
    2.安排一个查找程序窗口,以便您可以看到“ mutable-dev-environment-master”文件夹。
    3.在终端中,键入“ cd”(更改目录),然后按空格键。
    4.将“ mutable-dev-environment-master”文件夹拖到终端窗口中。
    5.在“终端”窗口中按回车键,提示将显示您现在位于正确的目录中。
    6.键入“ ls”,然后按回车键以查看文件列表,以确保确定。
  5. 启动环境所有详细信息都在GitHub文档中,但是非常简单:您键入“ vagrant up”,系统就可以构建虚拟机了-第一次需要15至30分钟。 不要不耐烦,尝试取消它。 然后键入“ vagrant ssh”进入虚拟机。 现在,如果您输入“ ls”,您将在Mutable Instruments GitHub中看到所有文件的列表。 辫子,树枝等
  6. 检查共享文件夹如果返回Finder,并查看mutable-dev-environment-master,您将找到一个名为“ eurorack-modules”的文件夹。 这是共享文件夹。 在此处编辑文件,编译并通过虚拟机上传它们。
  7. 试用一下,如文档所述,如果键入“ make -f cloud / bootloader / makefile hex”并按回车键,则系统应该消失并为Clouds编译bootloader。 系统创建的文件出现在“’eurorack-modules”内部的“ build”文件夹中
  8. 如果不起作用怎么办? 好吧,除了返回并再次阅读GitHub文档,我无法为您提供帮助。 您可以尝试 Mutable Instruments论坛中搜索任何错误代码,或要求加入Facebook群组,例如“ Euro SMD DIY Noobs”。

将代码上传到Clouds模块

下一步是连接到模块。

我使用的是ST-Link V2。 驱动程序包含在环境中,但是在上传任何内容之前,您必须按照以下自定义说明来告诉系统您正在使用哪个程序员。 每次启动系统时,我都必须输入:

 导出PGM_INTERFACE = stlink-v2 
导出PGM_INTERFACE_TYPE = hla

要检查系统是否可以看到您的编程器,请键入“ lsusb”,其中将列出所有连接的USB设备。

连接到模块

  1. 云需要同时使用模块化机箱 STLink USB连接来供电,以接收固件。 我在机箱中安装了我的机壳,后背悬挂有STLink,USB电缆伸入了计算机。
  2. 带红色Red Olimex适配器的电缆没有明确标记。 对我来说,标记为1的引脚似乎已连接到Clouds模块上标记为JTAG的引脚。 我尝试了两种方式,但没有炸毁(但反而没有用)。

您可以编译代码并使用以下命令将其上传:

  make -f cloud / makefile上传 

尽管我发现这行不通-它给出了一个错误-所以我必须使用此命令:(感谢bennelong.bicyclist的论坛提示)

 制作-f云/制作文件upload_combo_jtag 

因此,在开发代码时,我的工作流程是这样的:在Text Wrangler中编辑文件,按cmd + s保存,然后切换到终端并按向上箭头以返回我使用的最后一个命令,这不可避免地是“ make- f cloud / makefile upload_combo_jtag”。

按回车键,系统检查错误,编译代码并将其放入模块中。 大约需要30秒,这仍然是一个令人讨厌的时间。 在此期间,模块冻结并发出奇怪的声音。 终端显示一些令人担忧的消息,例如“当前模式:处理程序HardFault”和“调用了关闭命令”,但这很正常。

让我们写一些代码:Hello World for Clouds

当我开始学习使用Arduino时,就像大多数人一样,我从“眨眼”开始:

 无效设置 (){ 
pinMode(13,输出); // LED连接到引脚13
}
无效循环 (){
digitalWrite(13,HIGH); //打开LED
延迟(1000); //等待一秒钟
digitalWrite(13,LOW); //关闭LED
延迟(1000); //等待一秒钟
}

“眨眼”是经典的Hello World。 一旦工作了,您就可以看一下代码,说出类似“如果我将第一个delay(1000)更改为delay(100)会发生什么?”,然后,您正在编码。

Olivier的Clouds代码与“ Hello World”几乎相反。 它经过精心组织,适当优化,并且经常(对于像我这样的新手编码人员而言)令人困惑。

幸运的是,我有办法。

我最近遇到了计算机科学家Matthias Puech,他为可变模块编写了Parasites替代固件(还为Xaoc Devices Batumi编写了代码)。

我问了Matthias从哪里开始,而且-非常慷慨-他为Clouds撰写了“ Hello World”。 这是个简单的clouds.cc版本(单击“原始”或“下载ZIP”以获取代码)。

如果使用此代码替换现存版本的clouds.cc(它仍必须命名为clouds.cc),则保持所有其他内容不变,然后编译并将其上传到模块,您应该立即看到闪烁的橙色和绿色LED指示灯的模式。

这个“ Hello World”的作用是:

  • 闪烁LED
  • 将“左”输入输入到“左”输出,其音量由“位置”控件控制(就像无源衰减器一样!)
  • Ring调制左和右输入,将结果发送到右输出。

一旦您开始使用Hello World,您就可以开始玩乐了。 在最广泛的意义上,“有趣”一词。

让我们编写一些代码:进行更改

当您阅读Hello World代码时,它分成清晰的块。

  1. 顶部是许可证,以注释形式。
  2. 然后有各种设置行,引入外部库并执行我尚不了解的操作。
  3. 创建了一个变量(计数器),将在以后使用。
  4. 然后找到一个名为SysTick_Handler的函数。 正如注释所解释的,该块中的任何内容都被称为毫秒。 这里可能会发生一些人机界面操作,例如检查旋钮,打开和关闭LED。 它们不是时间紧迫的,因此不需要经常发生。
  5. 在其下方是一个名为FillBuffer的函数。 这是模块的跳动的心脏。 它称为每32个样本,即每秒1500次,它是系统填充编解码器缓冲区的地方,该编解码器将音频输入输入并发送音频输出。
  6. 在FillBuffer内部是while(n —)循环; 在这里处理每个样本,因此每秒必须运行48,000次。
  7. 下面是Init(),它在模块启动时运行一次,并在其中设置采样率等。
  8. 最后在底部是main(void),它是空的main循环,在计时器使所有其他例程正常工作时不执行任何操作。

现在,终于,一切就绪,您可以开始进行更改。

在SysTick_Handler中,找到以下行:

  //一些有趣的LED动画 
for(int i = 0; i <4; i ++){

将4更改为3,编译并上传到模块。 现在您不再有4盏灯发光,而是有3盏灯。

恭喜你 您正在编写自己的固件。

现在您可以真正开始尝试了。 在发现有趣的事物之前,不要害怕改变事物并进行试验。

建立一个简单的延迟

您可以使用带有以下命令的数组来创建非常简单的延迟:

  //创建一个具有一秒钟音频空间的数组 
  uint32_t delayLength = 48000; 
int16_t delayLine [48000];
  //创建变量以存储记录和播放位置 
//为此使用浮点数,因为我们可能想要它们
//移动得更快或更慢。
//开始播放记录头的一个样本*
//他们将陷入循环。
  double recordHead = 0; 
double playHead = 1;
  //将Left输入写入延迟线 
  //使用模“%delayLength”表示它写在一个循环中 
//从头到尾再次从头开始
  //使用(long)将float转换为整数,您不能 
//使用浮点数在数组上设置索引
  delayLine [(long)recordHead%delayLength] =输入-> l; 
recordHead ++;
  //读取延迟线的Left输出 
  output-> l = delayLine [(long)playHead%delayLength]; 
playHead ++;

您可以在固件中看到这些命令一起工作。 左声道只是一个1秒钟的音频延迟-输入的任何内容都会在1秒钟后出现。

显而易见的下一步是混合干净信号并添加反馈。 通过其他一些步骤(包括学习线性插值),您可以创建类似以下内容的荒谬方法:

这个黑云面板来自“喜p模块化”。

我沿途学到的东西,不分先后

  • 音频以16位整数(int16_t)的形式传入和传出; -32,768至32,767。 信号处理通常以32位浮点数完成; 其中-1至+1表示信号。 在两者之间转换:
  int16_t y = static_cast (x * 32768.0); 
浮点y =静态强制转换(x)/ 32768.0;
  • 将两个音频信号加在一起就像混合。 将它们相乘就像振幅(环形)调制一样。 在这两种情况下,您都需要事后进行除法,以确保输出不会被裁剪(还有其他方法可以做到这一点。)
  • 当您发现“错误”时,您会在输出端听到怪异的crack啪声-例如,如果数字溢出并经常产生意外结果,那么在48khz处发生的声音就像怪异的crack啪声。 有时,奇怪的crack啪声听起来很有趣。 有时错误听起来很棒。
  • 电位器和CV输入产生零对一的浮点数。 这就是为什么将输入乘以电位器位置可以用作衰减器的原因。 您可以在enum_AdcChannel中找到可用输入的列表。
  • 此代码与简单的Arduino代码之间的最大区别是,它被设计为非阻塞的。 Arduino代码通常一次只做一件事。 如果调用“ delay(1000)”,则整个系统将停止并等待。 Olivier的Clouds代码工作方式不同。 如果您调用“ adc.Convert()”,系统将关闭以读取所有电位计和CV输入,这需要数百微秒的时间,但是它仍然能够同时执行其他操作(例如播放音频)。
  • 随着您变得更加自信,请开始阅读其余的Clouds固件,以找到许多有用的例程和想法。

后续步骤和进一步阅读

到目前为止,这确实是我所能做到的。 我正在逐步浏览Curtis Roads的《计算机音乐教程》,并浏览诸如musicdsp.org之类的网站。

感谢您阅读本文,如果您到此为止,请在回复中发布指向您的发明的链接。