Open rbnpi opened 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.
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
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}
Ah thanks, that's much easier
Jus to clarify, to pick a random onset you should now use pick
instead of :rand
:
sample "/foo.wav", onset: pick
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.