Changelog
2.0.1.2.1.4.0
This release adds support for new SunVox 2.1.3 and 2.1.4 file format features, plus general improvements and bug fixes.
Additions
Adds
rv-iffCLI tool for dumping IFF chunk structure of SunVox files. Install withuv tool install -e ".[tools]"and run withrv-iff path/to/file.sunvox.Adds
Module.midi_in_neverattribute, supporting the “Never” option for MIDI input on modules. This corresponds to the MIDI input behavior where a module never responds to MIDI events.Updates default SunVox version written to files from 2.1.2.1 to 2.1.4.0.
SunVox 2.1.3 support
Adds
AnalogGenerator.always_play_osc2option. When enabled, plays the additional oscillator even if Osc2=0.Adds
Modulator.max_phase_modulation_delayvaluessec_8,sec_16, andsec_32. Extends the maximum phase modulation delay options to 8, 16, and 32 seconds.Adds
Modulator.pm_interpolationcontroller. Controls interpolation for phase modulation: off, linear, or spline.Adds
Sampler.reversecontroller. When enabled, plays samples backwards.
SunVox 2.1.4 support
Adds
Sampler.attackandSampler.releasecontrollers. These control the attack and release times when the volume envelope is enabled. Values range from 0 (instant) to 32768 (infinite).Adds
Lfo.frequency_unitvaluessemitoneandsemitone/100. These allow LFO frequency to be specified in musical semitones.Adds
Lfo.transposeandLfo.finetunecontrollers. These provide pitch adjustment when using semitone frequency units.
Fixes
Gracefully handles orphaned module connections when loading corrupted or hand-edited SunVox files. Previously would raise
RuntimeError.Fixes
MetaModule.on_embedded_controller_changed()to correctly match controller mappings (controller numbers are 1-based, mappings are 0-based).
2.0.0.2.1.2.1
This is a major release after a long period of development.
The themes of this release are:
Support for SunVox 2.0 file format:
New modules, controllers, and options.
New maximum number of user-defined MetaModule controllers.
More consistent naming of controllers:
Matching SunVox nomenclature as much as possible.
Including units of measure as metadata instead of inside the controller name.
Version number reflects the most recent supported version of SunVox.
Retire the TypeScript port of the project:
The TypeScript port was taking too much effort to maintain, with little benefit.
Radiant Voices can be imported by PyScript if needed in a browser.
Additions, changes, and bug fixes
Too many to list here!
Future releases in the 2.x series will include a more detailed changelog.
1.0.4
Bug fix release.
Changes (Python version)
Replaces
awesome-slugifydependency withpython-slugify.
1.0.3
Bug fix release.
Additions (All versions)
Adds test to load all files in
tests/files/extra/, to ensure that all example files included with SunVox can be loaded without error.
Fixes (All versions)
Fixes loading of some projects where modules were deleted.
Fixes (Python version)
Fixes
rv.tools.playerdecoding of module names.Fixes loading of some projects where patterns were deleted.
Fixes loading of user-defined controllers when loading MetaModules.
1.0.2
Bug fix release.
Fixes (Python version)
Avoids rearranging modules during project loading.
1.0.1
Bug fix release.
Fixes (all versions)
Adds correct range information for delay controllers in Delay and Echo modules.
1.0.0
The themes of this release are:
New JavaScript version of Radiant Voices.
Support for new modules, controllers, options, and curves in SunVox 1.9.6c.
Improved general compatibility with the SunVox file format.
Improved documentation of the SunVox file format.
Radiant Voices API improvements.
Major change: genrv code generator
To support porting Radiant Voices to more languages than just Python,
and keeping these ports in sync with new versions of SunVox,
this release introduces a new code-generation tool, genrv.
genrv is written in Python, and uses Jinja2 templates to generate
source code in various target languages, based on a spec written in YAML.
The generated code is run through code-formatting tools, saved directly into the final package structure, and committed to the git repository as any other code would be.
Base classes for all module types are generated this way. They include controllers, options, and controller value enums. The actual classes for each module inherit from these base classes and add module-specific behavior maintained by hand.
Major change: JavaScript port
Radiant Voices now has a JavaScript port, written in TypeScript. It pairs well with the JavaScript/WebAssembly version of the SunVox library.
It is not a 1-to-1 port from the Python version, although it is designed to allow you to do the same things.
As of this release, each version has strengths and weaknesses compared to the other. Over time, we will work towards parity as we strive toward 100% compatibility with SunVox.
Additions (all versions)
Adds
Project.receive_sync_midiandProject.receive_sync_otherflags.Adds
ADSRmodule.Adds
Ctl2Notemodule.Adds
Pitch Detectormodule.Adds
harmonicsto enum forAnalogGenerator.waveformcontroller.Adds new values to enum for
SpectraVoice.h_typecontroller:overtones1+,overtones2+,overtones3+,overtones4+,metal.Adds
Amplifier.gaincontroller.Adds
AnalogGenerator.true_zero_attack_releaseoption.Adds new values to enum for
AnalogGenerator.waveformcontroller:noise_with_spline_interpolation,white_noise,pink_noise,red_noise,blue_noise,violet_noise,grey_noise.Adds
LFO.freq_scale_pctcontroller.Adds
LFO.smooth_transitionscontroller.Adds
Sound2Ctl.send_only_changed_valuesoption.Adds new options to
MetaModule:receive_notes_from_keyboard,do_not_receive_notes_from_keyboard.Adds
PitchShifter.bypass_if_pitch_eq_0controller.Adds new value to enum for
Compressor.modecontroller:peak_zero_latency.Adds new values and value names to enum for
Distortion.typecontroller:clippingis the new name forlim.foldbackis the new name forsat.foldback2,foldback3,overfloware new values.Adds new value to enum for
Lfo.waveformcontroller:random_interpolated.Adds
DrumSynth.bass_panningcontroller.Adds
DrumSynth.hihat_panningcontroller.Adds
DrumSynth.snare_panningcontroller.Adds
MultiCtl.responsecontroller.Adds
MultiCtl.sample_rate_hzcontroller.Increases the maximum value of
Gpio.pin_inandGpio.pin_outcontrollers to256.Renames
Kicker.vol_additioncontroller toKicker.boost, to reflect naming in SunVox 1.9.4.
Additions (Python version)
Ports all test cases from JavaScript version. Note: A limited number of test cases are not yet completely ported.
Adds
Project.restart_positionattribute.Adds
Project.detach_module(module)method.Adds
patch_decompilertool.Adds
Pattern.projectattribute, set once attached to a project.Adds
Note.patternandNote.projectto allow notes to be project-aware.Adds
Note.module_indexproperty, convertsNote.moduleto 0-based index.Adds
Note.modproperty, allows setting a note’s module via an actual Module instance (instead of an int).
Changes (All versions)
Updates module option reading, writing, and setting to reflect changes in SunVox 1.9.6.
Changes (Python version)
Uses dict instead of OrderedDict, as modern Python’s built-in dict maintains key order.
Renames
incoming_linkstoin_links.Renames
controller_numbertoctl_index, andgain_percentagetogain_pct, to more closely reflect the naming in the JavaScript version.Adds type annotations to support static analysis tools and IDEs.
Renames “dirty waveform” to “drawn waveform”.
Updates default
sunvox_versionandbased_on_versionof newly-createdProjectcontainers to reflect file format version 1.9.6.1.Updates
MetaModule.behaviorsto includesends_notes.Now uses black to format all Python modules.
Project.attach_modulenow raisesModuleOwnershipErrorif the module is already attached to a project.Project.attach_modulenow re-uses empty module indexes, instead of always appending to the end.Project.connectnow raisesModuleOwnershipErrorif modules do not share a common parent.Python 3.8 is now required.
Project.attach_patternnow returns the index of the attached pattern.
Fixes (all versions)
Correctly reads and writes
SLnKchunks, thus correctly keeping the connection order between modules that have more than one connection going in or out.Renames
Sample.loop_endtoSample.loop_len.Fixes how effects embedded into
Sampler.effectare serialized.Updates
out_controllerofPitch2Ctl,Sound2Ctl, andVelocity2Ctlto have correct range of 0..255.
Fixes (Python version)
Fixes writing of controller values to use signed ints instead of unsigned.
Fixes reading/writing of
VorbisPlayer.finetunecontroller values.Updates the
helloworldexample to use correct APIs.Parses chunk IDs in a case-sensitive way, to prevent incorrect parsing of chunks such as
SLnK.
0.4.0.dev2 (2018-03-11)
Fixes
Corrects a packaging error that included unnecessary cache data from documentation builds.
0.4.0.dev1 (2018-03-11)
Additions
Adds documentation about the SunVox file format.
Adds equality checking to
Range.Adds
Module.midi_in_alwaysattribute, defaulting toFalse. WhenTrue, the module will respond to MIDI events regardless of whether it’s selected in the SunVox UI.Adds
Module.midi_in_channelattribute, defaulting to0(all channels). Set to 1-16 to make the module respond to only a specific MIDI channel.Adds
Project.time_grid2attribute.Adds
MultiSynth.curve2_influencecontroller.Adds
MetaModule.event_outputoption (default:True).Adds
MultiSynth.triggeroption (default:False).Adds
ModuleFlagsandVisibleModuleFlagsenums for reading/writingModule.flags.Adds
PatternFlagsandPatternAppearanceFlagsenums for reading/writingPattern.flagsandPattern.appearance_flags.Adds
Visualization,LevelMode,Orientation, andOscilloscopeModefor reading/writing theModule.visualizationstructure.Adds
Project.selected_generatorattribute.Adds
Lfo.Waveform.triangleconstant.Adds
Lfo.generatorcontroller.Adds
Reverb.random_seedcontroller.Adds
Sampler.pitch_envelopeandSampler.effect_control_envelopes[]containing new envelopes from SunVox 1.9.3.Adds
Sampler.effectto contain an optionalSunSynthinstance which in turn contains the effect being modulated by the effect control envelopes.Adds
Sampler.Sample.loop_sustainflag.Adds
Sampler.ignore_velocity_for_volumeoption.Adds
Container.clone()method.Adds
Project.pattern_lines()method, which iterates over a range of project lines and yields information about the active pattern lines for each project line.Adds
Pattern.source_method()andPatternClone.source_method(), to determine the source pattern for any given pattern or pattern clone.
Changes
Python 3.6 is now required.
While writing files,
CHFFandCHFRchunks will not be written if they always have a value of0.AnalogGenerator.unsmooth_frequency_changeoption is now inverted to.smooth_frequency_change.Updates
SamplerandSampler.Envelopeto support SunVox 1.9.3 format. When a pre-1.9.3 formatted Sampler is loaded, it will be upgraded to 1.9.3 format.More detailed exception message when attempting to set an out-of-range value to a controller.
Ignores chunk types no longer used by modern SunVox versions:
PSYN,PCTL, andPAMD.Ignores value of
CHNKwhen reading module-specific chunks.Does not write the optional -1 to the end of
SLNKchunks.Uses the value mapping curve when converting a
MultiCtl.valueto downstream controllers.Updates
MetaModule.play_patterns, which is now of typeMetaModule.PlayPatternsinstead ofbool. This introduces support for the newMetaModule.PlayPatterns.on_no_repeatvalue.Uses the Fruchterman-Reingold layout algorithm from NetworkX for auto-layout of modules, not PyGraphviz neato algorithm. This affects the arguments accepted by
Project.layout().Improves variable names generated from MetaModule user defined controller labels.
Fixes
SMIN(module MIDI output device name) is now correctly read and written.SMIIandSMICchunks are now encoded as unsigned int32 (was previously signed).Strings now use UTF-8 encoding.
All module types now have a correct default
.flagsattribute.After
MetaModule.update_user_defined_controllers()is called, user defined controllers will have correctvalue_typeset. (This avoids errors such as 44100 being out of the 0..32768 range.)In
MetaModule, when a user defined controller mapping points to a non-existent module, the mapping will be ignored. (Was throwing anAttributeError)When
Moduleoptions are loaded from older projects, assume0as a default value if there are not enough bytes. (Was throwing anIndexError)Range validation for
Lfo.freqandVibrato.freqnow depends on the value of thefrequency_unitcontroller. Some modules created in earlier versions of SunVox have out-of-range values. These are only warned about usinglogging, instead of the standard behavior of raising an exception.Writes correct value of
CHNKwhen writing module-specific chunks.Default to signed 8-bit int when a
CHFFvalue was 0.
0.3.0 (2017-04-18)
Additions
Adds
propagateargument toMultiCtl.reflect(). Defaults toTruewhich causes the newMultiCtl.valueto immediately propagate to all mapped controllers, including the one that was just reflected.Set to
Falseif you only want to setMultiCtl.valuewithout propagating to mapped controllers.Pass a value for
initialwhen callingMultiCtl.macro()to set and propagate an initial value. Default behavior is to not set a value.
Changes
The
reprof aCompactRangeinstance now shows that class name, instead ofRange.
Fixes
Fixes algorithm for propagating
MultiCtl.valuechanges to mapped controllers.Fixes algorithm for reflecting mapped controllers back to
MultiCtl.value.
0.2.0 (2017-04-02)
Additions
Adds
Controller.pattern_value()instance method, to map a controller’s value to a pattern value in the range of 0x0000-0x8000.Adds
ALL_NOTESconstant to see if aNOTECMDis a note or a command. (Example:if some_note in ALL_NOTES: ...)Adds
tabular_repr()instance methods toNoteandPattern, returning a tabular representation suitable for inclusion in text documents.Adds
behaviorsattribute to all module classes, describing the types of information each module can send and receive.Adds package-specific exception base classes to
rv.errors.Adds support for reading, writing, and modifying controller MIDI mappings.
Adds a
MultiCtl.macro()static method, for quickly creating aMultiCtlthat controls several similar controllers on connected modules.Adds a
MultiCtl.reflect()instance method, for setting aMultiCtl’s value based on the destination controller mapped at a given index.Adds
# TODO: ...notes to indicate unimplemented features.Allows property-style access to user-defined controllers on
MetaModule``s using a ``u_prefix. For example, if there’s a user-defined controller named “Attack”, it will be accessible via the.u_attackproperty.Adds
ArrayChunk.set_via_fn()method, for setting various curves using the output of a function.Adds
DRUMNOTE,BDNOTE,HHNOTE, andSDNOTEenumerations toDrumSynthclass, providing note aliases for easier programming of drum sequences.Adds
Pattern.set_via_fn()and.set_via_gen()instance methods, for altering a pattern based on the output of a function or generator.
Changes
Renames
Outputmodule’s module group to"Output".When using
Project.layout(), default to usingdotlayout engine.Uses a direct port of SunVox’s algorithm for mapping
MultiCtlvalues to destination controllers.Uses 1.9.2.0 as SunVox version number when writing projects to files.
Allows using separate x/y offsets and factors during
Project.layout()
Fixes
Uses same sharp note notation as used by SunVox (lowercase indicates sharp).
Honor
progkeyword arg when passed intoProject.layout()method.Does not require pattern
xoryto be divisible by 4.Assigns correct controller number to user-defined controllers on
MetaModule.Corrects the max value allowed in a
MultiSynthvelocity/velocity curve.Moves
pygraphvizfromrequirements/base.txtto.../tools.txtto be more Windows-friendly.
0.1.1 (2016-11-09)
Fixes upload to PyPI.
0.1.0 (2016-11-09)
Initial release.