# Beat
use_bpm 100

# KNISTERN
live_loop :knister_schleife do
  sample :vinyl_hiss, amp: 2
  sleep sample_duration :vinyl_hiss
end

# HIHAT
define :hihat do
  use_synth :pnoise
  with_fx :hpf, cutoff: 120 do
    play release: 0.01, amp: 13
  end
end

live_loop :hihat_schleife do
  aufteilungen = ring 2, 4, 2, 2, 2, 2, 2, 6
  aufteilungen[tick].times do
    hihat
    sleep 1.0 / aufteilungen[look]
  end
end

# SNARE
live_loop :snare_schleife do
  sleep ring(2.5, 3)[tick]
  with_fx :lpf, cutoff: 100 do
    sample :sn_dub, sustain: 0, release: 0.05, amp: 3
  end
  sleep ring(1.5, 1)[look]
end

# BASSDRUM
define :bassdrum do |note1, dauer, note2 = note1|
  use_synth :sine
  with_fx :hpf, cutoff: 100 do
    play note1 + 24, amp: 40, release: 0.01
  end
  with_fx :distortion, distort: 0.1, mix: 0.3 do
    with_fx :lpf, cutoff: 26 do
      with_fx :hpf, cutoff: 55 do
        bass = play note1, amp: 85, release: dauer, note_slide: dauer
        control bass, note: note2
      end
    end
  end
  sleep dauer
end

live_loop :bassdrum_schleife do
  bassdrum 36, 1.5
  if bools(0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0)[tick]
    bassdrum 36, 0.5, 40
    bassdrum 38, 1, 10
  else
    bassdrum 36, 1.5
  end
  bassdrum 36, 1.0, ring(10, 10, 10, 40)[look]
end

# AKKORDFOLGE
chord_1 = chord :c4, :maj9, num_octaves: 2
chord_2 = chord :es4, :maj9, num_octaves: 2
chord_3 = chord :b3, :maj9, num_octaves: 2
chord_4 = chord :d4, :maj9, num_octaves: 2

chord_tief_1 = chord :c2, :maj9
chord_tief_2 = chord :es2, :maj9
chord_tief_3 = chord :b1, :maj9
chord_tief_4 = chord :d2, :maj9

chord_hoch = chord_1
chord_tief = chord_tief_1

live_loop :chord_umschalter, delay: -0.5 do
  chord_hoch = (knit(chord_1, 2, chord_2, 2, chord_3, 4,chord_4, 4))[tick]
  chord_tief = (knit(chord_tief_1, 2, chord_tief_2, 2, chord_tief_3, 4, chord_tief_4, 4))[look]
  sleep 8
end

# SPHAEREN
define :chord_spieler do |der_chord|
  use_synth :blade
  der_chord.each do |note|
    play note, attack: rand(4), release: rand(6..8), cutoff: rand(50..85), vibrato_rate: rand(0.01..2), amp: 0.35
  end
end

with_fx :reverb, room: 0.99, mix: 0.7 do
  live_loop :sphaeren_schleife do
    chord_spieler chord_hoch.pick(6)
    chord_spieler chord_tief.take(3)
    sleep 8
  end
end

# GLOCKEN
with_fx :bpf, centre: 80, res: 0.7, amp: 0.7 do
  with_fx :echo, phase: 0.75, decay: 16 do
    live_loop :glocken_schleife, delay: 1.75 do
      use_synth :pretty_bell
      anzahl_toene = range(1, 10).stretch(2).mirror[tick]
      max_release = range(0.1, 1.0, 0.06).mirror[look]
      
      chord_hoch.take(anzahl_toene).shuffle.each do |note|
        play note, release: rand(0.1..max_release), amp: 1.5
        play note + 12, release: 0.02, amp: 2.5
        sleep 0.25
      end
      sleep 8 - (anzahl_toene * 0.25)
      
      chord_hoch.reverse.take(anzahl_toene).shuffle.each do |note|
        play note -12, release: rand(0.1..max_release), amp: 1.5
        play note, release: 0.02, amp: 2.5
        sleep 0.25
      end
      sleep 8 - (anzahl_toene * 0.25)
    end
  end
end

# Coded by Pit Noack
# supported by
# Alexander Degraf
# Astrid Hagenguth
# Enrico Mercaldi
# http://www.maschinennah.de/
# mail@pitnoack.de
