1 Вопрос: Как использовать значения массива в качестве аргументов функции в sclang (в контексте отправки большого числа чисел с плавающей запятой через OSC)

вопрос создан в Wed, May 8, 2019 12:00 AM

Я хотел бы использовать массив с плавающей точкой в ​​качестве аргументов функции для OSC.sendMessage (). Например, в PHP я знаю о call_user_func_array (). Есть ли что-то подобное в sclang?

Суть в том, что я хотел бы отправить много значений с плавающей запятой через OSC из sclang в Unity. AFAIK невозможно напрямую встроить массив значений в сообщение OSC.

Я также открыт для предложений, если есть лучший способ добиться этого, так как я понимаю, что могут быть ограничения в отношении количества значений, которые я могу упаковать в 1 сообщение OSC, и, возможно, мне придется обрабатывать фрагментацию /охват по множеству сообщения сам.

Для фиксированного размера массива /количества аргументов я понял это:

(
var floats = [13.37, 31337.1337, 1.0];
{ | a, b, c | o.sendMsg("/LoadAudioData", a, b, c); }.valueArray(floats);
)

Но мне нужно более общее решение для разных размеров массива.

    
0
1 ответ                              1                         

В SuperCollider есть синтаксический сахар для распаковки массивов -

  1. Для вызовов функций:
(
var list = [1, 2, 3];
func(*list);  // equivalent to func(list[0], list[1], list[2])
)
  1. Для назначения:
var a, b, c;
#a, b, c = [1, 2, 3]; // equivalent to a=1; b=2; c=3;

И даже для вашего примера кода SC поддерживает синтаксис стиля пакета параметров для работы с массивами переменных:

(
var formatWarning = {
   |string, ...args| // where args becomes an array of all remaining variables
   string.format(*args).warn;
};
formatWarning.value("Too much % %!", "syntactic sugar", "for me");
    
0
2019-05-08 20: 34: 06Z
  1. Также имейте в виду, что если вы передаете массивизированные значения в аргумент синтаксиса, вам нужно сделать несколько специальных вещей - см. раздел «Аргументы буквенного массива» в файл справки SynthDef или справка NamedControl.
    2019-05-08 20: 36: 54Z
  2. Спасибо за это интригующее объяснение! Я только что понял, что эта распаковка не работает для FloatArrays, хотя она работает для списков. Итак, я получил что-то вроде этого: `` `(var arr = FloatArray [13.37, 3.3333333, 123.456]; var list = List.new (arr.size); for (0, arr.size-1, {arg i ; list.add (arr [i])}); list.postln; o = NetAddr.new ("127.0.0.1", 6969); o.sendMsg ("/LoadAudioData", * list);) `` `Также , кажется, есть максимальный предел значений, которые я могу поместить в одно сообщение OSC. Но это не в оригинальном объеме вопроса ... Большое спасибо, сэр!
    2019-05-09 13: 43: 19Z
источник размещен Вот