Package: radiant-voices
Overview of Radiant VoicesPart of theMetrasynthproject.Radiant Voices provides tools tocreate, read, modify, and write SunVox files.
This includes project files ending in.sunvox,
and module/synth files ending in.sunsynth.SunVox data structures and APIsRadiant Voices strives toward 100% coverage of
all data structures used by SunVox files,
exposing APIs for creating and manipulating those structures.Using these APIs, you can do things not possible
with the standard SunVox interface or the SunVox DLL, such as:algorithmic compositionparametric synth/module designstructure and complexity analysisautomaticgraph layoutof modulesand more…Our collective imagination is the limit!Support for multiple languagesMultiple programming languages are supported.This is accomplished by combining a structured file format specification
with a code generation framework.Supported languages currently include:Python 3.8+TypescriptInteraction with the SunVox DLLBy combining Radiant Voices withsunvox-dll-pythonfor Python
(or the SunVox library wrapper for your language),
one can also create alternative editing and performance tools
to use alongside, or instead of, the official SunVox app.The two packages work together to provide convenient high-level
APIs for loading project and module objects directly into
playback slots managed by the SunVox DLL.Some possibilities might include:alternative project editorsgenerativesound design usinggenetic algorithmsnetwork-enabled performance toolsWhat canyoucome up with?SunVox file format documentationRadiant Voices intends to serve as ade factosource of documentation
about the format, as there is currentlyno official documentation for the
SunVox file format.The interpretation of SunVox file formats is based on a mix of “clean room”
style inspection of what SunVox writes to disk when a file is edited
a specific way, themost recent BSD-licensed source code
for the SunVox audio engine,
and consultation with NightRadio (the author of SunVox).Documentation is provided in the form of prose in the English language,
as well as a specification defined in YAML format.RequirementsA supported programming language.OS and platform supported bysunvox-dll-python, if working with
the native SunVox DLL.About SunVoxFrom theSunVox home page:SunVox is a small, fast and powerful modular synthesizer with pattern-based sequencer (tracker).
It is a tool for those people who like to compose music wherever they are, whenever they wish.
On any device. SunVox is available for Windows, OS X, Linux, Maemo, Meego, Raspberry Pi,
Windows Mobile (WindowsCE), PalmOS, iOS and Android.Changelog1.0.3Bug fix release.Additions (All versions)Adds test to load all files intests/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)Fixesrv.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.2Bug fix release.Fixes (Python version)Avoids rearranging modules during project loading.1.0.1Bug fix release.Fixes (all versions)Adds correct range information for delay controllers in Delay and Echo modules.1.0.0The 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:genrvcode generatorTo 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.genrvis 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 portRadiant 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)AddsProject.receive_sync_midiandProject.receive_sync_otherflags.AddsADSRmodule.AddsCtl2Notemodule.AddsPitch Detectormodule.Addsharmonicsto enum forAnalogGenerator.waveformcontroller.Adds new values to enum forSpectraVoice.h_typecontroller:overtones1+,overtones2+,overtones3+,overtones4+,metal.AddsAmplifier.gaincontroller.AddsAnalogGenerator.true_zero_attack_releaseoption.Adds new values to enum forAnalogGenerator.waveformcontroller:noise_with_spline_interpolation,white_noise,pink_noise,red_noise,blue_noise,violet_noise,grey_noise.AddsLFO.freq_scale_pctcontroller.AddsLFO.smooth_transitionscontroller.AddsSound2Ctl.send_only_changed_valuesoption.Adds new options toMetaModule:receive_notes_from_keyboard,do_not_receive_notes_from_keyboard.AddsPitchShifter.bypass_if_pitch_eq_0controller.Adds new value to enum forCompressor.modecontroller:peak_zero_latency.Adds new values and value names to enum forDistortion.typecontroller:clippingis the new name forlim.foldbackis the new name forsat.foldback2,foldback3,overfloware new values.Adds new value to enum forLfo.waveformcontroller:random_interpolated.AddsDrumSynth.bass_panningcontroller.AddsDrumSynth.hihat_panningcontroller.AddsDrumSynth.snare_panningcontroller.AddsMultiCtl.responsecontroller.AddsMultiCtl.sample_rate_hzcontroller.Increases the maximum value ofGpio.pin_inandGpio.pin_outcontrollers to256.RenamesKicker.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.AddsProject.restart_positionattribute.AddsProject.detach_module(module)method.Addspatch_decompilertool.AddsPattern.projectattribute, set once attached to a project.AddsNote.patternandNote.projectto allow notes to be project-aware.AddsNote.module_indexproperty, convertsNote.moduleto 0-based index.AddsNote.modproperty, allows setting a note’s module via an actualModuleinstance (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)Usesdictinstead ofOrderedDict, as modern Python’s built-indictmaintains key order.Renamesincoming_linkstoin_links.Renamescontroller_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 defaultsunvox_versionandbased_on_versionof
newly-createdProjectcontainers to reflect file format version 1.9.6.1.UpdatesMetaModule.behaviorsto includesends_notes.Now usesblackto 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 writesSLnKchunks,
thus correctly keeping the connection order between modules
that have more than one connection going in or out.RenamesSample.loop_endtoSample.loop_len.Fixes how effects embedded intoSampler.effectare serialized.Updatesout_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 ofVorbisPlayer.finetunecontroller values.Updates thehelloworldexample to use correct APIs.Parses chunk IDs in a case-sensitive way, to prevent incorrect
parsing of chunks such asSLnK.0.4.0.dev2 (2018-03-11)FixesCorrects a packaging error that included unnecessary cache data from
documentation builds.0.4.0.dev1 (2018-03-11)AdditionsAdds documentation about the SunVox file format.Adds equality checking toRange.AddsModule.midi_in_alwaysattribute, defaulting toFalse.
WhenTrue, the module will respond to MIDI events regardless of
whether it’s selected in the SunVox UI.AddsModule.midi_in_channelattribute, defaulting to0(all channels).
Set to 1-16 to make the module respond to only a specific MIDI channel.AddsProject.time_grid2attribute.AddsMultiSynth.curve2_influencecontroller.AddsMetaModule.event_outputoption (default:True).AddsMultiSynth.triggeroption (default:False).AddsModuleFlagsandVisibleModuleFlagsenums for reading/writingModule.flags.AddsPatternFlagsandPatternAppearanceFlagsenums for reading/writingPattern.flagsandPattern.appearance_flags.AddsVisualization,LevelMode,Orientation, andOscilloscopeModefor reading/writing theModule.visualizationstructure.AddsProject.selected_generatorattribute.AddsLfo.Waveform.triangleconstant.AddsLfo.generatorcontroller.AddsReverb.random_seedcontroller.AddsSampler.pitch_envelopeandSampler.effect_control_envelopes[]containing new envelopes from SunVox 1.9.3.AddsSampler.effectto contain an optionalSunSynthinstance
which in turn contains the effect being modulated by the
effect control envelopes.AddsSampler.Sample.loop_sustainflag.AddsSampler.ignore_velocity_for_volumeoption.AddsContainer.clone()method.AddsProject.pattern_lines()method, which iterates over a range of project lines
and yields information about the active pattern lines for each project line.AddsPattern.source_method()andPatternClone.source_method(),
to determine the source pattern for any given pattern or pattern clone.ChangesPython 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.UpdatesSamplerandSampler.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 ofCHNKwhen reading module-specific chunks.Does not write the optional -1 to the end ofSLNKchunks.Uses the value mapping curve when converting aMultiCtl.valueto downstream controllers.UpdatesMetaModule.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 byProject.layout().Improves variable names generated from MetaModule
user defined controller labels.FixesSMIN(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.AfterMetaModule.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.)InMetaModule, when a user defined controller mapping points to
a non-existent module, the mapping will be ignored.
(Was throwing anAttributeError)WhenModuleoptions are loaded from older projects,
assume0as a default value if there are not enough bytes.
(Was throwing anIndexError)Range validation forLfo.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 ofCHNKwhen writing module-specific chunks.Default to signed 8-bit int when aCHFFvalue was 0.0.3.0 (2017-04-18)AdditionsAddspropagateargument toMultiCtl.reflect().
Defaults toTruewhich causes the newMultiCtl.valueto
immediately propagate to all mapped controllers,
including the one that was just reflected.Set toFalseif you only want to setMultiCtl.valuewithout propagating to mapped controllers.Pass a value forinitialwhen callingMultiCtl.macro()to
set and propagate an initial value. Default behavior is to not set a value.ChangesThereprof aCompactRangeinstance now shows that class name,
instead ofRange.FixesFixes algorithm for propagatingMultiCtl.valuechanges to
mapped controllers.Fixes algorithm for reflecting mapped controllers back toMultiCtl.value.0.2.0 (2017-04-02)AdditionsAddsController.pattern_value()instance method, to map a controller’s
value to a pattern value in the range of 0x0000-0x8000.AddsALL_NOTESconstant to see if aNOTECMDis a note or a command.
(Example:if some_note in ALL_NOTES: ...)Addstabular_repr()instance methods toNoteandPattern,
returning a tabular representation suitable for inclusion in text documents.Addsbehaviorsattribute to all module classes, describing the
types of information each module can send and receive.Adds package-specific exception base classes torv.errors.Adds support for reading, writing, and modifying controller MIDI mappings.Adds aMultiCtl.macro()static method, for quickly creating aMultiCtlthat controls several similar controllers on connected modules.Adds aMultiCtl.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 onMetaModule``susing a ``u_prefix. For example, if there’s a user-defined controller
named “Attack”, it will be accessible via the.u_attackproperty.AddsArrayChunk.set_via_fn()method, for setting various curves using
the output of a function.AddsDRUMNOTE,BDNOTE,HHNOTE, andSDNOTEenumerations toDrumSynthclass, providing note aliases for easier programming of
drum sequences.AddsPattern.set_via_fn()and.set_via_gen()instance methods,
for altering a pattern based on the output of a function or generator.ChangesRenamesOutputmodule’s module group to"Output".When usingProject.layout(), default to usingdotlayout engine.Uses a direct port of SunVox’s algorithm for mappingMultiCtlvalues
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 duringProject.layout()FixesUses same sharp note notation as used by SunVox (lowercase indicates sharp).Honorprogkeyword arg when passed intoProject.layout()method.Does not require patternxoryto be divisible by 4.Assigns correct controller number to user-defined controllers onMetaModule.Corrects the max value allowed in aMultiSynthvelocity/velocity curve.Movespygraphvizfromrequirements/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.