Чистая абстракция данных для n аргументов - PullRequest
1 голос
/ 02 мая 2020

Я создал абстракцию Pure Data, которая принимает 5 идентификаторов MIDI-контроллера в качестве аргументов и имеет два входа (скорость и MIDI-контроллер). Я использую spigot для вывода входной скорости на выходе i , если идентификатор MIDI-контроллера соответствует i -ому аргументу абстракции. Screenshot of Pd patch

Я использую это для управления 5 ползунками (громкость, атака, затухание, сустейн, релиз) с моего MIDI-контроллера, которые выглядят так:

enter image description here

Как видите, абстракция очень повторяющаяся, и в идеале она могла бы принимать n аргументов, выводя значение слайдера данного MIDI-слайдера на я й выход. В качестве альтернативы я мог бы просто использовать один аргумент и заново использовать абстракцию для каждого слайдера, но это тоже немного повторяется.

Есть ли способ взять n аргументов в моей абстракции? Или есть какое-то более элегантное решение для управления слайдерами из MIDI, которое мне не хватает?

1 Ответ

2 голосов
/ 03 мая 2020

Для базовых ванильных объектов или внешних это обычная возможность принимать переменное количество аргументов. Многие объекты, такие как [trigger], [select], [pack] или [unpack], ведут себя таким образом и создают количество xlets в соответствии с тем, сколько аргументов им дано.

Для абстракций однако, не существует простого способа иметь переменное количество выходов в зависимости от количества аргументов. Это возможно, но это скорее взлом.

Давайте сначала посмотрим на некоторые приемы, которые упростят патчи.

Как вы можете видеть на следующем скриншоте, объект [expr] в вашем патче может легко заменяется простым объектом Pd: [==]

screenshot pf pd patch showing expr isn't necessary

Давайте посмотрим на сообщения MIDI. Объекты MIDI выводят элементы иерархического дерева: канал , контроллер , значение в этом порядке, но справа налево (верно для всех объектов в Pd, крайняя правая розетка срабатывает первой). То, что вы хотите, это направить их в соответствии с номером контроллера, игнорируя номер канала. Для этого вам нужно изменить порядок первых двух розеток, чтобы вы могли использовать номер контроллера в качестве селектора в списке. Один из способов сделать это - упаковать числа и затем изменить их порядок в сообщении, используя символы доллара (осторожно, символы доллара в объектах сообщений работают с локальными сообщениями, они не имеют ничего общего с тем, что делают символы доллара в ящиках объектов). Другой способ - использовать объект [swap] (использование [swap] в этом случае уменьшит количество объектов на единицу в патче, но [pack] и [message( более универсальны, поэтому я покажу его здесь ).

MIDI filtering based on controller number

По фактическому вопросу о принятии n аргументов для изменения количества торговых точек: эта задача представляет собой две отдельные проблемы :

  1. Как определить количество аргументов
  2. Как динамически изменить количество торговых точек

До недавнего времени не было правильного способа способ обнаружить наличие аргументов. Начиная с Pd 0,50 [pdcontrol], что позволяет именно это.

get number of arguments

Использование здесь [initbang], поскольку [loadbang] срабатывает слишком поздно для создания розеток. Вторая часть задачи может быть решена либо с помощью метода, называемого dynamici c patching , либо путем вывода списка вместо создания дополнительных точек. Однако с выходным списком вам нужно будет направить его потом, и тогда вы быстро придете к патчу, изображенному выше.

...