[Stk] How can you have a large amount of polyphony with STK?

Perry Cook prc at cs.princeton.edu
Sat Aug 22 13:23:53 PDT 2015


Well crap.  I just tried this and it turns out that for some inexplicable
reason FileLoop (possibly in its name) seems to need to keep the file
open.  Things don’t work (in a very bad way)  if I add the closeFile at
the end of the openFile routine.  Data seems to be read into an array,
so I can see no reason to keep the file open.

Gary, is this the way things work?

PRC


> On Aug 22, 2015, at 12:56 PM, Perry Cook <prc at CS.Princeton.EDU> wrote:
> 
> Those files shouldn’t be open for long, just long enough to read them
> once, then close it up.  The UGen doesn’t keep reading from the file,
> but uses a table that was filled from the file.  
> 
> I just checked Rhodey which uses FileLoop to read and store the 
> sine/other wavetables, and note that the beginning of FileLoop:openFile
> calls close for safety:
> 
> void FileLoop :: openFile( std::string fileName, bool raw, bool doNormalize )
> {
>  // Call close() in case another file is already open.
>  this->closeFile();
> 
> then opens the file in question.  BUT, it should really close it at the end
> of this routine, since it’s been read and never used again.
> 
> Try adding this->closeFile() to the end of this openFile routine.
> Let us know if this fixes things.   Gary, if so, we should make this
> modification.
> 
> PRC
> 
> PS:  One other possibility is that the OS takes a bit of asynchronous
> time to actually close files and clean up, so your tight loop of
> opening 64*4 (four for each Rhodey) files at essentially instantly
> might be clobbering things.  Since you likely do this once at setup
> time, you might consider a slight delay between each time around
> the loop.  sleep(100) or some such?
> 
> 
>> On Aug 22, 2015, at 10:35 AM, Patrick J. Collins <patrick at collinatorstudios.com> wrote:
>> 
>> Hi Gary,
>> 
>> I think it probably has to do with the number of files that can be open at a
>> given time..  This is running on an iOS platform.  But definitely, this
>> code:
>> 
>>   for (int i = 0; i < 64; i++) {
>>       Rhodey *rhodey = new Rhodey();
>>       delete rhodey;
>>   }
>> 
>> will crash with:
>> 
>> FileRead::open: could not open or find file (../../rawwaves/sinewave.raw)!
>> 
>> But if I change 64 to something like 32, then it's fine...  But this is a huge
>> problem for me because there are many cases where this *might* crash on me,
>> since I am using STK in a very dynamic way.
>> 
>> http://stackoverflow.com/questions/18666921/maximum-amount-of-open-files-on-ios
>> 
>> That's why I thought it would be so much better if STK was just preloading a
>> shared table that the instruments could all read from in memory since they're
>> so small, and not have to have any unnecessary disk IO.
>> 
>> ....  Separate topic:
>> 
>> The other problem I have found is that voicer->tick() doesn't seem to check if
>> the current instrument has been removed or not.
>> 
>> So, I have an OpenAL loop which is running in a separate thread which is just
>> calling voicer->tick() over and over and over...
>> 
>> The in my main thread, I will play an instrument, and then be done with it by
>> doing:
>> 
>> rhodey->noteOff(rhodeyTag, rhodeyAmplitude);
>> voicer->remove_instrument(rhodey);
>> delete rhodey;
>> 
>> ...  This will eventaully crash my applcation as well, because I am assuming,
>> my other thread is in the middle of calling voicer->tick() and the voicer is
>> iterating over frames and waves, and then suddenly delete rhodey is called, and
>> it's now trying to iterate over waves that were just deallocated-- crash!
>> 
>> I would think voier should be looking to see if the current instrument is
>> actually attached to the voicer before calling tick on it to prevent this sort
>> of problem.
>> 
>> The only solution I could think of to prevent the crash is to delete the
>> instrument after a 1 second delay, but that feels like a horribly unreliable
>> fix.
>> 
>> Do you have any suggestions?
>> 
>> 
>> Patrick J. Collins
>> http://collinatorstudios.com
>> 
>> 
>> On Sat, 22 Aug 2015, Gary Scavone wrote:
>> 
>>> If it was just a sinewave, then the SineWave class is the answer (it creates a static sine table).  But in the case of the FM instruments, the table is often not sinusoidal.  So, I don’t have a quick fix for that.
>>> 
>>> I don’t see why loading very small tables should cause a crash.  It is likely some other, potentially related, issue or bug.
>>> 
>>> —gary
>>> 
>>>> On Aug 22, 2015, at 1:52 AM, Patrick J. Collins <patrick at collinatorstudios.com> wrote:
>>>> 
>>>> It appears to me that everytime an instrument (FM) is instantiated, it
>>>> is reading the sinewave waveform from disk, and if I want to have a
>>>> large amount of polyphony:
>>>> 
>>>> Voicer *voicer = new voicer();
>>>> int group = 0;
>>>> for (int i = 0; i < 64; i++) {
>>>>  Rhodey *instrument = new Rhodey();
>>>>  voicer->addInstrument(instrument, group);
>>>> }
>>>> 
>>>> ...
>>>> 
>>>> My application crashes when doing fopen that many times...  Is there a
>>>> different way to get polyphony than this?  Is there an easy way to share
>>>> the same sinewave with multiple instances of an FM instrument?
>>>> 
>>>> Patrick J. Collins
>>>> http://collinatorstudios.com
>>>> 
>>>> _______________________________________________
>>>> Stk mailing list
>>>> Stk at ccrma.stanford.edu
>>>> https://cm-mail.stanford.edu/mailman/listinfo/stk
>>> 
>> _______________________________________________
>> Stk mailing list
>> Stk at ccrma.stanford.edu
>> https://cm-mail.stanford.edu/mailman/listinfo/stk
> 
> 
> _______________________________________________
> Stk mailing list
> Stk at ccrma.stanford.edu
> https://cm-mail.stanford.edu/mailman/listinfo/stk




More information about the Stk mailing list