Sensel Morph OSC interface

I thought people here would be interested in my recent software project:

senselosc is an OSC interface for the sensel morph.
Exposes contact information for up to 16 regions of the sensel morph using the Sensel API.

  • Get senselosc here.
  • Morph is a reference implementation of the OSC interface for SuperCollider.

senselosc is currently tested on OSX with SuperCollider, however I am confident that it could be easily adapted to run e.g. on a norns.

OSC implementation is straight-forward, so this should also work with any other OSC-capable host (e.g. Reaktor/Pd/…).

The project is written to be cross-platform and should thus also work (with slight changes in the cmake configuration files) on Linux. As for now I did not yet test this, though, and would be happy for others to give it a try.

Usage and OSC interface

(updated 2020-11-09)

Usage: senselosc [options]
  -h [ --help ]           this help message
  -x [ --nobundle ]       send messages unbundled
  -d [ --scandetail ] arg set scanning detail (0: low, 1:med, 2:high), defaults
                          to high
  -p [ --port ] arg       set output port number (default: 7000)

OSC messages sent:
    /contactAvg   <index> <num_contacts> <x> <y> <wx> <wy> <force> <area> <distance>
    /contact      <index> <id> <state> <x> <y> <force> <area> <distance> <orient> <major_axis> <minor_axis>
    /contactDelta <index> <id> <d_x> <d_y> <d_force> <d_area>
    /contactBB    <index> <id> <min_x> <min_y> <max_x> <max_y>
    /contactPeak  <index> <id> <peak_x> <peak_y> <peak_force>
    /sync index <updated_0> ... <updated_15>

See README for details.

Suggestions and PRs please via the github issue tracker.


There is now Morph, a reference implementation od the OSC interface in SuperCollider. It exposes all senselosc features in callback actions. Get it through the Quarks Extension interface, or look at its implementation on github.


is index currently always 0 because you only support one morph right now, or because you haven’t tested with more than one?

for now only one morph is recognized and supported (i only have one) but it should be fairly easy to support / extend to more. feel free to send a PR :slight_smile:

  • Updated interface to a semantically more valid OSC message
  • added contactAvg message type (sending additionally computed data such as weighted average position and force values)

changes are reflected in initial post above, for more details on the interface, see the README file.

1 Like

Morph — Reference implementation of the OSC interface for SuperCollider added to the description.

first thank you and congratulation for this app and SC Quark (i can say it oriented me a title bit to get a morph, and i just received mine).

I did all the installations instructions and after some try and adjustments, everything is working and i enjoy the morph with SuperCollider in OSC !

I’m wondering something (i’m middle level beginner) in SuperCollider, but practice a lot this last moons:
Sometimes with multi touch scenario the doneAction:2 doesn’t properly work and after a moment nodes in server goes up without possibility to clean the server (except a command period).

This is the case in your example with sound… How do you deal with ghost nodes with Morph? I really want to solve this because the morph and SuperCollider make a fantastic combo!

Thank you,


1 Like


glad you like the examples!

I suspect this to be a runtime problem…
can you make a minimal example, please? On which operating system are you? Are you sending OSC-bundles?


I’m in MacOs (Catalina) with a MacBook pro. We can take your example in the help file, because for the moment it’s my starting point… Your SynthDef have a \gate arg and the contactUpAction method, put \gate, 0, there is doneAction:2 in the SynthDef so it should free all synth by id. But sometimes (randomly) and most often wen i make lot of mouvements, the server monitor in SC doesn’t reset to 0 or doesn’t kill all the instances. But The sounds are stopped.

I believe there is something with id argument who doesn’t trace correctly all the instance of the synth?
Did you see this comportement on your machine?

I saw the same problem with this example : multitouch
So, i suppose the problem is with the API and the way to use it. Or something i don’t understand…

Thank you for your answer.

this is a problem i remember having seen with the Manta controller as well; i’ll have a look if i find a solution for it and let you know. Thanks for giving this precise feedback!

I got some good news… I turned my hardwareBufferSize to 64 (i was in 512 with 48000 sample rate):
s.options.hardwareBufferSize_(64); s.reboot;
And nodes are cleared to 0.
I made some stress test (by playing hard) and it look like it was this…

Thank you very much for your answers and your work.
I can can now begin to explore SC and Morph combo!


1 Like

I looked into it as well, it appears to me to be a race condition (synth released before fully instantiated, thus hanging because the synth release is happening by means of a gate signal and not with a .free message from external).
I do not (yet) have a good solution to have a simple way of making things happen but I can recommend looking into NPVoicer from the JITLib Extensions quark, it handles AFAICS this stuff excellently.