1 Câu hỏi: Cách sử dụng các giá trị mảng làm đối số hàm trong sclang (trong bối cảnh gửi nhiều float qua OSC)

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Tôi muốn sử dụng một mảng số float làm đối số hàm cho OSC.sendMessage (). Ví dụ: trong PHP tôi biết về call_user_func_array (). Có một cái gì đó tương tự có sẵn trong sclang?

Bối cảnh là tôi muốn gửi nhiều giá trị float qua OSC từ sclang đến Unity. AFAIK không thể nhúng trực tiếp một mảng các giá trị vào thông báo OSC.

Tôi cũng sẵn sàng nhận đề xuất nếu có cách tốt hơn để đạt được điều này vì tôi hiểu rằng có thể có các ràng buộc về số lượng giá trị tôi có thể đóng gói vào 1 tin nhắn OSC và có thể tôi phải xử lý phân mảnh /kéo dài qua nhiều lần tin nhắn bản thân.

Đối với số lượng đối số /kích thước mảng cố định, tôi đã tìm ra điều này:

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

Nhưng tôi cần một giải pháp chung hơn cho các kích thước mảng khác nhau.

    
0
1 Câu trả lời                              1                         

Có đường cú pháp trong SuperCollider để giải nén mảng -

  1. Đối với các cuộc gọi chức năng:
(
var list = [1, 2, 3];
func(*list);  // equivalent to func(list[0], list[1], list[2])
)
  1. Để chuyển nhượng:
var a, b, c;
#a, b, c = [1, 2, 3]; // equivalent to a=1; b=2; c=3;

Và, ngay cả đối với mã ví dụ của bạn, SC hỗ trợ cú pháp kiểu gói tham số để xử lý các mảng biến:

(
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. Ngoài ra, hãy lưu ý rằng nếu bạn chuyển các giá trị được phân mảng cho một đối số synth, bạn cần thực hiện một số điều đặc biệt - xem phần "Đối số mảng văn bản" của tệp trợ giúp SynthDef hoặc trợ giúp NamedControl.
    2019-05-08 20: 36: 54Z
  2. Cảm ơn lời giải thích hấp dẫn này! Tôi mới nhận ra rằng việc giải nén này không hoạt động đối với FloatArrays mặc dù nó hoạt động cho Danh sách. Vì vậy, tôi đã kết thúc với một cái gì đó như thế này: `` `(var Array = FloatArray [13.37, 3.3333333, 123.456]; var list = List.new (Array.size); for (0, Array.size-1, {arg i ; list.add (Array [i])}); list.postln; o = NetAddr.new ("127.0.0.1", 6969); o.sendMsg ("/LoadAudioData", * list);) `` `Ngoài ra , dường như có giới hạn tối đa của các giá trị tôi có thể đặt vào một thông báo OSC. Nhưng đó không phải là trong phạm vi ban đầu của câu hỏi ... Cảm ơn rất nhiều thưa ngài!
    2019-05-09 13: 43: 19Z
nguồn đặt đây