Vita/tests/test_render.py
2025-02-13 14:21:57 -05:00

67 lines
1.7 KiB
Python

from scipy.io import wavfile
import vita
from vita.constants import (
SourceDestination,
Effect,
FilterModel,
RetriggerStyle,
SpectralMorph,
DistortionType,
UnisonStackType,
RandomLFOStyle,
SynthFilterStyle,
WaveShape,
CompressorBandOption,
VoiceOverride,
VoicePriority,
SynthLFOSyncOption,
SynthLFOSyncType,
SyncedFrequency,
)
SAMPLE_RATE = 44_100
def test_render(bpm=120.0, note_dur=1.0, render_dur=3.0, pitch=36, velocity=0.7):
synth = vita.Synth()
# The initial preset is laoded by default.
synth.set_bpm(bpm)
assert vita.get_modulation_sources()
assert vita.get_modulation_destinations()
# Custom synthesizer settings
assert synth.connect_modulation("lfo_1", "filter_1_cutoff")
controls = synth.get_controls()
controls["modulation_1_amount"].set(1.0)
controls["filter_1_on"].set(1.0)
controls["lfo_1_tempo"].set(SyncedFrequency.k1_16)
# Render audio to numpy array shaped (2, NUM_SAMPLES)
audio = synth.render(pitch, velocity, note_dur, render_dur)
wavfile.write("generated_preset.wav", SAMPLE_RATE, audio.T)
# Dump current state to json text
json_text = synth.to_json()
preset_path = "generated_preset.vital"
with open(preset_path, "w") as f:
f.write(json_text)
# Load JSON text
with open(preset_path, "r") as f:
json_text1 = f.read()
assert synth.load_json(json_text1)
assert json_text == json_text1
# Or load directly from file:
assert synth.load_preset(preset_path)
# Load the initial preset, which also clears modulations
synth.load_init_preset()
# Or just clear modulations.
synth.clear_modulations()