Plotting with SC


I assume you're familiar with Stethoscope ({}.scope) and FreqScope ({}.freqscope) already



plot //highlight the method name 'plot' and ask for classes which implement it (cmd+Y on Mac)



Function plotting lets you check synthesis and draw diagrams!


//one cycle of a triangle wave at 100 Hz

{LFTri.ar(100)}.plot(0.01)


//observe frequency modulation close up

{SinOsc.ar(400+SinOsc.ar(100,0,200))}.plot(0.025)


//observe stereo frequency modulation at a distance

{SinOsc.ar(400+SinOsc.ar([10,100],0,[200,100]))}.plot(0.2)










Envelopes


Env([0,1,1,0],[0.5,1.0,2.0],[10,0,-4]).plot //this one you've probably seen before in learning about Env?



i= InterplEnv([0,1,1,0],[0.5,1.0,2.0],[10,0,-4]).plot


If you've not seen InterplEnv before, it's used with an IEnvGen


{SinOsc.ar(IEnvGen.kr(i,MouseX.kr(0,3.5))*500+200,0,0.2)}.play


It can therefore replace using the Index UGen (which requires a buffer to be allocated), but also allows continuous ranges










Plotting an ArrayedCollection


[0,5,1,3,2,4].plot




Plotting a Buffer


b=Buffer.read(s,Platform.resourceDir +/+ "sounds/a11wlk01.wav"); 


b.plot


{PlayBuf.ar(1,b)}.play


//get to language safely

b.loadToFloatArray(0,-1,{arg data; a=data;})


a.plot


//manipulate using language

a= a.collect{|val| if(0.1.coin,{val*val},{val*val*val}) }; 


a.plot


//return to buffer

b.loadCollection(a); 


b.plot















Wavetable


(also see Shaper, Osc, Signal, Wavetable help files)


A wavetable has a special efficient data format which can be loaded to a buffer for use with the Osc and Shaper UGens. 


You either have to use some special Wavetable creating class methods (for example, sineFill and chebyFill) or create one via a Signal


a= Signal.fill(256,{arg i; var t= (i/255.0)+0.1.rand;  (t*t)-t+(0.3*t*t*t)}); 


a= a.asWavetable


a.size //doubles size; adds interpolated values that are the secret ingredient of a wavetable


Plotting a wavetable will show you the wavetable with the special interpolating values hidden.


a.plot


b=Buffer.alloc(s,512,1);


b.loadCollection(a);


b.plot //this will show the hidden values too; looks weirder!


{Osc.ar(b,440,0,0.2)}.play //buzzy Synth


{LPF.ar(Osc.ar(b,MouseX.kr(50,500,'exponential'),0,0.2),MouseY.kr(100,10000,'exponential'))}.play //filter, but probably already aliasing


 





SoundFiles


f= SoundFile.openRead(Platform.resourceDir +/+ "sounds/a11wlk01.wav");


f.plot //uses the SCSoundFileView








Some other graphing functions



histograms via Collection:histo


Array.rand(1000,0.0,1.0).histo(10,0,1).plot(minval:0,maxval:200)   //histo first argument is number of histogram bins















---------------------------------------------------------

advanced (requires use of Extensions folder/Quarks, see Extending SC): 

For fun: Dan Stowell's HeatMap (it's a Quark, example from the help file)



// This distribution is interesting, but .plot doesn't really show why:

a = 20.collect{|x|20.collect{|y| (x+y/pi).sin.rand}}.flat;

a.plot(numChannels:20);

a.heatMap(20); // Much better!

// Choose your colour scheme:

a.heatMap(20, colscheme: \red);

a.heatMap(20, colscheme: \brw);

a.heatMap(20, colscheme: \coals);