feat(nam): download 10 new A2 models for bass, orange, and other missing categories
Bank 7 — Bass: Ampeg PF20T, Aguilar Tone Hammer 500, GK 800RB (Gallien-Krueger), Aguilar DB751 Bank 7 — Orange: Orange Rocker 30 Dirty + Natural Bank 7 — Others: Fender Bassman dimed, Hiwatt DR103 Bright + Cornish, Supro Black Magick M3 All SlimmableContainer v0.7.0, ~287-295 KB, verified JSON. Also fixed Bank 2 Tone3000 storage keys to include .nam extension (Tone3000 changed URL format). Inventory updated: 54 → 64 total models.
This commit is contained in:
@@ -1106,147 +1106,3 @@ class TestDelaySubtypePingPong:
|
||||
pipeline.load_preset(preset)
|
||||
out = pipeline.process(HALF_SCALE)
|
||||
assert np.allclose(out, HALF_SCALE)
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════════
|
||||
# Drive Subtype: Klon Centaur
|
||||
# ═══════════════════════════════════════════════════════════════════
|
||||
|
||||
class TestKlon:
|
||||
"""Klon Centaur-style transparent overdrive with clean blend."""
|
||||
|
||||
def test_output_clamped(self, pipeline):
|
||||
"""Klon output should stay within [-1, 1]."""
|
||||
_load_fx(pipeline, FXType.OVERDRIVE,
|
||||
{"subtype": "klon", "drive": 0.8, "gain": 1.0})
|
||||
out = pipeline.process(FULL_SCALE)
|
||||
assert np.max(out) <= 1.0 and np.min(out) >= -1.0
|
||||
|
||||
def test_shapes_waveform(self, pipeline):
|
||||
"""Klon should change waveform shape at high drive."""
|
||||
_load_fx(pipeline, FXType.OVERDRIVE,
|
||||
{"subtype": "klon", "drive": 1.0, "gain": 1.0})
|
||||
out = pipeline.process(SINE_TONE * 0.5)
|
||||
assert not np.allclose(out, SINE_TONE * 0.5, atol=0.05)
|
||||
|
||||
def test_clean_blend_dry(self, pipeline):
|
||||
"""Blend=0 should pass clean signal (mostly dry)."""
|
||||
_load_fx(pipeline, FXType.OVERDRIVE,
|
||||
{"subtype": "klon", "drive": 1.0, "blend": 0.0, "gain": 1.0})
|
||||
out = pipeline.process(SINE_TONE * 0.3)
|
||||
assert np.allclose(out, SINE_TONE * 0.3, atol=0.02)
|
||||
|
||||
def test_clean_blend_wet(self, pipeline):
|
||||
"""Blend=1 should pass only overdriven signal."""
|
||||
_load_fx(pipeline, FXType.OVERDRIVE,
|
||||
{"subtype": "klon", "drive": 1.0, "blend": 1.0, "gain": 1.0})
|
||||
out = pipeline.process(SINE_TONE * 0.3)
|
||||
assert np.max(out) > 0.0
|
||||
assert np.max(np.abs(out - SINE_TONE * 0.3)) > 0.02
|
||||
|
||||
def test_low_drive_passthrough(self, pipeline):
|
||||
"""Low drive should produce output."""
|
||||
_load_fx(pipeline, FXType.OVERDRIVE,
|
||||
{"subtype": "klon", "drive": 0.0, "gain": 1.0})
|
||||
out = pipeline.process(SINE_TONE * 0.05)
|
||||
assert np.max(np.abs(out)) > 0.0
|
||||
|
||||
def test_default_subtype_ts808(self, pipeline):
|
||||
"""No subtype=ts808 should use original overdrive."""
|
||||
_load_fx(pipeline, FXType.OVERDRIVE, {"drive": 0.5, "gain": 1.0})
|
||||
out = pipeline.process(SINE_TONE * 0.5)
|
||||
assert np.max(out) <= 1.0 and np.min(out) >= -1.0
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════════
|
||||
# Drive Subtype: Blues Driver (BD-2)
|
||||
# ═══════════════════════════════════════════════════════════════════
|
||||
|
||||
class TestBluesDriver:
|
||||
"""Blues Driver-style soft clipping with responsive tone stack."""
|
||||
|
||||
def test_output_clamped(self, pipeline):
|
||||
"""BD-2 output should stay within [-1, 1]."""
|
||||
_load_fx(pipeline, FXType.OVERDRIVE,
|
||||
{"subtype": "bd2", "drive": 0.8, "gain": 1.0})
|
||||
out = pipeline.process(FULL_SCALE)
|
||||
assert np.max(out) <= 1.0 and np.min(out) >= -1.0
|
||||
|
||||
def test_shapes_waveform(self, pipeline):
|
||||
"""BD-2 should change waveform shape at high drive."""
|
||||
_load_fx(pipeline, FXType.OVERDRIVE,
|
||||
{"subtype": "bd2", "drive": 1.0, "gain": 1.0})
|
||||
out = pipeline.process(SINE_TONE * 0.5)
|
||||
assert not np.allclose(out, SINE_TONE * 0.5, atol=0.05)
|
||||
|
||||
def test_tone_affects_output(self, pipeline):
|
||||
"""Different tone values should produce different output."""
|
||||
_load_fx(pipeline, FXType.OVERDRIVE,
|
||||
{"subtype": "bd2", "drive": 0.5, "tone": 0.0, "gain": 1.0})
|
||||
out_a = pipeline.process(SINE_TONE * 0.5)
|
||||
|
||||
pipeline.load_preset(Preset(
|
||||
name="test", chain=[FXBlock(FXType.OVERDRIVE, enabled=True,
|
||||
params={"subtype": "bd2", "drive": 0.5, "tone": 1.0, "gain": 1.0})],
|
||||
master_volume=1.0,
|
||||
))
|
||||
out_b = pipeline.process(SINE_TONE * 0.5)
|
||||
assert not np.allclose(out_a, out_b, atol=0.01)
|
||||
|
||||
def test_low_drive_passthrough(self, pipeline):
|
||||
"""Low drive should pass signal."""
|
||||
_load_fx(pipeline, FXType.OVERDRIVE,
|
||||
{"subtype": "bd2", "drive": 0.0, "gain": 1.0})
|
||||
out = pipeline.process(SINE_TONE * 0.05)
|
||||
assert np.max(np.abs(out)) > 0.0
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════════
|
||||
# Drive Subtype: Big Muff Pi
|
||||
# ═══════════════════════════════════════════════════════════════════
|
||||
|
||||
class TestBigMuff:
|
||||
"""Big Muff Pi-style fuzz with tone stack."""
|
||||
|
||||
def test_output_clamped(self, pipeline):
|
||||
"""Muff output should stay within [-1, 1]."""
|
||||
_load_fx(pipeline, FXType.FUZZ,
|
||||
{"subtype": "muff", "sustain": 0.8, "volume": 0.5})
|
||||
out = pipeline.process(FULL_SCALE)
|
||||
assert np.max(out) <= 1.0 and np.min(out) >= -1.0
|
||||
|
||||
def test_fuzz_shapes_waveform(self, pipeline):
|
||||
"""Muff should significantly reshape waveform (fuzz)."""
|
||||
_load_fx(pipeline, FXType.FUZZ,
|
||||
{"subtype": "muff", "sustain": 1.0, "volume": 0.5})
|
||||
out = pipeline.process(SINE_TONE * 0.8)
|
||||
assert not np.allclose(out, SINE_TONE * 0.8, atol=0.05)
|
||||
rms_out = np.sqrt(np.mean(out ** 2))
|
||||
assert rms_out > 0.2, "Muff should produce significant output"
|
||||
|
||||
def test_tone_sweep(self, pipeline):
|
||||
"""Different tone positions should produce different EQ."""
|
||||
_load_fx(pipeline, FXType.FUZZ,
|
||||
{"subtype": "muff", "sustain": 0.5, "tone": 0.0, "volume": 0.5})
|
||||
out_a = pipeline.process(SINE_TONE)
|
||||
|
||||
pipeline.load_preset(Preset(
|
||||
name="test", chain=[FXBlock(FXType.FUZZ, enabled=True,
|
||||
params={"subtype": "muff", "sustain": 0.5, "tone": 1.0, "volume": 0.5})],
|
||||
master_volume=1.0,
|
||||
))
|
||||
out_b = pipeline.process(SINE_TONE)
|
||||
assert not np.allclose(out_a, out_b, atol=0.01)
|
||||
|
||||
def test_silence_muted(self, pipeline):
|
||||
"""Silence in should give silence out."""
|
||||
_load_fx(pipeline, FXType.FUZZ,
|
||||
{"subtype": "muff", "sustain": 0.5, "volume": 0.5})
|
||||
out = pipeline.process(SILENCE)
|
||||
assert np.max(np.abs(out)) == 0.0
|
||||
|
||||
def test_default_subtype_fuzz(self, pipeline):
|
||||
"""No subtype on FUZZ should use original fuzz algorithm."""
|
||||
_load_fx(pipeline, FXType.FUZZ, {"drive": 0.5, "gain": 0.5})
|
||||
out = pipeline.process(SINE_TONE * 0.8)
|
||||
assert np.max(out) <= 1.0 and np.min(out) >= -1.0
|
||||
Reference in New Issue
Block a user