[TOSS Conf 2023 Offline]Sonic Pi notes

Sonic pi (Create music using code) programs showcased in the activity

# There are no mistakes, only opportunities.
# Sam Aaron

puts "KanchiLug Sonic pi"

# Synths
use_synth :piano
play :C3

# amp, pan, rate (rate reverse)
play 60, amp: 2, pan: 0, rate: 1

# Attack, decay, sustain, release
play 60, attack: 0.3, sustain: 1, release: 1
play 60

#It’s important to note that the duration of a sound is the summation of
#the times of each of these phases. Therefore the following sound
#will have a duration of 0.5 + 1 + 2 + 0.5 = 4 beats:

loop do
  play 60, attack: 0.5, attack_level: 1, decay: 1, sustain_level: 0.4, sustain: 2, release: 0.5
  sleep 4
end

# ---

# Samples
sample :loop_amen

# What happen when you half the rate
sample :loop_amen, rate: 0.5

# Custom samples
sample "~/Downloads/game-music.wav"

loop do
  stop
  sample :loop_amen, rate: 0.5, amp: 0.4, pan: 0.8
  sleep 8
end

# ADSR
sample :loop_amen, start: 0.5, finish: 0.8, rate: -0.2, attack: 0.3, release: 1

# Effects

with_fx :reverb, room: 1 do # Slicer, echo
  sample :loop_amen, rate: 0.5
  sleep sample_duration(:loop_amen)
end

#----

# Welcome to Sonic Pi

use_random_seed 40
5.times do
play rrand(50, 100)
sleep 0.5
end

loop do
  stop
  sample :perc_bell, rate: rrand(0.125, 1.5)
  sleep rrand(0.2, 2)
end

# ---

4.times do
  sample :drum_heavy_kick
  2.times do
    sample :elec_blip2, rate: 2
    sleep 0.25
  end
  sample :elec_snare
  4.times do
    sample :drum_tom_mid_soft
    sleep 0.125
  end
end

loop do

  if one_in(2)
    sample :drum_heavy_kick
    sleep 0.5
  else
    sample :drum_cymbal_closed
    sleep 0.25
  end

end


use_synth :dsaw

loop do
  play 50, amp: 0.3, release: 2
  play 53, amp: 0.3, release: 2 if one_in(2)
  play 57, amp: 0.3, release: 2 if one_in(3)
  play 60, amp: 0.3, release: 2 if one_in(4)
  sleep 1.5
end

# ---

# List and choose
play choose([50, 55, 62])

# Functions
define :player do |root, repeats|
  repeats.times do
    play root, release: 0.3
    sleep 0.5
  end
end

player :e3, 2
sleep 0.5
player :a3, 3
player :g3, 4
sleep 0.5
player :e3, 3

# ---

loop :twinkle do
  use_bpm 120
  use_synth :piano
  play :g3
  sleep 1
  play :g3
  sleep 1
  play :d4
  sleep 1
  play :d4
  sleep 1
  play :e4
  sleep 1
  play :e4
  sleep 1
  play :c4
  sleep 2
  
  play :c4
  sleep 1
  play :c4
  sleep 1
  play :b3
  sleep 1
  play :b3
  sleep 1
  play :a3
  sleep 1
  play :a3
  sleep 1
  play :g3
  sleep 2
end

# ---

# Welcome to Sonic Pi

use_synth :piano
use_bpm 120

puts "Twinkle Twinkle Little Star"
notes = (ring :G, :G, :D, :D, :E, :E, :C)
notes.each do |n|
  play note(n, octave: 4)
  sleep 1
end

puts "How I wonder what you are"
notes = (ring :C, :C, :B, :B, :A, :A, :G)
notes.each do |n|
  play note(n, octave: 3)
  sleep 1
end

# another way of writing this

verse1 = (ring :G, :G, :D, :D, :E, :E, :C)
loop :slow do
  stop
  use_synth :piano
  play verse1.tick, release: 0.5
  sleep 0.5
end

# ---

# Multiple loops
live_loop :beats do
  sample :loop_compus, rate: 0.8, amp: 0.8
  sleep ((1/0.8) * sample_duration(:loop_compus))
end

live_loop :bass do
  use_synth :pretty_bell
  n = (chord :c2, :minor).tick
  3.times do
    play n
    sleep 1
  end
  play n
  sleep 0.5
  play (chord :c2, :minor).tick
  sleep 0.5
end

use_synth :pretty_bell
notes = (ring :E4, :Fs4, :B4, :Cs5, :D5, :Fs4, :E4, :Cs5, :B4, :Fs4, :D5, :Cs5)

live_loop :slow do
  play notes.tick, release: 0.1
  sleep 0.3
end

live_loop :faster do
  play notes.tick, release: 0.1
  sleep 0.295
end

# ---

# Welcome to Sonic Pi

use_synth :pretty_bell
use_synth :prophet
use_synth :beep
use_bpm 120

verse1 = (ring :G, :G, :D, :D, :E, :E, :C)
verse2 = (ring :C, :C, :B, :B, :A, :A, :G)
verse3 = (ring :D, :D, :C, :C, :B, :B, :A)
verse3 = (ring :D, :D, :C, :C, :B, :B, :A)
verse4 = (ring :C, :C, :B, :B, :A, :A, :G)
verse5 = (ring :G, :G, :D, :D, :E, :E, :C)

live_loop :twinkle do
  [verse1, verse2, verse3, verse4, verse5].each do |notes|
    notes.each do |n|
      if n == :G or n == :A or n == :B
        play note(n, octave: 3)
        play note(n, octave: 4)
      else
        play note(n, octave: 4)
        play note(n, octave: 5)
      end
      sample :drum_heavy_kick
      sleep 1
    end
    sample :drum_bass_hard
    sample :drum_heavy_kick, rate: 0.75
    sleep 0.5
    sample :drum_heavy_kick
    sleep 0.5
  end
  sleep 1
end

live_loop :beats do
  sample :ambi_drone
  sleep sample_duration(:ambi_drone)
end

# ---

# Blockgame

# Coded by DJ_Dave

use_bpm 130

live_loop :met1 do
  sleep 1
end

cmaster1 = 130
cmaster2 = 130

define :pattern do |pattern|
  return pattern.ring.tick == "x"
end

live_loop :kick, sync: :met1 do
  stop
  a = 1.5
  sample :bd_tek, amp: a, cutoff: cmaster1 if pattern "x--x--x---x--x--"
  sleep 0.25
end

with_fx :echo, mix: 0.2 do
  with_fx :reverb, mix: 0.2, room: 0.5 do
    live_loop :clap, sync: :met1 do
      stop
      a = 0.75
      sleep 1
      sample :drum_snare_hard, rate: 2.5, cutoff: cmaster1, amp: a
      sample :drum_snare_hard, rate: 2.2, start: 0.02, cutoff: cmaster1, pan: 0.2, amp: a
      sample :drum_snare_hard, rate: 2, start: 0.04, cutoff: cmaster1, pan: -0.2, amp: a
      sleep 1
    end
  end
end

with_fx :reverb, mix: 0.2 do
  with_fx :panslicer, mix: 0.2 do
    live_loop :hhc1, sync: :met1 do
      stop
      a = 0.75
      p = [-0.3, 0.3].choose
      sample :drum_cymbal_closed, amp: a, rate: 2.5, finish: 0.5, pan: p, cutoff: cmaster2 if pattern "x-x-x-x-x-x-x-x-xxx-x-x-x-x-x-x-"
      sleep 0.125
    end
  end
end

live_loop :hhc2, sync: :met1 do
  stop
  a = 1.25
  sleep 0.5
  sample :drum_cymbal_closed, cutoff: cmaster2, rate: 1.2, start: 0.01, finish: 0.5, amp: a
  sleep 0.5
end

with_fx :reverb, mix: 0.7 do
  live_loop :crash, sync: :met1 do
    stop
    a = 0.1
    c = cmaster2-10
    r = 1.5
    f = 0.25
    crash = :drum_splash_soft
    sleep 14.5
    sample crash, amp: a, cutoff: c, rate: r, finish: f
    sample crash, amp: a, cutoff: c, rate: r-0.2, finish: f
    sleep 1
    sample crash, amp: a, cutoff: c, rate: r, finish: f
    sample crash, amp: a, cutoff: c, rate: r-0.2, finish: f
    sleep 0.5
  end
end

with_fx :reverb, mix: 0.7 do
  live_loop :arp, sync: :met1 do
    with_fx :echo, phase: 1, mix: (line 0.1, 1, steps: 128).mirror.tick do
      stop
      a = 0.6
      r = 0.25
      c = 130
      p = (line -0.7, 0.7, steps: 64).mirror.tick
      at = 0.01
      use_synth :beep
      tick
      notes = (scale :g4, :major_pentatonic).shuffle
      play notes.look, amp: a, release: r, cutoff: c, pan: p, attack: at
      sleep 0.75
    end
  end
end

with_fx :panslicer, mix: 0.4 do
  with_fx :reverb, mix: 0.75 do
    live_loop :synthbass, sync: :met1 do
      stop
      s = 4
      r = 2
      c = 60
      a = 0.75
      at = 0
      use_synth :tech_saws
      play :g3, sustain: 6, cutoff: c, amp: a, attack: at
      sleep 6
      play :d3, sustain: 2, cutoff: c, amp: a, attack: at
      sleep 2
      play :e3, sustain: 8, cutoff: c, amp: a, attack: at
      sleep 8
    end
  end
end

Recent video from sonic pi author: https://www.youtube.com/watch?v=zL1LYRXFEEc

Other audio creation software mentioned in the talks

Happy exploring…

Found a awesome sonic pi notes in