Oh, I understand now! I’ve updated the script to take this into account. In addition:
- The script has more comments this will, hopefully, make it easier for others (and future Ibby) to use.
- The script has options for setting the attack, sustain and release ratios.
I tested this with a version of Brahm’s Lullaby. This file is small enough to run in Sonic Pi, without run_file
.
Note that the synths were added after the file was generated.
use_bpm 100
melody0 = [{:note=>64, :duration=>0.47291666666666665}, {:note=>64, :duration=>0.47291666666666665}, {:note=>67, :duration=>1.8979166666666667}, {:note=>64, :duration=>0.47291666666666665}, {:note=>64, :duration=>0.47291666666666665}, {:note=>67, :duration=>1.8979166666666667}, {:note=>64, :duration=>0.47291666666666665}, {:note=>67, :duration=>0.47291666666666665}, {:note=>72, :duration=>0.9479166666666666}, {:note=>71, :duration=>1.4229166666666666}, {:note=>69, :duration=>0.47291666666666665}, {:note=>69, :duration=>0.9479166666666666}, {:note=>67, :duration=>0.9479166666666666}, {:note=>62, :duration=>0.47291666666666665}, {:note=>64, :duration=>0.47291666666666665}, {:note=>65, :duration=>1.8979166666666667}, {:note=>62, :duration=>0.47291666666666665}, {:note=>64, :duration=>0.47291666666666665}, {:note=>65, :duration=>1.8979166666666667}, {:note=>62, :duration=>0.47291666666666665}, {:note=>65, :duration=>0.47291666666666665}, {:note=>71, :duration=>0.47291666666666665}, {:note=>69, :duration=>0.47291666666666665}, {:note=>67, :duration=>0.9479166666666666}, {:note=>71, :duration=>0.9479166666666666}, {:note=>72, :duration=>1.8979166666666667}, {:note=>60, :duration=>0.47291666666666665}, {:note=>60, :duration=>0.47291666666666665}, {:note=>72, :duration=>1.8979166666666667}, {:note=>69, :duration=>0.47291666666666665}, {:note=>65, :duration=>0.47291666666666665}, {:note=>67, :duration=>1.8979166666666667}, {:note=>64, :duration=>0.47291666666666665}, {:note=>60, :duration=>0.47291666666666665}, {:note=>65, :duration=>0.9479166666666666}, {:note=>67, :duration=>0.9479166666666666}, {:note=>69, :duration=>0.9479166666666666}, {:note=>64, :duration=>0.9979166666666667}, {:note=>67, :duration=>0.9479166666666666}, {:note=>60, :duration=>0.47291666666666665}, {:note=>60, :duration=>0.47291666666666665}, {:note=>72, :duration=>1.8979166666666667}, {:note=>69, :duration=>0.47291666666666665}, {:note=>65, :duration=>0.47291666666666665}, {:note=>67, :duration=>1.8979166666666667}, {:note=>64, :duration=>0.47291666666666665}, {:note=>60, :duration=>0.47291666666666665}, {:note=>65, :duration=>0.4979166666666667}, {:note=>67, :duration=>0.24791666666666667}, {:note=>65, :duration=>0.24791666666666667}, {:note=>64, :duration=>0.9479166666666666}, {:note=>62, :duration=>0.9479166666666666}, {:note=>60, :duration=>1.8979166666666667}]
sleeps0 = [0.0, 0.5, 0.5, 2.0, 0.5, 0.5, 2.0, 0.5, 0.5, 1.0, 1.5, 0.5, 1.0, 1.0, 0.5, 0.5, 2.0, 0.5, 0.5, 2.0, 0.5, 0.5, 0.5, 0.5, 1.0, 1.0, 2.0, 0.5, 0.5, 2.0, 0.5, 0.5, 2.0, 0.5, 0.5, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5, 0.5, 2.0, 0.5, 0.5, 2.0, 0.5, 0.5, 0.5, 0.25, 0.25, 1.0, 1.0]
in_thread do
use_synth :dpulse
sleep sleeps0[0]
melody0.each_with_index do |item,i|
play item[:note], sustain: item[:duration]*0.8, release: item[:duration]*0.2
sleep sleeps0[i+1] if i+1 < sleeps0.length
end
end
melody1 = [{:note=>48, :duration=>0.9479166666666666}, {:note=>52, :duration=>1.8979166666666667}, {:note=>55, :duration=>1.8979166666666667}, {:note=>48, :duration=>0.9479166666666666}, {:note=>52, :duration=>1.8979166666666667}, {:note=>55, :duration=>1.8979166666666667}, {:note=>48, :duration=>0.9479166666666666}, {:note=>52, :duration=>1.8979166666666667}, {:note=>55, :duration=>1.8979166666666667}, {:note=>47, :duration=>0.9479166666666666}, {:note=>53, :duration=>0.9479166666666666}, {:note=>55, :duration=>0.9479166666666666}, {:note=>47, :duration=>0.9479166666666666}, {:note=>53, :duration=>1.8979166666666667}, {:note=>55, :duration=>1.8979166666666667}, {:note=>47, :duration=>0.9479166666666666}, {:note=>53, :duration=>1.8979166666666667}, {:note=>55, :duration=>1.8979166666666667}, {:note=>47, :duration=>0.9479166666666666}, {:note=>53, :duration=>1.8979166666666667}, {:note=>55, :duration=>1.8979166666666667}, {:note=>48, :duration=>0.9479166666666666}, {:note=>52, :duration=>1.8979166666666667}, {:note=>55, :duration=>1.8979166666666667}, {:note=>48, :duration=>0.9479166666666666}, {:note=>53, :duration=>1.8979166666666667}, {:note=>57, :duration=>1.8979166666666667}, {:note=>48, :duration=>0.9479166666666666}, {:note=>52, :duration=>1.8979166666666667}, {:note=>55, :duration=>1.8979166666666667}, {:note=>50, :duration=>0.9479166666666666}, {:note=>52, :duration=>0.9479166666666666}, {:note=>53, :duration=>0.9479166666666666}, {:note=>48, :duration=>0.9479166666666666}, {:note=>52, :duration=>1.8979166666666667}, {:note=>55, :duration=>1.8979166666666667}, {:note=>48, :duration=>0.9479166666666666}, {:note=>53, :duration=>1.8979166666666667}, {:note=>57, :duration=>1.8979166666666667}, {:note=>48, :duration=>0.9479166666666666}, {:note=>52, :duration=>1.8979166666666667}, {:note=>55, :duration=>1.8979166666666667}, {:note=>57, :duration=>0.9479166666666666}, {:note=>55, :duration=>0.9479166666666666}, {:note=>53, :duration=>0.9479166666666666}, {:note=>48, :duration=>1.8979166666666667}, {:note=>52, :duration=>1.8979166666666667}]
sleeps1 = [1.0, 1.0, 0.0, 2.0, 1.0, 0.0, 2.0, 1.0, 0.0, 2.0, 1.0, 0.0, 2.0, 1.0, 0.0, 2.0, 1.0, 0.0, 2.0, 1.0, 0.0, 2.0, 1.0, 0.0, 2.0, 1.0, 0.0, 2.0, 1.0, 0.0, 2.0, 1.0, 1.0, 1.0, 1.0, 0.0, 2.0, 1.0, 0.0, 2.0, 1.0, 0.0, 2.0, 1.0, 1.0, 1.0, 0.0]
in_thread do
use_synth :dsaw
sleep sleeps1[0]
melody1.each_with_index do |item,i|
play item[:note], sustain: item[:duration]*0.8, release: item[:duration]*0.2
sleep sleeps1[i+1] if i+1 < sleeps1.length
end
end