null
музыка · delta machine · sonic pi

DISCRETE

холодная математика. простые числа как мелодия. in production.


артистDELTA MACHINE
движокSonic Pi
треков4 (запланировано)
длительность08:00 (план)
статусin production · 2026

DISCRETE — это математика без компромисса.

Мелодия индексируется простыми числами. Ноты выбираются из F-major pentatonic через pr[i] % 8.

Prime · Twin · Recurrence · Divisors — четыре теоремы как четыре трека. Звучит как доказательство.


01 Prime
тон только если n простое. пауза если составное.
02 Twin
два голоса. звучат вместе если (n, n+2) простые.
03 Recurrence
следующая нота зависит от предыдущей.
04 Divisors
количество делителей n = плотность звука.

# Discrete - Track 01: Prime
# dur = 120.0s
# Pure melodic, crystal xylophone. No beats.

start_t = vt
dur = 120.0

use_bpm 168
use_debug false

define :alive do |st, d|
  (vt - st) < d
end

define :master_gain do |st, d|
  t = vt - st
  return 1.0 if t < d - 14
  g = (d - t) / 14.0
  return 0.0 if g < 0
  g
end

define :elapsed do |st|
  vt - st
end

define :section do |st|
  t = elapsed(st)
  return 0 if t < 30
  return 1 if t < 60
  return 2 if t < 90
  3
end

define :prime_q do |n|
  return false if n < 2
  return true if n == 2
  return false if n.even?
  i = 3
  lim = Math.sqrt(n).floor
  while i <= lim
    return false if (n % i).zero?
    i += 2
  end
  true
end

define :prime_list do |count|
  out = []
  x = 2
  while out.length < count
    out.push(x) if prime_q(x)
    x += 1
  end
  out
end

pr = prime_list(256)
scale_notes = scale(:f4, :major_pentatonic, num_octaves: 3)

# Prime-indexed melodic sequence
degrees = ring(0, 1, 2, 3, 4, 5, 6, 7)
melody = pr.map { |p| scale_notes[(degrees[p % 8] + (p % 3)) % scale_notes.length] }
harmony = pr.map { |p| scale_notes[(degrees[(p + 2) % 8] + (p % 2)) % scale_notes.length] - 12 }

set :melody_ring, ring(*melody)
set :harmony_ring, ring(*harmony)

live_loop :prime_clock do
  stop unless alive(start_t, dur)
  cue :tick
  sleep 0.125
end

# Main xylophone melody — crystal glockenspiel
live_loop :prime_xylo do
  sync :tick
  stop unless alive(start_t, dur)
  g = master_gain(start_t, dur)
  sec = section(start_t)
  idx = tick(:xylo_idx)

  n = get(:melody_ring)[idx]
  next if n.nil?

  with_fx :reverb, room: 0.88, mix: 0.32 do
    with_fx :echo, phase: 1.0, decay: 6, mix: 0.22 do
      sample :glockenspiel, note: n, amp: 1.0 * g, release: 0.08
    end
  end
end

# Soft harmonic answer — lower register, same timbre
live_loop :prime_xylo_low do
  sync :tick
  stop unless alive(start_t, dur)
  g = master_gain(start_t, dur)
  sec = section(start_t)
  idx = tick(:xylo_low_idx)
  next unless [2, 5, 7].include?(idx % 8)

  n = get(:harmony_ring)[idx + 3]
  next if n.nil?

  with_fx :reverb, room: 0.9, mix: 0.35 do
    sample :glockenspiel, note: n, amp: 0.6 * g, release: 0.1
  end
end

# Occasional high sparkle — prime accents
live_loop :prime_sparkle do
  sync :tick
  stop unless alive(start_t, dur)
  g = master_gain(start_t, dur)
  idx = tick(:spark_idx)
  next unless (idx % 5).zero?

  n = get(:melody_ring)[idx + 11]
  next if n.nil?

  with_fx :reverb, room: 0.92, mix: 0.4 do
    sample :glockenspiel, note: n + 12, amp: 0.5 * g, release: 0.06
  end
end

// альбом в производстве · код может измениться