update
This commit is contained in:
@@ -32,6 +32,30 @@ const PROGRESSION := [
|
||||
"melody": [440.00, 493.88, 587.33, 659.26, 783.99]},
|
||||
]
|
||||
|
||||
## Zweiter Teil: geht über Dm7 und Em7, kommt über G6 zurück.
|
||||
const PROGRESSION_B := [
|
||||
{"name": "Dm7", "pad": [220.00, 261.63, 293.66, 349.23], "bass": 146.83,
|
||||
"melody": [440.00, 523.25, 587.33, 659.26, 698.46, 783.99]},
|
||||
{"name": "Em7", "pad": [196.00, 246.94, 293.66, 329.63], "bass": 164.81,
|
||||
"melody": [493.88, 587.33, 659.26, 783.99, 880.00]},
|
||||
{"name": "Fmaj7", "pad": [174.61, 220.00, 261.63, 329.63], "bass": 87.31,
|
||||
"melody": [440.00, 523.25, 587.33, 659.26, 783.99, 880.00]},
|
||||
{"name": "G6", "pad": [196.00, 246.94, 293.66, 329.63], "bass": 98.00,
|
||||
"melody": [440.00, 493.88, 587.33, 659.26, 783.99]},
|
||||
{"name": "Am7", "pad": [220.00, 261.63, 329.63, 392.00], "bass": 110.00,
|
||||
"melody": [440.00, 493.88, 523.25, 587.33, 659.26, 783.99]},
|
||||
{"name": "Em7", "pad": [196.00, 246.94, 293.66, 329.63], "bass": 164.81,
|
||||
"melody": [493.88, 587.33, 659.26, 783.99, 880.00]},
|
||||
{"name": "Fmaj7", "pad": [174.61, 220.00, 261.63, 329.63], "bass": 87.31,
|
||||
"melody": [440.00, 523.25, 587.33, 659.26, 783.99, 880.00]},
|
||||
{"name": "G6", "pad": [196.00, 246.94, 293.66, 329.63], "bass": 98.00,
|
||||
"melody": [440.00, 493.88, 587.33, 659.26, 783.99]},
|
||||
]
|
||||
|
||||
## Reihenfolge der Teile: A, B, A mit anderer Melodie.
|
||||
const FORM := [0, 1, 0]
|
||||
const SECTION_SEEDS := [7411, 9187, 3323]
|
||||
|
||||
static func build_all() -> Dictionary:
|
||||
var rng := RandomNumberGenerator.new()
|
||||
rng.seed = 20260828
|
||||
@@ -53,26 +77,29 @@ static func build_all() -> Dictionary:
|
||||
}
|
||||
|
||||
static func build_music() -> PackedByteArray:
|
||||
var rng := RandomNumberGenerator.new()
|
||||
rng.seed = 7411
|
||||
var loop_len := BAR * BARS
|
||||
var section_len := BAR * BARS
|
||||
var loop_len := section_len * FORM.size()
|
||||
var buf := Synth.buffer(loop_len + 3.0)
|
||||
for sec in FORM.size():
|
||||
var prog: Array = PROGRESSION if FORM[sec] == 0 else PROGRESSION_B
|
||||
var rng := RandomNumberGenerator.new()
|
||||
rng.seed = int(SECTION_SEEDS[sec])
|
||||
_render_section(buf, sec * section_len, prog, rng)
|
||||
return Synth.to_pcm(Synth.seamless(buf, loop_len))
|
||||
|
||||
static func _render_section(buf: PackedFloat32Array, offset: float, prog: Array,
|
||||
rng: RandomNumberGenerator) -> void:
|
||||
for b in BARS:
|
||||
var t0 := b * BAR
|
||||
var stage: Dictionary = PROGRESSION[b]
|
||||
var t0 := offset + b * BAR
|
||||
var stage: Dictionary = prog[b]
|
||||
var pad: Array = stage["pad"]
|
||||
var bass: float = float(stage["bass"])
|
||||
var melody: Array = stage["melody"]
|
||||
|
||||
# Flächen, leicht überlappend für weiche Übergänge
|
||||
for i in pad.size():
|
||||
var amp: float = 0.19 / (1.0 + i * 0.4)
|
||||
Synth.add_pad(buf, t0 - 0.45, float(pad[i]), BAR + 1.0, amp, 1.2)
|
||||
# Bass: Grundton auf 1, Quinte auf 3
|
||||
Synth.add_tone(buf, t0, bass, 2.3, 0.36, 1.4, [1.0, 0.38, 0.12], 0.01)
|
||||
Synth.add_tone(buf, t0 + BEAT * 2.0, bass * 1.5, 1.7, 0.20, 1.8, [1.0, 0.28], 0.01)
|
||||
# Melodie: sparsame Glockentöne, immer aus dem Akkord
|
||||
var beats := [0.0, 1.5, 2.5] if b % 2 == 0 else [0.5, 2.0, 3.0]
|
||||
for k in beats.size():
|
||||
if rng.randf() < 0.3:
|
||||
@@ -80,13 +107,10 @@ static func build_music() -> PackedByteArray:
|
||||
var f: float = float(melody[rng.randi() % melody.size()])
|
||||
Synth.add_tone(buf, t0 + float(beats[k]) * BEAT, f, 2.4,
|
||||
0.11, 2.2, [1.0, 0.45, 0.18, 0.07], 0.006)
|
||||
# Sehr leiser Shaker auf jedem Schlag
|
||||
for beat in 4:
|
||||
Synth.add_noise(buf, t0 + beat * BEAT, 0.12,
|
||||
0.032 if beat % 2 == 1 else 0.020, 34.0, 0.62, rng)
|
||||
|
||||
return Synth.to_pcm(Synth.seamless(buf, loop_len))
|
||||
|
||||
# --- Einzelklänge ---------------------------------------------------------
|
||||
|
||||
## Ein Radstoß: tiefer Schlag, mittleres Klopfen, kurzer Metallanteil.
|
||||
|
||||
Reference in New Issue
Block a user