A synthesizer audio plugin for making music by drawing objects, text, and images on an oscilloscope.
Read more, and contribute to osci-render here!
Share your art, and give feedback on the osci-render Discord!
Get osci-render premium here to get the following features:
Super-realistic oscilloscope
The ability to record visuals
Support for MP4 and MOV video formats
Syphon/Spout input
Improved text rendering
WINDOWS USERS: Make sure you install the latest C++ runtime redistributable here https://aka.ms/vs/17/release/vc_redist.x64.exe
Release notes:
There is now a timeline for GPLA files on the standalone version, so that you can easily scrub the video or animation
You can now link certain parameters together, such as scale, to allow you to use one slider to control multiple parameters
You can now easily mute audio using the volume icon above the volume meter on the left
The visualiser settings window is now resizable horizontally to allow finer control of the sliders
If there is an unexpected crash, you can choose to reset to a new project
The volume meter has been redesigned to look more modern
A warning message now appears when trying to open very large .obj files
The last opened directory is now saved globally across projects and VSTs
WINDOWS USERS: Make sure you install the latest C++ runtime redistributable here https://aka.ms/vs/17/release/vc_redist.x64.exe
Release notes:
Fixed the visualiser not appearing, being black, or having glitches on many Intel graphics computers
Applications on Windows are now properly DPI and scale-aware, so there should be fewer issues when switching between windows with different scales set.
Replaced the slider range button with a more generic settings button that allows you to control all slider settings
Added new LFO start and end parameters that manage the LFO's range, effectively enabling you to automate each slider's minimum and maximum values.
Added a new parameter to each slider that allows you to control how quickly the slider changes value, called 'Smooth Value Change Speed'
Improved the sizing and spacing of the recording and visualiser settings
Added the current file name to the window title
Added support for MP3, OGG, and FLAC audio file types in osci-render
Added better error messages when osci-render fails to open a file type
Fixed a crash when opening projects
WINDOWS USERS: Make sure you install the latest C++ runtime redistributable here https://aka.ms/vs/17/release/vc_redist.x64.exe
This version adds several quality-of-life and performance improvements.
Massively improved performance when streaming live from Blender and saving GPLA files
Reduced file size of GPLA files
Grease pencil line art baking is no longer required (but still helps performance)
You can now randomize the Blender port in the About menu, and choose a specific port in the Blender plugin
Overhauled the trace effect behaviour
Instead of 'Trace Start' and 'Trace End', it is now controlled with 'Trace Start' and 'Trace Length'
Fixed and improved the wobble effect
The wobble effect now has a 'Wobble Phase' parameter that controls the position of the wobble
Make the visualiser settings window resizable
You can now drag-and-drop to open files and .osci projects
Changing slider values with arrow keys is now more reliable
Double-clicking sliders now correctly resets slider values
Improved visualiser settings interface
The size and layout of the application and audio plugin is now saved with the project
WINDOWS USERS: Make sure you install the latest C++ runtime redistributable here https://aka.ms/vs/17/release/vc_redist.x64.exe
This adds a lot of small quality-of-life improvements, including:
Make visualiser fullscreen mode hide the bottom bar and your cursor when it's still
Add space to pause the visualiser
Make popout visualiser always stay on top
Add double-click and alt-click to reset parameter values
Add more decimal places to effects and LFOs (requires creating a new project to activate)
Fix crash when loading a project in a VST
Show an error if a GIF fails to open
WINDOWS USERS: Make sure you install the latest C++ runtime redistributable here https://aka.ms/vs/17/release/vc_redist.x64.exe
This version brings massive performance and quality improvements to the software oscilloscope visualiser, and brings several more visualiser settings, including:
Saturation
Focus
Noise
Glow
Ambient Light
Smoothing (low-pass filter)
Sweep
This also adds buttons to get osci-render premium which includes all the features included with sosci, a new audio plugin that simulates the look and feel of a real analogue oscilloscope from the 20th century.
You can learn more about sosci here: https://osci-render.com/sosci
This version brings a massively improved software oscilloscope visualiser, several helper functions for Lua custom effects and files, and support for opening .wav and .aiff audio files!
Scroll down below to see some of the new features, or download here:
Here's a look at the new visualiser, making the preview far more realistic!
The new visualiser uses the same renderer as dood.al/oscilloscope (thanks @pishtaq for letting me use this!) which is widely regarded to be the best quality software oscilloscope.
This version comes with several improvements such as:
Improved quality when full-screen
Ability to change the intensity of the beam
Control over the smudging effect applied to the image
If you find that you are having performance or stability issues using the new visualiser, you can always switch back to the old visualiser by going to View > Use Legacy Visualiser in the menu bar at the top.
.wav and .aiff audio file supportYou can now open .wav and .aiff audio files in osci-render, allowing you to import audio from other software and apply osci-render's effects to it! This gives additional flexibility to the standalone app, where it was previously clunky to use with existing audio.
The new helper functions for Lua open up a lot more possibilities when making custom Lua files and effects. They simplify creating shapes and waves, and also allow multiple images to be mixed together using the osci_mix() function. Here's the full documentation of the new functions added:
osci_line()return osci_line(phase)start = { slider_a, slider_b }
finish = { slider_c, slider_d }
line = osci_line(phase, start, finish)
return lineosci_rect()return osci_rect(phase)width = slider_a
height = slider_b
rect = osci_rect(phase, width, height)
return rectosci_square()return osci_square(phase)width = slider_a
square = osci_rect(phase, width)
return squareosci_arc()return osci_arc(phase)radius_x = slider_a
radius_y = slider_b
start_angle = slider_c * 2 * math.pi
end_angle = slider_d * 2 * math.pi
arc = osci_arc(phase, radius_x, radius_y, start_angle, end_angle)
return arcosci_ellipse()return osci_ellipse(phase)radius_x = slider_a
radius_y = slider_b
ellipse = osci_ellipse(phase, radius_x, radius_y)
return ellipseosci_circle()return osci_circle(phase)radius = slider_a
circle = osci_circle(phase, radius)
return circleosci_polygon()return osci_polygon(phase)num_sides = math.floor(slider_a * 10)
polygon = osci_polygon(phase, num_sides)
return polygonosci_bezier()return osci_bezier(phase)start = { slider_a, slider_b }
control_point = { slider_c, slider_d }
finish = { slider_e, slider_f }
quadratic_bezier = osci_bezier(phase, start, control_point, finish)
return quadratic_bezierstart = { slider_a, slider_b }
control_point_1 = { slider_c, slider_d }
control_point_2 = { slider_e, slider_f }
finish = { slider_g, slider_h }
cubic_bezier = osci_bezier(phase, start, control_point_1, control_point_2, finish)
return cubic_bezierosci_lissajous()return osci_lissajous(phase)radius = slider_a
ratio_a = slider_b
ratio_b = slider_c
theta = math.sin(step / 1000)
lissajous = osci_lissajous(phase, radius, ratio_a, ratio_b, theta)
return lissajousosci_translate()translate = { slider_a, slider_b }
square = osci_square(phase)
square = osci_translate(square, translate)
return squareosci_scale()scale = { slider_a, slider_b }
square = osci_square(phase)
square = osci_scale(square, scale)
return squareosci_rotate()angle = slider_a * 2 * math.pi
square = osci_square(phase)
square = osci_rotate(square, angle)
return squareosci_saw_wave()return { osci_saw_wave(10 * phase), osci_saw_wave(phase)}osci_square_wave()square_wave = osci_square_wave(phase)
return { osci_saw_wave(phase), square_wave }osci_triangle_wave()triangle_wave = osci_triangle_wave(phase)
return { osci_saw_wave(phase), triangle_wave }osci_mix()ellipse = osci_ellipse(phase)
square = osci_square(phase)
offset = 2 * math.pi * osci_saw_wave(step / 1000)
weight = osci_square_wave(phase + offset)
return osci_mix(ellipse, square, weight)Removed support for connections to james.ball.sh/oscilloscope
Changed renderer on Windows to Direct2D for better performance
Visualiser now stays in full screen upon closing and opening osci-render
Fixed bug on Windows on some DAWs where separate opened windows would not render correctly
Fixed several minor bugs
Fixes bugs when opening .osci files before version 2.2.0
The last opened folder is now remembered when opening files
Osci-render 2.2 is the second major release of osci-render 2!
This version brings support for animated GIFs, as well as wider image support, allowing you to open PNG and JPEG images! Here's a little showcase of what's new:
There's also a new About section that provides some credits, as well as the current version of osci-render:

Here's a full changelog for this version:
Support for animated GIFs
Support for PNG and JPEG images
Improved software oscilloscope controls
Includes ability to pop-out software oscilloscope into a separate window
Various fixes and improvements
Support for opening pre-rendered Blender scenes, and syncing them to music
This allows you to connect with several instances of osci-render and Blender at once
It also massively improves performance when using Blender this way
This comes as a new file type, .gpla, which stands for Grease Pencil Line Art
Blender scenes can be animated within osci-render, and synced to the BPM of your DAW
Thanks so much to DJ_Level_3 for making this feature, and for writing the tutorial below!
Install the latest Blender plugin above
Create an animation in Blender
Add a Scene Line Art object, or Collection Line Art object if using collections
Change the following settings from default
Edge Types
Intersections: Enable
Geometry Processing
Overlapping Edges as Contour: Enable
Crease on Smooth: Enable
Composition
Overscan: Set to 0
Image Boundary Trimming: Enable
Bake the line art. If keyframes appear on the timeline, great! If not, clear the baked line art and bake again.
When seen from the side, the line art is only visible on some edges, which are the edges that are visible to the camera.
This becomes clear when viewed from the camera’s perspective.
In the osci-render Blender plugin, click “Save line art to file” and name the file to which the line art will be saved. Note: The plugin automatically adds the extension .gpla if there is no extension or if the extension is not .gpla.
In a DAW (in this tutorial, Ableton was used), open the osci-render VST3 plugin and (optionally) enable MIDI. If using MIDI, it is recommended (but not required) to set the number of voices to 1 and increase the sustain level to 1.000.
Using the “Choose File(s)” button in osci-render, open the .gpla file exported from Blender. This will open the Line Art Settings panel and begin rendering the line art from the file.
To synchronize the animation with the BPM of the song, tick the “BPM Sync” box and set the framerate in frames per beat. For animations that have a length of a power of 2, setting the rate to a lower power of 2 makes the animation loop exactly at the beginning of a bar. In this example, where the animation is 32 frames and the rate is 8 frames per beat, the animation loops every 4 beats or 1 bar at 4/4.
Fixed bug where custom Lua effect code would be blank when opening and closing a VST window
Fixed bug where enabling sidechain on the first parameter in an effect causes sidechain on all parameters to be enabled
Fixed crash when reordering effects
Changed AU plugin type so it appears correctly as an instrument in GarageBand
Osci-render now automatically opens the code editor when a Lua or text file is created
Fixed bug causing audio input to be disabled
Improved checkbox design
Allow LFO sliders to be more granular, supporting increments of up to 0.01Hz
Tweaked the interface to make it more responsive, modern, and clear

Corners are rounded
White outlines removed from buttons and text boxes
Increased contrast between parts of the interface
Improved performance when moving and resizing the window
File editor now includes the file name
Lua now throws an error if the script runs for too long, helping stop infinite loops without freezing osci-render
You can clear the console from within Lua using the clear() function
Fixed various bugs
Fixes bug on macOS when changing the range of sliders
Replaces effect checkboxes with toggle switches

Adds debug console for Lua, to allow you to view messages printed to the console using the print function

The console is closed by default, and can be opened by clicking the console title
Click the pause button to pause printing to the console, allowing you to scroll through the console history
Click the delete button to clear the console
Fixes a bug that caused a crash when opening multiple files at once
Adds a button next to sliders to allow you to change the range of the slider, and LFOs that control this slider
This was previously possible by right-clicking the slider name, but has been moved to a button to make it easier to find
Lua sliders can now be animated with LFOs!
Lua slider values now smoothly change between values
Lua slider values can now be used in effects
PLEASE NOTE: Performance when using Lua may be worse. Let me know if you notice a difference!
Osci-render 2.1 is the first major release of osci-render 2, packed with new features, bug fixes, and lots of quality-of-life improvements.
PLEASE NOTE: This is a major release, and old .osci projects or old DAW projects may break if you are upgrading osci-render to 2.1
New audio effects!

3D Ripple
Applies a 3D ripple effect to the image in the Z direction
Ripple Depth controls the size of the ripples applied to the image
Ripple Phase controls the position of the ripple
By default, this is animated to make the image ripple inwards
Ripple Amount controls how many ripples are applied to the image - increasing this will reduce the space between ripples
3D Rotation
Controls rotation of the image and object in X, Y, and Z directions
By default, the image rotates around the Y axis
Scale
Scales the image and object in X, Y, and Z directions
Make this negative to invert the image
Swirl
Applies a swirl distortion to the image

Dash
Traces along the image in dashed-lines - increase this to increase the length of the dashes

Modified audio effects
All existing effects now operate in 3D rather than 2D
This means effects like bit crush apply the effect in X, Y, and Z directions, like below:

Added Z dimension to Distortion and Translation effects
Simplified and expanded 2D Rotate effect into 3D rotation without a rotation speed slider
Rotation speed can now be more easily controlled by animating rotation using a Sawtooth or Reverse Sawtooth LFO, and setting the exact speed in Hz
Removed any fixed-rotation axis buttons since these are no longer required
Trace effects are now more consistent
3D perspective effect has been removed since everything is now treated as a 3D object
This has been replaced with the Lua Effect, for programmable audio effects
You can now create 3D custom effects, using the variable z, which is the Z coordinate of the input audio
Lua can now output 3D coordinates, as well as 2D coordinates like before
This means you can now program 3D shapes, objects, fractals, or anything else you want!
New button to randomise all the audio effects
This gives you a really quick way to experiment with new audio effects

The default shape is now a square rather than a circle

Slightly rearranged the interface

Improved the file opening and navigation interface
You can now switch between files using left and right arrow buttons, instead of pressing j and k
Close files by using the delete icon to the right of the file name

frequency, phase, sample_rate, and step variables are now available in custom Lua effects, just like in Lua files
Lua slider values can now be changed when editing a custom Lua effect
3D objects that are behind the camera, or out of the range of the camera are now clipped
This removes undesirable audio and visual glitches when objects are in strange places
3D objects are now consistently sized when opening them
Fixes min trace and max trace effects, so they work as expected
Improves audio performance
Fixes a bug that meant osci-render could crash when rendering a Blender scene
Adds a button to open the Audio and MIDI settings from the MIDI panel when running the standalone version
Adds automatic timed recording, and manual recording of audio
Click on the circular record icon to start recording, showing a preview of the audio as you record
Click the timer icon to configure how long you want to record for, automatically stopping after the time has elapsed

Adds MIDI pitch-bend support
Adds sidechaining, allowing you to change the value of effects based on the volume of the input audio
You can enable this for any slider by clicking the microphone icon next to it
When enabled, the microphone icon and slider turn red
Now, any audio input controls the value of the effect
Sliders are now more usable when the interface is made smaller
When loading a project, the DAW is now properly notified of any changes in values
Reduce how dark disabled audio effects are, so they are easier to read
You can now view the software oscilloscope in full-screen by double-clicking it
Note, that you can also improve the quality of the oscilloscope by right-clicking and reducing the roughness, though this may lead to worse performance
Massively improve performance of interface and software oscilloscope on Windows
Properly support mono output so that the plugin works in Logic.
Remove cap on drawing speed that led to inaccurate pitch of objects drawn at high frequency