Performance weirdness

Okay, still deep in the weeds here, trying to build out a granular engine.
I came across something peculiar. When I run the following block of code, it runs fine. But if I copy & paste it more than once, it hangs, or throws an error that it got too far behind the beat.
But if I wrap it in “8.times do … end”, it runs fine.
What’s going on here? What’s the culprit? Is it the repeated invocations of with_synth that’s causing the snarlup?
Any insight would be most welcome here. I can kludge around this, but I’d love to understand the true nature of the problem.

   
     
     
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.06026268005371094, release: 0.0625, amp: 0.8432861328125, sustain: 0.08319664001464844, amp: 1.0 end 
      sleep 0.06026268005371094
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.08263206481933594, release: 0.0625, amp: 1.084130859375, sustain: 0.05765533447265625, amp: 1.0 end 
      sleep 0.08263206481933594
        
      
      with_synth "pluck" do handle = play 60, sustain: 0.07434463500976562, release: 0.0625, amp: 1.0756103515625, sustain: 0.05439567565917969, amp: 1.0 end 
      sleep 0.07434463500976562
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.06367301940917969, release: 0.0625, amp: 0.86427001953125, sustain: 0.053226470947265625, amp: 1.0 end 
      sleep 0.06367301940917969
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.07426643371582031, release: 0.0625, amp: 1.10843505859375, sustain: 0.08402824401855469, amp: 1.0 end 
      sleep 0.07426643371582031
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.050006866455078125, release: 0.0625, amp: 1.08216552734375, sustain: 0.036624908447265625, amp: 1.0 end 
      sleep 0.050006866455078125
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.06869125366210938, release: 0.0625, amp: 1.1485595703125, sustain: 0.07889366149902344, amp: 1.0 end 
      sleep 0.06869125366210938
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.08797645568847656, release: 0.0625, amp: 1.03450927734375, sustain: 0.04629707336425781, amp: 1.0 end 
      sleep 0.08797645568847656
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.0537261962890625, release: 0.0625, amp: 0.98590087890625, sustain: 0.0475311279296875, amp: 1.0 end 
      sleep 0.0537261962890625
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.08492469787597656, release: 0.0625, amp: 0.89697265625, sustain: 0.055492401123046875, amp: 1.0 end 
      sleep 0.08492469787597656
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.08938789367675781, release: 0.0625, amp: 1.07298583984375, sustain: 0.05688285827636719, amp: 1.0 end 
      sleep 0.08938789367675781
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.08383750915527344, release: 0.0625, amp: 0.8431884765625, sustain: 0.09367179870605469, amp: 1.0 end 
      sleep 0.08383750915527344
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.06284523010253906, release: 0.0625, amp: 0.81248779296875, sustain: 0.06134605407714844, amp: 1.0 end 
      sleep 0.06284523010253906
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.07091522216796875, release: 0.0625, amp: 0.8350341796875, sustain: 0.08015060424804688, amp: 1.0 end 
      sleep 0.07091522216796875
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.08056259155273438, release: 0.0625, amp: 0.89381103515625, sustain: 0.04084587097167969, amp: 1.0 end 
      sleep 0.08056259155273438
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.03868675231933594, release: 0.0625, amp: 0.81578369140625, sustain: 0.038738250732421875, amp: 1.0 end 
      sleep 0.03868675231933594
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.07019805908203125, release: 0.0625, amp: 0.9301025390625, sustain: 0.051372528076171875, amp: 1.0 end 
      sleep 0.07019805908203125
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.08568954467773438, release: 0.0625, amp: 1.08433837890625, sustain: 0.04088401794433594, amp: 1.0 end 
      sleep 0.08568954467773438
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.060817718505859375, release: 0.0625, amp: 0.83536376953125, sustain: 0.03476142883300781, amp: 1.0 end 
      sleep 0.060817718505859375
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.03661918640136719, release: 0.0625, amp: 1.17220458984375, sustain: 0.06467628479003906, amp: 1.0 end 
      sleep 0.03661918640136719
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.0577545166015625, release: 0.0625, amp: 1.05198974609375, sustain: 0.09169578552246094, amp: 1.0 end 
      sleep 0.0577545166015625
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.07649993896484375, release: 0.0625, amp: 0.83013916015625, sustain: 0.05410194396972656, amp: 1.0 end 
      sleep 0.07649993896484375
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.04179954528808594, release: 0.0625, amp: 0.8355224609375, sustain: 0.07030868530273438, amp: 1.0 end 
      sleep 0.04179954528808594
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.045101165771484375, release: 0.0625, amp: 0.90838623046875, sustain: 0.07711982727050781, amp: 1.0 end 
      sleep 0.045101165771484375
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.0614776611328125, release: 0.0625, amp: 1.0471435546875, sustain: 0.06303024291992188, amp: 1.0 end 
      sleep 0.0614776611328125
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.08508491516113281, release: 0.0625, amp: 1.01766357421875, sustain: 0.07901191711425781, amp: 1.0 end 
      sleep 0.08508491516113281
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.09365272521972656, release: 0.0625, amp: 1.02667236328125, sustain: 0.04465675354003906, amp: 1.0 end 
      sleep 0.09365272521972656
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.036296844482421875, release: 0.0625, amp: 1.1825927734375, sustain: 0.03869056701660156, amp: 1.0 end 
      sleep 0.036296844482421875
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.046123504638671875, release: 0.0625, amp: 1.077978515625, sustain: 0.04871559143066406, amp: 1.0 end 
      sleep 0.046123504638671875
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.08482742309570312, release: 0.0625, amp: 0.96077880859375, sustain: 0.07078933715820312, amp: 1.0 end 
      sleep 0.08482742309570312
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.09298515319824219, release: 0.0625, amp: 1.0392578125, sustain: 0.03914451599121094, amp: 1.0 end 
      sleep 0.09298515319824219
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.07536506652832031, release: 0.0625, amp: 0.83284912109375, sustain: 0.09348487854003906, amp: 1.0 end 
      sleep 0.07536506652832031
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.04640007019042969, release: 0.0625, amp: 1.11568603515625, sustain: 0.03496742248535156, amp: 1.0 end 
      sleep 0.04640007019042969
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.04658317565917969, release: 0.0625, amp: 1.16405029296875, sustain: 0.06352806091308594, amp: 1.0 end 
      sleep 0.04658317565917969
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.03460693359375, release: 0.0625, amp: 0.98980712890625, sustain: 0.06156349182128906, amp: 1.0 end 
      sleep 0.03460693359375
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.08666229248046875, release: 0.0625, amp: 1.1000244140625, sustain: 0.06500625610351562, amp: 1.0 end 
      sleep 0.08666229248046875
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.06756210327148438, release: 0.0625, amp: 1.064404296875, sustain: 0.03638267517089844, amp: 1.0 end 
      sleep 0.06756210327148438
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.07045745849609375, release: 0.0625, amp: 0.81878662109375, sustain: 0.08577537536621094, amp: 1.0 end 
      sleep 0.07045745849609375
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.08010292053222656, release: 0.0625, amp: 0.84188232421875, sustain: 0.07211112976074219, amp: 1.0 end 
      sleep 0.08010292053222656
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.06608390808105469, release: 0.0625, amp: 0.9298095703125, sustain: 0.051727294921875, amp: 1.0 end 
      sleep 0.06608390808105469
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.041534423828125, release: 0.0625, amp: 0.98504638671875, sustain: 0.04373931884765625, amp: 1.0 end 
      sleep 0.041534423828125
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.04973411560058594, release: 0.0625, amp: 0.91280517578125, sustain: 0.047576904296875, amp: 1.0 end 
      sleep 0.04973411560058594
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.082183837890625, release: 0.0625, amp: 0.83084716796875, sustain: 0.04133796691894531, amp: 1.0 end 
      sleep 0.082183837890625
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.03250694274902344, release: 0.0625, amp: 0.87841796875, sustain: 0.037059783935546875, amp: 1.0 end 
      sleep 0.03250694274902344
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.07406806945800781, release: 0.0625, amp: 1.0959228515625, sustain: 0.06015777587890625, amp: 1.0 end 
      sleep 0.07406806945800781
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.03933525085449219, release: 0.0625, amp: 0.96051025390625, sustain: 0.09314537048339844, amp: 1.0 end 
      sleep 0.03933525085449219
       
      
      with_synth "pluck" do handle = play 60, sustain: 0.09092521667480469, release: 0.0625, amp: 1.1903076171875, sustain: 0.09341621398925781, amp: 1.0 end 
      sleep 0.09092521667480469


Had a play with this.
On a Mac I ran out of buffer size even on just one iteration of your code. (size is smaller than on windows or linux)
Using run_file enabled me to try out many pasted iterations (in a text file) without any problems.

Is there a way to sniff for the buffer size? I want to write code that can run on any platform.
What’s the most code that can be in a buffer before this happens? How do I optimize around this limitation?

Macs by default set a maximum size of 9216 bytes. You can read this typing
sysctl net.inet.udp.maxdgram in a terminal windows on the Mac.
I don’t think windows and linux in general restrict the size so much, so the safest thing to do is to use this as a limit. Newer versions of Sonic-Pi print an error messages when the limit is exceeded.

It is possible to raise it on a Mac using sudo sysctl -w net.inet.udp.maxdgram=65535 but it could cause networking problems

I tried this and could increase the number of lines in the editor window.

However, like you I got to a point where it would hang. Looking at the sonic-pi logs I noticed that the spider.log showed problems in communicating involving udp.
There were also warning about redefining ;sustain and :amp on most lines

workspace_zero:1: warning: key :sustain is duplicated and overwritten on line 1
workspace_zero:1: warning: key :amp is duplicated and overwritten on line 1
workspace_zero:5: warning: key :sustain is duplicated and overwritten on line 5
workspace_zero:5: warning: key :amp is duplicated and overwritten on line 5
workspace_zero:9: warning: key :sustain is duplicated and overwritten on line 9
workspace_zero:9: warning: key :amp is duplicated and overwritten on line 9
workspace_zero:13: warning: key :sustain is duplicated and overwritten on line 13
workspace_zero:13: warning: key :amp is duplicated and overwritten on line 13
workspace_zero:17: warning: key :sustain is duplicated and overwritten on line 17
workspace_zero:17: warning: key :amp is duplicated and overwritten on line 17
workspace_zero:21: warning: key :sustain is duplicated and overwritten on line 21
workspace_zero:21: warning: key :amp is duplicated and overwritten on line 21
workspace_zero:25: warning: key :sustain is duplicated and overwritten on line 25
workspace_zero:25: warning: key :amp is duplicated and overwritten on line 25
workspace_zero:29: warning: key :sustain is duplicated and overwritten on line 29
workspace_zero:29: warning: key :amp is duplicated and overwritten on line 29
workspace_zero:33: warning: key :sustain is duplicated and overwritten on line 33
workspace_zero:33: warning: key :amp is duplicated and overwritten on line 33
workspace_zero:37: warning: key :sustain is duplicated and overwritten on line 37
workspace_zero:37: warning: key :amp is duplicated and overwritten on line 37
workspace_zero:41: warning: key :sustain is duplicated and overwritten on line 41
workspace_zero:41: warning: key :amp is duplicated and overwritten on line 41
workspace_zero:45: warning: key :sustain is duplicated and overwritten on line 45
workspace_zero:45: warning: key :amp is duplicated and overwritten on line 45
workspace_zero:49: warning: key :sustain is duplicated and overwritten on line 49
workspace_zero:49: warning: key :amp is duplicated and overwritten on line 49
workspace_zero:53: warning: key :sustain is duplicated and overwritten on line 53
workspace_zero:53: warning: key :amp is duplicated and overwritten on line 53
workspace_zero:57: warning: key :sustain is duplicated and overwritten on line 57
workspace_zero:57: warning: key :amp is duplicated and overwritten on line 57
workspace_zero:61: warning: key :sustain is duplicated and overwritten on line 61
workspace_zero:61: warning: key :amp is duplicated and overwritten on line 61
workspace_zero:65: warning: key :sustain is duplicated and overwritten on line 65
workspace_zero:65: warning: key :amp is duplicated and overwritten on line 65
workspace_zero:69: warning: key :sustain is duplicated and overwritten on line 69
workspace_zero:69: warning: key :amp is duplicated and overwritten on line 69
workspace_zero:73: warning: key :sustain is duplicated and overwritten on line 73
workspace_zero:73: warning: key :amp is duplicated and overwritten on line 73
workspace_zero:77: warning: key :sustain is duplicated and overwritten on line 77
workspace_zero:77: warning: key :amp is duplicated and overwritten on line 77
workspace_zero:81: warning: key :sustain is duplicated and overwritten on line 81
workspace_zero:81: warning: key :amp is duplicated and overwritten on line 81
workspace_zero:85: warning: key :sustain is duplicated and overwritten on line 85
workspace_zero:85: warning: key :amp is duplicated and overwritten on line 85
workspace_zero:89: warning: key :sustain is duplicated and overwritten on line 89
workspace_zero:89: warning: key :amp is duplicated and overwritten on line 89
workspace_zero:93: warning: key :sustain is duplicated and overwritten on line 93
workspace_zero:93: warning: key :amp is duplicated and overwritten on line 93
workspace_zero:97: warning: key :sustain is duplicated and overwritten on line 97
workspace_zero:97: warning: key :amp is duplicated and overwritten on line 97
workspace_zero:101: warning: key :sustain is duplicated and overwritten on line 101
workspace_zero:101: warning: key :amp is duplicated and overwritten on line 101
workspace_zero:105: warning: key :sustain is duplicated and overwritten on line 105
workspace_zero:105: warning: key :amp is duplicated and overwritten on line 105
workspace_zero:109: warning: key :sustain is duplicated and overwritten on line 109
workspace_zero:109: warning: key :amp is duplicated and overwritten on line 109
workspace_zero:113: warning: key :sustain is duplicated and overwritten on line 113
workspace_zero:113: warning: key :amp is duplicated and overwritten on line 113
workspace_zero:117: warning: key :sustain is duplicated and overwritten on line 117
workspace_zero:117: warning: key :amp is duplicated and overwritten on line 117
workspace_zero:121: warning: key :sustain is duplicated and overwritten on line 121
workspace_zero:121: warning: key :amp is duplicated and overwritten on line 121
workspace_zero:125: warning: key :sustain is duplicated and overwritten on line 125
workspace_zero:125: warning: key :amp is duplicated and overwritten on line 125
workspace_zero:129: warning: key :sustain is duplicated and overwritten on line 129
workspace_zero:129: warning: key :amp is duplicated and overwritten on line 129
workspace_zero:133: warning: key :sustain is duplicated and overwritten on line 133
workspace_zero:133: warning: key :amp is duplicated and overwritten on line 133
workspace_zero:137: warning: key :sustain is duplicated and overwritten on line 137
workspace_zero:137: warning: key :amp is duplicated and overwritten on line 137
workspace_zero:141: warning: key :sustain is duplicated and overwritten on line 141
workspace_zero:141: warning: key :amp is duplicated and overwritten on line 141
workspace_zero:145: warning: key :sustain is duplicated and overwritten on line 145
workspace_zero:145: warning: key :amp is duplicated and overwritten on line 145
workspace_zero:149: warning: key :sustain is duplicated and overwritten on line 149
workspace_zero:149: warning: key :amp is duplicated and overwritten on line 149
workspace_zero:153: warning: key :sustain is duplicated and overwritten on line 153
workspace_zero:153: warning: key :amp is duplicated and overwritten on line 153
workspace_zero:157: warning: key :sustain is duplicated and overwritten on line 157
workspace_zero:157: warning: key :amp is duplicated and overwritten on line 157
workspace_zero:161: warning: key :sustain is duplicated and overwritten on line 161
workspace_zero:161: warning: key :amp is duplicated and overwritten on line 161
workspace_zero:165: warning: key :sustain is duplicated and overwritten on line 165
workspace_zero:165: warning: key :amp is duplicated and overwritten on line 165
workspace_zero:169: warning: key :sustain is duplicated and overwritten on line 169
workspace_zero:169: warning: key :amp is duplicated and overwritten on line 169
workspace_zero:173: warning: key :sustain is duplicated and overwritten on line 173
workspace_zero:173: warning: key :amp is duplicated and overwritten on line 173
workspace_zero:177: warning: key :sustain is duplicated and overwritten on line 177
workspace_zero:177: warning: key :amp is duplicated and overwritten on line 177
workspace_zero:181: warning: key :sustain is duplicated and overwritten on line 181
workspace_zero:181: warning: key :amp is duplicated and overwritten on line 181
workspace_zero:185: warning: key :sustain is duplicated and overwritten on line 185
workspace_zero:185: warning: key :amp is duplicated and overwritten on line 185

===========
Critical: UDP Server Spider API Server for port ["AF_INET", 35914, "127.0.0.1", "127.0.0.1"] had issues receiving from socket
undefined method `%' for nil
["/Users/rbn/dev/sonic-pi/app/build/macOS_Release/Sonic Pi.app/Contents/Resources/app/server/ruby/lib/sonicpi/osc/oscdecode.rb:100:in `block in decode_single_message'", "/Users/rbn/dev/sonic-pi/app/build/macOS_Release/Sonic Pi.app/Contents/Resources/app/server/ruby/lib/sonicpi/osc/oscdecode.rb:67:in `each_char'", "/Users/rbn/dev/sonic-pi/app/build/macOS_Release/Sonic Pi.app/Contents/Resources/app/server/ruby/lib/sonicpi/osc/oscdecode.rb:67:in `decode_single_message'", "/Users/rbn/dev/sonic-pi/app/build/macOS_Release/Sonic Pi.app/Contents/Resources/app/server/ruby/lib/sonicpi/osc/udp_server.rb:89:in `block in start_listener'", "<internal:kernel>:187:in `loop'", "/Users/rbn/dev/sonic-pi/app/build/macOS_Release/Sonic Pi.app/Contents/Resources/app/server/ruby/lib/sonicpi/osc/udp_server.rb:86:in `start_listener'", "/Users/rbn/dev/sonic-pi/app/build/macOS_Release/Sonic Pi.app/Contents/Resources/app/server/ruby/lib/sonicpi/osc/udp_server.rb:41:in `block in initialize'"]
===========

===========
Critical: UDP Server Spider API Server for port ["AF_INET", 35914, "127.0.0.1", "127.0.0.1"] had issues receiving from socket
undefined method `%' for nil
["/Users/rbn/dev/sonic-pi/app/build/macOS_Release/Sonic Pi.app/Contents/Resources/app/server/ruby/lib/sonicpi/osc/oscdecode.rb:100:in `block in decode_single_message'", "/Users/rbn/dev/sonic-pi/app/build/macOS_Release/Sonic Pi.app/Contents/Resources/app/server/ruby/lib/sonicpi/osc/oscdecode.rb:67:in `each_char'", "/Users/rbn/dev/sonic-pi/app/build/macOS_Release/Sonic Pi.app/Contents/Resources/app/server/ruby/lib/sonicpi/osc/oscdecode.rb:67:in `decode_single_message'", "/Users/rbn/dev/sonic-pi/app/build/macOS_Release/Sonic Pi.app/Contents/Resources/app/server/ruby/lib/sonicpi/osc/udp_server.rb:89:in `block in start_listener'", "<internal:kernel>:187:in `loop'", "/Users/rbn/dev/sonic-pi/app/build/macOS_Release/Sonic Pi.app/Contents/Resources/app/server/ruby/lib/sonicpi/osc/udp_server.rb:86:in `start_listener'", "/Users/rbn/dev/sonic-pi/app/build/macOS_Release/Sonic Pi.app/Contents/Resources/app/server/ruby/lib/sonicpi/osc/udp_server.rb:41:in `block in initialize'"]
===========
Studio - Pausing SuperCollider Audio Server
Studio - Pausing SuperCollider Audio Server
Studio - Pausing SuperCollider Audio Server

So it doesn’t really like multiple calls to your basic line lilke

with_synth "pluck" do handle = play 60, sustain: 0.06026268005371094, release: 0.0625, amp: 0.8432861328125, sustain: 0.08319664001464844, amp: 1.0 end 

I’m not to sure what you are trying to achive here. It’s like using a control function to alter say a cutoff value. However there is no defined time delay between the two sustain: settings for example

I defined your basic first section as a function and foud it works OK just calling this many times as required.
eg put your code inside

define :gr do
...
...
end

gr
gr #as required

This ran OK on a Mac after lengthening the net.inet.udp.maxdgram value

Note also that it will work in a mac with the default 9126 max buffer size if yiou remove the blank lines in your code.

You’ve given me alot to think about here, Robin.
I’m trying to emulate granular synthesis, with each grain having different durations, amps, start points in a sample, etc. I get that making a function shortens the length of the string, but I’m basically feeding generated notation into the arrange function, which generates a separate play command (with optional params) per note.
I may need to consider a deeper refactoring here.
In the meanwhile, I cut down the length of each block to a max of an eighth note (0.125 duration), and that seems to be preventing fatal errors. I want to code it so that any casual user can use it without diving too deep into the internals of sonic pi or the os.
There’s always tradeoffs with development.
I’ll mull at this, and see where to go from here.
Thank you so much for your detailed analysis.