top of page

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.

Description
Recording
Score

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

bottom of page