- Edited
please use backticks ( ``` ) and not '
to enclose your code
vivian if i were to try and plot this line to oled
The currently supported functions are the ones above and they show the few types of prints you can get currently. U assume they display some basic text only, but I don't have a working display at hand, did you try them out? To obtain anything other than that, you'll need to write some custom C++ code. The available graphics functions are here https://github.com/giuliomoro/OSC2OLED4Bela/blob/master/SSD1306_OLED.h#L151-L165
Looking at the names there, you'd probably to use drawPixel()
. I don't actually know how to handle bundles in OSC neither from the Sc side or the C side, so I'll assume for simplicity that you are sending some float values and you want to show those, but there is definitely room for improvements!
For instance, I expect that if you add this to the body of int parseMessage(oscpkt::Message msg, void* arg)
:
oscpkt::Message::ArgReader args = msg.match("/values");
if(args)
{
const unsigned int nValues = args.nbArgRemaining();
float values[nValues];
for(unsigned int n = 0; n < nValues; ++n)
{
if(args.isFloat())
{
args.popFloat(values[n]);
} else if(args.isInt32()) {
int i;
args.popInt32(i);
values[n] = i;
} else {
fprintf(stderr, "Wrong type at argument %d\n", n);
return -1;
}
}
// now tenValues contains the 10 values.
// prepare a bitmap:
printf("received: ");
for(unsigned int n = 0; n < 10; ++n)
printf("%f ", values[n]);
printf("\n");
clearDisplay();
for(unsigned int x = 0; x < SSD1306_LCDWIDTH; ++x)
{
// we interpret each value as the vertical displacement and
// we want to draw a series of horizontal lines at the specified points
unsigned int valIdx = x * float(nValues) / SSD1306_LCDWIDTH;
unsigned int y = values[valIdx] * SSD1306_LCDHEIGHT;
drawPixel(x, y, WHITE);
}
Display();
}
then you can send
~displayOSC.sendMsg('/values', 0, 0.1);
or
~displayOSC.sendMsg('/values', 0, 0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9);
to display n
horizontal bars which are placed left-to-right at a relative vertical positiony
, as specified by each of the float arguments (range 0 - 1). If you pass as many arguments as the number of horizontal pixels in the display ( typically 128), then each bar will be one pixel wide. There must be a better way of doing this from Sc than specifying the numbers as comma-separated values and probably using OSC bundles it would be a better idea.
vivian do i use .asString to speak to OSC or .asRawOSC?
no idea, sorry.
vivian Window.closeAll;
w = Window ("gui", Rect(20,20,150,30))
.front
.alwaysOnTop(true);
~sliderx = Slider(w, Rect(20,20,150,30))
~sliderx.action({
arg obj;
w.view.background_(Color.black);
obj.value.postln;
});
I am not sure what this does, but it would seem it's trying to create a slider in a GUI? There's no easy way to have the Sc GUI mirrored on the OLED display. You'll have to send dedicated commands which are parsed by the C++ file and sent to the display.