Doffu - Barret's Theme | バレットのテーマ

A new cover song of Barret’s Theme from Final Fantasy VII. I’ve abandoned my old project alias Bag of Dragonite and have started something new under the name Doffu (Just in case there was any confusion).

Please let me know what you think. Some of the song was done in Logic while other parts (especially the Breakcore part) were done in Sonic Pi. I couldn’t really pull this style off without the help of Sonic Pi.

2 Likes

Hi @bagofdragonite

Very good job ! A very good playful tune ! If you could share your sonic pi tips you used to achieve your goals do not hesitate !
Again, congratulations !

I’ll try and share a process video I’m creating for it now. I screen recorded the whole creative process but it’s a lot of footage to sift through and edit down into something worth sharing. I’ll include the code too at that time.

Really it all comes down to sample selection and sound arrangement. I love using Sonic Pi to make breakcore sounding beats as well as complicated chunks of audio but I don’t rely on it for arranging simple structures or for mixing and mastering purposes. I find that using a DAW like Logic is necessary in my workflow as it is stronger for visual arrangement of overall song structure as well as better mixing/mastering capabilities.

  1. I began in Logic with the MIDI information for each instrument.
  2. I selected and crafted the sounds of each instrument to be pleasing to my ear and work well together.
  3. I then individually exported all the instrument sections as wav files and placed them in a folder.
  4. Next in Sonic Pi I wrote paths to retrieve the external samples.
  5. I created Live Loops at different timings each of which played different samples.
  6. I added effects where I felt necessary.
  7. Once I was happy with things I exported each Live Loop individually and imported back into Logic.
  8. Then I did my final arrangement stitching together some some of the simpler sections from Logic with the imported stuff from Sonic Pi… added automation, build ups, panning, mixed and mastered.

It’s a long process but I think the key is to find the right workflow for you. Don’t struggle to do everything with one program, each program is a tool which has its own strengths.

Also recycle and improve your code. I rarely write any new song code from scratch. Instead I copy over an existing code structure from past projects and rework them into something suitable for the newly imported samples. You’d be surprised how often you can entirely reuse the same code with different samples and a different BPM and have it sound like an entirely new song with little effort.

I’ll try to get the video out soon and can share a link here if I remember.

1 Like

Hi @bagofdragonite

Thanks for these explanations about your creation process. It’s very useful and interesting to read your thoughts.

The key is to use good samples in computed music as in cooking, good ingredients are primordial !

Yo. You got a bandcamp for your new stuff, so I can keep up with it?

Oh yeah for sure:

Unfortunately I’m running into some encoder trouble and a bunch of the recorder footage didn’t turn out. It was my first time screen recording with Quicktime in awhile and I didn’t realize it became obsolete.

Still I did promise to share the code so here it is. It may have some oddly named things and maybe some unnecessary or redundant things because I typically just recycle code from older projects and don’t bother renaming anything. So if you see code that appears to do nothing then it probably doesn’t. This code relies on external sample folders so you’ll need to change the paths to wherever your loops or samples are located.

use_bpm 75
counter0 = 0
use_random_seed 8 #14 #8 #3# Welcome to Sonic Pi v3.1

#LOAD IN SAMPLE LIBRARIES
#Change to your own sample folder paths.
barretA = "/Users/sheakennedy/Desktop/Elder Desktop/DESKTOP/Drum Kits _ Samples/Homebrew/Barret Loops/A/"
barretDrum = "/Users/sheakennedy/Desktop/Elder Desktop/DESKTOP/Drum Kits _ Samples/Homebrew/Barret Drums/"
barretBreak = "/Users/sheakennedy/Desktop/Elder Desktop/DESKTOP/Drum Kits _ Samples/Homebrew/B - Breaks/"
barretB = "/Users/sheakennedy/Desktop/Elder Desktop/DESKTOP/Drum Kits _ Samples/Homebrew/Barret Loops/B"
barretC = "/Users/sheakennedy/Desktop/Elder Desktop/DESKTOP/Drum Kits _ Samples/Homebrew/Barret Loops/C"
barretD = "/Users/sheakennedy/Desktop/Elder Desktop/DESKTOP/Drum Kits _ Samples/Homebrew/Barret Loops/D"
barretE = "/Users/sheakennedy/Desktop/Elder Desktop/DESKTOP/Drum Kits _ Samples/Homebrew/Barret Loops/E"
barretF = "/Users/sheakennedy/Desktop/Elder Desktop/DESKTOP/Drum Kits _ Samples/Homebrew/Barret Loops/F"
barretG = "/Users/sheakennedy/Desktop/Elder Desktop/DESKTOP/Drum Kits _ Samples/Homebrew/Barret Loops/G"

#AUTOMATION
line_Riser0 = (line 10, 0, inclusive: true, steps: 16)
line_Riser1 = (line 8, 0, inclusive: true, steps: 128)
line_Riser2 = (line 4, 0, inclusive: true, steps: 128)
lfo0 = (line 70, 100, inclusive: true, steps: 16).mirror
lfo1 = (line 0.8, 0.99, inclusive: true, steps: 32).mirror
lfo2 = (line 120, 60, inclusive: true, steps: 4).mirror
lfo3 = (line 120, 100, inclusive: true, steps: 8)
lfo4 = (line 0.7, 0.99, inclusive: true, steps: 4).mirror
lfo5 = (line 0.3, 0.99, inclusive: true, steps: 2).mirror

#LEVELS 
#I set these to 0 if I want to mute a track and to 1 if I want it to play. Can also set in between for volume 
#control.
       
inst0_lvl           = 1
inst2_lvl           = 1
inst3_lvl           = 1
inst5_lvl           = 1
inst6_lvl           = 1
inst7_lvl           = 1
inst8_lvl           = 1
inst9_lvl           = 1
inst10_lvl          = 1

live_loop :euclid_beat2 do
  if(inst0_lvl == 1)
    with_fx :level, amp: inst0_lvl do
      puts tick
      with_fx :echo, mix: 0.8 do
        sample barretA, 2, rate: 1, onset: 1, release: 0.01 if (spread 8, 16).look
      end
    end
  end
  sleep 1
end

live_loop :elevator2 do
  if(inst2_lvl == 1)
    with_fx :level, amp: choose([1])  do
      puts tick
      sample barretA, 1, rate: 1
    end
  end
  sleep 8
end

live_loop :elevator3 do
  if(inst3_lvl == 1)
    with_fx :level, amp: choose([1])  do
      puts tick
      sample barretA, 0, rate: 1, release: 0.01
    end
  end
  sleep 16
end

live_loop :trip do
  puts tick
  if(inst5_lvl == 1)
    with_fx :level, amp: choose([1])  do
      with_fx :slicer, phase: 2 do
        with_fx :lpf, cutoff: lfo0.look, res: lfo1.look do
          sample barretB, 4, rate: (ring 2, 0.5).look, onset: (ring 1,0,0,2,6,4,5,  1,0,0,7,7,8,2,0).look , release: 0.01
        end
      end
    end
  end
  sleep (ring 0.5, 0.25, 0.5, 0.25).mirror.look #(ring 0.5, 0.125, 0.125,0.25)
end

live_loop :trip2 do
  puts tick
  if(inst6_lvl == 1)
    with_fx :level, amp: choose([1])  do
      sample barretA, 11, rate: (ring 2, 4).look, onset: (ring 2, 4, 4, 7).look, release: 0.01 if (spread 16, 16).look
    end
  end
  sleep (ring 0.5, 0.25, 0.25).look #Switch between these to change pacing
  #sleep (ring 0.25, 0.125, 0.125).look
end

live_loop :amen do
  puts tick
  if(inst7_lvl == 1)
    with_fx :level, amp: choose([1])  do
      sample barretC, 6, rate: 2, onset: (ring 1,0,0,2,6,4,5,  1,0,0,7,7,8,2,0).look, sustain: 0, release: 0.20 if (spread 12, 16).look
    end
  end
  sleep 0.25
end

live_loop :elevator do
  if(inst8_lvl == 1)
    puts tick
    sample barretE, 5, rate: 1, onset: 3, release: 0.01 
  end
  sleep (ring 2, 0.5, 1, 0.5).mirror.look
end

live_loop :amen2 do
  if(inst9_lvl == 1)
    with_fx :level, amp: choose([0.8,1])  do
      sample barretC, 9, rate: 2, onset: pick, sustain: 0, release: choose([0.1])
    end
  end
  sleep 0.25
end


live_loop :amen3 do
  if(inst10_lvl == 1)
    puts tick
    with_fx :level, amp: choose([1,1])  do
      sample barretBreak, 0, rate: 1, onset: pick, sustain: 0, release: choose([0.1, 0.2])
    end
  end
  sleep 0.125
end```
1 Like

Hi @bagofdragonite,

would you be so kind and make your code more readable by adding three backticks before an after?

Okay thanks, I just fixed that.

1 Like