1. Neos VR
  2. News

Neos VR News

2020.10.25.1005 - Hotfix for choppy audio with multiple stream consumers

A quick hotfix to fix choppy playback when there are multiple consumers of audio data from AudioClipPlayer. Also merged in new translations (thanks for being super quick with those!).

Compatible with previous build.

[h2]Tweaks:[/h2]
- Merged Japanese, Chinese and Esperanto locale additions by @Melnus

[h2]Bugfixes:[/h2]
- Fixed incorrect sampling position calculation with multiple reads in AudioClipPlayer, causing choppy playback (e.g. when VolumeMeter is attached) (reported by @Zane, @Enverex and @Shifty | Quality Control Lead)

2020.10.25.915 - Audio pitch control, basic audio editing, audio optimizations

Introducing a new audio system, based on custom AudioX class, replacing the old and ugly system!

Neos now has completely redesigned handling of audio assets and buffers with variety of benefits, giving it full control over audio data. Not only is the new system more performant (e.g. removing lag when you play too many compressed audio effects at once and removing a lot of redundant works), but also supports playing audio at varying speed (including reverse) changing its pitch! This is fully controllable with LogiX as well. This enables variety of applications and sound effects that weren't previously possible.

You can also now do basic audio editing/processing in Neos - normalizing volume, trimming, adding fade in/out and converting between formats, with a lot more to come in the future. Neos can now also not only decode audio, but supports encoding to WAV, OGG Vorbis and FLAC as well, which now powers a new Microphone tooltip, which lets you make audio clips directly in-game!

There is a lot more to come in the future based on this redesigned system as well - procedural audio clips, more editing options, asset variant system and so on. The handling of realtime audio streams (e.g. voice) was also improved, increasing performance, adding support for stereo (currently unexposed) and reducing some audio glitches and stutters (might need some extra fine-tuning as we go).

There's also bunch of other tweaks, additions and bugfixes as usual. I really wanted to rewrite the audio system to enable this for a long while, I hope you'll have lots of fun with it and I can't wait to see what kind of audio shenanigans you'll create!

[h2]New Features:[/h2]
- AudioClipPlayer now supports changing playback speed (resulting in change of pitch) as well as reverse playback (previously requested by @ProbablePrime, @H3BO3, @Kal, @orange and many others (sorry I forgot ;_;))
- DrivePlaybackNode now has "MaximumPositionError" and "Speed" inputs
-- "MaximumPositionError" allows setting a tolerance in seconds, which will prevent the node from changing the current playback position if it's close enough to the new position (this can be used to avoid some skipping, while still ensuring the playback is mostly synced to an input value)
-- Speed allows smoothly modulating the playback speed. For audio sources it's recommended to use MaximumPositionError to avoid skipping. Set MaximumPositionError to Infinity if you don't care about the playback position being synced across users.
- PlayOneShot node now had "Speed" input, which allows setting the speed that the clip will play at
- Added "MicrophoneTip" tooltip, which allows conveniently recording user voice in-game
-- Supports recording into WAV, OGG Vorbis and FLAC (Vorbis quality can be changed through inspector)
-- Has two modes to record - hold trigger to record, or press trigger to start/stop recording (you can drop the tool and it'll keep recording with the latter)
-- You can also record either raw audio coming from microphone or processed (filtered and noisegated)
- AudioInput system and OpusStream now support recording/transmitting stereo audio (voice still uses Mono by default)
- Added audio processing actions to the StaticAudioClip in the inspector (similar to textures and meshes)
-- Normalize Volume
-- Trim (Start/End/Both) Silence - uses configurable amplitude threshold
-- Trim Start/End - uses duration in seconds to trim the audio clip
-- Add Fade In / Fade Out - uses duration in seconds to add volume transition
-- Convert to WAV / OGG Vorbis / FLAC
- Inspector now shows basic loaded audio clip information (sample rate, channels, duration, format)
- Added AudioClipAssetMetadata which provides metadata for an audio clip (SampleRate, Channels, Sample Count, Duration, Codec Info)
- Inspector now lets you adjust the playback speed directly in the inspector window (this works for any playback, but can be used for the new audio as well)

- Added "World Hide From Listing" node that indicates if the world is currently hidden from listing (requested by @Raith)
- Added silence and unsilence commands to the headless
- Added IntToEnum node (requested by @Coffee | Programmer)

[h2]Optimizations:[/h2]
- Redesigned & rewrote the audio clip asset system for a significantly more efficient design, based around new AudioX class to handle audio data
-- The new system uses Span to reinterpret buffers (Mono/Stereo samples), allowing use of vectorization for faster processing and simplified code
-- The system also eliminates many redundant reads and conversions of audio data, often ensuring that data is read/converted in one go by the target reader (it allows resampling reads directly from the buffer)
-- It supports both fully decoding data in-memory or streaming from encoded version (WAV, OGG Vorbis, FLAC...)
-- For streaming decoding, new AudioBufferPool system is used. This uses a shared pool of memory to prevent redundant decoding of audio data and causing performace issues (e.g. when using OGG for sound effects played multiple times)
-- The system supports encoding audio data as well, currently into WAV, OGG Vorbis and FLAC
-- Resampling audio input/output will no longer produce audio chunk boundary artifacts, due to cutting off partial samples
- StaticAudioClip now has "LoadMode" and "SampleRateMode" properties
-- LoadMode determines how are the audio data decoded, regardless of format:
--- Automatic (default) - will fully decode in-memory any clips shorter than 10 seconds, otherwise streamed from file
--- StreamFromFile - decodes the audio data on the fly from the file in the disk
--- StreamFromMemory - loads the file fully into memory and decodes on the fly
--- FullyDecode - completely decodes the audio data into memory (not recommended for long clips, will use lots of RAM, but strongly recommended for short audio clips)
-- SampleRateMode
--- Original - leaves the sample rate as-is
--- Conform - will resample the clip to system sample rate to help avoid having to resample it on the fly (currently only done when FullyDecode is active)
- Redesigned circular audio buffers used for user audio data (filling from microphone/network stream and reading for playback/encoding) based on the new system, reducing complexity and improving speed
- Optimized underlying CSCore library to avoid redundant audio format conversions

[h2]Tweaks:[/h2]
- Improved AudioStream handling of playback to help reduce voice stutters due to latency jitter
- Fixed audio artifacts with AudioStream due the last chunk of samples getting cut off and used when the new chunk arrives
- Contextual tutorial label for opening tool menu is now localizable
- Removed outdated "Double press to dequip" contextual tutorial label for tooltips (reported by @Hayden (PolyLogiX Studio))
- Default value for quaternion and matrix dynamic variables is now identity (based on report by @Earthmark)
-- This should affect every case where the variable or space is missing for all dynamic variable components, including DynamicVariableInput and ReadDynamicVariable nodes
- Renamed StaticAudioClipProvider to StaticAudioClip
- Merged Spanish locale additions by @Ruzert
- Merged Japanese, Esperanto and Chinese locale additions by @Melnus
- Merged Norwegian locale additions by @Revi
- Merged Polish locale additions by @art0007i
- Merged Dutch locale additions by @jeana and @Alex the insufferable avali 🐦
- Merged Finnish locale additions by @Napo
- Added new strings to the Czech locale
- Added initial Swedish translation by @Coffee | Programmer, @Swingly and @Rulle (currently mostly incomplete)
- AudioStreams will no longer cut off very quiet sounds, as this is now handled by the input noise gate

- Upgraded to Unity 2019.4.13f1 (from 2019.4.12f1)

[h2]Bugfixes:[/h2]
- Fixed beginning of an audio clip getting cut of on repeated playbacks, resulting in very short audio clips not being played on repeated playbacks (reported by many people in the past, I don't remember any specific ones though sorry ;_;)
- Fixed playback position resulting in NaN when the clip length is zero
- Fixed wrong audio being played from video players when the video asset isn't loaded due to buffer reuse
- Fixed VisemeAnalyzer producing incorrect analysis on stereo audio sources
- Fixed ToTimeString adding extra 0 between seconds and milliseconds (reported by @CuriousVR)
- Fixed incorrect 8 bps WAV encoding in CSCore library
- Fixed SyncPlayback resetting position to 0 when the speed is set to 0 (discovered by @Dante)

Moderation improvements, Deleted Item/World recovery, full MMC judging footage

Hello everyone!

Welcome to another weekly update! This week we look at some moderation and security improvements we have made, new tool to help recover deleted items and worlds, group management commands and some more highlights from the Metaverse Maker Competition!



[h2]Decorating the Neos HQ for Halloween[/h2]
With Halloween around the corner, we've started decorating our (virtual) Neos HQ with the theme on our last stream! If you've missed it, you can watch the video from our regular Friday stream here:

[previewyoutube][/previewyoutube]

[h2]Moderation and Security Improvements[/h2]
This week we had an unfortunate incident, with user harassing deaf/mute users, posting antisemitic remarks and posting the New Zealand Mosque shooting video in another user's world under the guise of "edgy humor". While we want Neos to be open space, harassment, hate-speech and making light of terrorist attacks is something we strongly stand against and won't allow on our platform.

We're proud of our community, since incidents like this are still very rare at our platform and dealt with quickly when they occur. To help ensure that there will always be someone to help deal with such situations, we have graduated another group of moderators from our internal several-month long program.

Welcome Ryuvi, Sykes, PurpleJuice, Conduit, Cyro, Tatsu Kimiero and June as new Neos moderators! If you have any moderation problem in Neos, you can turn to them. You can identify any moderator by the silver moderator badge:



We have also improved the moderation and security on technical side as well. Neos now has a system to help detect ban evasions, both for global bans of such users and for your own, when you ban an user from your session.

We hope that those tools will need to be used as least as possible long into the future and the primary goal of our moderators is to talk to users and defuse any problematic situations, but continued harassment or breaking of guidelines won't be allowed.

[h2]Deleted Item / World Recovery[/h2]
Given more frequent requests for recovery of accidentally deleted inventory items, we have decided to extend and wrap around some of our internal recovery tools and make them available to use for our Patreon supporters.

If you're a Patreon supporter, you now have access to new function which will recover deleted items and worlds from Audit records for up to 30 days. If you accidentally delete some world or item, this can help you save it! Don't rely on this functionality though, as the recovery might not be 100% right now and it will be tedious on your end to recover a lot of items. It's not a trash bin!

To run the recovery, send the following command to the "Neos" account in your contact list:
/requestDeleteRecovery  
  • indicates how long ago in the history to search. Syntax is flexible, e.g. "1d", "2h", "30m", "1 hour 30 minutes" will all work. Default unit is day.
  • will filter out any items that don't contain given term anywhere in their path or name. Use
  • to recover everything
  • You will be emailed a ZIP file with special files representing items of your inventory in the same folder structure. To actually recover the item/world, you need to import those files into Neos and save them again. DO NOT CLEAR YOUR CACHE!
  • Maximum recovery time period is 30 days, after this the items are deleted permanently
  • This command can only be used by Patreon users directly. If you have an emergency and are not Patreon, contact a team member
  • THIS IS LAST RESORT EMERGENCY OPTION! Full recovery isn't 100% guaranteed, it relies on other asset files still being in the cloud or being in your cache to recover fully. Please take every step necessary to make sure you don't need to use it in the first place.


Long term we plan to have extended functionality for recovery, such as a proper trash bin implementation and easy to use UI, but hopefully this command will help in case of emergencies.

If you're not a Patreon supporter and you need urgent recovery of an item, you can request a team member to run the recovery for you.

[h2]Managing your own groups[/h2]
In similar vein, we have made changes so Neos group admins now can manage members on their own, without having to go through a Neos team member. If you're an admin of a group in Neos (typically when you requested one to be created), you can now use following commands:


/getGroupInfo
/addMember
/removeMember
  • /getGroupInfo will also list all current members of your group, along with their individual storage space usage
  • If you want member's group quota to be only limited by the group quota itself, use -1 as an argument.


[h2]Complete MMC Frooxius judging footage + more highlights[/h2]
Last week we announced the MMC winners and honorary mentions. However because there were so many great entries, we wanted to give everyone a shout-out and spotlight for participating.

If you'd like to see me (Frooxius) going through each entry for the first time and giving first (but hopefully thorough!) impressions, I have uploaded the complete footage below. Since the overall footage is about 16 hours long (this includes going through all 81 entries) it was split into two parts and timestamps were added so you can easily find your entry (big thanks to Shorty0w0 who has found all the timestamps!).

You might need to open the videos directly on YouTube for the timestamps/chapters to work correctly.

[previewyoutube][/previewyoutube]
[previewyoutube][/previewyoutube]

I've also wanted to give a bunch more entries a quick personal shout-out, since there were so few places available for winners and honorary mentions:

  • Anywhere Door - this world was a really cool twist on the portal mechanic and really fun to play with. I think by constraining the portals to pre-made doors in the world could be used for some interesting themed puzzles
  • Battle Corgis - a very fun entry to play by GearBell! The riding mechanic, customization and interactions feel very fluid and fun to play, it was one of my favorites.
  • Blaster Minigame - I really liked the self-contained nature of this game system. Just spawn it anywhere and play!
  • Infinity Machine - A very unique entry. I love optical feedback and the effects you can do with them, but I've never seen one in stereo!
  • Messenger-pigeon cross world chat - Not only you can chat with other people anywhere, but it actually has a live stream of your messages being printed in realtime in author's room!
  • MMC Rap - Another very unique entry. Actual rap song about Neos, LogiX, MMC and the Creator Jam with a good production quality! I definitely haven't expected to see (well hear!) entry like this.
  • Reference Clip board - this was a really cool utility that makes it easier to reuse common references and values in Neos. I always love seeing more builder tools being made in Neos itself, as it's a way for creators to empower other creators
  • The CUBE - despite its simplicity and being a joke entry, it had a pretty cool atmosphere to it
  • WeatherSocket GUI - a pretty cool use of websockets to connect the virtual world to the real one, even if partly broken at the time of judging. I really love the concept of connecting the world with the virtual one.
  • Websocket Lights - another cool use of websockets, controlling the smart lightbulb color from VR!
  • Club Intensity - a pretty cozy and cool looking club, with nice lighting effects and some controls
  • DeepUmi - this entry had interesting dynamics on a fish-looking model, which would stretch and squish as you moved it around
  • Domes - a very interesting aesthetic that reminded me of the ~80's 3D graphics. It even had some s simple building elements to play around with
  • Floof Gang OwO! - a very sleek modern house with a nice lookout for watching videos together, with parts built with Neos primitives. I love this kind of modern aesthetic
  • Golem's Gauntlet - while unfortunately very buggy, this entry showed a lot of potential and work put into it. Once finished, I think this will be a very fun asymmetric game to play, where several players have to fight a giant golem. I particularly liked a powerup that gives you strength to throw trees and containers at the golem and how different powerups actually physically modify your avatar.
  • It's a Scale World - this was very clever use of the scaling portal mechanic. I loved how the view outside of the room is the bigger version of the room itself
  • Laser Beam - more games in Neos! I loved the arena style and how this game keeps you playing even if you die. With a lot of the games once you die you're out, but with this one it just respawns you and counts the score, so everyone can keep playing until the end
  • Leaf: Glider World - a really big world with a cool calming gliding mechanic. The only thing I wished is that it would use joysticks on Index to control, as the touchpad is a bit finicky, but I like how once you activate the glider, it snaps your hands to it and you don't have to worry about holding them up
  • NeatSaber - what was really impressive on this entry is that it parses actual .dat files from the BeatSaber modding community and lets you bring lots of existing songs and even has instructions to make your own. I feel that it only needed some polish for the gameplay to give better feedback on when you hit the boxes
  • Night and Day - Yet another unique entry! The author has rendered a day & night cycle into series of lightmaps and made them into a video. Lightmaps aren't commonly used in Neos yet, so seeing one that's animated was really cool technical achievement!
  • rkgk Museum - Another unique entry! Museum of cool art created by rukigaki. I love how the author is looking forward to the Neos Store to sell their art before we have even finished implementing it, makes us really excited to see artists looking forward to it.
  • Sparring Program - A Matrix inspired world! This is one of the most visually impressive entries, with nice volumetric lighting. I love how it expanded a bit on the scene from the movie, making it more open.
  • Starry Lookout - A really beautiful chill world inspired by the Vincent van Goth's famous painting. It had lots of nice details and ways to expand the painting itself.
  • The Ranch Dimension - RANCH! We'd definitely need a meme category in the future MMC's
  • The Shattering - Another cool narrative entry. I really liked the visual style of it and how it forced some exploration
  • Viking climb outpost - Another climbing map. I really liked how this one was nature based, giving it interesting visual variety. It even had a really challenging section, with an easy option and hidden TV room


Anyway that's all for this week! As usual, there have been a bunch of other smaller additions, tweaks and bugfixes, you can check out the #neos-updates channel on our Discord to see more details. We hope that everyone had a lot of fun with MMC and great week and we can't waiting to bring you more the next one!

And not to forget, big thank you for supporting Neos and making it into the fun and creative place it is!

2020.10.17.533 - Security & moderation tool improvements, tweaks and fixes

Sorry for another small build, the underlying work on some new internal systems doesn't have anything workable yet. Pushing this one though because it contains important security improvements to help prevent users evading bans, given recent situation. Also a few small additions and bugfixes on the side.

I've also made a small, but hopefully impactful change. The Contact list will now show more accurate world description if you can't see the actual world. E.g. if user is in Contact only world, but you don't have the host as contact, it'll show "In Contact Only World" instead of "In Private World". Hopefully this'll give some more social nuance when deciding whether to ask someone if you can join them or not!

[h2]New Features:[/h2]
- Admins of groups can now use /getGroupInfo command to get list of current members and other metadata (based on request by @Robyn (QueenHidi))
- Added ReferenceMultiDriver component (requested by @3x1t_5tyl3)
- Added DataPresetReference component (requested by @Toxic_Cookie)
- Added some extra MMC badges by @Medra

[h2]Tweaks:[/h2]
- Moderation tool & security improvements to help prevent ban evasion (requested by @Veer | Chief Moderation Officer)

- Friends dialog now show different status when actual world cannot be displayed to better differentiate why is the information hidden:
-- "In Private World" when user is in world that's actually Private
-- "In Contact Only World" when user is in contact only world, but you don't have the host as contact
-- "In Hidden World" - in world that's set to Anyone/Registered, but not listed in sessions
-- "In LAN World" - when user is in world that's accessible on their LAN only

- Merged Japanese locale updates from @orange

[h2]Bugfixes:[/h2]
- Fixed DestroyBlock and DuplicateBlock Enabled field not being respected (reported by @3x1t_5tyl3)
- Fixed PBS Color Mask Specular ignoring the specular map (reported by @A Monsoon of Babies)

2020.10.14.462 - Dynamic Variable additions, initial Pico Neo 2 support and more

I'm sorry for another small build, I'm mostly designing some larger optimizations and reworks now and still processing some MMC stuff (uploading full judging video soon). Here are a few additions to dynamic variable systems, initial support for Pico Neo 2 headset (might be broken), fixing some outdated contextual tutorials that confuse new users and some other bugfixes and tweaks, so they don't have to wait on bigger things.

[h2]New Features:[/h2]
- Added initial support for Pico Neo 2 headset/controllers through SteamVR (requested by @Kagifa)
-- Currently untested (I don't own the headset), please let me know how it works, I've made the binding files manually based on the controller profile I extracted from the drivers
- Added ReferenceEqualityDriver (requested by @Alex from Alaska)
- Added DynamicVariableStatus which indicates if a space is linked and if given variable exists (based on request by @Alex from Alaska)
- Added DefaultValue and DefaultTarget to Dynamic(Value/Reference)VariableDriver, which allows overriding which value/target will be assigned when the variable is unlinked (based on request by @Alex from Alaska)

[h2]Tweaks:[/h2]
- Silence option toggles are now logged to help determine which user has silenced who
- ClearDynamicVariablesOfType node now displays the type on the label to make it easy to distinguish (reported by @かず#0617)
- Changed contextual tutorials for grabbed items, so they no longer refer to the legacy "Double Grip" and confusing new users (requested by @Nexulan | Community Manager)
- Contextual tutorials are now localizable
- Merged Japanese, Esperanto and Chinese locale additions from @Melnus
- Merged Polish locale additions from @art0007i
- Merged Spanish locale additions from @Skywind Kitsune
- Merged Spanish locale additions and fixes from Ruzert (don't know Discord handle, sorry!)
- Merged German locale additions/changes from @Tillikum#4761 and @Blaze

[h2]Bugfixes:[/h2]
- Fixed "Save as screenshot" not working in some cases due to the screenshot file now being transferred yet (reported by @H3BO3 and @Lucaedr)
- Fixed "Silence" permission validation issues, causing it to reset in some cases, as well as background validation errors for Kick and Ban
- Fixed Write nodes not triggering "OnFail" impulse when trying to write to a driven field (reported by @3x1t_5tyl3)
- Fixed race condition when fetching user streams, causing incorrect stream to be fetched and the decoding to become corrupted
- Fixed DynamicValueVariableDriver not validating the generic type argument and causing crash if a wrong one is used
- Fixed Dynamic(Value/Reference)VariableDriver not updating the driven variable in some cases (e.g. when switching from existing variable to a non-existing one)