For my graduation internship, I worked at Sorama B.V., who specializes in audio visualization hardware. For their then newest product, the CAM iV64, the wanted a demo to let potential buyers get to know the product within VR. The demo had been worked on by prior interns, but did not reach the point where it demonstrated the product’s capabilities well enough.

Differences

The project at the end of the internship

The project at the start of the internship

The task

My task was to make the demo as good as possible, adding the missing functionalities, improving the visuals and performance. As most of the people at Sorama had little-to-no experience with Unity, I had to ensure that the project was as easily expandable as possible and that the documentation was clear on how everything works and could be used.

The works

A basic summary: I had developed the missing functionalities:
  • Sampling audio
  • Visual frequency graph
  • Selecting a frequency range
  • Visualizing audio through Blobs on the screen

As I started the internship with little-to-no knowledge regarding audio from a programming perspective, I began with sampling the audio outside of Unity, this way I could figure out how to sample audio and bring it to a visual without having to directly apply this to a Unity component.

External sampling program, using ScottPlot

Once the functionality was there, I ported it over to Unity, using “baked” audio sample files to handle multiple audio files at once without a major hit to performance. I had tried several options to render the graph, but in the end used the Linerenderer as it was the best from what I had tried and had available.

Selecting the frequency range was done using sliders, and made use of the Span struct to get the content from the array directly.

The blobs were visualized through a heat map shader that got the screen points with their strengths passed through as an array of data. As the screen only needed a framerate of 24fps to match it’s real world counterpart, the system could use that lower framerate to send the data to the GPU without having to worry about it being noticeably delayed, as the game would run at 90fps.

The Result

At the end of the internship, I held a presentation at the company showing the result of my work. The employees were very happy with the results and found it incredible that everything performed smoothly in VR with.

Difference in framerate between the project at the start and end of the internship.

The final result

“I’ve never seen such in-depth documentation, you can really see the passion that he put it into it.”
- Job, my internship guide


Note: Currently, the repository is private per Sorama's request, this link will redirect you to the Git page if it is no longer private