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. On any system.
Official SunVox page: https://warmplace.ru/soft/sunvox
Windows: 2000 (x86/x86_64).
Linux: any fresh distribution + libsdl2 (you can install this library using apt-get or some other package manager).
macOS: 10.9 (x86_64).
Windows CE: 3.0 (ARM).
|System||Supported architectures||Sound engine format||Multi-touch||GPIO|
|Linux||x86, x86_64, ARM (Maemo-based devices, Raspberry Pi, PocketCHIP, etc.), ARM64 (PINE64 etc.)||32-bit floating-point / 4,12 fixed-point||YES||YES|
|Windows||x86, x86_64||32-bit floating-point / 4,12 fixed-point||YES|
|Windows CE||ARM||4,12 fixed-point|
|Android||ARM, x86||32-bit floating-point / 4,12 fixed-point (on devices without FPU)||YES||YES|
|iOS||ARM||32-bit floating-point (iOS 7 and higher) / 4,12 fixed-point||YES|
As you can see, there are two sound engine formats in SunVox. Let's look at them in detail.
In some cases the sound engine format will be selected automatically. But in some cases (in Linux, for example) you can choose it manually: there are several versions of SunVox with different engines.
You can always find the information about the current engine format in the SunVox Main Menu → About window.
The SunVox interface is divided into the several rectangular areas (windows):
Each area has its own menu with different options and functions - use the button with three horizontal lines to open this menu. Click on some area sets the focus on this area.
First click on the Stop button - stop playing. Second click - reset all SunVox activity and switch the engine to standby mode.
You can change it in the Main Menu → Preferences → Interface → Shortcuts. Any keys and MIDI-buttons can be assigned to any SunVox action (from the list below).
|CTRL + Z||undo|
|CTRL + Y or SHIFT + CTRL + Z||redo|
|CTRL + N||new project or object (module/pattern/…)|
|SHIFT + UP/DOWN/LEFT/RIGHT||selection|
|CTRL + (||selection begin|
|CTRL + )||selection end|
|CTRL + A||select all|
|CTRL + X or SHIFT + DELETE||cut|
|CTRL + C||copy|
|CTRL + V or SHIFT + INSERT||paste|
|CTRL + D||duplicate / clone|
|INSERT (or Command+I on Mac)||insert an empty note and shift the pattern content down; or just insert something|
|BACKSPACE||delete previous note and shift the pattern content up; or just delete something|
|DELETE (or Fn+Backspace on Mac)||delete|
|ESC||exit the application|
|CTRL + SHIFT + N||new project|
|CTRL + O||load project|
|CTRL + S||save project|
|CTRL + B||save project to BACKUP.sunvox|
|musical keyboard (notes)|
|F1…F8||set octave number|
|SHIFT + )||octave up|
|SHIFT + (||octave down|
|SPACE||edit mode ON/OFF|
|CTRL + '='||increase the edit step|
|CTRL + '-'||decrease the edit step|
|CAPSLOCK or '~'||insert “Note OFF” (==)|
|K||insert a special command “Set Pitch” (SP)|
|SHIFT + K||insert a special command “Previous Track” (<<)|
|CTRL + M||paste and mix|
|CTRL + T||select track|
|CTRL + I||interpolate values|
|CTRL + U||interpolate velocity|
|SHIFT + '='||transpose up (+1 semitone)|
|SHIFT + '-'||transpose down (-1 semitone)|
|SHIFT + ']'||transpose octave up (+12 semitones)|
|SHIFT + '['||transpose octave down (-12 semitones)|
|CTRL + P||place selected events evenly|
|SHIFT + 7||cyclic shift up|
|SHIFT + 8||cyclic shift down|
|CTRL + R||randomize module controllers|
|SHIFT + mouse movement||module link/unlink|
|SHIFT + controller value change||write the value to the pattern|
|SHIFT + >||next module|
|SHIFT + <||previous module|
|CTRL + >||next synth|
|CTRL + <||previous synth|
|CTRL + RIGHT||next module horizontally|
|CTRL + LEFT||previous module horizontally|
|CTRL + DOWN||next module vertically|
|CTRL + UP||previous module vertically|
|CTRL + 1||toggle mute|
|CTRL + 2||toggle solo|
|CTRL + 3||toggle bypass|
|CTRL + 4||unmute all modules|
|CTRL + F||find a module|
|SHIFT + scroll wheel||change the size of all modules|
|CTRL + scroll wheel||change the size of the selected module|
|F10||play from beginning|
|SHIFT + F9||record start/stop|
|SHIFT + F10||play from the pattern cursor|
|SHIFT + F12||go to beginning|
|SHIFT + touch||write a microtone (Set Pitch XXYY command) to the pattern|
The SunVox project consists of the following parts:
All the project parts are stored in the single *.sunvox file. The sound of the project should be the same (or close to the original) regardless of the device and system.
A few words about hex numbers. Memory locations and software in today's computers use the hexadecimal (hex) number system which comprises sixteen distinct symbols, digits 0 - 9 and letters A, B, C, D, E, F (or a - f) where the letters represent the numbers 10 - 15. For more detail on the hexadecimal system please visit: https://en.wikipedia.org/wiki/Hexadecimal
Examples of hexadecimal numbers and its decimal (dec) equivalents:
Pattern is a group of simultaneously played tracks that represents some section of the SunVox project (score). It is divided into horizontal lines. Playing direction is top-down.
Any pattern in the SunVox looks like this:
|line||track 0||track 1||track 2||…|
event - some music event (something like a MIDI command).
Examples of events:
|event of turning note C5 on:||C5 80 01 0000 0000|
|event of turning note A5 on:||A5 80 01 0000 0000|
|event of turning note off:||==|
As you can see, an events contain several text/numeric columns (fields). All numbers in the pattern are represented in HEXADECIMAL format.
Event format: NN VV MM CCEE XXYY
Lets see detailed description of each column in the event:
Velocity can be changed dynamically. Example:
NN VV MM CCEE XXYY C3 10 03 0000 0000 -- 20 -- 0000 0000 -- 30 -- 0000 0000 -- 40 -- 0000 0000 -- 50 -- 0000 0000 -- 60 -- 0000 0000
In this example velocity changed from 10 to 60.
Example of changing cutoff frequency (global controller) of filter from min to max value:
NN VV MM CCEE XXYY -- -- 01 0200 0000 -- -- 01 0200 1000 -- -- 01 0200 2000 -- -- 01 0200 3000 -- -- 01 0200 4000 -- -- 01 0200 5000 -- -- 01 0200 6000 -- -- 01 0200 7000 -- -- 01 0200 8000
The “Cutoff frequency” controller has a number 2 in the filter.
Some modules have the local controllers. A local controller can be changed for a particular note (sound) on a particular track, independently of the other sounds of the same module.
Example: (changing local controller 2 in the module 1)
NN VV MM CCEE XXYY C3 80 01 0200 0000 //Set local controller 2 to value 0000. Separate sound begins playing here -- -- -- 0200 0001 //Set local controller 2 to value 0001 -- -- -- 0200 0002 //Set local controller 2 to value 0002 -- -- -- 0200 0003 //Set local controller 2 to value 0003 -- -- -- 0200 0002 //... -- -- -- 0200 0001
01 - Slide up (Portamento Up). This effect will slide up the frequency of the synth being played on the track by XXYY (one semitone = 40) tones for every tick. If a slide rate is not specified (XXYY is zero) then the last slide rate used on the track is used again.
02 - Slide down (Portamento Down). This effect will slide down the frequency of the synth being played on the track by XXYY (one semitone = 40) tones for every tick. If a slide rate is not specified (XXYY is zero) then the last slide rate used on the track is used again.
03 - Slide to note. This effect will slide a note being played on a track to a specified note NN. The parameter XXYY (one semitone = 40) will states the speed at which a slide will occur. If a slide rate is not specified (XXYY is zero) then the last slide rate used on the track is used again. If NN is empty, the last NN (specified early for effect 03 in the same track) will be used.
04 - Vibrato with parameters XXYY, where the XX - frequency (examples of values: 20 - one period per line; 40 - two periods per line), YY - amplitude (one semitone = 40).
08 - Arpeggio. This effect is normally used to simulate chords. It can also be used to produce a heavy vibrato. Example: Note = C3; XXYY = 0407 (second note increment = 4; third note increment = 7) this is an attempt to produce a C-major chord. At the beginning of a line the C3 note is played, then 1/3 into the line the sound is retriggered at E-3, at 2/3 is retriggered at G3, and at the beginning of the next line (if there are no new notes to be played on the track), it is retriggered at C3 again. Video: Arpeggio Standard Effect
09 - Set sample offset. This functionality enables you to start a sample from a specified position rather than the normal beginning position. Multiply value XXYY * 256 to get the position in samples from the beginning of the sample where playback should start. If no sample is specified, the sample currently playing is retriggered to the offset specified. Example: play instrument 2 at note C3, and XXYY = 0023. This would make playback of the sample start at offset 0023 * 0100 = 2300. This offset provides quite a wide range from where you can start playing the sample.
07 - Set sample offset (by percentage). XXYY from 0000 (sample start) to 8000 (sample end). Video: Sampler Retriggering / Scaling
0A - Slide velocity up/down. This effect will change the velocity of the synth being played on a track. The value XXYY the speed of the velocity change. If XX is nonzero the velocity is increased, and if YY is nonzero the velocity is decreased. Example: set XXYY to 0003. This means that at the beginning of the line, the current velocity of the synth is decreased by 3 (because YY = 3). The velocity is decreased by 3 again for every tick on this line.
0F - Set playing speed. This effect changes the TPL (number of ticks per line). Valid values are 1 - 1F (1 - 31 in decimal). Values above 1F represent a modified BPM (beats per minute). A speed value of 2A (42 in decimal), equals 42 beats per minute.
11 - Fineslide up. This effect functions just like effect 1, except that the frequency of the note is only modified once (at the beginning of a line).
12 - Fineslide down. This effect functions just like effect 2, except that the frequency of the note is only modified once (at the beginning of a line).
13 - Set Bypass/Solo/Mute flags. BSM = XYY; Example of mute: 13 0001; example of solo: 13 0010.
14 - Reset Bypass/Solo/Mute flags. BSM = XYY. Example of bypass reset: 14 0100.
15 - Сhange the relative note XX and finetune YY of the module.
Relative note XX:
19 - Retrigger. Effect 19 allows you to retrigger a note after XXYY ticks during the line. For example, let's specify note C3 and set XXYY = 2 when the speed (TPL) is currently 6. This starts the specified note at the beginning of the line, and after two ticks it is restarted. This continues until the beginning of the next line.
1C - Cut. This effect turns off the note after XXYY ticks in the current line.
1D - Delay. This effect delays the start of a note until tick XXYY in the current line. For example, if note C2 is played, with effect 1D and argument XXYY = 3 when the speed is 6. The note C2 will be triggered at the 3rd tick after the start of the line. Purpose: to delay the start of a sample for a VERY short amount of time.
1F - Set BPM to XXYY.
20 - Note probability. Set the probability XXYY (from 0 to 8000) of a note being triggered. This effect can be used for original unpredictable rhythms.
21 - Note probability with random velocity. Same as effect 20 but with random velocity.
22 - Write a random value 0…XXYY to the controller CC.
23 - Write a random value XX (00..FF) … YY (00..FF) to the controller CC.
24 - Note from line XXYY. Take a note from line XXYY on the same track. If the note to the left of the effect is specified, it will be used as the transposition value (relative to C5: c5 - one semitone higher, C4 - one octave lower, etc.). If the module number is missing, then the module number from line XXYY will be used.
25 - Random note from line XX…YY. Take a random note from the range of lines XX..YY (inclusive) on the same track.
26 - Note from track XXYY. Take a note from track XXYY on the same line.
27 - Random note from track XX…YY. Take a random note from the range of tracks XX..YY (inclusive) on the same line.
28 - Note from line XXYY on track 0. Take a note from line XXYY on track 0.
29 - Random note from line XX…YY on track 0. Take a random note from the range of lines XX…YY (inclusive) on track 0. See example “pat effect 29 random note from trk0”.
30 - Stop playing the song.
31 - Jump to line XXYY (address) right after the end of the current line.
32 - Set jump address mode YY:
38 - Delete an event on track XX with a probability of YY (00..FF(100%)). See simple_examples/pat effect 38 self destructive.sunvox.
39 - Cyclic shift of track XX down by YY lines.
3A - Generate a new iteration of YY-line polyrhythm on track XX. See simple_examples/pat effect 3A polyrhythm.sunvox.
3B - Copy track XX to a pattern named YY.
40…5F - delay an event for selected fraction of the line (from 0% (40) to 96.875% (5F)).
Video: Standard Effects
You can use controllers with number 80+X to send MIDI Control Change command. Where the X is MIDI Controller Number.
NN VV MM CCEE XXYY -- -- 01 8100 0000 - set Modulation (MSB and LSB) to the min value -- -- 01 8100 8000 - set Modulation (MSB and LSB) to the max value MSB - Most Significant Byte; LSB - Least Significant Byte.
You can get MIDI Controller Number for CC column from the following table.
|MIDI controller number (dec)||SunVox controller number (MIDI contr. + 80 (hex)); Use these values in the CC column of SunVox pattern||Controller name|
|0||80||Bank Select (MIDI Controller 32 more commonly used)|
|6||86||Data Entry MSB|
|12||8C||Effect Control 1|
|13||8D||Effect Control 2|
|16-19||90-93||General Purpose Controllers|
|32-63||A0-BF||LSB for MIDI Controllers 0 - 31|
|64||C0||Damper Pedal (Sustain)|
|70||C6||Sound Controller 1 (default: Sound Variation)|
|71||C7||Sound Controller 2 (default: Timbre/Harmonic Content)|
|72||C8||Sound Controller 3 (default: Release Time)|
|73||C9||Sound Controller 4 (default: Attack Time)|
|74||CA||Sound Controller 5 (default: Brightness)|
|75-79||CB-CF||Sound Controller 6-10 (no defaults)|
|80-83||D0-D3||General Purpose Controllers|
|91||DB||Effects 1 Depth (previously External Effects Depth)|
|92||DC||Effects 2 Depth (previously Tremolo Depth)|
|93||DD||Effects 3 Depth (previously Chorus Depth)|
|94||DE||Effects 4 Depth (previously Detune Depth)|
|95||DF||Effects 5 Depth (previously Phaser Depth)|
|98||E2||Non-Registered Parameter Number LSB|
|99||E3||Non-Registered Parameter Number LSB|
|100||E4||Registered Parameter Number LSB|
|101||E5||Registered Parameter Number MSB|
|121||F9||Reset All Controllers|
|123||FB||All Notes Off|
|126||FE||Mono On (Poly Off)|
|127||FF||Poly On (Mono Off)|
Interpolator is a tool that provides the ability to make a smooth transition between the values of the selected area of the pattern, with various parameters (like the curve type, noise, etc.).
Description of the buttons
If you want the smooth transition between the first and the last line of your selection - use Interpolate. But if you want to change the existing values (fade them out for example) - use Apply envelope.
Module is a basic element of the SunVox. There are several types of modules:
Lines between the modules define the direction of signal transmission: more intensive part of line must go from the source; less visible part must go to the destination (reciever).
There is internal set of basic SunVox modules. Click twice on the empty area between the modules - and you will see the list of internal modules. You also can load some modules from the external storage medium by clicking the LOAD button under the list of internal modules. You can find several folders with additional modules (effects, instruments) in the SunVox directory.
There are three ways to connect one module to another:
Reconnection removes the previous connection.
Every module has a set of parameters (controllers):
Click twice (or right click) on the controller to open the Controller Properties window, where you can do the following operations: change, reset, randomize, write to pattern, assign MIDI IN:
Automation of the module controllers - automatic change of controller values during playback. Sources of automation: special modules (MultiCtl, Pitch2Ctl, Sound2Ctl, Velocity2Ctl) or the patterns. In the latter case, it does not matter which pattern will send commands to the controller: in SunVox there is no strict binding of certain patterns to the modules and their parameters.
If you press SHIFT, and then on the controller, then its value will be written in a pattern (at the current cursor position). If you need to write more complex automation, then there are three additional ways:
If automation is recorded in a pattern, then the changes do not occur smoothly, but in steps. Step length = 1 tick (after live recording), or 1 line (in other cases). To make changes smoother, automation commands can be sent to the MultiCtl module (in which the Response parameter is different from 1000), which will smooth the changes and send commands to other modules connected to it.
Some modules have a “Mode” parameter with the following possible values:
If the CPU of your device is too slow for some SunVox project (app stutters and hangs), you can use the following tips:
Timeline defines the layout of the SunVox project. It describes how to play the patterns. Patterns can be repeated across multiple orders to save tracking time and file space.
When you select a pattern, you will see its contents (tracks, lines, events) in the Pattern Editor. In the single pattern play mode, when you select another pattern, it will play after the end of the previous selected pattern.
Playback speed is defined by the following parameters:
Generator with 32 double alias-free oscillators with internal 12/24dB filters, exponential envelopes and smooth parameters changing.
The sound quality of this module is better at a sample rate of 44100Hz.
Video: Virtual Analog Generator
Drum synthesizer with variety of predefined sounds.
The sound quality of this module is better at a sample rate of 44100Hz.
Distribution of sounds:
FM-based synth. Abbreviations: C - carrier; M - modulator.
The sound quality of this module is better at a sample rate of 44100Hz.
Basic generator of different types of periodic signal waveforms with the volume envelope.
This module can receive the incoming signal and use it for the frequency modulation. To do this, connect any other audio source to the input of the Generator, and that source will affect the frequency of the Generator. And don't forget to set a “Frequency modulation on input” controller to some nonzero value.
Available local controllers: Type; Pan.
Audio input from Microphone/Line-in.
Compatibility: implemented in the iOS and Android versions only. Other systems will be supported in future SunVox updates.
Available local controllers: Type.
OGG Vorbis player.
Sampler can play and record audio files. Supported file formats: WAV, XI, AIFF, RAW. 8 / 16 / 24 / 32 bits. In Linux version all FFmpeg/AVConv formats supported too.
Available local controllers: Pan.
FFT-based synth. Can be used to generate a sound with a complex spectrum.
Available local controllers: Pan.
Video: SpectraVoice: four harmonics
Signal amplifier with various settings.
For example you can split a stereo audio input into the left and right channels with this module:
DC blocking filter.
This module delays the sound and the incoming events (note, pitch, phase, velocity). Max delay length = 4 seconds.
This module adds various types of distortion to the sound.
Maximal delay length: 4 seconds.
IIR Filter that can remove some unwanted frequency ranges.
In HQ mode the Filter is double-sampled. In LQ mode the Filter is 2x faster, but with the following consequences:
High-quality 64-bit IIR Filter that can amplify, pass or attenuate some frequency ranges. This module is slower than the Filter.
LFO - Low Frequency Oscillator.
Here are three ways to use this module.
This module repeats a fragment of the incoming sound a specified number of times. To reset the loop: either change the “Repeats” controller, or send some note to this module.
Video: Loop Module
Amplitude or Phase modulator. First input = Carrier. Other inputs = Modulators.
More info about amplitude modulation: https://en.wikipedia.org/wiki/Amplitude_modulation
More info about phase modulation: https://en.wikipedia.org/wiki/Phase_modulation
Video: Pitch Shifter
Reverberator with DC Blocking Filter.
This filter was designed to simulate the vocal tract of a human.
In simple terms, WaveShaper allows you to change the shape of the input signal. Default shape is linear (no changes; play the original signal).
In math terms, WaveShaper is the expression y = f( x ); where y - output; x - input; f - function with graph which you can see in the WaveShaper interface. The horizontal axis of the graph is Input. The vertical axis of the graph is Output.
Generally the feedback is not allowed in SunVox you can't create an endless loop between the modules. But you can do it by placing two Feedback modules inside of the loop (see screenshot).
Internal Feedback delay = 20 ms.
Glide is similar to the MultiSynth (which sends the input events to the connected output modules), but it also adds the commands of smooth transition between the notes.
With this module you can use the General-Purpose Input/Output (GPIO) pins of the device board. For example, you can send some signals to the LEDs, or receive the ON/OFF (1/0) messages from the buttons.
Requirements: Linux with GPIO Sysfs Interface enabled.
Platform-dependent GPIO numbering (not physical numbering) is used to access GPIO pins. here you can read about the GPIO numbering on Raspberry Pi.
Example in simple_examples folder: raspberry_pi_gpio.
MetaModule is a full-featured copy of SunVox in a single module. So you can include one SunVox-project into another recursively. Some complex synth or effect (with large amount of the modules) may be hidden in the MetaModule. You also can use it as arpeggiator.
There are two ways to play some generator in the MetaModule:
With this module you can control multiple controllers at once.
Video: MultiCtl Module
This module sends the incoming events (notes, pitch change, phase change) to any number of connected modules (receivers). So you can play a large number of synths simultaneously by pressing one note only. The MultiSynth can also modify incoming events according to the parameters described below.
This module converts the incoming notes to the controller values (in some another connected module).
This module converts the audio signal to the numeric value of any selected controller.
Input port of the Sound2Ctl is for receiving the audio signal. Output port of the Sound2Ctl is for transmitting the commands like “set controller X to the value Y”.
If you want to disable this module: just mute it, or set OUT Controller to 0.
Video: Sound2Ctl Module
This module converts the velocity parameter of the incoming notes to the controller values (in some another connected module).
Go to the main menu → Preferences, and you will see the window with the main SunVox settings (not for the separate project, but for the whole SunVox app).
In most cases, you should not change this file manually, because the main settings are available in the SunVox Preferences window. But if you want to use some specific options, you can create your own configuration file based on this one (description of all options).
Interface is lagging very much
Try to disable some module visualization options: Main Menu → Preferences → Modules.
I noticed the effects parameters on the right of the note, velocity etc at the top seem to be missing
These columns are hidden by default. But you can enable them - just go to the Main menu and select “Show additional columns”.
How to connect one module to another?
The answer is here.
Filter effect's impulse value doesn't change. When i change impulse value, it return 0
It is normal behaviour. There is no need to remember the “impulse” value. I'll try to describe the algorithm.
How to paste sounds from another iOS apps?
Is there a way to make the Sampler notes less 'clicky'? When I play pure waveforms especially the clicks become really loud as it cuts off a wave at one amplitude and starts a new one at a different amplitude.
There is no automatic anticlick function in the current version of the Sampler. You should make through the Volume Envelope with 1-tick (at least) release. Also make sure that your Sampler has enough Polyphony channels. If not sure - just set it to 32 os ro.
Is there a particular bit rate/sample rate/# channels that the samples need to be in order to work?
WAV samples must be in following format: 8 / 16 / 24 / 32 (float) bits; mono / stereo; any sample rate; only uncompressed PCM data. Supported file formats: WAV, AIFF, XI, JPEG. As for JPEG, brightness of the pixels will be converted into the sound wave (pixel by pixel).
How to open the sample editor?
Please check this video-tutorial.
For multisamples, how do I set the root note of my sample?
Use the “rel.note” (relative note) parameter for such purposes.
How do I adjust multisample instruments? I see slots for multiple samples and a zone managment section in the editor, but I can only load one sample at a time?
I hope this little tutorial will help you.
Step 1. Open new empty sampler:
Step 2. Load sample 0:
Step 3. Sample 0 loaded:
Step 4. Load sample 1:
Step 5. Sample 1 loaded:
Step 6. Make sample 1 playable on octaves 5 and 6:
Sound stutters or (and) freezes. How to fix?
Windows CE: go to the SunVox Preferences → Audio and change the Buffer to some value between 1024 and 4096; for example, 1536 is the best value for iPAQ devices.
How to connect SunVox to another app via MIDI?
How to split MIDI notes by channels, and send the notes from different channels to different modules?
Go to the properties of the module and set MIDI IN to “always”, if this module should play always (even when not selected). Next, change the channel value to the right of MIDI IN.
SunVox crashing for no apparent reason
Try to clean the settings of the SunVox. Launch it from console with the following command: sunvox clearall. If you are Windows user - just run the reset_sunvox.bat script.
How can i import/export files from/to the SunVox internal storage on iOS?
There are several ways.
How can i copy/paste audio to/from the other iOS audio apps?
No signal from the microphone
Open the Android Settings → Apps → SunVox → enable the “record audio” permission.
Copy/Paste don't work, the previous session is not saved