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

Perry Cook prc at cs.princeton.edu
Sat Aug 22 12:56:50 PDT 2015


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




More information about the Stk mailing list