sonic-pi-net / sonic-pi

Code. Music. Live.
https://sonic-pi.net
Other
10.76k stars 921 forks source link

expose more onset data? #1328

Open rbnpi opened 8 years ago

rbnpi commented 8 years ago

Any chance of exposing more onset data for a given sample. Use of sample :loop_amen_full,onset:3 for example is great, but it would be nice to get access to the full onset data of start and stop times for a given sample with a suitable call akin to the onset_slices function in samplebuffer.rb applied to a given sample.

samaaron commented 8 years ago

Yes, there are plans to expose more of the Aubio API - but not for the next release. We need to be careful that the API will create for Sonic Pi is incredibly simple and easy to use. I think the onset: opt achieves that. I still haven't decided upon the best way to obtain and manipulate the slice times.

rbnpi commented 8 years ago

OK. At the moment I run something like

50.times do |i|
sample :loop_compus,onset: i
sleep 0.1
end

with log_synths turned on. From the output below:

run: 121, time: 0.0}
 └─ sample "~/src/sonic-pi/etc/samples",
             "loop_compus.flac", {onset: 0, start: 0.0, finish: 0.03}

{run: 121, time: 0.1}
 ├─ Timing error: can't keep up...
 └─ sample "~/src/sonic-pi/etc/samples",
             "loop_compus.flac", {onset: 1, start: 0.03, finish: 0.0477}

{run: 121, time: 0.2}
 ├─ Timing error: can't keep up...
 └─ sample "~/src/sonic-pi/etc/samples",
             "loop_compus.flac", {onset: 2, start: 0.0477, finish: 0.0611}

{run: 121, time: 0.3}
 └─ sample "~/src/sonic-pi/etc/samples",
             "loop_compus.flac", {onset: 3, start: 0.0611, finish: 0.0927}

{run: 121, time: 0.4}
 └─ sample "~/src/sonic-pi/etc/samples",
             "loop_compus.flac", {onset: 4, start: 0.0927, finish: 0.1086}

{run: 121, time: 0.5}
 └─ sample "~/src/sonic-pi/etc/samples",
             "loop_compus.flac", {onset: 5, start: 0.1086, finish: 0.1235}

{run: 121, time: 0.6}
 └─ sample "~/src/sonic-pi/etc/samples",
             "loop_compus.flac", {onset: 6, start: 0.1235, finish: 0.1861}

{run: 121, time: 0.7}
 └─ sample "~/src/sonic-pi/etc/samples",
             "loop_compus.flac", {onset: 7, start: 0.1861, finish: 0.2503}

{run: 121, time: 0.8}
 └─ sample "~/src/sonic-pi/etc/samples",
             "loop_compus.flac", {onset: 8, start: 0.2503, finish: 0.2793}

{run: 121, time: 0.9}
 └─ sample "~/src/sonic-pi/etc/samples",
             "loop_compus.flac", {onset: 9, start: 0.2793, finish: 0.2934}

{run: 121, time: 1.0}
 └─ sample "~/src/sonic-pi/etc/samples",
             "loop_compus.flac", {onset: 10, start: 0.2934, finish: 0.3113}

{run: 121, time: 1.1}
 └─ sample "~/src/sonic-pi/etc/samples",
             "loop_compus.flac", {onset: 11, start: 0.3113, finish: 0.3424}

{run: 121, time: 1.2}
 └─ sample "~/src/sonic-pi/etc/samples",
             "loop_compus.flac", {onset: 12, start: 0.3424, finish: 0.3738}

{run: 121, time: 1.3}
 └─ sample "~/src/sonic-pi/etc/samples",
             "loop_compus.flac", {onset: 13, start: 0.3738, finish: 0.4365}

{run: 121, time: 1.4}
 └─ sample "~/src/sonic-pi/etc/samples",
             "loop_compus.flac", {onset: 14, start: 0.4365, finish: 0.5}

{run: 121, time: 1.5}
 └─ sample "~/src/sonic-pi/etc/samples",
             "loop_compus.flac", {onset: 15, start: 0.5, finish: 0.5309}

{run: 121, time: 1.6}
 └─ sample "~/src/sonic-pi/etc/samples",
             "loop_compus.flac", {onset: 16, start: 0.5309, finish: 0.5388}

{run: 121, time: 1.7}
 └─ sample "~/src/sonic-pi/etc/samples",
             "loop_compus.flac", {onset: 17, start: 0.5388, finish: 0.5616}

{run: 121, time: 1.8}
 └─ sample "~/src/sonic-pi/etc/samples",
             "loop_compus.flac", {onset: 18, start: 0.5616, finish: 0.5922}

{run: 121, time: 1.9}
 └─ sample "~/src/sonic-pi/etc/samples",
             "loop_compus.flac", {onset: 19, start: 0.5922, finish: 0.6082}

{run: 121, time: 2.0}
 └─ sample "~/src/sonic-pi/etc/samples",
             "loop_compus.flac", {onset: 20, start: 0.6082, finish: 0.623}

{run: 121, time: 2.1}
 └─ sample "~/src/sonic-pi/etc/samples",
             "loop_compus.flac", {onset: 21, start: 0.623, finish: 0.6861}

{run: 121, time: 2.2}
 └─ sample "~/src/sonic-pi/etc/samples",
             "loop_compus.flac", {onset: 22, start: 0.6861, finish: 0.7499}

{run: 121, time: 2.3}
 └─ sample "~/src/sonic-pi/etc/samples",
             "loop_compus.flac", {onset: 23, start: 0.7499, finish: 0.7845}

{run: 121, time: 2.4}
 └─ sample "~/src/sonic-pi/etc/samples",
             "loop_compus.flac", {onset: 24, start: 0.7845, finish: 0.8108}

{run: 121, time: 2.5}
 └─ sample "~/src/sonic-pi/etc/samples",
             "loop_compus.flac", {onset: 25, start: 0.8108, finish: 0.8426}

{run: 121, time: 2.6}
 └─ sample "~/src/sonic-pi/etc/samples",
             "loop_compus.flac", {onset: 26, start: 0.8426, finish: 0.8733}

{run: 121, time: 2.7}
 └─ sample "~/src/sonic-pi/etc/samples",
             "loop_compus.flac", {onset: 27, start: 0.8733, finish: 0.936}

{run: 121, time: 2.8}
 └─ sample "~/src/sonic-pi/etc/samples",
             "loop_compus.flac", {onset: 28, start: 0.936, finish: 0.9996}

{run: 121, time: 2.9}
 └─ sample "~/src/sonic-pi/etc/samples",
             "loop_compus.flac", {onset: 29, start: 0.0, finish: 0.03}

{run: 121, time: 3.0}
 └─ sample "~/src/sonic-pi/etc/samples",
             "loop_compus.flac", {onset: 30, start: 0.03, finish: 0.0477}

I can see how many separate slices are available before it repeats, (in this case range 0 to 28) and can then use this in loops liked this:

live_loop :groove do
  l=rrand_i(0,28) #0 to 28 range found for loop_compus by inspection
  puts l
  sample :loop_compus,onset: l,amp: 4,beat_stretch: 6
  #sample :bd_haus,amp: 3 if !spread(5,8).tick
  sleep 0.15
end

It would be nice to have a command to get the onset slice range available for a given sample. eg something like onset_range :loop_compus => 28

samaaron commented 8 years ago

If you're just looking to play a random onset, use the index :rand :-)

sample "/foo.wav", onset: :rand

Also, you can pass a lambda as the onset value, and it will receive a list of all the onsets as a param:

sample "/foo.wav", onset: lambda{|x| puts x.size ; x.choose}
rbnpi commented 8 years ago

Ah thanks, that's much easier

samaaron commented 6 years ago

Jus to clarify, to pick a random onset you should now use pick instead of :rand:

sample "/foo.wav", onset: pick