接受 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 objects 或 externals 来说,采用可变数量的参数是一个常见的特征。 [trigger]
、[select]
、[pack]
或 [unpack]
等许多对象都以这种方式运行,并根据给定的参数数量创建多个 xlet。
然而,对于 abstractions,没有简单的方法可以根据给定的参数数量来获得可变数量的输出。这是可能的,但它更像是一个 hack。
让我们先来看看一些使补丁更容易的技巧。
正如您在下面的屏幕截图中看到的,补丁中的 [expr]
对象可以轻松地替换为简单的 Pd 对象:[==]
让我们看看 MIDI 信息。 MIDI 对象输出分层树的元素:channel、controller、value 按此顺序但从从右到左(对于 Pd 中的所有对象都是如此,最右边的出口首先触发)。你想要的是根据控制器编号路由它们,忽略通道编号。为此,您需要翻转前两个插座的顺序,以便您可以将控制器编号用作列表中的选择器。一种方法是打包数字,然后使用美元符号在消息中对它们重新排序(注意,消息对象中的美元符号对本地消息起作用,它们与美元符号在对象框中的作用无关)。另一种方法是使用对象 [swap]
(在这种情况下使用 [swap]
会将补丁中的对象数量减少一个,但是 [pack]
和 [message(
更多多才多艺,这就是我在这里展示它的原因)。
关于采用 n 个参数来改变插座数量的实际问题:这个挑战是两个独立的问题:
- 如何检测参数个数
- 如何动态更改网点数量
直到最近,还没有一种正确的方法来检测参数的存在。由于 Pd 0.50 有 [pdcontrol]
这正是允许的。
在这里使用 [initbang]
因为 [loadbang]
会触发得太晚而无法创建出口。
挑战的第二部分可以通过称为“”的技术或通过输出列表而不是创建额外的出口来解决。然而,对于列表输出,您需要在之后对其进行路由,然后您将快速到达上图所示的补丁。
我创建了一个纯数据抽象,它将 5 个 MIDI 控制器 ID 作为参数,并有两个入口(速度和 MIDI 控制器)。如果 MIDI 控制器 ID 与抽象的第 i 个参数匹配,我使用 spigot
在出口 i 输出输入速度。
我用它来控制我的 MIDI 控制器的 5 个滑块(音量、起音、衰减、延音、释放),它们看起来像这样:
如您所见,抽象是非常重复的,理想情况下它可以接受 n 个参数,在第 i 处输出给定 MIDI 滑块的滑块值出口。或者我可以只使用一个参数并为每个滑块重新使用抽象,但这也有点重复。
有没有办法在我的抽象中使用 n 个参数?或者,是否还有其他更优雅的解决方案来控制我缺少的 MIDI 滑块?
对于核心 vanilla objects 或 externals 来说,采用可变数量的参数是一个常见的特征。 [trigger]
、[select]
、[pack]
或 [unpack]
等许多对象都以这种方式运行,并根据给定的参数数量创建多个 xlet。
然而,对于 abstractions,没有简单的方法可以根据给定的参数数量来获得可变数量的输出。这是可能的,但它更像是一个 hack。
让我们先来看看一些使补丁更容易的技巧。
正如您在下面的屏幕截图中看到的,补丁中的 [expr]
对象可以轻松地替换为简单的 Pd 对象:[==]
让我们看看 MIDI 信息。 MIDI 对象输出分层树的元素:channel、controller、value 按此顺序但从从右到左(对于 Pd 中的所有对象都是如此,最右边的出口首先触发)。你想要的是根据控制器编号路由它们,忽略通道编号。为此,您需要翻转前两个插座的顺序,以便您可以将控制器编号用作列表中的选择器。一种方法是打包数字,然后使用美元符号在消息中对它们重新排序(注意,消息对象中的美元符号对本地消息起作用,它们与美元符号在对象框中的作用无关)。另一种方法是使用对象 [swap]
(在这种情况下使用 [swap]
会将补丁中的对象数量减少一个,但是 [pack]
和 [message(
更多多才多艺,这就是我在这里展示它的原因)。
关于采用 n 个参数来改变插座数量的实际问题:这个挑战是两个独立的问题:
- 如何检测参数个数
- 如何动态更改网点数量
直到最近,还没有一种正确的方法来检测参数的存在。由于 Pd 0.50 有 [pdcontrol]
这正是允许的。
在这里使用 [initbang]
因为 [loadbang]
会触发得太晚而无法创建出口。
挑战的第二部分可以通过称为“