First attempt: You Just Have To Pay Attention

Dropbox link.

It’s a I V vi IV progression, playing the chords and partial arpeggios over them
plus a few non-chord notes from the scale of each chord.
Not a lot of randomness, mostly just overlapping different length sequences. Only uses random to decide whether or not to play certain beats and to add some ‘humanizing’ to the chord arpeggios.

whole = 4.0
double = whole*2
half = whole/2
quart = whole/4
eight = whole/8
sixth = whole/16
use_bpm 60
root = :E2
live_loop :main do
  puts("counter", tick(:ctr))
  set :ctr, look(:ctr)
  if (get :ctr) > 60 # stop main loop
    stop
  end
  
  progression = [
    [root, :major, double],
    [root+7, :major, double],
    [root+9, :minor, double],
    [root+5, :major, whole],
    [root+5, :major, whole],
  ]
  note, kind, time = progression.tick(:prog)
  print(note, kind)
  if look(:ctr) > 3 # start main piano chords
    use_synth :piano
    with_fx :gverb  do
      play (chord note, kind), sustain: time*2, attack: 0.5
    end
  end
  
  if look(:ctr) > 6 # start overtone chords
    use_synth :pretty_bell
    overamp =   (1+Math.sin(tick(:overamp)/5+3.14159))/8
    with_fx :flanger do
      with_fx :ring_mod do
        play (chord note+12, kind, invert:2), sustain: time, attack: time/2, amp:overamp
      end
    end
  end
  
  
  use_synth :piano
  set :bassnote, note
  set :basskind, kind
  play note, sustain: time, attack: 0.5
  use_synth :piano
  
  with_fx :flanger do
    with_fx :panslicer, mix: 0.35 do
      if look(:ctr) > 8 # start single notes
        time_warp rand(0.05) do
          play (chord note, kind, num_octaves: 3).tick(:arp), sustain: time/2, decay:time/2
          sleep time/2
          play (chord note, kind, num_octaves: 2).tick(:arp)+12, sustain: time/2, decay:time/2
        end
      end
      if one_in(4)
        sleep time/4
        print('non chord')
        if look(:ctr) > 12 # start extra notes
          time_warp rand(0.1) do
            play (scale note, kind, num_octaves: 2).choose, sustain: time/4, decay:time/4
          end
        end
        sleep time/4
      else
        sleep time/2
      end
    end
  end
end # end main loop




if (get :ctr) > 56 # stop industrial sample
  stop
end
live_loop :beat do
  sleep 12
  with_fx :gverb, spread: 1, damp: 0.3, room: 30, amp: 0.5 do
    with_fx :ring_mod, mix: 1, phase: 8 do
      if one_in(2)
        sample :loop_industrial, release:0.6, finish: 0.8
      end
    end
  end
end

live_loop :beat2 do
  if (get :ctr) > 54 # stop at 2.5 mins
    stop
  end
  sleep 2
  if not one_in(3)
    with_fx :echo, phase:2.0/8*1.5, decay:2 do
      sample :drum_heavy_kick, amp:0.4
    end
  end
  if not one_in(4)
    sleep 2
    with_fx :echo, phase:2.0/8*1.5, decay:2 do
      sample :drum_bass_hard, amp:0.4
    end
  end
end

# bass piano
live_loop :bass do
  if (get :ctr) > 56 # stop bass notes
    stop
  end
  note = (chord get(:bassnote), get(:basskind))[[2,0].look(:bassline)]-12
  time_warp -1 do
    use_synth :hollow
    play note-12, pan:[0.8,0.7,-0.8,-0.7].look(:bassline), attack:0, release:0.75, sustain:[7,2].look(:bassline), amp:3
    use_synth :piano
    play note, sustain: 0.5, pan:[-0.5,-0.4,0.5,0.4].look(:bassline), attack:0, release:0.25, sustain:[7,2].look(:bassline), amp:0.7
  end
  with_fx :panslicer, phase:1, wave:3  do
    use_synth :fm
    play note-12, sustain:[7,2].look(:bassline), amp:1
  end
  sleep [1,7].tick(:bassline)
end
```
3 Likes

This is your first piece?? I am totally impressed … :+1: :+1:

Here some small hints:

  • better place a blank between the parameters and the values (sustain: 1 instead of sustain:1)
  • There is the constant Math::PI in case you’ll need it for your future work
  • the program throws an error at the first start, because the set :ctr comes to late for the other loops. Just a put a set :ctr inside the head before the live_loop
  • If you post code, better put it inside 3 backticks ``` ; then you’ll get nice colored formatting

Thanks for sharing and I am looking forward to the pieces to come!! :+1: :+1:

EDIT: I think the statement

if (get :ctr) > 56 # stop industrial sample
  stop
end

in line 77 will not have any effect. Think about the Ruby interpreter as parsing the file from top to bottom. These lines will be executed even before the live_loops start running.

Thanks so much, for the kind words and tips!

Welcome and very nicely done! It gives me Minecraft vibes. I’m personally reminded of the quiet and solitude of playing the game in single player mode, gradually building a base, with a trace of loneliness.

EDIT: had to mention upon listening to this a few more times that I really like your sound design and think it builds a wonderfully emotional vibe. Perhaps you could share some tips and considerations that went into making this piece? I know it’s your first post and all, but you obviously know something about music, even if it’s intuition.

Thanks!
The piece is structured around a I V vi IV progression, so there’s a simple, well known harmonic structure, even if it gets buried a bit.

I start with just bass notes, combining a Piano synth which plays a dominant (5th) above the tonic (root) of the current chord 1 beat before the progression changes, and the the tonic right at the change, so this gives you a leading note that helps give a sense of forward motion. Below that I use a Hollow synth to mirror the piano 1 octave lower, to add a sense of menace.

After that, the actual chords kick in, also played on a piano synth.

After a while, the chord notes come in, played in pairs in sequence over 3 and 2 octaves. For instance, the first chord is E, so the notes are E F# G#. There’s a single tick for these notes, regardless of which chord we’re in, so the sequence skips around.

After a longer while, I add the entire scale related to the chord, playing notes picked at random. This can produce some dissonance, as not all the scale notes will mesh with the scales of the other chords in the progression. For instance, the vi chord is b minor (its scale is B, C♯, D, E, F♯, G, A). If the G note is ringing, for example, and the chord progression goes back to A (which has the scale A, B, C♯, D, E, F♯, G♯) it might clash with a G# or with the A chord itself (A, C#, E).

On top of that, I repeat the chords with a pretty_bell synth, one octave up and with a ringmod with a long phase, to create a sort of high pitched whine that fades in and out, which mimics what I’d do with an electric guitar if I was recording this traditionally.

Finally, there’s some sparse drum samples triggered randomly at long intervals, just to remind you of the beat without actually defining a rhythm, including the ‘loop_industrial’ sample which to me gives it a kind of Prince vibe.

At the end, the parts start to drop out, leaving you with just the final notes on the piano reverberating.

Other than that, I just tweaked the sounds, synths and effects until I got the feeling I was looking for.

1 Like

D’oh. You’re right of course.

Thanks for your thorough walkthrough and explanation!

I realise there’s no exact science of doubling/layering except in classical orchestration, so much of sound design is a matter of experimentation and experience. I like how you’ve brought your electric guitar and listening background into your music. All I see whenever I try to do instrumentation is a tabula rasa. Unable to define and differentiate roles, I end up using similar/identical synths for all my voices, which gets boring quick. That’s why I’m seeking thoughts.

So would you say there’s a need to reconcile such conflicts, and if so, how would you approach it? Because if too many conflicts happen in quick succession, I imagine a piece might fall apart. To draw from my listening with an extreme case, Schoenberg achieves coherence in his later atonal works by employing traditional rhythms, melodic phrases, and voicing.

My approach for coherence is to rely on motifs which remain constant throughout rapid modulations/chord substitutions. My work leans a bit too random and is lacking in structure however, so I’m rethinking my approach.

Another thing I have to learn from. My music is essentially a continuous stream. Any thoughts on how to approach spacing elements out? I’ve tried simply pausing every other measure, which sometimes creates a nice call and response between voices. But I don’t have much of a method to my bit of madness :sweat_smile:

I just realised that I’m getting Minecraft vibes because the drums are completely missing on every other run. I like the music with and without the drums however.

Not really. I try to keep them down to a few, and I futzed the script a little because it was ending on a jarring one, other than that I feel they add a bit of spice.

I want to try doing something bluesy with some pre-made motifs, like when you play a riff or lick on the guitar.

In this case, just setting it to be random (or periodic), and tuning it by ear until it sounds right.

1 Like

It helps me to think about each voice as a traditional instrument or role. So I have the bass, the rhythm guitar or piano, the vocal melody, the background vocals, the drums, the percussion, etc.

1 Like

When trying to write EDM, I usually have roles for the sub & bass, chords, lead, arps, and percussion. I find synth presets helpful as a starting point. Even with a wavetable synth as versatile as Serum however, I have difficulties creating distinct and interesting patches. I guess I just need to experiment more.

Thanks for your thoughts! It’s always nice to hear from different artists :slightly_smiling_face:

1 Like