IKEA CUTTING BOARD (2021)
A former student wrote a piece using a cutting board from IKEA, (mostly) beer bottles, and a set of rice bowls. I borrowed the rice bowls and the cutting board to sample them and create virtual instruments. With the rice bowl samples, I created the work Jojo's Rice Bowls. Ikea Cutting Board is the sister work to Jojo's Rice Bowls. Almost all of the code is the same. There are small differences in the random seed and the tempo but they have substantial ramifications on the experience of the work. This along with the new sample source - something resembling a woodblock that is very secco - yields something fairly individual from Jojo's Rice Bowls. Nonetheless, you can still hear shared materials and formal features.
For those technically inclined, it might be interesting to look at the humanization features I added to the sample playback. With such a dry sound featuring a strong transient attack, repeated hits at the same place on the cutting board at the same dynamic level - even while utilizing different takes - resulted in a "machine gun" effect, an instant give away that the music is based on samples. However, this can be disguised via small, random adjustments to the amplitude and filtering of each sample playback event to further differentiate takes from each other as well as very small variations in wait durations, individualizing note lengths that are technically the same. This is outlined in the code below. For annotations on the rest of the coding, please consult the annotated score of Jojo's Rice Bowls.
SCORE
CuttingBoard = "/Desktop/CuttingBoard/Samples/"
set_recording_bit_depth! 24
use_random_seed 255
use_bpm 104
pan = [-0.15, -0.05, 0.05, 0.15]
event_lengths = [7, 8, 9, 14, 16, 18, 28, 32, 36]
event_nth = [3, 2, 7, 0, 8, 4, 6, 5, 1, 6, 4, 5, 0, 7, 8, 3, 1, 2, 0, 6, 3, 0, 6,
3, 0, 6, 3, 3, 8, 1, 0, 5, 7, 6, 2, 4, 6, 1, 8, 0, 4, 2, 3, 7, 5]
fours_permutations = [0, 1, 2, 3, 0, 1, 3, 2, 0, 2, 1, 3, 0, 2, 3, 1, 0, 3, 2, 1, 0,
3, 1, 2, 1, 0, 2, 3, 1, 0, 3, 2, 1, 2, 0, 3, 1, 2, 3, 0, 1, 3,
0, 2, 1, 3, 2, 0, 2, 0, 1, 3, 2, 0, 3, 1, 2, 1, 0, 3, 2, 1, 3,
0, 2, 3, 0, 1, 2, 3, 1, 0, 3, 0, 1, 2, 3, 0, 2, 1, 3, 1, 0, 2,
3, 1, 2, 0, 3, 2, 0, 1, 3, 2, 1, 0]
cycle_series_choice = [0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1,
1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1,
0, 1, 0, 1, 1, 1, 1, 0]
series_selection = [1, 2, 0, 2, 1, 0, 2, 0, 1, 0, 2, 1, 0, 1, 2, 1, 0, 2]
cycle_selection = fours_permutations.reverse
dyns_selection = [1, 4, 1, 4, 1, 4, 1, 5, 3, 1, 5, 3, 1, 0, 5, 4, 3, 2, 2, 3, 4, 5,
0, 1, 2, 4, 0, 2, 4, 0]
rhythm_selection = [0, 1, 2, 4, 3, 0, 1, 3, 2, 4, 0, 1, 3, 4, 2, 0, 1, 4, 2, 3, 0,
1, 4, 3, 2, 0, 2, 1, 3, 4, 0, 2, 1, 4, 3, 0, 2, 3, 1, 4, 0, 2,
3, 4, 1, 0, 2, 4, 1, 3, 0, 2, 4, 3, 1, 0, 3, 1, 2, 4, 0, 3, 1,
4, 2, 0, 3, 2, 1, 4, 0, 3, 2, 4, 1, 0, 3, 4, 1, 2, 0, 3, 4, 2,
1, 0, 4, 1, 2, 3, 0, 4, 1, 3, 2, 0, 4, 2, 1, 3, 0, 4, 2, 3, 1,
0, 4, 3, 1, 2, 0, 4, 3, 2, 1, 1, 0, 2, 3, 4, 1, 0, 2, 4, 3, 1,
0, 3, 2, 4, 1, 0, 3, 4, 2, 1, 0, 4, 2, 3, 1, 0, 4, 3, 2, 1, 2,
0, 3, 4, 1, 2, 0, 4, 3, 1, 2, 3, 0, 4, 1, 2, 3, 4, 0, 1, 2, 4,
0, 3, 1, 2, 4, 3, 0, 1, 3, 0, 2, 4, 1, 3, 0, 4, 2, 1, 3, 2, 0,
4, 1, 3, 2, 4, 0, 1, 3, 4, 0, 2, 1, 3, 4, 2, 0, 1, 4, 0, 2, 3,
1, 4, 0, 3, 2, 1, 4, 2, 0, 3, 1, 4, 2, 3, 0, 1, 4, 3, 0, 2, 1,
4, 3, 2, 0, 2, 0, 1, 3, 4, 2, 0, 1, 4, 3, 2, 0, 3, 1, 4, 2, 0,
3, 4, 1, 2, 0, 4, 1, 3, 2, 0, 4, 3, 1, 2, 1, 0, 3, 4, 2, 1, 0,
4, 3, 2, 1, 3, 0, 4, 2, 1, 3, 4, 0, 2, 1, 4, 0, 3, 2, 1, 4, 3,
0, 2, 3, 0, 1, 4, 2, 3, 0, 4, 1, 2, 3, 1, 0, 4, 2, 3, 1, 4, 0,
2, 3, 4, 0, 1, 2, 3, 4, 1, 0, 2, 4, 0, 1, 3, 2, 4, 0, 3, 1, 2,
4, 1, 0, 3, 2, 4, 1, 3, 0, 2, 4, 3, 0, 1, 2, 4, 3, 1, 0, 3, 0,
1, 2, 4, 3, 0, 1, 4, 2, 3, 0, 2, 1, 4, 3, 0, 2, 4, 1, 3, 0, 4,
1, 2, 3, 0, 4, 2, 1, 3, 1, 0, 2, 4, 3, 1, 0, 4, 2, 3, 1, 2, 0,
4, 3, 1, 2, 4, 0, 3, 1, 4, 0, 2, 3, 1, 4, 2, 0, 3, 2, 0, 1, 4,
3, 2, 0, 4, 1, 3, 2, 1, 0, 4, 3, 2, 1, 4, 0, 3, 2, 4, 0, 1, 3,
2, 4, 1, 0, 3, 4, 0, 1, 2, 3, 4, 0, 2, 1, 3, 4, 1, 0, 2, 3, 4,
1, 2, 0, 3, 4, 2, 0, 1, 3, 4, 2, 1, 0, 4, 0, 1, 2, 3, 4, 0, 1,
3, 2, 4, 0, 2, 1, 3, 4, 0, 2, 3, 1, 4, 0, 3, 1, 2, 4, 0, 3, 2,
1, 4, 1, 0, 2, 3, 4, 1, 0, 3, 2, 4, 1, 2, 0, 3, 4, 1, 2, 3, 0,
4, 1, 3, 0, 2, 4, 1, 3, 2, 0, 4, 2, 0, 1, 3, 4, 2, 0, 3, 1, 4,
2, 1, 0, 3, 4, 2, 1, 3, 0, 4, 2, 3, 0, 1, 4, 2, 3, 1, 0, 4, 3,
0, 1, 2, 4, 3, 0, 2, 1, 4, 3, 1, 0, 2, 4, 3, 1, 2, 0, 4, 3, 2,
0, 1]
series1 = [2, 3, 0, 1, 3, 1, 3, 1, 0, 3, 2, 1, 1, 1, 1, 1, 3, 1, 3, 1, 1,
1, 1, 1, 3, 1, 3, 1, 1, 1, 1, 1, 0, 3, 2, 1, 3, 1, 3, 1, 2, 3,
0, 1, 1, 1, 1, 1]
series2 = [3, 1, 3, 1, 0, 2, 0, 2, 1, 3, 1, 3, 2, 0, 2, 0, 0, 2, 0, 2, 2,
0, 2, 0, 0, 2, 0, 2, 2, 0, 2, 0, 1, 3, 1, 3, 0, 2, 0, 2, 3, 1,
3, 1, 2, 0, 2, 0, 0, 2, 0, 2, 1, 3, 1, 3, 2, 0, 2, 0, 3, 1, 3,
1, 1, 3, 1, 3, 3, 1, 3, 1, 1, 3, 1, 3, 3, 1, 3, 1, 2, 0, 2, 0,
1, 3, 1, 3, 0, 2, 0, 2, 3, 1, 3, 1]
series3 = fours_permutations
quartet_vals = range(1, 12, inclusive: true)
trio_vals = range(1, 18, inclusive: true)
pairs_vals = range(1, 24, inclusive: true)
singles_vals = range(0,47,inclusive: true)
count = 0
#This is the foundation of the whole piece.
cycle_series_choice.each do |n|
count = count + 1
print "This is event: #{count}"
temp_len = event_lengths[event_nth.tick(:evt_n)]
event_pitches = if n == 0 then
temp_series_select = series_selection.tick(:ser_sel)
case temp_series_select
when 0
temp_len.times.collect { series1.tick(:ser1) }
when 1
temp_len.times.collect { series2.tick(:ser2) }
when 2
temp_len.times.collect { series3.tick(:ser3) }
end
else
temp_cycle_select = cycle_selection.tick(:cyc_sel)
case temp_cycle_select
when 0
temp_single = singles_vals.tick(:s_val).to_i
temp_len.times.collect { fours_permutations[temp_single] }
when 1
temp_pair = fours_permutations.take(2 * pairs_vals.tick(:p_val)).last(2)
(temp_len / 2.0).ceil.times.collect { temp_pair }.flatten.take(temp_len)
when 2
temp_trio = fours_permutations.take(3 * trio_vals.tick(:t_val)).last(3)
(temp_len / 3.0).ceil.times.collect { temp_trio }.flatten.take(temp_len)
when 3
temp_quartet = fours_permutations.take(4 * quartet_vals.tick(:q_val)).last(4)
(temp_len / 4.0).ceil.times.collect { temp_quartet }.flatten.take(temp_len)
end
end
temp_rhy_select = rhythm_selection.tick(:rhy_sel)
event_rhythm = case temp_rhy_select
when 0
temp_single_dur = choose([0.125, 0.14, 0.167, 0.2, 0.25, 0.33, 0.4, 0.5])
temp_len.times.collect { temp_single_dur }
when 1
temp_len.times.collect { choose([0.125, 0.14, 0.167, 0.2, 0.25, 0.33, 0.4, 0.5]) }
when 2
(temp_len / rrand_i(2,5)).round.times.collect
{ choose([0.125, 0.14, 0.167, 0.2, 0.25, 0.33, 0.4, 0.5]) }
when 3
temp_accel = line(7,0,steps: temp_len,inclusive:true).to_a.collect {|n| n.round}
temp_accel.collect { |n| [0.125, 0.14, 0.167, 0.2, 0.25, 0.33, 0.4, 0.5][n] }
when 4
temp_rit = line(0,7,steps: temp_len,inclusive:true).to_a.collect {|n| n.round}
temp_rit.collect { |n| [0.125, 0.14, 0.167, 0.2, 0.25, 0.33, 0.4, 0.5][n] }
end
temp_dyns_select = dyns_selection.tick(:dyns_sel)
event_dynamics = case temp_dyns_select
when 0
temp_len.times.collect { 2 }
when 1
temp_len.times.collect { 0 }
when 2
line(0, 3, steps: temp_len, inclusive:true).to_a.collect {|n| n.round}
when 3
line(3, 0, steps: temp_len, inclusive:true).to_a.collect {|n| n.round}
when 4
temp_len.times.collect {
if one_in(8)
3
else
choose([0,1])
end
}
when 5
temp_len.times.collect {
if one_in(8)
choose([1,2])
else
0
end
}
end
temp_len.times do
# This is where the humanization is added in. The humanize variable is a randomly selected value
# between 0 and 5. This is multiplied by 0.25 to create an amplitude adjustment, which is added to
# a base amplitude value of 0.9, making the amplitude range 0.9-2.15. A low pass filter is added
# to each sample playback event. It also utilizes the humanize variable, making a range of values
# between 105-130. Note that quieter events will, therefore, also be less bright, which simulates
# what typically happens with instrumental sounds. There is also an adjustment added to the wait
# time. It also uses the humanize variable, adding between 0-14ms delay between attacks. This is
# particularly helpful with the attacks that are repeated quickly, making them seem less
# mechanistic.
humanize = rrand_i(0,5)
amp_adjust = humanize * 0.25
wait_adjust = humanize * 0.005
cur_pitch = event_pitches.tick(:pitch)
cur_samp = (cur_pitch * 16) + (event_dynamics.tick(:dyn) * 4) + fours_permutations.tick(:take)
sample CuttingBoard, cur_samp, pan: pan[cur_pitch], amp: 0.9 + amp_adjust, lpf: 105 + (humanize * 5)
wait event_rhythm.tick(:rhy) + wait_adjust
end
end