Абстракция Pure Data для приема n аргументов

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

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

введите здесь описание изображения

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

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


person Chris Marais    schedule 02.05.2020    source источник
comment
Возможный дубликат stackoverflow.com/questions/48766671/   -  person Max N    schedule 03.05.2020


Ответы (1)


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

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

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

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

скриншот pf pd patch, показывающий, что expr не нужен

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

Фильтрация MIDI на основе номера контроллера

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

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

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

получить количество аргументов

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

person Max N    schedule 03.05.2020
comment
Это решение намного лучше, поэтому мне не нужна моя абстракция с n аргументами. Кстати, похоже, что объект [route] принимает n аргументов — интересно, как это было реализовано? - person Chris Marais; 04.05.2020
comment
Для основных ванильных объектов или внешних объектов не проблема принимать переменное количество аргументов. Многие объекты, такие как [триггер] [выбрать] [упаковать] [распаковать] ведут себя таким образом и соответственно создают ряд кслетов. Просто сложно исправить такое поведение для абстракций. - person Max N; 04.05.2020
comment
Максим, спасибо, очень помогло. [route] кажется очень полезным объектом, который я до сих пор не в полной мере оценил - person Chris Marais; 05.05.2020