I’m making a long-form piece with Sonic Pi that’s going to be running for some time. I’m considering using a large selection of samples, but only playing/using 2 or 3 at a time. I’m wondering what the best practice is to prevent problems with samples eating up RAM.
If I load a sample as follows:
set :mysample, "C:/Users/me/Desktop/loop1.wav"
And later change the sample by doing something like:
set :mysample, "C:/Users/me/Desktop/loop2.wav"
Is the original loop1.wav still taking up memory? If I hypothetically did this, for example, in a Sonic Pi session that lasted for days, would I eventually run into trouble?
If so, how can I safely release samples once I’m done with them and free-up the memory?
Hi there @drmindflip
calling set :mysample "C:/Users/me/Desktop/loop1.wav"
doesn’t load the sample into memory. It simply stores the string or sentence "C:/Users/me/Desktop/loop1.wav"
in the time state. This does take a tiny bit of memory up, but it won’t cause a memory leak - unless you call set
with lots and lots and lots of different keys such as :mysample2
, :mysample3
… etc. Essentially you should never worry about using set
lots of times.
However, calling sample "C:/Users/me/Desktop/loop1.wav"
will load the sample into memory and then play it. Similarly load_sample "C:/Users/me/Desktop/loop1.wav"
will load the sample into memory although it will not play it. Both of these will consume a lot of memory (especially if the sample is long). Calling sample
or load_sample
with lots of different samples will cause an eventual memory leak and is something to be concerned about if you’re loading many unique samples.
In order to deal with this, you can use the functions sample_free
to unload a specific sample from memory (i.e. sample_free "C:/Users/me/Desktop/loop1.wav"
) or sample_free_all
to unload all samples from memory.
Hope that this helps!
2 Likes
Ah that’s exactly what I was looking for Sam, thanks a million! The extra clarity on when exactly the sample gets loaded into memory is very helpful too.
So, whenever I’m loading a new sample to replace one, I’ll be sure to use sample_free
or sample_free_all
to keep things tidy in the background.
Is there a way to view a list of all the samples currently loaded in memory? If not, I guess I can use sample_loaded?
after sample_free
to make sure it’s gone!
1 Like
Sorry, there’s not currently a way of listing all the loaded samples - although you shouldn’t need to check whether a sample has been freed with sample_free
unless you don’t trust my code! It should definitely free the sample and if it doesn’t, then that’s a bug I’d be very happy to address and fix.
1 Like
Sounds great Sam, thanks for the helpful and detailed advice. And it’s certainly more a case of me not trusting my own code! I’ll just be careful to sample_free
dilligently - that’s perfect for what I need.
PS - small related question:
If I have a block of code calling sample "C:/Users/me/Desktop/loop1.wav
, and another block of code does the exact same thing simultaneously, will loop1.wav
be loaded into RAM twice? Or will subsequent instances of sample "C:/Users/me/Desktop/loop1.wav
use the data that has already been loaded?
Hi, loading the same sample twice or more via sample
or load_sample
doesn’t use any more memory than just loading it once. Sonic Pi is smart enough to cache the loaded sample and re-use it again. So no worries there.
1 Like
That’s awesome Sam, cheers. Makes working with these functions a breeze 
1 Like
Great, thanks, needed this, have been od’ing on samples!