Hello hello, this is the Egg back at you with the 10th "no more patches" patch for Keysight! Hint system I've backported a system from Keysight 2 that I've been working on implementing: hints. Think "loading screen hints", except they're on a bar at the bottom of the menu. A wise
Hello hello, this is the Egg back at you with the 10th "no more patches" patch for Keysight!
Hint system
I've backported a system from Keysight 2 that I've been working on implementing: hints. Think "loading screen hints", except they're on a bar at the bottom of the menu.
A wise man (Tantacrul, actually) once said "it doesn't matter if your software has a feature, it only matters if people can find it and use it" and that is one heck of a sticking point with Keysight 1. There are 240 hints cycling at the bottom of the screen just sort of mentioning all sorts of stuff and giving little, well, hints as to how to use Keysight. These range from incredibly basic to pretty advanced, and the current hint can be paused by hovering over it or advanced to the next hint by clicking on it.
The idea is that since I can't really fix the discoverability of features in Keysight 1 at this point, I can at least just info-dump at people and hope someone benefits from a moment of "wait that's possible?".
If you don't want an extra UI element filling up your screen with changing text, the hint bar can be disabled under System > Interface.
Render-to-video padding adjustments
A small adjustment has been made to the render-to-video "Post FX" with how padding-in and padding-out settings work. These allow you to add extra time to the beginning and end of renders, but now that can accept negative values as well to crop the beginning and ends!
This should help cut down on wasted time in a render if you have a particularly long note travel time in top-down mode, such as in vertical video content, without having to resort to video editing. This actually required a full-rewrite of the padding / fading / watermark image time calculation, and in doing so I fixed a few edge-case one-frame bugs.
The caveat here being that if you are attaching an audio file to a render, audio sync will break if you have more negative padding-in than the time taken for MIDI playback to hit the keyboard (so, in bottom-up note direction: instantly. In top-down, by your time delay value). This is because the audio file cannot be trimmed before being added into the render at the end.
Forced aspect-ratio rendering
Render-to-video would have a broken layout if you had a Core > Visual layout with "forced aspect ratio" turned on, and forced aspect ratio was actually taking effect. My bad! It's fixed now. I don't think this really affected anyone, I guess everyone is on standard 16:9 monitors, so that's a relief at least.
Anyway, happy Keysighting! <3 Back to Keysight 2 for me, I just got some really nasty input rebinding stuff set up and working nicely, so I'm feeling good.
Greetings! Super tiny update here. In fact, it isn't an update at all, but just an enabling of a Steam feature that I should have turned on a long time ago: Your Keysight data is now automatically synchronised to the cloud, allowing you to keep your presets as you move between di
Greetings!
Super tiny update here. In fact, it isn't an update at all, but just an enabling of a Steam feature that I should have turned on a long time ago:
Your Keysight data is now automatically synchronised to the cloud, allowing you to keep your presets as you move between different computers!
This will not sync some folders of your save data, notably:
Graphics settings
Exports
Intermediate data
All custom image textures will be uploaded. If you have a huge number of large image files, cloud sync may take a while to complete the first time! You may need to open Keysight and then close it again to trigger a Steam cloud upload for the first time as well.
If you want to opt out of cloud sync, this can be done via the properties for Keysight in your Steam library. Right click on Keysight in Steam, navigate to Properties, and then uncheck this toggle:
Additionally, this feature is untested on MacOS devices. If you're a MacOS user and run into difficulty with cloud sync, let me know in a comment or via Discord!
Greetings! For those keeping score, this is now the 9th patch beyond "I'm not working on Keysight 1 anymore" Sliders The main change here is that the way in which sliders (and graph Y-axis) snap to a value when dragging the handle. This is not quite using the exact Keysight 2 cod
Greetings!
For those keeping score, this is now the 9th patch beyond "I'm not working on Keysight 1 anymore"
Sliders
The main change here is that the way in which sliders (and graph Y-axis) snap to a value when dragging the handle. This is not quite using the exact Keysight 2 code, but the principle is the same: snapping increments are now based on the actual size of the slider in screen pixels and the current bounds of the slider. This makes sliders feel a lot more uniform, especially when using "unusual" slider bounds.
The snapping target is 10 pixels, and then the "closest nice number" is chosen from whatever increment value would be given by that 10-pixel snap. This means sliders should always snap to numbers like 0.1, 0.25, 0.5, and the are between 5-20 snapping pixels. Also don't forget snapping can be disabled with the alt key!
Feedback on slider feel is very welcome! Again, this is basically how Keysight 2 sliders work, so getting a real-world vibe check from a bunch of people would be enormously useful to me in making sure Keysight 2 feels as good as possible.
Other stuff
Physical undo / redo buttons
Keysight has had an undo system since version 1.2.0, but a recent Tantacrul video opened my eyes to the fact that you cannot assume people know that ctrl+Z ctrl+Y exist, and "physical" undo/redo buttons are likely the most-clicked buttons in any application.
Indicator for forced-aspect-ratio blank areas
A few folks have run into unwanted black areas from forced aspect ratio layouts on non-16:9 monitors and not understood why they're seeing them, which is 100% fair enough. There is now some wrapping text in blanked-out spaces to better communicate what is happening!
Render rate limiting for the render phase of render-to-video
Render profiles now support a framerate limiter for rendering to assist in stability under extreme render settings. Note that due to how particle modes work, setting a limit of 60 while in "SAFE" particle mode will give you an actual maximum render rate of 15 frames per second (and 30 in "FAST", or the full 60 in "CPU" or "OFF"). This limit will also not affect the Export framerate (as this is handled outside of Keysight, technically speaking).
More console commands
The note counter and pedal display widgets can now be rotated with "counterrotate 90" and "pedalrotate 90" (warning: very janky!) and "deframe" is overhauled for my own testing purposes. If you're curious about Deframe stuff and analysing streaming smoothness scientifically, message me on Discord!
Bugfixes
Just a few minor things relating to recent features mostly, but also fixes a critical div/0 crash relating to illegal slider values being possible if you really tried.
Greetings! So umm... this should absolutely be "Keysight 1.7.0" or at least 1.6.4, but I said that 1.6.3 was definitely the final update for Keysight. So here we are. "Version 1.6.3g", which is definitely just a hotfix patch and nothing to do with features people have requested f
Greetings! So umm... this should absolutely be "Keysight 1.7.0" or at least 1.6.4, but I said that 1.6.3 was definitely the final update for Keysight. So here we are. "Version 1.6.3g", which is definitely just a hotfix patch and nothing to do with features people have requested for years!
Ultrawide support and forced aspect ratio
Keysight's menu now scales much better on non-16:9 displays, and has configurable text size and preset bar width!
Keysight's menu will now pin to the left side of the screen, and not exceed a 16:9 aspect ratio for the central options area (to prevent breaking a ton of menu layouting). For ultrawide displays, this means the menu stays readable and allows for more space to edit presets on the right, instead of the old behaviour of uncomfortably zooming waaay in.
This definitely has nothing to do with me recently acquiring a 32:9 monitor and becoming a lot more sensitive to ultrawide support.
Forced aspect ratio layouting
In combination with better menu scaling, the default Automatic layout mode has a new feature: forced aspect ratio. This ensures the live Keysight render matches your video rendering aspect if editing on a monitor that is different (eg. an ultrawide monitor and creating 16:9 videos, or a 16:9 monitor and creating portrait 9:16 videos). When aspect ratio is forced, the render is pinned to the bottom-right of the screen. This feature has been enabled by default for all Automatic layouts, and set to 16:9!
This can be incredibly helpful for working on vertical video content, as you can pin the vertical render to the right side of the screen and make the menu smaller and pinned to the left, and have a full menu open while still seeing your full preset exactly as it will show up in the video!
Twitch chat control
There is now an official, pre-packaged and easy-to-use Twitch chat control tool bundled with Keysight! Any Keysight save data that didn't already have any Inbound websocket configuration has been automatically updated to work with this tool right out of the gate. For a basic implementation with the Keysight default presets, literally just opening the Keysight tool and authenticating your Twitch account when prompted will grant you Twitch chat control abilities!
This tool was developed by Cellko, and the Node.js source code is freely available if you'd like to expand upon it for your own needs. It is intentionally a very simple tool, with the following limitations:
Twitch-only, no Youtube chat support, sorry!
No channel point integration
No queueing
But it has the following features:
HTML form-based editing for setting up commands
Permissions levels, for gating commands behind mod/sub badges
Runs entirely locally
Response messages back into chat
Configurable account to use for responses (if you want to use a bot account, for example)
Funnily enough, I've always wanted a generic and shareable chat control tool but never got around to commissioning one. Then Frank Tedesco (clang) got in touch asking if I could get one set up for him as part of a commission, and he was more than happy to essentially subsidise development of a good generic tool that anyone could use as long as it met all of his needs. So, thank Frank for this tool!
Console commands
As part of stronger remote control through websockets, console commands got a lot of additions! If you're unfamiliar, there's a semi-transparent console command field in the System tab that can be used to execute Unreal Engine console commands or a handful of Keysight-specific ones. The full changelog and Wiki pages have more information on the specifics, I'll not go into detail here!
Console commands can also be added to a new "commands.txt" file buried in the save data. When Keysight launches, any lines in this file not starting with // will be executed as console commands, which synergises nicely with the next thing...
Note counter and pedal display
Quite possibly the two most commonly requested features that I never implemented. They're finally here!
However, these features are only accessible through console commands and do not function in render-to-video. They are also very rigid in style compared to the rest of Keysight! Think of these as "debug" functions rather than explicit features.
Note counter features:
Three modes: "Session" displays notes played this session, "Total" displays all notes played through Keysight, "Subathon" counts down instead and is intended to integrate strongly with websocket control.
Configurable size, position, colour and digits
Triggerable "temporary offset" to start counting from zero again in a non-destructive way
Pedal display features:
Individual visibility control for soft / sostenuto / sustain pedals
Configurable size, position, colour and squash amount
This guide breaks down how to turn on and configure these features using console commands.
I always held off making these features because they felt a little gimmicky and outside the usual 3D-driven-effects of Keysight, plus they can't integrate with render-to-video. But the new console command text file allowed me to get over myself and make a "good enough" implementation for the folks that really wanted it for live performances. Sorry it took me so long!
Extra stuff
Mask Mode+
There is a new "Mask mode plus" toggle under Scene > Semi-transparency to activate a new and improved version of Mask Mode! (If you're unfamiliar, this mode integrates with a filter in OBS to provide perfect semi-transparency of Keysight without needing luma/chroma keys)
A quick overview of the improvements:
No more weird colour borders if you re-scale a source in OBS
Much clearer indication that Mask Mode is on
Better options in OBS
Automatic disabling of Mask Mode while the menu is open (both in Keysight and OBS)
Sustain-pedal effect extension has been broken into independent toggles for keyboard-based effects (keypresses and impact lights) and backdrop effects (notes, particles and pulses). These toggles are also available for the sostenuto pedal too, as I am proudly one of the seven people who enjoy using it sometimes! I still strongly recommend against using sustain pedal effect extension as it gets messy really quickly, but the sostenuto extension is quite nice as a way of very clearly visualising that it's happening.
Better smoothing (maybe)
After a lot more investigation and testing, I've removed some engine CVars I previously applied in the hopes of making Keysight's frame delivery smoother. Turns out: they don't. They actually make it worse in OBS capture, it's just the frametime graph looks smoother. Particle systems also had some internal things tweaked to try and make them less liable to cause hitches when spawning.
Bugfixes
Notable ones:
Refreshing websockets now shouldn't cause fatal crashes
Fixed sustain pedal effect extension breaking if provided 0-velocity note-on events as note-off events (thanks to BrentusFirmus for helping me find this!)
Fixed (or vastly reduced) Pulse and Particles sometimes being pushed "below" Light Bar components when new effects were spawned
Ok. Back to Wiki-writing and Keysight 2 development for me!
Greetings! More of a "lukewarm" fix here than a "hotfix", but as they say: better late than never. 8k resolution rendering is now actually functional (for better or worse). I made a very silly mistake that stopped resolutions larger than 4,096 from being allowed in the Y axis in
Greetings! More of a "lukewarm" fix here than a "hotfix", but as they say: better late than never.
8k resolution rendering is now actually functional (for better or worse). I made a very silly mistake that stopped resolutions larger than 4,096 from being allowed in the Y axis in the last patch! I still strongly recommend that nobody use >4k resolutions for producing content, it's just far too much overhead and liable to make Keysight crash on lower-spec systems, but I don't want to actually enforce such a restriction in code.
Also fixed: Channel colour mode breaking on time-offset Pulses and Particles. This one actually slipped through since version 1.6.0!
Finally, I added a debug console command to switch Keysight to output a BMP image sequence rather than an actual video when performing a render-to-video operation. Similar to 8k rendering, I strongly recommend ignoring this feature; it's intended for a single person who wanted completely uncompressed frame output! A single minute of 8k footage rendering to a BMP image sequence will create 354GB of files.
Happy Keysighting! <3
Full 1.6.3f changelog:
--- SMALL ADDITIONS ---
Added debug console commands: render-jpg render-bmp "render-bmp" switches render-to-video to export intermediate frames in .bmp format rather than .jpg, and disables video exporting to just keep the frames around. "render-jpg" switches things back to normal
Added 8k resolution to dropdown selector for render-to-video resolution
--- CHANGES ---
Changed high-resolution warning on render-to-video to kick in if internal resolution is above 4k (rather than above 8k)
--- BUG FIXES ---
Fixed Y-axis custom resolution input not allowing >4096 for render-to-video operations (whoops!)
Fixed being able to click "cancel render" in a narrow window between rendering and exporting, causing all kinds of chaos
Fixed Channel colour mode not functioning properly on time-offset Pulses and Particles
Happy Holidays! We're now at the 6th update beyond what I called "the final update" (in my defence, I didn't add any new features this time). To get into the spirit of things and celebrate the Steam Winter Sale, here's a neat Christmas-themed preset created by Wilwolferine! (Down
Happy Holidays! We're now at the 6th update beyond what I called "the final update" (in my defence, I didn't add any new features this time).
To get into the spirit of things and celebrate the Steam Winter Sale, here's a neat Christmas-themed preset created by Wilwolferine! (Download⬇) Just a reminder, but the Discord is the place for finding and sharing creations like these. Go join it if you haven't already! The Wiki is also (finally) coming together, with just Scene element pages left to write. I'll be honest, I wildly underestimated how much time writing documentation was going to take!
Anyway, I found and fixed a number of small issues while working on the Keysight Wiki, here is the full changelog for 1.6.3e:
--- CHANGES ---
Changed MacOS to launch into "ULTRA" graphics preset by default (it's been a few years, seems like most people are rendering videos and/or can run Ultra just fine in any case!)
Changed custom frame directory selection for render-to-video intermediate frames to create "/KeysightFrames" rather than "/Keysight frames", just in case spaces in file paths mess anything up
Removed "Do not unbind and rebind" warning to MIDI device selection, as this issue was fixed as of the last minor patch
Renamed "Pedal preset switching" to "Soft pedal preset switching" and removed ability to specify an arbitrary CC ID, as this feature was broken for anything except the soft pedal anyway (and I don't think a single person uses it)
--- BUG FIXES ---
Fixed note objects (usually black keys) using "transparent" material domain from showing on top of Light Bars (such as "Fade (top)")
Fixed a lot of "midi" not being "MIDI" (very important)
Fixed soft pedal exposure/bloom switch not resetting if soft pedal is held when this feature is disabled
Fixed looping Randomizer "only randomize on no activity" mode being completely broken, and always thinking no activity was happening
Fixed Outbound websocket basic mode activity information always showing 0.0
Fixed Outbound websocket advanced mode being a broken in about 5 different ways
Fixed crash relating to cancelling render-to-video operation within 1 second of it starting
Hello! We are now at the 5th update past "the final update" and counting, but here we go... While making some of my own content, I ran into some annoyances with Keysight and decided to fix them. Without further ado, here is the changelog: --- SMALL ADDITIONS --- Added a preset se
Hello! We are now at the 5th update past "the final update" and counting, but here we go...
While making some of my own content, I ran into some annoyances with Keysight and decided to fix them. Without further ado, here is the changelog:
--- SMALL ADDITIONS ---
Added a preset search function (only took 4 years)
Added function to auto-focus the selected preset when the selected preset is changed
Added support for render resolutions above 4096x4096 pixels. I strongly recommend not doing this though, Keysight is liable to crash!
Added blending mode support to Light Bar Wisp and Plasma objects, allowing "Normal" blending mode. This allows for dark or black Wisps and Plasma
--- CHANGES ---
Changed "Midi" tab to be "MIDI", since it is an acronym and not a word (hugely important, I know)
Changed preset scroll bar scrolling to be smoothly animated
Changed all file pickers for image importing to show all files, and just block non-supported image files. Should streamline the experience of using non-default file types (such as a jpg on Pulses which expect a png)
Changed all materials to render "two-sided"
Changed Reflections on Note Objects that use the static rotation mode to rotate 180 degrees if the note is realtime. Functionally this means if you rotate Reflections and pan them such that they follow Note Object movement, this persists even if you change the direction of note travel, making presets a bit more shareable!
--- BUG FIXES ---
Fixed materials in "Transparent" mode not showing texture options when emissive colour is set to "Texture" but masking is not enabled
Fixed "Cancel render" button tooltip being wrong
Fixed unbinding from a MIDI device failing to properly release that device, causing it to be unusable in other programs (or Keysight, if you try to bind to it again). This fix brought to you by: "some tiny one-line comment at the bottom of a forum post" and it has eluded me for 4+ years!
Four years! Greetings! It's that time of year again: the Keysight anniversary. Oh, and I guess the Steam Summer Sale too, so Keysight is 30% off! I've also been working hard on something that turned out to be way bigger than anticipated: The Keysight Wiki Here it is! This site ai
Four years!
Greetings! It's that time of year again: the Keysight anniversary. Oh, and I guess the Steam Summer Sale too, so Keysight is 30% off!
I've also been working hard on something that turned out to be way bigger than anticipated:
The Keysight Wiki
Here it is! This site aims to replace the Steam guides with something a lot more cross-linked and searchable now that Keysight is in its "final state".
The Wiki aims to mitigate what I see as the core problem with Keysight 1: usability and user education. Keysight 1 can achieve a lot of things, but usually through very unintuitive and circuitous methods. The Wiki provides a much easier-to-browse source of information than the existing Steam guides, and is guaranteed to be up to date. I recommend starting with the "Concept" pages if you want a broad overview of how Keysight works without getting bogged down in technicalities.
Warning: at time of writing, the Wiki is maybe 30% complete. I wanted to have it done for the 4-year anniversary, but a combination of "oh, this is way bigger of a task than I thought" and "let's sort out MacOS and a bunch of bugfixes" stopped that from happening. Finishing the Wiki is my current priority!
MacOS is now up-to-date!
Thanks to the incredible work of HeapUnderflow doing some really cursed things to get it all to work: Keysight is now fully up to date on the MacOS branch after being abandoned since May 24th, 2023! MacOS users now have access to:
"Channel" colour mode
Up to 88 colour slots
Point-based particle force (black hole particles)
CPU render mode for render-to-video
Tons of bugfixes
On top of the new stuff in 1.6.3b!
Version 1.6.3b changes
Since I had to go in to change all the menu links from Steam guides to the Wiki, some minor adjustments and fixes have also been made:
All measurements are now in centimetres. (Prior to this change, there was a lot of inconsistency with some things being in 10cm per unit, or 1cm per unit, or 1 "key width" (2.358cm) per unit.)
Updated all default presets and Light Bar templates to be better laid out in 3D space, with no overhanging shadows or excessive Z-height on some Pulses
Added "Static rotation" Reflection mode for materials to allow material to pan without rotation in any direction
Added emergency soft-lock prevention on render-to-video operations which lose connection with the video export tool
Back to working on Keysight 2!
At the time of writing, there are still some Wiki pages left to be written, and I want to record some good video guides. But once that's out of the way, it's back to Keysight 2 development!
Don't forget about the devlog playlist if you want to keep up to date on KS2 development, but I have learned my lesson and will not be able to provide any ETA on when it'll be ready. It's still a very long way off though, apologies!
Hello! I got my hands on some new performance testing utilities and ended up making a couple changes, wanted to push it as a build so everyone benefits. 1.6.3a (Windows-only) contains the following changes: --- SMALL ADDITIONS --- Added a "Disable frame-smoothing optimisations" t
Hello! I got my hands on some new performance testing utilities and ended up making a couple changes, wanted to push it as a build so everyone benefits. 1.6.3a (Windows-only) contains the following changes:
--- SMALL ADDITIONS ---
Added a "Disable frame-smoothing optimisations" toggle to Graphics > Framerate. This applies "RHI.MaximumFrameLatency 0" and "RHI.SyncSlackMS 10" in the event that the new default behaviour of "RHI.MaximumFrameLatency 1" "RHI.SyncSlackMS 0" somehow causes issues for anyone.
--- CHANGES ---
Changed Pulses to switch to mask-capable mode only when Mask Mode is enabled, and allowed this to happen for sprite and world-space opacity masked Pulses
Changed default engine CVars to "RHI.MaximumFrameLatency 1" "RHI.SyncSlackMS 0" to add in smoother frame delivery when v-sync'd and operating comfortably within hardware capabilities. This is measurable, but minor
--- BUG FIXES ---
Fixed Render-to-video lack of resampling when using a branding image that is not a clean multiple of the target render resolution
Greetings! In this update... - New default presets - Polished particle / pulse templates - Better organised light bars - New custom-commissions service on offer - Far too many words, GIFs and videos Have you ever ended up with a file called "thing_final_final_v4_new"? In unrelate
Greetings!
In this update...
- New default presets
- Polished particle / pulse templates
- Better organised light bars
- New custom-commissions service on offer
- Far too many words, GIFs and videos
Have you ever ended up with a file called "thing_final_final_v4_new"? In unrelated news, I am pleased to announce the final version of Keysight (1.6.3) is now available!
This update focuses on the default resources bundled with Keysight, incorporating new Keysight-usage techniques that bring visuals to the next level! All default presets / particles / pulses / light bars have been edited to a greater or lesser degree to give you the best start to building visualisations.
All the new default presets! Some new, some reworked, some largely untouched.
These default resources are loaded from external files when Keysight launches, and so happily: update 1.6.3 is also available for MacOS users! Minus a few little bugfixes I snuck into the Windows version.
IMPORTANT! Please read (or watch!)
This update will not change the look of any pre-existing presets. You will need to manually re-import the default presets in order to see them (if you already use Keysight)! I have made a video outlining how to access the new stuff here:
Or if you prefer to read, here's the different ways you can grab the new default presets:
Option 1: re-importing all default presets
Simply head to the System tab, then click "re-import default presets"! However, warning: this will overwrite any presets that share the same name as a default preset. Those names are: Quicksilver / Vintage / Electric / Night / Fire / Spectrum / Gemstone / Keysight / Plain (default)
Option 2: importing a specific default preset
All default presets are bundled with the Keysight install as .kspreset files, and can be imported individually. Click "import" in the top left, and navigate to the Keysight install (Typically Steam/Steamapps/Common/Keysight). From here, head to Keysight/Extra resources/Presets/Stock preset backup and select the file you would like to import.
You may also want to import "Plain (default)" via this method, and then head to System > Defaults calibration and click "set current preset as default" (while using Plain (default)). This will make any new presets inherit the Plain (default) settings as the starting point, and the new default preset has various settings optimised for easier Keysight usage.
Option 3: completely wiping your data and starting fresh
I recommend this if you're a long-time user of Keysight and have never performed a factory reset! Over time, I have altered the way a lot of default settings behave, but I do not auto-adjust user data to reflect the new defaults as they might not be suitable for all implementations. If you want to make a backup of your entire save data first, this is found under:
Windows: C:/Users/[you]/Appdata/Local/Keysight/
Mac: Library/Application Support/Epic/Keysight/
And/or you can export individual presets to .kspreset files for safe storage.
Anyway, to fully factory-reset Keysight: head to System, and then the console command entry field at the bottom of the tab. Typing reset and hitting enter will instantly delete all your save data and start fresh.
Commission custom Keysight presets!
I have already announced this publicly on Discord, but just to repeat everything in a Steam announcement:
I (Egglyberts, sole developer) am now publicly offering a paid service to build custom Keysight implementations for you.
I've already done this for a number of creators behind-the-scenes when asked, and I wanted to formalise and make it known that I am happy to do this. To be clear, I am not changing my policy of near-infinite free help via Discord and Steam answering questions, and I do not expect preset commission to be of interest to 99% of users. "Custom Keysight implementation" in this context means presets, AR 3D camera matching, or just an entire Keysight setup if you have something niche in mind!
So, how does this work?
£20 (about US $25) base price. This guarantees up to one hour of my time
Further time, if required, at £20/h
Time cost is dependent on goals. There will be a free consultation phase where I present a fixed-price for your requirements. (One hour is roughly enough to make two really nice presets with stock resources in Keysight, or one preset with custom art assets)
I'll provide images / videos of progress as I go to make sure it's in line with your vision
Payment on completion, and only if you're happy with it. Then I'll send over necessary files + source materials
Any submitted files are yours. I will not use them, I will not share them. Not even any preview images (unless you would like me to do that and promote it!)
Ok! With that out of the way, time to show off the new goodies. All the new presets, plus a couple extra, are on display in the freshly-reworked trailer:
It's interesting to note that I haven't added or changed the way anything in Keysight actually works; these new presets could have been built way back in 1.6.0! 1.6.3 presets look nicer due to better usage of Light Bars and the Reflections system, and I've also tried to make things cleaner and less obnoxiously bright/flashy as well.
"Classroom" and "Synthwave" presets have been removed, and the new presets of "Vintage" and "Night" have been added in their place. Here's a quick comparison and breakdown of the rest:
Quicksilver
- Notes use the new Fluid reflection texture, strongly inspired by some older Kassia and Rousseau videos - Impact light shadows have been lengthened - Light bars have been used to fake some ambient occlusion on the keyboard - Rising haze particles are improved and made cleaner - Added streak particles - Lowered brightness of keypresses - Lowered overall brightess of preset to be easier on the eyes - Added shadow at top of screen, kind of like a vignette
Fire
- Added warm lighting to the keyboard - Light bars have been used to fake some ambient occlusion on the keyboard - Added top shadow - Added reflection to backdrop to provide more visual interest to empty areas - Reduced amount of sparks
Electric
- Changed hue gradient to be vertical, with green at the top, using a new Light Bar template - Made lightning more subtle - Inverted and tweaked piano key materials - Added reflection-driven interesting keypress material - Made circuit board more subtle, but also larger and bolder - Changed notes to semi-rounded and gave them a Pietschmann-inspired reflection-driven material - Added top shadow - Added some blue smoke - Reduced brightness of light bar
Gemstone
- Changed particles from "Column" to "Basic fountain" - Added keyboard shadow - Changed keyboard lighting - Tweaked reflections on notes to be less high-contrast - Added "Drifting specks" particles - Added top shadow
Keysight
- Removed keyboard light - Added keyboard shadow - Updated "Rising haze" particles to the new template
Spectrum
Sorry this is such a compressed mess, thanks GIF format... - Made note border narrow instead of wide - Overall heavy brightness reduction - Added keyboard shadows - Updated "Burst" particles to the new template - Added "Drifting specks" particles - Added top shadow underneath smoke
Plain
- Added top shadow - Added keyboard shadows - Reduced note light brightness - Reduced keypress brightness - Lengthened impact light shadows - Changed scene lighting to give more interesting highlights on piano keys
Reworked templates
Next up: particle / pulse / light bar templates!
Particles
Every template has been tuned up to a greater or lesser extent. Some templates, like Burst, have barely changed but should render faster. Others have undergone serious reworks, here are some examples (old on the left, new on the right):
Fireworks
These now pop into existence at their target height instantly, rather than being thrown upwards first. As shown, this allows Fireworks to be useful in bottom-up mode. They are also a lot more detailed and realistic, at the cost of not having an even spread.
Rising haze
The comparison GIF doesn't do a great job at showing it, but this template is now made up of smoke + oval particles rather than a single fade-with-speck. The vector field force has also been tuned heavily to be more swirly and detailed.
Streak
This template has been drastically tuned down so as not to dominate any preset it is added to, as well as dropping to just one streak instead of two.
Lightning
This has also been made more subtle, with less arcing and sticking lower down to the keyboard to act more as a "pulse" than a particle system. A GIF of just the lightning here might look a little dull, but it fits more presets a lot better than the original lightning.
Pulses
Pulses have undergone far less change, but have also been tuned slightly. No lengthy comparisons here! Most changes amount to subtle things like adjusting the base size of "Basic ring" such that it intersects nicely with "Basic circle", allowing faster and nicer composite Pulse layouts.
Light bars
Light bars have been renamed to be better organised, with a few additions!
"Fade"-type templates (shadows) now include more options for adding piano shadow, as extensively seen in the new default presets. There is also a new "Hue (Colour)" template (only available on Windows) which allows for easily multiplying the scene colour towards a target colour towards the top of the screen, in order to more easily allow for vertical-gradient-type visualisations.
Other improvements
All default textures have been consistently compressed (turns out some were PNGs, some were low quality JPGs... an artefact of just throwing more stuff on the pile over time). Normal maps are now PNGs, and everything else is 95% JPG, which saves a small amount of storage space and improves normal map quality in some instances.
Added new "Stars" mask, and added a starry backdrop template to any default template that does not use an Overlay.
Added rough CPU/GPU cost to particle template descriptions (these are relative, and should only be compared to each other, although these are the actual millisecond performance cost for my own computer).
Organised and added more "Extra resources" .kspresets and templates. These are found under the Keysight install, then /Keysight/Extra resources.
(Windows-only) fixed a bunch of small bugs:
- Fixed missing textures causing buggy, infinite-stretched materials
- Fixed editing Colour in Basic mode causing black note borders to turn white
- Fixed colour pickers not displaying the correct hex code (these were using Linear hex codes, and now use the expected sRGB)
- Fixed sustain-effect-extension mode breaking keypress indicators if keypress indicators are not also extended
What next?
Well... with Keysight 1? Hopefully nothing! 1.6.3 is intended to be the final update for Keysight (but it is the third "final update" to date so... take that with a pinch of salt). However, before getting back to Keysight 2 development, I would also like to create a Keysight Wiki. Keysight 2 is still going to take me a long time to finish, and Keysight 1 will not be going away once Keysight 2 is released... so I want to try and address the ease-of-use issues in Keysight 1 with a really good, easy-to-navigate wiki, now that everything in the program is not going to undergo any more changes.
Anyway! Wow, err, long announcement (1,911 words, in fact). If you read the whole thing... well done! You're never getting that time back. If you want to keep up on Keysight 2 news, join the Discord, subscribe to Youtube, maybe come chat to me on Twitch!
Hello! It's, err, me again. Another hotfix, although this is more of a coldfix at this point! Activity and Notes-per-second colour mode are now functional once more and not stuck at 0.00 blending factor. Please note that as this is a Windows-only fix for a bug introduced way back
Hello! It's, err, me again. Another hotfix, although this is more of a coldfix at this point!
Activity and Notes-per-second colour mode are now functional once more and not stuck at 0.00 blending factor. Please note that as this is a Windows-only fix for a bug introduced way back in 1.6.0, MacOS still suffers from broken Activity/NPS modes and will remain that way. I am so sorry for letting this slip through at the time and now have no way of updating the MacOS branch :( Big thanks to Plain-Piano in the Discord for bringing this to my attention!
In the process of fixing things, I did have to remove the "colour look-ahead" feature under Core > Simulation. But this was a weird and entirely unknown feature for colour modes that weren't even working, so... acceptable losses, in my book.
Hey folks! Tiny hotfix here addressing an oversight with the Channel colour mode. No idea how, but particle systems were just not using the new mode at all. Apologies for that! While I'm posting here I'd like to mention that Keysight 2 devlogs are now a thing on Youtube! If you'r
Hey folks! Tiny hotfix here addressing an oversight with the Channel colour mode. No idea how, but particle systems were just not using the new mode at all. Apologies for that!
While I'm posting here I'd like to mention that Keysight 2 devlogs are now a thing on Youtube! If you're curious about what Keysight 2 is going to look like and would like to keep up on development, get subscribed!
Hello! Teeny tiny update (Windows-only) to add a necessary feature for a streamer to achieve a specific implementation. Only two changes: Pulses which are translucent and always fully opaque (that is, 1.00 opacity across opacity-by-velocity and opacity-by-lifetime-1/2) will now b
Hello! Teeny tiny update (Windows-only) to add a necessary feature for a streamer to achieve a specific implementation.
Only two changes:
Pulses which are translucent and always fully opaque (that is, 1.00 opacity across opacity-by-velocity and opacity-by-lifetime-1/2) will now be masked in mask mode. While in this mode, they also slightly move downwards over time in order to properly perform transparency sorting. This allows masking of "note object replacement" pulses.
A notice to MacOS users Regretfully, 1.6.2 will not be available on MacOS. This is for the very lame reason that I told my external developer in charge of MacOS porting that 1.6.1 was definitely the final Keysight update. They have therefore torn down the necessary Unreal Engine
A notice to MacOS users
Regretfully, 1.6.2 will not be available on MacOS. This is for the very lame reason that I told my external developer in charge of MacOS porting that 1.6.1 was definitely the final Keysight update. They have therefore torn down the necessary Unreal Engine setup required to create more builds. My deepest apologies! Very much my fault, but I'm not about to ask them to re-figure-out the outrageous hoops to jump through to get certain plugins working on Mac.
Surprise!
Hey so err, remember when I boldly announced "no more Keysight 1.X updates, I'm working on Keysight 2.X"? While working through some important bugfixes for 1.6.1, I accidentally snuck in some much-requested features. Whoops! Let's break those down quickly, and then talk about Keysight 2 news.
Colour improvements
Colour modes got a bit of a facelift, and a new addition! The "Channel" colour mode does exactly what you would expect it to do: change colour based on the channel being used by the event. This is less flexible than using full Channel-to-Preset mapping under Automation, but is far more quick and convenient if you simply want some flat colours to change based on the hand or instrument.
Additionally, the Gradient mode (previously called Key Position) now dynamically updates slot name based on which pitch that slot is closest to on the keyboard.
Finally, the colour slot limit has been increased from 12 slots all the way to 88! It is incredibly unwieldly to have so many slots, but having 88 slots with Series colour mode allows a specific pitch to have a specific colour in a way that was not previously possible. If doing this, I recommend ensuring Slot 12 is the colour you want all notes to be, as this colour is added to the end of the colour list when adding slots beyond slot 12.
"Point-based force" added to particles
By popular request, particles have a new force they can use! "Point-based force" lives under the Wind tab and is a bit of a mouthful, but the snappier "Black hole" name does not quite describe what these new options do. You can now assign a point in space which exerts a force on all particles with (of course) a lot of configuration. In trying to use this effect myself, it is by far the "hardest" system to get to grips with in Keysight, but it can do some cool new stuff as already proven by Shyked.
CPU particle mode in Render-to-Video
Ok so before I get distracted talking about why this has been such a struggle, the headline: perfect quality renders are now typically more than twice as fast to render using the new CPU particle mode. This has the caveat that this is only faster than "safe" particle mode, and only works on "reasonable" numbers of particles (systems with greater than 5k particles spawned per second will benefit much less, and may even be slower). Oh, and the resolution limits have been changed: rendering up to 16,384 x 16,384 is now allowed (at your own risk!). But hey, we have the marketing point of "8k rendering!!11!" now...
The technical details for "CPU" mode, for those interested: Keysight's render-to-video (RTV) exports frames using RenderTargets, which exist in the GPU's memory (VRAM). Particles simulate via the GPU and are also stored in VRAM. For some unknown reason, writing to RenderTargets and simulating particles in the same frame causes horrendous particle artifacting, and so for RTV to actually work it needs to write to a RenderTarget for one frame, and then advance the particle simulation on the next frame. This alternation is what "FAST" particle mode does (and may still have a single broken frame here or there); with "SAFE" particle mode being 1-frame-write, 1-frame-simulation, 2-frame-wait as the cycle (which is guaranteed to give perfect frames). The new "CPU" particle mode simulates particles on the CPU and in regular old RAM, thus avoiding the particle artifacting if writing a frame and simulating particles at the same time and guaranteeing non-broken particles on every frame.
CPU simulated particles are much slower than normal GPU simulated particles. If using presets without a high volume of particle spawning, CPU can be even faster than FAST mode, but this is very much a preset-by-preset thing and I encourage you to do some tests!
I wanted to give you folks some super early heads-up about how things are going to work. If you have questions or any input, I would love to hear from you in the comments or via the Discord! (This is big scary product roadmap stuff and I want to do everything I can to give you the best experience moving forwards)
"Keysight 2" will be a separate product to "Keysight"
Anyone who owns Keysight at the time of Keysight 2 being released will receive a free license to Keysight 2. Keysight 1 will continue to exist on Steam and be available to purchase at a slightly lower base price, as my plan is to list Keysight 2 at a higher base price. Anyone purchasing Keysight 1 after the release of Keysight 2 will not receive a key for Keysight 2.
Originally, I had intended to release 2.0 as a free update to Keysight. However, the architecture and flexibility of 2.0 is going to be so radically different that I will not be able to support up-converting 1.X data. Therefore, if I did release 2.0 as an update to Keysight then it would cause a huge headache to any user opening Keysight post-update and suddenly needing to rebuild all their data (unless they manually downgrade via Beta branches back to 1.X). Having a separate product of Keysight 2 allows a much better-communicated split between 1.X and 2.X, but I absolutely want to ensure it acts as a "free update" to you existing Keysight users! Hence the free keys.
Keysight 2 has no explicit release date or timeline
I have very lofty ambitions for 2.0, and that brings with it a lot of big technical questions I have yet to solve! Pre-production and testing of ideas has already begun, but I don't yet even have a concept for how long it's likely to take to rebuild everything we currently have (on top of adding new features). Let's go with "probably at least a year".
Keysight 2 is a very open development process
Interested to see how things are going? I am regularly opening up 2.X feedback discussion threads in the Discord and adjusting the design based on thoughts from users like you! Additionally, I will occasionally stream development and have shared various design documents (like this one outlining the planned data structure).
Keysight 2 will be very exciting
Disclaimer: everything is subject to change, and no discussion of a planned feature should be taken as a promise that this feature will eventually exist. With that out of the way, here's some things to fire the imagination!
We are, of course, using Unreal Engine 5 for Keysight 2. The typical big-ticket features like Nanite and Lumen are less relevant to Keysight, but there is an experimental new engine feature called Substrate for building materials. And oh man, Keysight 2 materials are going to be exquisite!
HeapUnderflow, the external developer responsible for all the actually-difficult tool development for Keysight (like midi file reading, render to video, preset import/export), is working closely with me to "nativise" all tools directly into the engine itself. This brings a host of back-end benefits to make development for me easier, but also brings a huge speed increase to those systems! As an example, the proof-of-concept midi file importing now appears to be upwards of 10x faster and capable of handling larger files.
Automation will be a major focus for the general data architecture of Keysight 2. This is very difficult for me to explain succinctly, but the idea is as follows: every menu action in Keysight can also be performed through an "Automation action", and these Actions can be triggered by a variety of inputs. Actions can also smoothly set a variable over time, allowing every single setting in Keysight to become animated.
Following the ease and popularity of .KSpreset files, we will be replacing the awkward "basic / advanced" menu switching in Keysight 1 with a "template -> customise" workflow for every object and effect, and then allow these templates to be exported. The dream is to allow people to share just things like a ".KSnote" or ".KSmaterial" to let beginner users snap together pre-made elements rather than operate within the janky confines of Basic mode; suffer through Advanced mode; or use someone else's preset completely as-is.
There is, of course, so much more I could talk about. But rather than do that, I'll get back to actually building it! Keysight 1 has been a great exploration into the design space of midi visualization and I am quite proud of what has been built, but there are so many lessons and ideas that I am excited to build into the foundations of something new. Watch this space!
Hello! I am very pleased to announce that 1.6.1 is done and live! This update originally started as a simple "let's just quickly add preset import/export", but exploded out into a number of high-priority bugfixes and some small tweaks to existing systems which massively expand th
Hello!
I am very pleased to announce that 1.6.1 is done and live! This update originally started as a simple "let's just quickly add preset import/export", but exploded out into a number of high-priority bugfixes and some small tweaks to existing systems which massively expand the possibility space for what can be achieved with Keysight.
Please note that 1.6.1 will be the final update for Keysight 1.X. However, this is not the end of the Keysight development journey! More information at the end of this announcement, but let us first talk about what's new...
Preset import / export
Sharing presets just got a lot easier! Thanks to the wonderful work of HeapUnderflow developing another extension to Keysight, presets can now be imported from and exported to ".kspreset" files complete with all their custom images! There's honestly not much more I can say about this; you just click the button, select a file, and it all works as expected.
Due to .kspreset files having the ability to contain unmoderated text and images, I am pushing the official Keysight Discord as the best place to share and find files from other users. In fact, we have a #Hall-Of-Fame channel set up in there to showcase and share anything which really makes go you "whoa, Keysight can do that?!" featuring, for example: Shyked's wonderful "Raindrops" preset!
Go grab the preset file from the Discord if you want to use this preset!
Small additions
On top of the main goal of implementing native preset import/export, 1.6.1 also brings with it a number of small feature iterations. 1.6.1 adds:
Two new particle systems! "Streaks" emulates spline-based trails as seen in other styles of visualisation, and "Drifting specks" emulates an ambient particle system look.
A flag for particle systems to be flipped upside down, and snapped to the top of the active area instead. Makes particle system bursts tied to note spawns in top-down mode a lot easier to achieve!
Global brightness modifier for scene lights, making it a lot easier to turn up or down piano lighting as a whole if built up from multiple lights (as is the case in most default presets)
Lighting channel control to all objects which can receive lighting. This allows much finer control over what is illuminated and is particularly useful for stopping keypresses/note objects from having any other colour than their emissive colour
Reflection colour multiplication modes (for the extra spicy advanced users out there). This allows the reflection image to be much more finely controlled in terms of colour, rather than always using the emissive colour of the material
Flat midi velocity mode. This allows rapid removal of all dynamic effect response with velocity, or remapping the response from midi files with a single midi velocity
Improved repeat note-on piano key animation behaviour. Keys now no longer snap upwards to begin animating downwards if a note-on event occurs while the key is mid-animation, which actually does more than you might think for believability!
Index-based sprite frame display for pulses. Err, that is to say: when using horizontal sprite sheets as the pulse stencil, these can now take the note's pitch as their frame to display. If using a 12 frame sprite sheet, this allows for per-pitch stencil switching on pulses, which in turn allows for note names to be attached to notes!
"Note names.kspreset" is included as part of the /Keysight/Extra resources/ folder included in the Keysight install. The Import button goes here by default. Please note that these note names are essentially hard-coded to follow the path of notes in a stock Core > Visual Layout setup at 16:9 resolution, and will require tweaking if you have changed these settings at all.
Bugfixes
With 1.6.0 bringing a huge overhaul to the state machine in Keysight, it's unsurprising (to me, anyway) that a bunch of bugs slipped through. 1.6.1 squashes a ton of these! Here's a summary:
Fixed midi culling being completely absent, whoops!
Fixed pitch bending completely breaking note object position, also whoops!
Fixed custom frame and output directory selection resetting on each Keysight launch
Also made custom frame directory write to a sub-folder, fixing file-deletes in the instance of a user specifying a location shared by other files (this is actually by far the worst bug ever to have existed in Keysight, sorry!)
Fixed keypress reflections not behaving as expected compared to other materials
Fixed soft-pedal-based bloom and exposure modification not occurring during render-to-video operations
Fixed key and damper animations not resetting cleanly when the panic button was pressed (a bug which also occurred at the beginning of any render-to-video operation, fade-in would simply mask it)
Fixed midi playback breaking and going backwards in time if the panic button was pressed during playback
Fixed midi playback not resetting cleanly if loading a midi file while midi playback was occurring
Fixed midi playback looping, if enabled, causing the file to play after a render-to-video operation completes (avoiding system strain if you start a render and then walk away, as most people do!)
Fixed particle alignment with non-standard 3D camera angles
Fixed camera roll applying incorrectly (or, rather: unintuitively) when using non-90 local roll values
Fixed various unwanted behaviour when pasting an object type which had not yet been copied
I mentioned this at the end of the 1.6.0 announcement, but: I want to completely rebuild Keysight. There is a concept in development called "technical debt", and Keysight suffers from it badly. The analogy of a house works pretty well here: the foundations of Keysight were laid three years ago (!) without much of a concept for what the actual structure would look like. The resulting structure is a pile of awkward extensions and supports, with many parts being dependent on some rickety little subsystem which cannot be easily replaced without tearing the entire thing down.
So that's what we do! We tear it down. I have a lot of very ambitious goals for Keysight 2.X, but I'll share the ones that I am reasonably confident I can actually achieve:
Building in Unreal Engine 5. This is less exciting than you might think, but still!
A clean and enjoyable menu
Support for localisation down the line (it's currently impossible in 1.X thanks to how I built early systems)
Better preset display and organisation
A consistent way of allowing presets to use a "global" value for a variable, or their own "local override" across every single option
This will take an unknown amount of time. This time around, I want to properly forward-plan and take the necessary development time to build things right. If that means spending a month making a really nice slider, then I'm going to spend a month making a really nice slider.
I'll be asking for feedback on prospective ideas and rambling about progress over in the Discord if you want to stay up to date with what's going on. But in the mean-time, I hope preset sharing allows users struggling under the weight of poor user experience to get their hands on some really awesome visuals without having to climb the learning curve themselves!
Oh, and: this 2.0 rebuild will be released for free for all Keysight users. I hate to mention this at all, but this kind of continuous development on a fixed-price product doesn't make a ton of economic sense, especially not as a sole-developer... As such, if you believe Keysight is worth more than what you paid for it, I set up a buymeacoffee link to support me further.
Hello! It's done! Presets, and all associated custom images, can now be natively imported and exported from within Keysight. No more messing with file browsers if you want to share something! This feature is now available via the beta branch (currently Windows-only for now). Plea
Hello!
It's done!
Presets, and all associated custom images, can now be natively imported and exported from within Keysight. No more messing with file browsers if you want to share something! This feature is now available via the beta branch (currently Windows-only for now). Please give it a go, and tell me if it breaks!
This version of Keysight is considered to be a "release candidate", which means that I'm not aware of any unfixed bugs or missing functionality that would stop it from being suitable for being deployed in a live production environment. However, since preset import/export involves a lot of fiddly file manipulation, it's going to stay on the beta branch for a little bit while I get the MacOS build sorted along with the big announcement. If you find anything broken or strange, please get in touch via the forums or, preferably, the Discord!
Other notable features in 1.6.1
These are in addition to the recent beta-only 1.6.0a fixes!
Midi channel to preset mapping can now fully ignore channels if desired, and is pre-set-up to assist new users in getting to grips with this feature
All objects that can be illuminated now have full lighting channel control
Improved keypresses to give users with multiple scene lights options to work around the limitation that only one scene light can illuminate a semi-transparent keypress indicator
Fixed camera X-roll values applying incorrectly if local roll was not 90. This may alter manual camera angles which use X-roll and non-standard local-roll at the same time
Fixed particles rotating to face camera in manual camera mode
Fixed soft pedal bloom/exposure modification rendering during render-to-video
Hey folks! It's been a while! Keysight version 1.6.1 is very close to completion, but before working on the last piece of the puzzle I wanted to give public access to some important bugfixes through the beta branch. This is Windows-only for now , but the full 1.6.1 release will b
Hey folks!
It's been a while! Keysight version 1.6.1 is very close to completion, but before working on the last piece of the puzzle I wanted to give public access to some important bugfixes through the beta branch. This is Windows-only for now, but the full 1.6.1 release will be out soon for both Windows and MacOS, with... *drumroll* native preset import/export to allow easy custom preset sharing!
Full changelog for 1.6.0a, since it's quite small:
--- SMALL ADDITIONS ---
Added some useful links to the main menu list
Added text explaining the mysterious text input box under the pitch bend semi-tone displacement slider
Added message to screen after closing setup wizard to inform new users that Escape opens the menu
Added a "flat midi velocity" mode to Core > Simulation. While in this mode, both note-on and note-off velocity can be explicitly specified and all notes will use these velocities instead of their original velocities
Added a global brightness modifier for scene lights, allowing easy raising and lowering of brightness in a scene with lots of lights
Added reflection colour multiplication modes: Emissive/Static/None. This allows a reflection image to be selectively multiplied by either the object's emissive colour (colour settings or texture), a static defined colour or just display as-is. Incredibly niche usage, but removes a limitation if trying to achieve very specific reflection implementation
Added a flag to particle systems to flip all Y axis effects, including location. This allows easy snapping of an existing system to the top of the active area; especially useful when combined with auto-release and time offsets to match when note objects interact with the top of the active area
--- CHANGES ---
Changed setup wizard final page layout to have guide/Discord buttons immediately below the text saying that they exist
Changed main menu close menu section spacing to give slightly more room to the main tabs
Changed and improved alignment image dropdown and selection in manual camera mode. Now has aspect ratio warning and a useful add-image button to bring it in line with other image pickers
--- BUG FIXES ---
Fixed midi culling being completely absent, whoops!
Fixed pitch bending being completely broken, also whoops!
Fixed demo mode not spawning non-note-object effects in top-down mode
Fixed material picker not updating mask display when using the new + button to add a custom texture
Fixed custom frame and output directory selection resetting on each Keysight launch
Fixed keypress advanced materials not correctly displaying reflections
Fixed pre-copy object pasting causing unwanted information errors (like the message that says "if you see this, tell Eggly he's a bum")
Fixed rare edge case where loading with a system settings file pointing to an invalid preset index would cause a broken preset until a preset switch is manually called
New stuff! Hey! It's been a while, but I'm excited to finally release the next major step forward for Keysight! Version 1.6 brings with it some significant architectural improvements and several extremely flexible new visualisation elements. Check out the new trailer! A quick, im
New stuff!
Hey! It's been a while, but I'm excited to finally release the next major step forward for Keysight! Version 1.6 brings with it some significant architectural improvements and several extremely flexible new visualisation elements. Check out the new trailer!
Before we dive into features and changes: many settings have been tuned as part of the move from 1.5 to 1.6. Your existing preset data will auto-convert as usual, but this time around, I strongly advise you to consider removing all your save data using the provided button on the update screen and starting fresh.
Why? This will ensure every tiny option is, by default, on the recommended setting. Much as I can process old data, it's impossible to know if certain options are set a certain way by the user intentionally or because they're inherited from older Keysight versions where those settings were the default. Therefore a lot of niche settings are left untouched by auto-conversion from 1.5 to 1.6, and the only way I can guarantee you that Keysight looks the best it possibly can is by recommending you reset to stock settings. More on this later, but Keysight 1.6 will remain in place for a long time now, so this is the best time to start fresh if you're a long-time user!
If you have presets you care about, but still would like to reset Keysight: you can back up presets and import them again after resetting your data in 1.6. Preset data is found under Appdata/Local/Keysight/Saved/Presets on Windows, and Library/Application Support/Epic/Keysight/Saved/Presets on MacOS. Simply copy out the files you want to keep; perform the reset in 1.6; save and quit; copy those files back into the save location; re-open Keysight!
Feature highlight
Super quick feature headlines before we go into more detail:
Reflections! Materials in the Advanced mode can now "reflect" a given image, allowing for tons of cool new visual effects
Video rendering profiles that allow quickly switching between settings, along with support for any resolution and aspect ratio
Piano and frame 3D model rebuild, with new keypress "coverage" modes to vastly improve the fine details in scene appearance
A new, simpler method for setting up a scene layout: "auto cam" mode
Support for 16 channels of simulation, allowing multi-track visualisation even when those tracks use the same notes
Particle ambient wind and height adjustment
Scene lights for lighting-channel-driven ambient lighting
...and many more smaller additions!
The new default presets!
A whole new visualisation dimension: Reflections
The advanced material mode for surfaces now has an additional feature: Reflections. It's an incorrect name on the technical level, but it looks like reflections, so we're sticking with it! Enabling reflections gives you another layer of self-emissive colour to a surface based on the selected reflection texture, and uses a camera reflection vector to appear as though there is an environment being reflected in the surface. This allows "reflections" to just use any old tiling image (and not an actual 360 degree cubemap), and allows materials to have independent reflection environments to each other.
Reflections inherit the normal map surface deformation, and can be panned/rotated over time. The application here is to have warping wobbly interesting stuff going on over surfaces, in order to give motion to things without using just a simple pan-over-time. Oh and the best bit? Reflections cost essentially zero performance! Folks using the Low graphics preset now have a huge visual quality boost available to play with without murdering the framerate.
Some examples of what reflections can do!
Render-to-video profiles, with support for any resolution
Any Instagram or TikTok creators out there? Render-to-video now supports rendering to any resolution / aspect ratio, and has profiles to allow you to rapidly switch between settings you regularly use! I've included three profiles by default, but you can have as many as you like. A profile consists of:
Resolution (up to 4096x4096 max)
Pixels-per-pixel (essentially whether you want to multiply the internal resolution by 2x or 4x for better quality. Be warned: 16x pixels per pixel above 1080p is strongly advised against unless you have a 4090 or something, as Keysight will likely crash!)
Framerate
Compression (both source and output)
Particle rendering mode (as a reminder: do use "SAFE" if you want the absolute bulletproof best quality final render. The extra time cost is worth it to avoid potential one-frame bugs on particles)
Padding in/out (can inherit a global option, or use local-to-profile settings)
Fading in/out (can inherit a global option, or use local-to-profile settings)
Branding images (can inherit a global option, or use local-to-profile settings)
Scene layout (uses new auto-cam mode. Inherits current settings by default, or can use local options if you want to slow down notes for a vertical video or something like that!)
Additionally, the intermediate frame location and video output location can now be modified. Theoretically this may break if you do something silly like specify a USB stick as the intermediate location, but the option is there if you have a very small primary OS drive and a larger secondary drive you would like to hold data on.
Non-16:9 rendering now supported!
3D model rebuild, now more accurate and easy to use
Story time: when first building Keysight, I took a tape measure to my piano and measured a white key at 2.2cm. Keysight then used that width for a white key even through the 1.3 piano rebuild, to avoid messing with camera coordinates, even though that original 2.2cm measurement did not include the gaps between keys. As a result: up until now, the proportions of the Keysight virtual piano have been inaccurate!
After doing a bunch of research, the piano model has been rebuilt with correct spacing between black keys, and a white key width of 2.358cm. This allows top-down Keysight/IRL blending to be much more accurate! In the process of rebuilding the piano models, the quality has also been significantly improved, and the backend for how they work in the engine has also been optimised.
In addition to accuracy and quality improvements on the "real" elements of the keyboard, the surrounding frame also got reworked to be higher quality and have much cleaner dimensions for layering effects. Dampers are now 0.1cm tall, note objects are 0.5cm each, and the top arch to the dividing bar between keyboard and piano is 0.15cm giving an overall height of 1.25cm if you wish for something to be "above" every element in the scene. The dividing bar width between keyboard and active area is 0.3cm, and all of these important values do not scale with piano key length (giving you a known gap of 0.3cm to fit light bars into).
Keypress indicators and material slots on piano keys also changed (yes, I'm still talking about this, this whole thing is more important than you might think). Keypresses can now "cap" a piano key, "encase" it, or sit inset on the key (with that last mode being the previous only option). Piano keys also have what I call "coverage" modes and the option to use a completely blank, black material on the secondary material slot. By using the (stock) setting of top-only coverage and a black inner material, this fixes the long-standing bug of a tiny line of visible pixels of white key material at the bottom edge of keys and generally makes the gaps between keys much visually cleaner.
Oh, and key/damper animations got rebuilt to be smoother and nicer, although are disabled by default if using a normal top-down 2D view so as not to cause one-pixel aliasing on depressed keys becoming slightly angled with animation.
As a 3D artist originally, I could talk even more about all this stuff, but I'll leave it with: black key geometry is bloody awful to model, and here's a comparison between old and new!
Also showcases one of the new keypress coverage modes!
Auto cam mode and coordinate system rebuild
So the way Keysight has worked up to this point is to just give you the raw camera coordinates, and then awkwardly tries to infer if you're in some kind of "default" view when you slide the field of view around to adjust the coordinates accordingly. No longer! There is now simply a flag for "I want full control" or "I want Keysight to work it out for me". That second mode is what I'm calling Auto Cam, and it allows you to specify a number of things for Keysight to automatically adjust internal coordinates to achieve, namely:
Note travel time
Key length (with 1.00 being the new default)
The amount of "perspective" (basically a field-of-view curve)
Border (global, or on each edge)
The range of keys to display
These settings are completely independent to the manual camera mode, so you can easily switch between a default 2D view and a customised 3D view without losing or altering any data in the process. Ctrl+O now switches to Auto Cam mode, and Ctrl+P switches to Manual Cam. Ctrl+i will reset to the default manual camera angle and switch to manual cam mode.
The manual camera coordinate system also underwent some internal changes, fixing a long-standing edge-case bug relating to camera roll values not applying correctly in fly-cam mode. Oh, speaking of flycam, that got an improvement with scroll-wheel speed adjustment and better on-screen tooltips for controls too.
Any custom 3D camera angles will likely need to be updated by the user as part of this Keysight update. Between coordinate system changes and piano/frame sizing and proportion updates, 3D angles will not look the same but are not something I can automatically adjust for you... apologies!
Not got a full 88-key device, or a midi file that only uses a small range? Auto-cam makes it easy to zoom in on just the bit you want!
State machine rebuild for better performance and multi-track visualisation
By "state machine", what I'm referring to here is the way Keysight understands what notes are being played and when, and how those events spawn and release effects. This is actually the most advanced technical bit of development I've ever undertaken, and the biggest change in Keysight 1.6! But it's mostly invisible to the user, alas.
Essentially, two big things have changed: Keysight is now entirely event-driven and subsequently fixed a ton of one-frame bugs and weird edge cases; and Keysight can now simulate 16 different "state channels". This allows the same note to be played across different state channels without them interfering, whereas previously the second note-on event on a key would trigger note-off first even if these events happened on different midi channels/tracks. Under stock operation, midi channels are mapped to state channels. System > Interface > Midi and rendering has a toggle to interpret midi tracks as state channels instead.
Despite technically being able to simulate 16x more data, in practice there is around a +10% or so performance bump on the CPU side of things thanks to doing less per-frame checking. Oh, and through fixing and improving all this stuff: "black midi" rendering now doesn't break Keysight, if that's your jam...
Notice how the gem notes are not released by the electric notes, finally!
Particle wind and Y-height position offsets
In the first particle system addition since 1.3, particles now have some new tricks! The origin point can be offset (in cm) to allow them to spawn at different heights with velocity, similar to impact lights. Or by combining time offsets and a static height, particle systems can be added at the top of the active area as well as the bottom.
Particles can also now be blown by activity-driven wind. This differs from "note wind" in that the direction is universal across all particles, and the strength is driven by total simulated piano activity. Ambient wind in combination with a bit of vector field influence can give a very pleasing, natural look to particle drift over time. These new options are found under the "Wind" tab (previously called Note Wind") in the advanced Effects > Particles menu (and the tab may require full template editor mode to be enabled before it can be changed).
This effect uses Y-height offsets, release-after-set-time, time offsets and the new ambient wind variables!
New "scene lights" for fine control over ambient lighting
Historically, if you wanted actual lighting in the Keysight scene versus making surfaces self-emissive, you had to use a global "ambient lighting" cubemap which affected all objects equally. This pushed the workflow towards non-physical-looking self-emissive surfaces, or flooding the scene with a lot of lighting. No longer! (Well, ambient lighting is still around and improved if you want it, but there's a better way.)
The widgets menu has its second entry now: Scene Lights. These are directional lights (so, they have an infinite influence radius and shine in a specific direction), and can be set to broadcast over specific lighting channels. Directional and channel based lighting is a huge improvement for highlighting just the piano portion of the scene, or having different brightness on the piano than the backdrop. Careful tuning and multiple scene lights can start to give some really nice subtle highlights to keys! Oh, and scene lights can flicker too, if you want to get a bit spooky.
Scene-based keyboard lighting can now be independent from the backdrop, and allows user-driven light directions to highlight the bits you want!
Other, smaller additions
Quick-fire round, lets go!
A loading screen! Only took more than 2 years...
Midi hotkeys can now toggle between exclusive and non-exclusive activation
Midi file time-based preset switching now applies on midi file playback, not just during rendering
Preset switches occurring in top-down mode from non-user-input triggers now only trigger scene element changes after the given note travel time (can be disabled to revert to old behaviour if desired)
Dampers can now use the same material as the piano frame
Piano frame can use custom materials
Key animation can be instantaneous if desired, or if CPU performance is limited
Basic mode "image" backdrops have more controls
Every custom texture dropdown can now directly import and set a new image with a file browser window
Logs can be saved to files
Pitch bend ceiling can be changed to support 0-127 or 0-16383 pitch bend midi values
Impact lights can now "lock in" at their starting brightness if no fade-out is desired
New light bar template: "Fire"
New default preset: "Classroom" with pitch-based colours
Added ability for sustain pedal to extend note and effect durations as if notes are held while the pedal is down (not recommended, however)
And some note-worthy changes and bugfixes...
Default preset selection is now just 8+1. By unanimous vote in the Discord, a more focused default selection was preferred!
Channel-based preset switching now counts 0-15 rather than 1-16 (if you have switches set up, these may need to be altered)
Bright, saturated colours look slightly nicer
Bloom settings are now per-preset and live under Scene settings
Key animations are now improved
Changed some randomizer weights to ensure reflection-enabled materials show up a little more
Fixed cancelling video-renders from potentially breaking the render-to-video feature until a reboot
Fixed descending chromatic notes from having the same particle system vector field random offsets
Fixed black midi from breaking everything. For better or worse.
Fixed light bar "light" components being incorrectly positioned on non-52-length light bars
Fixed fly-camera failing to correctly save coordinates if any amount of camera roll was applied
What's next?
I have one more major thing I want to squeeze into Keysight 1.6, and that is the ability to natively import and export presets (including any custom image files). This is already in the works thanks to the ever-wonderful HeapUnderflow! I also want to add a couple tiny things to reflections and scene lights, and tidy up some less critical bugs and workflow issues.
But what's after Keysight 1.6.1?
Keysight 2.0
Yep. I want to spend a long time fully rebuilding Keysight from the ground up in a new version of Unreal Engine, with a very different data structure for presets, and a ton of new features. The actual instigating goal that made me decide "ok, it's time to tear it all down and start again" was the desire to rebuild the menu system to be far more user friendly, since this is still the worst aspect of using Keysight. The thing is, Keysight is kind of 80% menu from a codebase perspective, so if the entire menu is getting rebuilt then might as well put in a tiny bit of extra work and redo the whole thing!
Once 1.6.1 is finished, I want to take a couple of months away from Keysight to really think about what the best way forward is, and have a break from non-stop iteration to focus on life and professional work a little more. As a result, I expect "Keysight 2" to be at least a year away! Hence recommending now as the best time to start from the ground up; you'll not need to do this again for a long while if you want to be absolutely sure you're getting the best Keysight experience.
On a personal note: is taking a year to re-develop an entire platform as a free update "worth it"? Absolutely not. I just really like making midi visualisation things, and seeing the incredible content folks are making with Keysight already makes me want to release more tools for those people, regardless of whether or not that time spent is likely to give monetary returns. I like making things, and I like other people making things... so if you're reading this deep down an update announcement: thank you! By using my creations, you inspire me to create further, and creating things is my deepest source of fulfilment.
New stuff! Hey folks! It is with great pleasure that I can announce Keysight 1.6.0 is now available to try on the beta branch (Windows only, for now) . Before giving a brief run-down of the new features and overhauls, a quick word of caution: This update may alter your presets Du
New stuff!
Hey folks! It is with great pleasure that I can announce Keysight 1.6.0 is now available to try on the beta branch (Windows only, for now). Before giving a brief run-down of the new features and overhauls, a quick word of caution:
This update may alter your presets
Due to reworks involving the camera and piano model dimensions, any non-standard 3D angles are going to be slightly "wrong" moving into this version. Additionally, light bar colour calculation is handled differently (and better) but often causes 1.5 preset light bars to appear more saturated.
I recommend backing up your entire save data found in /Appdata/Local/Keysight, just in case something is not to your liking and you want to opt into the 1.5.0 static branch to stop receiving updates.
For anyone especially keen to ensure they have the best 1.6 experience (and this update will likely be staying in place for a long time before a new one, more on that in a future announcement): I recommend backing up any preset files that are important to you and using the update splash screen "reset" button to fully wipe your save data. Starting from the ground up like this (and re-importing any presets you want to keep) will make sure everything is as good as it can be! (There are a ton of tiny edge case things I cannot automatically handle in converting 1.5 data to 1.6. If you've played with a lot of settings, some of these settings may no longer be optimal, hence recommending the wipe.)
This will be an as-fast-as-possible overview of new changes. Once 1.6.0 releases on the public branch, I will have a new announcement with a lot more detail and examples! But anyway, here goes:
Render to video is now profile-based, and can render to any resolution (up to 4096x4096). This allows you to build profiles for, say, TikTok or Instagram and rapidly render out videos to different resolutions. Render options are now much more streamlined too.
Advanced materials now have an additional feature: Reflections! This system is extraordinarily flexible (more flexible than I originally thought it would be!) and allows you to show any image "reflected" in a surface. This is used extensively in the new default presets, and it has the benefit of being almost performance-free so the Low graphics preset got a whole lot prettier as a direct benefit of this system!
Scene composition can now be vastly streamlined with new "automatic" layout mode! This mode allows you to set border widths, note travel time, key range to show etc and then Keysight will automatically adjust all the actual camera coordinates to achieve those settings. Auto-cam profiles can also be assigned to render profiles, to easily allow different travel times or key ranges for different resolutions.
Piano and frame models have been rebuilt to be prettier, and much more accurate. Notably, this increases the white key width from 2.2cm to 2.358cm, hence the warning about camera positions. This rework "fixes" the appearance of the keyboard in terms of the black pixels between keys; felt visibility is now optional; keypresses have different coverage modes; animations have been rebuilt to be smoother... the list goes on.
New widget: Scene Lights! These allow channel-based directional lighting, and are intended to replace ambient lighting with a much more flexible system. Scene lights come in the form of an array, so you can have as many as you like for illuminating different scene components with the desired brightnesses without messing around with self-emissive materials.
Completely rebuilt state machine that allows for clean multi-track visualisation. Up to this point, Keysight has had one set of "simulation" data (things like whether a note is down or up, etc), which meant that if a multi-track midi file was played where two notes happen at the same pitch, the second note will release the first note. No longer is this the case! Keysight has 16 sets of simulation data, which map to midi channels. If using a track-based midi file rather than channel-based, make sure to tick the option in System > Interface to "Use midi track as channel data".
Here's a little taste of the new default "Keysight" preset in 1.6.0!
Happy Keysighting! And do let me know if something breaks or doesn't work right! I'm going away for a week tomorrow at the time of writing this, and I wanted to get this out the door for folks to start using ASAP but it means there's a significant chance for something to be under-baked...
Another small hotfix! Big thanks to kmare for getting in touch about render-to-video failing on their macOS devices. Turns out the version of FFMPEG bundled with Keysight would crash on Big Sur (and likely other OSs pre-Monterey). Also tidied up some other stuff! Full changelog:
Another small hotfix! Big thanks to kmare for getting in touch about render-to-video failing on their macOS devices. Turns out the version of FFMPEG bundled with Keysight would crash on Big Sur (and likely other OSs pre-Monterey). Also tidied up some other stuff! Full changelog:
- Bundled correct version of FFMPEG on macOS to prevent export crashes on older operating systems - Stopped Windows files from being downloaded on macOS. Whoops! - Removed redundant FFMPEG tools on Windows to reduce install size by around 160mb - Cleared render target variables from having any asset assigned by default, potentially fixing low-level-error engine crashes relating to UnorderedAccessViews on unsupported low-end hardware (typically older iGPUs on Windows)