Nonstandard and complex visualizers
Having discussed the basic ways in which we can visualize numerical data and audio, we will now demonstrate how we can exploit the built-in GUI elements to implement more complicated or nonstandard visualizers. In particular, we will discuss how we can reappropriate GUI elements originally meant to carry out different tasks, and how to combine the various built-in visualizers in more complex ones.
Nonstandard visualizers
Despite the existence of dedicated objects that cater to all our basic scoping, plotting, and metering needs, the use of simpler and less sophisticated GUI elements is to be considered sometimes because of their characteristic crudeness, which may be just what we are after for certain projects. As in the previous example, we can manually set the value of almost all GUI objects, and that being so, we can exploit them accordingly to design imaginative, uncanny visualizers. For example, we could make the previous code appropriate so that it monitors both the values as well as the distance between any two consecutive adjacent entries in our dataset using RangeSliders
:
updateSliders = fork{loop{ sliders.do{ arg item, i; { var value; // store current and previous values in an array and sort it so that the smaller number is always the first value = [dataset[i][index-1], dataset[i][index]].sort; // set each RangeSlider's value item.setSpan(value[0],value[1]); }.defer; }; if ( index < 1000) {index = index + 1;} {index = 0; }; // increment 0.1.wait; // sliders will be updated every 0.1 seconds }};
A complex scope
After having discussed all major built-in signal visualizers in SuperCollider, it is trivial to combine them in a singleton visualizer. Nonetheless, the server inconsistency of ScopeView
and FreqScopeView
is an obstacle not easy to surpass. Since it is probably a matter of time before a future version of SuperCollider solves this problem, it does make sense to attempt it, even if only for educational reasons. The code for MyFancyStereoScopeClass
is given online. We have to save it onto a file with the .sc
extension, copy it into our extensions folder (which can be always retrieved by evaluating Platform.userAppSupportDir
), and recompile the SuperCollider's Class
library before we can use it as shown in the following code snippet:
( // MyfancyStereoScope Example Server.default.waitForBoot({ // wait for server to boot MyFancyStereoScope.new(); {[Saw.ar(400), Saw.ar(402)]}.play(a) }) )
If all scopes were functional, our custom stereo scope would appear as shown in the following screenshot: