Τo πρωτόκολλο OSC αποτελεί απαραίτητο εργαλείο. Το πως θα το εισάγουμε στην εφαρμογή μας αποτελεί ένα ερώτημα υπο μελέτη. Οι δυο πρώτοι τρόποι που μου έρχονται στο μυαλο για να γίνει αυτό είναι οι ακόλουθοι:

  1. Δημιουργία wrapper 1 της βιβλιοθήκης ofxOsc του openFrameworks.
  2. Αποστολή - απολαβή OSC μηνυμάτων χρησιμοποιόντας την γλώσσα Lua.

H πρώτη μέθοδος δείχνει πιο προσιτή λόγω του ότι δεν θα απαιτείται απο τον χρήστη εγκατάστασης της βιβλιοθήκης osc της Lua.

Οπότε εισάγουμε στο Wrapper τον παρακάτω κώδικα για να αρίσουμε τις δοκιμές:

class_<ofxOscLua>("osc")
 .def(constructor<>())
 .def("setup", (void(ofxOscLua::*)()) &ofxOscLua::setup)
 .def("update", (void(ofxOscLua::*)()) &ofxOscLua::update)
 .def("resp", (void(ofxOscLua::*)(string)) &ofxOscLua::resp)
 .def("var", (float(ofxOscLua::*)(string)) &ofxOscLua::var),

Send OSC messages through script

Το συντακτικό απο την στιγμή που δημιουργούμε ένα πρότυπο το ofxOscLua αλλάζει και γίνεται, έξω απο τα function

sender = of.osc()
-- και για τις μεθόδους τoυ προτύπου χρησιμοποιούμε το συντακτικό:
sender:setup()
-- και για την αποστολή μηνυμάτων
sender:sendMsg("gea__1")
sender:sendMsg("gea__2")
sender:sendMsg("varName_A", 155)
sender:sendMsg("varName_B", 15)

Ένα απο τα προβλήματα που έχουμε να αντιμετωπίσουμε είναι τα περιεχόμενα του κάθε OSC μηνύματος. Μέχρι στιγμής δηλώναμε στο wrapper οτι η συγκεκριμένη function έχει παράδειγμα 3 ορίσματα πραγματικούς αριθμούς.

def("translate", (void(*)(float,float,float)) &ofTranslate)

Προσωρινά δίνετε η δυνατοτήτα αποστολής μηνυμάτων όπως παραπάνω.

Receive OSC messages in the script

Η συγκεκριμένη εφαρμογή είναι απαραίτητη και πολύ χρήσιμη για GEA λόγω του ότι έτσι θα μπορούμε να ελέγχουμε και να τροποποιούμε της μεταβλητές, παράμετρους του script έξω απο το script συναρτήση παραδείγματος χάρη των χαρακτηριστικών του ήχου.

Μεχρι στιγμής έχει επιτευχθεί να δημιουργείς responders μεσω scripting και να λαμβάνονται οι τιμές απο το GEA αλλα δεν μπορούμε να τις έχουμε στο script.

Σε απάντηση απο issue στο ofxLua (https://github.com/danomatika/ofxLua/issues/12) ο Stewart υπέθεσε η amp() function

Dan solution from issue

Xcode is telling you the problem. You probably built the project as 64 bit, then switched to 32. The ofxLua Luabind xcodeproject was not rebuilt for 32 and the linker couldn't link the 64 bit luabind lib with your 32 bit app. In the future, just clean and rebuild the project, in the menu Product->Clean or SHIFT+CMD+K.

As for osc bindings, see https://github.com/danomatika/ofxLua/blob/master/src/ofxLua.h#L109 for info on how to write your own. Luabind makes it pretty easy.

This is what I'm using a project:

module(lua, "osc")
[
///////////////////////////////
/// \section Osc

def("send", &send),
def("sendFloat", &sendFloat),
def("sendInt", &sendInt),
def("sendString", &sendString),
def("sendMessage", &sendMessage),
def("sendBundle", &sendBundle),

///////////////////////////////
/// \section Message

class_<ofxOscMessage>("Message")
    .def(constructor<>())
    .def("clear", &ofxOscMessage::clear)
    .def("setAddress", &ofxOscMessage::setAddress)
    .def("getAddress", &ofxOscMessage::getAddress)
    .def("getRemoteIp", &ofxOscMessage::getRemoteIp)
    .def("getRemotePort", &ofxOscMessage::getRemotePort)
    .def("setRemote", &ofxOscMessage::setRemoteEndpoint)
    .def("getType", &ofxOscMessage::getArgType)
    .def("getTypeName", &ofxOscMessage::getArgTypeName)
    .def("getInt", &ofxOscMessage::getArgAsInt32)
    .def("getFloat", &ofxOscMessage::getArgAsFloat)
    .def("getString", &ofxOscMessage::getArgAsString)
    .def("addInt", &ofxOscMessage::addIntArg)
    .def("addFloat", &ofxOscMessage::addFloatArg)
    .def("addString", &ofxOscMessage::addStringArg)
    .def_readonly("numArgs", &ofxOscMessage::getNumArgs)
    .enum_("argType")
    [
        value("NONE", OFXOSC_TYPE_NONE),
        value("INT", OFXOSC_TYPE_INT32),
        value("FLOAT", OFXOSC_TYPE_FLOAT),
        value("STRING", OFXOSC_TYPE_STRING),
        value("BLOB", OFXOSC_TYPE_BLOB),
        value("BUNDLE", OFXOSC_TYPE_BUNDLE),
        value("OUTOFBOUNDS", OFXOSC_TYPE_INDEXOUTOFBOUNDS)
    ],

///////////////////////////////
/// \section Bundle

class_<ofxOscBundle>("Bundle")
    .def(constructor<>())
    .def("clear", &ofxOscBundle::clear)
    .def("addMessage", &ofxOscBundle::addMessage)
    .def("addBundle", &ofxOscBundle::addBundle)
    .def("getMessage", &ofxOscBundle::getMessageAt)
    .def("getBundle", &ofxOscBundle::getBundleAt)
    .def_readonly("numMessages", &ofxOscBundle::getMessageCount)
    .def_readonly("numBundles", &ofxOscBundle::getBundleCount)
];
Also, you'll need to pass a reference of the ofxOscMessage to lua. I use a callback so you can do this in Lua:

-- process incoming osc messages
function oscReceived(msg)
if msg:getAddress() == "/visual/test" then
local f1 = msg:getFloat(0)
local s1 = msg:getString(1)
print("received OSC: "..msg:getAddress().." "..f1.." "..s1)
else
print("received OSC: "..msg:getAddress())
end
end

Gea branch in ofxLua - Extend ofxLua

Footnotes:

1

Wrapper(περικάλλυμα) είναι μια λεπτή στρώση απο κώδικα που μεταφράζει την υπάρχων διεπαφή μιας βιβλιοθήκης κώδικα σε μια άλλη διεπαφή.

Posted on .
blog comments powered by Disqus