Keysight 1.6 release!

Keysight

Keysight is a real-time MIDI visualization platform powered by Unreal Engine, built for piano-focused streamers and content creators, and featuring unmatched customization!

[h1]New stuff![/h1] 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! [previewyoutube=YAc5l8yKNCo;full][/previewyoutube][h1]A quick, important announcement[/h1] 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, [b]I strongly advise you to consider removing all your save data using the provided button on the update screen and starting fresh.[/b] 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 [b]this is the best time to start fresh if you're a long-time user![/b] 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! [h1]Feature highlight[/h1] Super quick feature headlines before we go into more detail: [list] [*] 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! [/list][img]{STEAM_CLAN_IMAGE}/38079779/b52f646b09193a638c647aa90fcd8240c0d1cfe1.gif[/img] [i]The new default presets![/i] [h2]A whole new visualisation dimension: Reflections[/h2] The advanced material mode for surfaces now has an additional feature: Reflections. It's an incorrect name on the technical level, but it [i]looks[/i] 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. [img]{STEAM_CLAN_IMAGE}/38079779/ecebbbccc49c4de2c600e15a99d1134657755267.gif[/img] [i]Some examples of what reflections can do![/i] [h2]Render-to-video profiles, with support for any resolution[/h2] 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: [list] [*] 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!) [/list]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. [img]{STEAM_CLAN_IMAGE}/38079779/531392af0d49d9d5f5fcb86ceb2e1b9fae1a7a47.png[/img] [i]Non-16:9 rendering now supported![/i] [h2]3D model rebuild, now more accurate and easy to use[/h2] 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, [i]and[/i] 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! [img]{STEAM_CLAN_IMAGE}/38079779/cd79dfb03438c56b47045ee38f304806b1cdd512.gif[/img] [i]Also showcases one of the new keypress coverage modes![/i] [h2]Auto cam mode and coordinate system rebuild[/h2] 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: [list] [*] 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 [/list]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. [b]Any custom 3D camera angles will likely need to be updated by the user as part of this Keysight update.[/b] 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! [img]{STEAM_CLAN_IMAGE}/38079779/6b121ba9ced73a1c57ccfd2d4d67b8cb361be860.gif[/img] [i]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![/i] [h2]State machine rebuild for better performance and multi-track visualisation[/h2] 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 [i]ton[/i] 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 [i]channels[/i] are mapped to state channels. System > Interface > Midi and rendering has a toggle to interpret midi [i]tracks[/i] 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... [img]{STEAM_CLAN_IMAGE}/38079779/6c3c116274e75701d6ca5a3af6832fd6341fdada.gif[/img] [i]Notice how the gem notes are not released by the electric notes, finally![/i] [h2]Particle wind and Y-height position offsets[/h2] 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). [img]{STEAM_CLAN_IMAGE}/38079779/3c98427d832684170d0afb9cd2ac7f62103c4b4e.gif[/img] [i]This effect uses Y-height offsets, release-after-set-time, time offsets and the new ambient wind variables![/i] [h2]New "scene lights" for fine control over ambient lighting[/h2] Historically, if you wanted actual [i]lighting[/i] 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. [img]{STEAM_CLAN_IMAGE}/38079779/3a1d268b8e91bd015f4493151a31587d74bf451a.png[/img] [i]Scene-based keyboard lighting can now be independent from the backdrop, and allows user-driven light directions to highlight the bits you want![/i] [h1]Other, smaller additions[/h1] Quick-fire round, lets go! [list] [*] 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)[/list] And some note-worthy changes and bugfixes... [list] [*] Default preset selection is now just 8+1. By unanimous vote in [url=https://discord.gg/EHuJKU9393]the Discord[/url], 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[/list] [h1]What's next?[/h1] 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? [b]Keysight 2.0[/b] 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 [b]at least a year away![/b] 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. Happy Keysighting <3 [url=https://egglyberts.live/keysight/changelogs/1-6-0.txt]Full changelog[/url]