接受 n 个参数的纯数据抽象

Pure Data abstraction to take n arguments

我创建了一个纯数据抽象,它将 5 个 MIDI 控制器 ID 作为参数,并有两个入口(速度和 MIDI 控制器)。如果 MIDI 控制器 ID 与抽象的第 i 个参数匹配,我使用 spigot 在出口 i 输出输入速度。

我用它来控制我的 MIDI 控制器的 5 个滑块(音量、起音、衰减、延音、释放),它们看起来像这样:

如您所见,抽象是非常重复的,理想情况下它可以接受 n 个参数,在第 i 处输出给定 MIDI 滑块的滑块值出口。或者我可以只使用一个参数并为每个滑块重新使用抽象,但这也有点重复。

有没有办法在我的抽象中使用 n 个参数?或者,是否还有其他更优雅的解决方案来控制我缺少的 MIDI 滑块?

对于核心 vanilla objectsexternals 来说,采用可变数量的参数是一个常见的特征。 [trigger][select][pack][unpack] 等许多对象都以这种方式运行,并根据给定的参数数量创建多个 xlet。

然而,对于 abstractions,没有简单的方法可以根据给定的参数数量来获得可变数量的输出。这是可能的,但它更像是一个 hack。

让我们先来看看一些使补丁更容易的技巧。

正如您在下面的屏幕截图中看到的,补丁中的 [expr] 对象可以轻松地替换为简单的 Pd 对象:[==]

让我们看看 MIDI 信息。 MIDI 对象输出分层树的元素:channelcontrollervalue 按此顺序但从从右到左(对于 Pd 中的所有对象都是如此,最右边的出口首先触发)。你想要的是根据控制器编号路由它们,忽略通道编号。为此,您需要翻转前两个插座的顺序,以便您可以将控制器编号用作列表中的选择器。一种方法是打包数字,然后使用美元符号在消息中对它们重新排序(注意,消息对象中的美元符号对本地消息起作用,它们与美元符号在对象框中的作用无关)。另一种方法是使用对象 [swap](在这种情况下使用 [swap] 会将补丁中的对象数量减少一个,但是 [pack][message( 更多多才多艺,这就是我在这里展示它的原因)。

关于采用 n 个参数来改变插座数量的实际问题:这个挑战是两个独立的问题:

  1. 如何检测参数个数
  2. 如何动态更改网点数量

直到最近,还没有一种正确的方法来检测参数的存在。由于 Pd 0.50 有 [pdcontrol] 这正是允许的。

在这里使用 [initbang] 因为 [loadbang] 会触发得太晚而无法创建出口。 挑战的第二部分可以通过称为“”的技术或通过输出列表而不是创建额外的出口来解决。然而,对于列表输出,您需要在之后对其进行路由,然后您将快速到达上图所示的补丁。