Forum rss-feed

Forum

Developers: Prototype open-source OSC EigenD agent available

STICKY

written by: geert

Hi everyone,

Given the current developer interest and barnone's motivation to dig into the code, Jim has spent some time creating a prototype EigenD agent that is able to output EigenD data streams directly through OSC.

This implementation is just a start and was quickly written in two days to bootstrap the learning process of users that wish to participate in the development. Its serves both as a documented example for creating agents as well as an initial step towards the OSC plans that we've been making. As time progresses, our OSC support will mature and the EigenD OSC protocol will be formalized in more detail, but this should give you an idea of the direction we're heading into. We've discussed various approaches towards how to handle the OSC representation over the network and have hit limitations of the network stack in the past due to the massive amount of performance data that the Eigenharp generates. This performance data is essential to the expressiveness of the Eigenharp and we obviously want to allow it to be exposed in as much detail as possible. The document named "OSC" that comes with this example agent briefly explains what we consider the best approach, it will mature as we further work on the OSC support.

The document named 'Roadmap' explains how to use this OSC agent and gives a high-level developer-centric explanation of EigenD's internal architecture. The source code is heavily documented and should make it easy to adapt towards any other functionalities that you might want to implement with an agent.

The source code can be found on GitHub in the 1.4 branch of EigenD. Here is a direct link towards the source of just the plg_osc agent:
https://github.com/Eigenlabs/EigenD/tree/1.4/plg_osc

More information about getting involved in EigenD development can be found on this wiki page:
http://www.eigenlabs.com/wiki/Developers/

Please realize that we have very limited resources to provide direct support to external developers as we're hard at work wrapping up the initial release of EigenD 2.0 and Workbench. We hope that this example will give you enough information to make EigenD development more accessible.

Take care,

Geert

written by: bwong

Thu, 20 Oct 2011 02:57:33 +0100 BST

I uploaded a copy of it for anyone interested here :

http://www.mediafire.com/?ya2dj1cl59f8vt7

It requires Csound and Processing to be installed for it to work. Also Processing must have the OSC and Csoundo libraries installed.


written by: geert

Thu, 20 Oct 2011 06:40:28 +0100 BST

NothanUmber said:
Ah, thanks! So cfilter and ufilter are essentially default implementations that agents which perform operations on incoming realtime or control data and forward those afterwards can use!


Right, however, we're phasing out ufilter and very little agents are using it now, cfilter is the one to look at.

That being said, I do have a feeling that we could maybe extract another abstraction for very primitive agents like the Latch one I just wrote. I need to take time with to sit down with a clear head though to ponder on that and see what would make sense. It is actually another part of the reason why I wrote those two primitive agents.

Take care,

Geert


written by: geert

Thu, 20 Oct 2011 06:45:39 +0100 BST

@barnone, exactly, this is one of the powers of the EigenD system, you can easily totally customize everything. You can even run different Eigenharp instruments together into the same EigenD application, provided that the appropriate instrument manager instruments are added.


written by: barnone

Wed, 26 Oct 2011 05:59:02 +0100 BST

First Prototype patch is done.

Proof


written by: geert

Wed, 26 Oct 2011 07:03:34 +0100 BST

Awesome barnone! Motivates me even more to try to add better native CV support to EigenD in my spare time. I've decided to go for a Slim Phatty to get started.


written by: barnone

Sat, 5 Nov 2011 01:37:03 +0000 GMT

Just confirmed that this agent made it to the 1.4.8 release. So I'm able to fire up my setups using the osc agent from official 1.4.8 now.

experimenting a bit with cv before committing to a more polished patch.

It's actually been very reliable for me. No stuck notes or hanging/backing up of the event stream. I'm not decimating at all, although I added code to for sending to other sources that may not be so forgiving.

It's also very fast to fire up the setup and just start patching CV to the modular.

Really wonderful, thx. Hope to contribute back shortly.




written by: dkah

Wed, 9 Nov 2011 15:16:23 +0000 GMT

Have a question related to the OSC agent. I do all the brpc steps as listed in the Roadmap, with my Pico attached and EigenD started over the commandline and the blank setup loaded (tested also without setup, just to be sure). Then I try to get the OSC stream, which I in the end want to have in Processing (with pdlib, which means Pure Data integrated in Processing). Processing is set up right to get OSC 5555, but even if not, Max6 UDP test should work and it doesn't. I also test with Osculator , just to be sure. I will call these POM.
Sometimes this works, but often it doesn't, what could I do wrong? Not waiting enough? I normally try on the blank setup, could this be a problem?
If I use oscdump etc. naturally I block the port, but I get the OSC values in the Terminal, even if POM didn't get any.
So the problem is not the OSC but the connection somehow? Also tried variations, bar0 method with the 4A/M, naturally with Pico not Alpha, doesn't work. I don't know how to fix this, tried all permutations of things, poor man's debug for the stymied. Next time it works I will try to bake into a setup, but I would like to know why sometimes it doesn't work even if I haven't changed anything in the startup process.
Is there a clue I can look at in the messages EigenD prints or maybe insert one more print somewhere to get a better picture? Would the log help? Could try to make a clean one.
Thanks for any help and pointers.


written by: barnone

Wed, 9 Nov 2011 17:21:32 +0000 GMT

It's hard to tell from your post exactly what steps you used and where it went wrong. Maybe write those steps out in detail.

Did you send EigenD the register message?

/register-fast keyboard_1 5555
sent to localhost port 9999

It won't send any messages to 5555 until you do.

MAX doesn't want/need the OSC type params like "ff" etc so I drop those from geerts instructions.

I also posted my MAX patch in the Latency thread. It's avail here.

EigenCV Patch


written by: barnone

Wed, 9 Nov 2011 16:12:31 +0000 GMT

Actually the instructions should really go in this thread, so here they are.

>>>>>>

If anyone is interested. Here is the MAX patch as it currently stands. I added some comments.

There are a few sections marked with panels to separate the code that is generic to processing the raw CV from the code that is specific to routing OSC to Expert Sleepers and doing polyphony management.

EigenCV Patch

The patch requires the installation of the osc-route MAX external. Standard OSC routing in MAX is not great at dealing with dynamic names in the OSC patch. This external is very good and efficient at it.

OSC Route CNMAT

Anyway, this could be adapted to send midi or trigger native MSP sound processing or whatever. Have at it.

Note that EigenD 1.4.8 includes the osc agent. You do need to read the release notes and roadmap in the source code on git hub to understand how to build a basic setup that connects the agent. See the OSC agent thread.

Also, a tip, what I do is I connect the osc agent to a full setup that already sends midi and such. I then use the midi out to interpret the pitch and gate events and use the MAX patch to send the continuous controls. However someone could extend this patch to interpret keys as midi pitch gate events as well if they so wished.

Obviously this is an experimental setup, so don't try to use it unless you are familiar with MAX. ;)


written by: dkah

Wed, 9 Nov 2011 23:46:26 +0000 GMT

Hello barnone0,
Thanks for the answer. I just use Max6 (demo) as UDP test, because I have the feeling it is the most reliable one. To test I try to exclude all possible error sources, in Processing I still could have initialized something wrong.

Good of you to publish your patches, so we can all learn.

Found the problem. Its obvious when you know what to look for and which you pointed out
oscdump 5555 &
occupies the port and so POM cannot dock there, Osculator and Processing give me errors. But I still need to do the last line
oscsend localhost 9999 /register-fast si keyboard_1 5555
which sends the messages out to port. Just had to know what to look for.

So the data processing will be done in Java and for the sound part I can harness the power of Pure Data. Not yet the fastest solution, but enough for prototyping. Hope to have the first working "game/sound" prototype working by end of the week. And changing the sound will be as easy as changing the pd-patch.
Can probably even use Processing with XML-RPC lib to script the Eigenharp to switch the LEDs of the Alpha on and off.


written by: barnone

Thu, 10 Nov 2011 01:44:52 +0000 GMT

Sounds fun, happy hacking.


written by: dhjdhj

Sat, 19 Nov 2011 18:34:26 +0000 GMT

OK --- I have everything built and I'm trying to get Max to work. Running to some issues that I don't understand.

First of all, in the documentation for the OSC agent, there are two lines that I'm supposed to run

tmp/bin/brpc '' exec osc output create
tmp/bin/brpc '' exec pico manager create

First of all, what is the purpose of '' at the beginning? I note that in a subsequent example on this thread, these same commands are given but with an empty string. If I try with empty string, then I get python errors.

Secondly, I am using alpha, so I replaced the second line with
tmp/bin/brpc '' exec alpha manager create

That seems to get accepted but when I subsequently enter the line

tmp/bin/brpc '' exec alpha keyboard 1 to osc output 1 connect

that comes back with a non-zero exit code

I've tried creating a basic Max patch with the /register-fast message on port 555 send to localhost port 9999 and I have a [udpreceive 555] object connected to [print] but I'm not seeing anything in the Max window when I press keys on the Eigenharp.

Would appreciate some suggestions here.

Thanks,
D


written by: dhjdhj

Sat, 19 Nov 2011 18:35:56 +0000 GMT

Hmmm, in the examples above, I had the word interpret surrounded by angle brackets and quotes (per the example in the README for the OSC agent) but they seem to have disappeared in the forum view. From that behavior, I'm assuming that it always has to be there (and @barnone had them there too)


written by: barnone

Sat, 19 Nov 2011 18:43:35 +0000 GMT

Yes, I think the confusion is that the forum strips any text with an angle bracket. Would definitely look at the OSC and Roadmap files in the src code instead as the authoritative src of info.

Once you have gotten the initial connections made, you can save the setup in EigenD and it will be restored when you load that setup.

For my MAX patch, I don't actually use a blank setup to start. I start with an existing setup that sends midi. Is use the midi for notes, velocity etc. I use the OSC for continuous data such as pressure, x, y. The note data is there though in the OSC, I just chose not to hook it up, since it wasn't needed for what I was trying to do. The MAX patch does sanitize the key stream into something fit for conversion to notes and detects note on and note off.


written by: dhjdhj

Sat, 19 Nov 2011 19:35:52 +0000 GMT

Well, at this point, I just want to get OSC working into Max but it seems that the command

exec alpha keyboard 1 to osc output 1 connect

is not working (or at least it's returning a non-zero code) so I don't know how to proceed.


written by: barnone

Sat, 19 Nov 2011 19:39:25 +0000 GMT

Did the osc output object get created?

tmp/bin/brpc '{interpreter}' exec osc output create
tmp/bin/brpc '{interpreter}' exec alpha manager create

Wait for alpha to be detected be looking at the console output of EigenD, then do:

tmp/bin/brpc '{interpreter}' exec alpha keyboard 1 to osc output 1 connect

Note that the curly braces around "interpreter" need to be angle brackets instead but the forum strips them


written by: dhjdhj

Sat, 19 Nov 2011 20:24:04 +0000 GMT

When I try to connect the keyboard to the osc, I'm being told that the arguments are incorrect....see below

So close and yet so far (grin)
----------------


: run imperative: ('alpha', 'keyboard', '1', 'to', 'osc', 'output', '1', 'connect')
: language_plg:error_message (('Inappropriate arguments for the verb %s', 'connect', '', '', 1), '')
: language_plg:message words= ['*', 'Inappropriate', 'arguments', 'for', 'the', 'verb', 'connect'] desc= err_msg speaker=
: feedback:msg ['*', 'Inappropriate', 'arguments', 'for', 'the', 'verb', 'connect']


written by: dhjdhj

Sat, 19 Nov 2011 20:26:58 +0000 GMT

Well, it looks like the osc output object gets created but when I try to create the alpha manager, I'm seeing all sorts of errors

I'm assuming the alpha manager was created based on the first 5 or 6 lines of the following console output but it looks like it's then bitching about being unable to open the usb port

: initial state: [] set([]) set([])
: after alpha state: []
: after manager state: []
: after flush, state= [abstract([alpha,manager])]
: verb: create ['(abstract([alpha,manager]),)']
: run imperative: ('alpha', 'manager', 'create')
eigend-backend: verb: ['497903696',2,'',[abstract([alpha_manager])]]
eigend-backend: assigned ordinal 1 to alpha_manager
: eigend 1: ok
: after verb, succeeded= 1 errors= 0 sync= [''] obj= set([''])
: pushing set(['']) to context stack
: starting sync after create : ['']
: sync done
: initialise_set ['']
: autonumber ('alpha', 'manager') with 1
eigend-backend: skipped
: evt : base
: usb name : 26260000
: can't open: already opened by someone else
: Traceback (most recent call last):
: File "plg_keyboard/keyboard_X.py", line 596, in __dequeue
Functor with exception >
: File "plg_keyboard/keyboard_X.py", line 454, in __init__
: RuntimeError : can't open: already opened by someone else from picross/src/pic_usb_macosx.cpp:144 ()
: python exception inside functor
: RuntimeError : python exception inside functor from tmp/obj/piw/src/piw_native_python.cpp:107202 ()
: call problem caught at piw/src/piw_thing.cpp:74
: starting resync
: resync done


written by: barnone

Sat, 19 Nov 2011 20:34:51 +0000 GMT

That doesn't look good.

"can't open: already opened by someone else "

You can only have one instance of the alpha manager. Maybe cycle your basestation, restart EigenD and start clean.

Did you start EigenD with these flags?

./EigenD --stdout --noauto

Definitely don't want to load any configuration at startup.

If you do load a factory setup, does the Alpha work properly?


written by: dhjdhj

Sat, 19 Nov 2011 21:10:36 +0000 GMT

Well, I've made signifcant progress without understanding why ----

1) I opened eigend --stdout which loads my standard guitar setup (I didn't know about --noauto, I'll come back to that)
2) I did NOT subsequently load a blank setup
3) I executed the osc connect
4) I did NOT execute the alpha manager create
5) I executed the keyboard osc connect and got no errors
6) I ran my trivial Max patch and indeed I am seeing all the OSC messages

So in principle, I'm in a position to start analysing the OSC messages to create my Max patchers.

However, obviously I'd like eigend to not be doing all the work that it's doing for my standard guitar setup.

So the first question is, how come loading a blank setup (following the Roadmap in the OSC folder) subsequently results in the other commands not working?

Other issues I encountered.
a) There doesn't seem to be any way to save a setup (there's also no eigenD menu)---
b) I tried to run the eigencommander from the command line but it bitched about using python rather than pythonw. Since eigencommander is an executable, I don't know how to make it startup with pythonw
c) I noted there's a folder called "app" that has EigenD, EigenCommander (and others in it) but they don't work if you try to open them. I looked in the package contents and noted that there were aliases to actual programs but the original files associated with those aliases were not found so those have not been setup properly.



Please log in to join the discussions