在CNMAT单块效果器2.0正在设计,编程,并通过音乐和计算机科学专业卢克dzwonczyk组装与CNMAT的杰里米·瓦格纳教授埃德蒙·坎皮恩的支持。卢克完成音乐158a和158b其中的音乐有资格在他的音乐和技术“的发现体验”到CNMAT和音乐计划的部门参加,以增加研究和本科顶峰项目涉及音乐和技术在CNMAT。  

注:该项目目前正在进行中 - 这个网页被更新,不断反映项目的最新阶段。

摘要

The CNMAT Stompbox, created by Jeremy Wagner in 2017, is a fully built and functional system for getting lots of switches into Max via USB serial connection. Initially conceived for foot pedal controllers, the CNMAT Stompbox provides robust TS & TRS connections for up to 12 momentary switches (such as sustain pedals) and 10 continuous controllers (such as expression pedals).  A description of the Stompbox 1.0 and the process of creating it can be found at //www.cewekina.net/projects/cnmat-stompbox-lots-pedals-max
 
升级到2.0单块效果器的设计包括以下主要变化:

  1. 更换用网络连接的USB串行连接,从物理地拴在计算机上释放的单块效果器
  2. 处理的踏板输入的读出和校准逻辑与的Arduino代码代替最大补丁的

 

这些变化涉及到一个WiFi功能的espressif esp32微控制器的更换teensy板,并使用内置UDP和CNMAT OSC为Arduino的库创建。

介绍

的问题,即踏脚转盘尝试解决的第二次迭代是减少长导线线路。的踏脚转盘1.0通过USB电缆连接到计算机。然而,USB电缆具有15英尺的最大距离。 ESTA提出了一个问题:如果计算机是从踏板超过15英尺处,随即将单块效果器不能被旁边的踏板位置,但必须在电脑附近相反。埃斯塔力用户运行所有从脚蹬踏板电缆(可能是高达22线)一路到单块效果器,这可能是许多英尺远。通过完全除去USB电缆,将单块可以在舞台上放置时踏板和计算机可以是几乎任何地方。这就是所述单块2.0实现通过使用esp32微控制器,其具有WiFi功能。通过使用OSC和UDP Arduino的库,和最大的内置UDPsend和udpreceive对象,可以OSC发送的数据包在网络上很容易地从单块效果器到计算机。

两个主要的改动就是使用无线网络而不是从单块效果器USB线输出的数据,和更换用Arduino的代码最大补丁所做的逻辑来实现。 cnmat.o.stompbox最大补丁读取在teensy板模拟引脚和打包成捆ODOT是那样的贴片的输出。此外,它处理的踏板的校准。现在,销的读取和校准逻辑在Arduino是完成的。销使用内置函数analogRead()和校准开始当接收esp32消息从OSC最大值随着/校准地址到9月1日读取。

 
OSC的图书馆

该项目的主要部分是OSC的esp32和MAX之间发送消息。这是全部采用由阿德里安弗里德写Arduino的OSC库完成。实现是相当简单的。第一,oscbundle被创建的对象。 

oscbundle bndl_out;
 
然后,当一个值被读出掉esp32,oscmessage创建一个对象并使用oscbundle.add()函数添加到包。 
 
bndl_out.add( “/数字/ 0”)加(1).;
 

11个所有的OSC消息,一个用于每个输入,被添加到包,它使用的是oscbundle.send(wifiudp)方法发送出去。 

 
bndl_out.send(UDP);
 
 

校准 

数字和模拟引脚需要进行校准。校准是必要的,因为单块效果器有各种不同品牌和类型的脚踏板的工作,我们不能假定每个踏板相互作用以相同的方式esp32。当校准开始接收的OSC消息esp32随着/校准地址设置为1,在这一点上,10秒的校准周期开始。

在环()函数,UDP等待接收,并从最大解析的分组。当它,它读取在UDP包作为oscbundle,则调用调度()方法来校准该呼叫。

 

oscbundle bndl_in;

INT bndl_in_size;

//如果一个UDP数据包已经-被接收,解析它

if ((bndl_in_size = Udp.parsePacket()) > 0) {

    //读取UDP包作为oscbundle

    而(bndl_in_size--){

        bndl_in.fill(udp.read());

    }

    //调用口径()方法oscmessage与地址/校准

    bndl_in.dispatch( “/校准”,校准);