I'm looking for a way to shrink the RAM usage in my live patch.
I'm currently running a patch for live usage which has 14 x 100 stereo audio arrays. and 14 x 20sec variable delay lines. there's also 3 vst plugins (compressor, limiter and tape style delay). the GUI isn't too busy, there aren't any vu's and the arrays and lots of stuff are hidden in subpatches.
it is basically a 7 stereo channel (hence 14 x 100, 14 mono pairs x 100 clips long in timeline) ableton live-esqe system but with a delay line on each channel (i need different delay times each channel, hence no send setup).
I have initialised all arrays to 6 samples (which i suppose i should change to 1 or 0 samples if possible). So that they take up the minumum amount of RAM when not in use (correct me if i'm wrong). i have a loop programmed that loads the audio files into the arrays and resizes the ones in use. they are 16 bit stereo files
The most amount of arrays I've tried to load into the patch is 588 (42 x 14) which have been roughly 15secs long and i'm running at 44.1khz. this has lead to my RAM overloading and pd shutting locking and crashing.
I changed the 4 of the channels to mono and got away with it. but pd still used up nearly all of my 2gb of ram. (i've recently bought more)
is there anything i can do to save on RAM??
also how can i calculate roughly how much RAM that pd will need per second of audio array/delay line etc.??
and are there any other factors that are RAM draining (exc GUI)??
Thanks in advance, this list has been more than helpful to me in the past but apologies for lack of brevity this time!
Solen Music wrote:
is there anything i can do to save on RAM??
PD uses 32bits natively (unless you compiled it especially for 64bit), so the iem16 stuff would halve the amount of RAM required, but at the slight expense of audio quality (doesn't matter if your files loaded into tables are 16bit, but for delay lines you might notice the decreased dynamic range).
also how can i calculate roughly how much RAM that pd will need per second of audio array/delay line etc.??
4 bytes per sample * 44100 samples per second (or whatever the sample rate is) for 32bit audio.
Plus a small constant (I hope) overhead for bookkeeping for each object.
thanks hard and claude. i will try both of those things.
also. is there anyway to speed up the loading time of the arrays? it seems to take a good few minutes at the moment?
where can i find iem16 ?
I see that it's not in iemlib, or am i missing something?
2008/7/24 Claude Heiland-Allen claudiusmaximus@goto10.org:
Solen Music wrote:
is there anything i can do to save on RAM??
PD uses 32bits natively (unless you compiled it especially for 64bit), so the iem16 stuff would halve the amount of RAM required, but at the slight expense of audio quality (doesn't matter if your files loaded into tables are 16bit, but for delay lines you might notice the decreased dynamic range).
also how can i calculate roughly how much RAM that pd will need per second of audio array/delay line etc.??
4 bytes per sample * 44100 samples per second (or whatever the sample rate is) for 32bit audio.
Plus a small constant (I hope) overhead for bookkeeping for each object.
Claude
On Thu, Jul 24, 2008 at 4:52 AM, Solen Music solenpuredata@googlemail.com wrote:
also. is there anyway to speed up the loading time of the arrays? it seems to take a good few minutes at the moment?
A trick I use to speed up loading samples into arrays is use [readsf~] with [tabwrite~] in an abstraction that upsamples (using [block~]). You obviously need to know the size of the .wav beforehand. I don't know how much it will speed up loading hundreds of samples but I suppose it does not make much difference.
./MiS
okay. i found iem16 at ftp://ftp.iem.at/pub/pd/Externals/ (duh! the giveaway was the iem bit). it seems to run okay on my windows machine.
but is the only way to load something into the table16 object by copying from a regular pd array?
i'm trying to patch up a scratch pd array which every sample will visit before arriving at it's table16. but is there a more elegant solution similar to soundfiler for this?
thanks again.
2008/7/24 Claude Heiland-Allen claudiusmaximus@goto10.org:
Solen Music wrote:
is there anything i can do to save on RAM??
PD uses 32bits natively (unless you compiled it especially for 64bit), so the iem16 stuff would halve the amount of RAM required, but at the slight expense of audio quality (doesn't matter if your files loaded into tables are 16bit, but for delay lines you might notice the decreased dynamic range).
also how can i calculate roughly how much RAM that pd will need per second of audio array/delay line etc.??
4 bytes per sample * 44100 samples per second (or whatever the sample rate is) for 32bit audio.
Plus a small constant (I hope) overhead for bookkeeping for each object.
Claude
Solen Music wrote:
okay. i found iem16 at ftp://ftp.iem.at/pub/pd/Externals/ (duh! the giveaway was the iem bit). it seems to run okay on my windows machine.
well, like all of our open-source externals, iem16 can also be found in the pure-data repository: https://pure-data.svn.sourceforge.net/svnroot/pure-data/trunk/externals/iem1...
afaik, it's also part of Pd-extended
but is the only way to load something into the table16 object by copying from a regular pd array?
afair, yes. i did not want to write a separate version of [soundfiler] that would be able to read into a [table16], and there was no way to use the original [soundfiler] to do this.
the other solution is of course to use and upsampled [readsf~], as has been discuessed several times on this list (the discussion was about threaded soundfile-loading; nothing to do with iem16, but the same principles apply)
fgmasdr IOhannes
okay i've found a neat way of loading all the files into the table16's using a makefilename loop.
my problem now is that i can't seem to play them because my player patch needs to know the size of each table16 when it calls for it.
i've tried using arraysize and the expr size("$s1") objects but both return
"no such table"
Is there any way to fetch the size of a table16??
this would really help me out! as my 1400 samples now only take up 1 gig of ram instead of 2-3 gigs
2008/7/24 IOhannes m zmoelnig zmoelnig@iem.at:
Solen Music wrote:
okay. i found iem16 at ftp://ftp.iem.at/pub/pd/Externals/ (duh! the giveaway was the iem bit). it seems to run okay on my windows machine.
well, like all of our open-source externals, iem16 can also be found in the pure-data repository: https://pure-data.svn.sourceforge.net/svnroot/pure-data/trunk/externals/iem1...
afaik, it's also part of Pd-extended
but is the only way to load something into the table16 object by copying from a regular pd array?
afair, yes. i did not want to write a separate version of [soundfiler] that would be able to read into a [table16], and there was no way to use the original [soundfiler] to do this.
the other solution is of course to use and upsampled [readsf~], as has been discuessed several times on this list (the discussion was about threaded soundfile-loading; nothing to do with iem16, but the same principles apply)
fgmasdr IOhannes
or, maybe a pitchable table16 reader that automatically loops back to the start upon reaching the end of the table16??
again, thanks.
2008/7/24 Solen Music solenpuredata@googlemail.com:
okay i've found a neat way of loading all the files into the table16's using a makefilename loop.
my problem now is that i can't seem to play them because my player patch needs to know the size of each table16 when it calls for it.
i've tried using arraysize and the expr size("$s1") objects but both return
"no such table"
Is there any way to fetch the size of a table16??
this would really help me out! as my 1400 samples now only take up 1 gig of ram instead of 2-3 gigs
2008/7/24 IOhannes m zmoelnig zmoelnig@iem.at:
Solen Music wrote:
okay. i found iem16 at ftp://ftp.iem.at/pub/pd/Externals/ (duh! the giveaway was the iem bit). it seems to run okay on my windows machine.
well, like all of our open-source externals, iem16 can also be found in the pure-data repository: https://pure-data.svn.sourceforge.net/svnroot/pure-data/trunk/externals/iem1...
afaik, it's also part of Pd-extended
but is the only way to load something into the table16 object by copying from a regular pd array?
afair, yes. i did not want to write a separate version of [soundfiler] that would be able to read into a [table16], and there was no way to use the original [soundfiler] to do this.
the other solution is of course to use and upsampled [readsf~], as has been discuessed several times on this list (the discussion was about threaded soundfile-loading; nothing to do with iem16, but the same principles apply)
fgmasdr IOhannes
-- John
i would assume that the size of the [table16] tables would just be half of the original tables that soundfiler creates.. so, if you have your [table16] objects indexed with integers (and i guess you do if you have 1400 of them), then you would just take the original array size, halve it, and then write that size into a seperate table of table sizes.
ie, you have a table, lets call it [table arraysizes] of size 1400, and you write values for the size of each of your 1400 samples at the index point of each sample. then when you want to play back a sample, you tell tabplay~ or tabread4~ or whatever to playback sample number x, and to get the size of that sample you just send a value of x to [tabread arraysizes]
sorry, the overuse of the words 'table' and 'array' in my last post make it quite hard to understand. but i promise it works.
ah indeed. a table of the array sizes. i'll get on that.
until now i've been grabbing the array size (using [arraysize] external) on the fly whenever an array was called into tabread4~
thanks!
2008/7/24 hard off hard.off@gmail.com:
i would assume that the size of the [table16] tables would just be half of the original tables that soundfiler creates.. so, if you have your [table16] objects indexed with integers (and i guess you do if you have 1400 of them), then you would just take the original array size, halve it, and then write that size into a seperate table of table sizes.
ie, you have a table, lets call it [table arraysizes] of size 1400, and you write values for the size of each of your 1400 samples at the index point of each sample. then when you want to play back a sample, you tell tabplay~ or tabread4~ or whatever to playback sample number x, and to get the size of that sample you just send a value of x to [tabread arraysizes]