музыка · 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 = плотность звука.
// код · 01.rb · Prime
# 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
// альбом в производстве · код может измениться