Dear SurSounders,

This isn't a launch for the masses; it's an invitation to the few who still remember that Ambisonics was never meant to be just another format, but a philosophy. You are the ones who bridge the gap between 'miserable' technical circumstances and art, as we humans enjoy it.

Today I decided to stop worrying that my vision remains a ghost in the machine.

Over the past two years I implemented a proof of concept for an Ambisonics-only platform with lossless FLAC streaming and native headtracked binaural decoding up to third order - working in major browsers on recent machines.

It is meant to become a hub for attentive listeners of spatial audio.

-

Life is short, art endures. Will Ambisonics? If someone does the job and starts collecting. This list has the brightest minds and warmest hearts around the subject. I am positive.

What can I give to the equation?

I can provide defaults in UX and UI design, start with a tech stack and ... come up with wording? Have a look at the given [Ontology](https://ambisonics.market/lexis) (or read further down below) to get a better understanding of what I have in mind.

I was searching for a reference decoder. A good candidate: the IEM BinauralDecoder. Widely known, respected, excellent quality, available on every platform: a published algorithm.

I had the honor to work with Dr. Markus Zaunschirm and Christian Schörkhuber from Graz who implemented the very MagLS algorithm [1] as WebAssembly for me. It has the same set of filters that drive the IEM Plugin Suite (KU100).

Gladly I was provided with a valuation script, that shows -134.91 dB SNR as maximum delta between the WebAssembly compile and the original IEM plugin output, when fed with Dirac impulses and noise as test signals.

Wow. We have an exact replica running in every browser.

-

My work was to design a player and an interface for headtrackers (Waves Nx support via Web Bluetooth API out of the box, Supperware via WebSockets + the Python script following this message, AirPods Pro/Max via Headitude + the same script. This needs to be streamlined into a single app. A fork of Headitude with WebSockets support would be necessary...)

As metering in professional audio especially spatial audio is crucial, I dove into web fundamentals and wrote a live sound field visualiser widget with the goal to match the quality of the IEM EnergyVisualizer. I learned WebGPU shaders. GPU acceleration on all platforms. The idea was to take advantage of the vast amount of dynamic range human eyes and ears can perceive. All visualisers have HDR and SDR display support.

The backend is Django + HTMX, to name a few more elderly buzzwords of the tech stack. I designed the frontend in plain HTML5 + CSS + Vanilla JS for maximum performance. No framework magic here, just one dependency: @wasm-audio-decoders/flac with HTTP range-requests. This provides us with pristine audio.

One might ask: Where is the protection? The engine is only HTTPS-encrypted. Once the data reaches the browser, it resides in the main memory. The FLAC files can be downloaded and assembled manually. An explicit wrapper with e.g. Web Crypto API and AES-CTR is missing. Perhaps this is the deathblow for anyone seeking absolute security. But in my eyes, this bug is a feature of spatial and multi speaker audio. If I can hear it, I can record it. Art escapes every cage, thrives for openness, not restriction.

The SPA-like experience was achieved with reactive signals, finite state machines, and singletons. Documentation is important, so JSDoc is everywhere to get IDE Intellisense and type safety for a good developer experience. (Switch to Typescript possible, as the team grows.)

"Where's the catch? This sounds too good to be true. The site is online, you have demos - get yourself funding!"

My answer: "Time to market is a thing, but it is not the only thing to worry about. What about rights? Intellectual property? Fully automated payout? You are aware what that implicates?"

As always, the devil is hidden in the details. Thinking led me to a long but simple question.

Do we want to repeat the same mistakes the industry keeps preaching us as the solution for the dichotomy between capital and art more than a century by now? I don't have good answers, yet. Do you?

All I can say is, that the platform is ready for pseudonymous multi identity management (people die, heirs come and do business, that is for sure).

My Ontology is made public in a time where smart contracts and blockchain are still there - but do we really need this? Are musicians, who explore Ambisonics for the first time in their life, really the typical NFT guys paying a lot of money for a link? I don't know. I see a new (stereo)type of people, with the keys for tomorrow, barely knowing what they hold in their hands. They won't go backwards in time, the way Michael Gerzon used to do it so well with his invention of Ambisonics.

"Questions." As Roy put it well when talking to the creator of his eyes... But thats another story, and this message is way too long already.

-

Still there? Take your preferred browser (Google Chrome on a desktop works best) and have look: https://ambisonics.market

You'll find everything I've claimed - just without the market.

That's the part where I am miserable. Give me an instrument and I make art. Give me a computer and I make sometimes beautiful, sometimes useful things. But please don't ask me money questions. I just can't pull it off.

I prepared everything, Listener, for at least three dimensions of your imagination. Cover photography in HDR, backstories and Hammer-Aitov projected virtual microphones, colored by a 10-bit HDR version of the Viridis-Magma colormap. (Thank you Stéfan for helping me out!)

Touchdown. You even can setup Passkeys/Hardware keys, create one or more artists "Personas", and that's it. No one can find you. What a pity.

Something else also needs your imagination: Upload. Sell. Earn. Search. Connect. As somebody put it once for my premature ears: "What you’re up to is called an uphill battle." Now I know.

Thanks for countless hours all of you who stood by my side, Listeners.

Curious? We need more than money.

All the best,
Gabriel

Ps: The icon right next to the light/dark mode is a switch between (pre)buffer mode and streaming mode. Streaming has instant playback. With prebuffering all data of a Werck gets loaded upfront. Then you get a) instant seek, b) offline safety and c) playback with a closed tab. PPs: There's an easter egg. Hold [alt] and press the eject icon to load and play Ambisonics wave files up to 16 channels from your local harddrive, with all the goodies... Don't like the decoder? Do you have a speaker setup? Want a simple passtrough? Just select bypass from the options menu, right below the dummy head. The [0-9] number keys work as seek shortcuts, [m] is for mute [n] for next, [p] for previous Werck. PPPs: What is indeed too much for this first post, is sharing the asset generation scripts for audio assets and my sketches for the Werck DB layout. If you are interested, please don't hesitate to contact me.

[1] Schoerkhuber, Christian; Zaunschirm, Markus; Hoeldrich, Robert.
“Binaural Rendering of Ambisonic Signals via Magnitude Least Squares”,
Fortschritte der Akustik, DAGA, 2018



--- The Ontology

I. Principles

Listener, n.
    The fundamental participant in the system: a human who engages through attentive listening.
Werck, n.
    A digital manifestation of a Listener’s Ambisonic intent.
    A Werck is a multichannel Ambisonics (AmbiX) audio file up to 7th order, published under a Persona.     A Werck may be unpublished, anonymous, collaborative, and/or commercially licensed.
    A Werck may be vested in a Legal Entity.
    A Werck may be witnessed by pseudonymous, cryptographically signed Placements of Listeners within the system.
Location, n.
    A multidimensional classification describing the aesthetic position of a Werck within the listening space.


II. Entities

Cryptographic Entity, n.
    A digital actor in the system holding one or more Credentials to authenticate during the Authentication Ceremony.
    A Cryptographic Entity can manage one or more Personae.
    A Cryptographic Entity is not tied to the real-world identity of the person controlling it.
Persona, n.
    A public-facing identity that serves as the primary vessel for the publication of Wercks.
    A Persona is managed by one or more Cryptographic Entities.
    A Persona is anchored by a Legal Entity, as permanent publication and licensing takes place. A Persona may represent an individual artist, a collective identity, or a pseudonym.
Legal Entity, n.
    A human or an organization that contracts with, and holds rights within the system.     A Legal Entity must be linked to a Persona if accountability is required.
Persona–LegalEntity Link, n.
    A contract binding a Persona to a Legal Entity.
    A Persona-Legal Link acts as a legal record establishing who held authority over time.
CryptographicEntity-Persona Link, n.
    A binding agreement between a Cryptographic Entity and a Persona.
    A CryptographicEntity-Persona Link acts as the governance record for keys holding administrative authority (Owner, Manager, or Heir) over the Persona's digital identity.


III. Operations

Authenticator, n.
    A hardware device or software that securely stores cryptographic keys and performs WebAuthn authentication.     A hardware Authenticator may be for example a Yubikey, a Nitrokey or Face ID.     A software Authenticator may be for example Apple Password, Windows Hello or KeePassXC.
Authentication Ceremony, n.
    A process by which a Cryptographic Entity proves control of a Credential.     An Authentication Ceremony involves a challenge issued by the server and a signed response produced by the Authenticator.
Credential, n.
    A cryptographic key pair (public/private) used during the Authentication Ceremony providing a Cryptographic Entity access to the system.     A Credential consists of a public key registered with the platform and a private key held securely by the Authenticator device.
License, n.
    A contractual permission granting exploitation rights to use a Werck.
    A License may specify duration, scope, and permitted forms of use.
Placement, n.
    An act of will, where a Listener is sharing their aesthetic perception of a Werck.     A Placement emerges as a pseudonymous, cryptographically signed dot in the tesseract.
Swarm, n.
    A collective manifestation of all Placements associated with a Werck.
Werck Credit, n.
    An attribution of a contributor to a Werck.


--- The Python Script for Headtracking with Supperware Headtracker and AirPods Pro/Max

#!/usr/bin/env python3

## How to set up Headtracking on ambisonics.market?
#
# - Supperware Headtracker? Set your Bridgehead app to 50 Hz and the Quaternion (composite) preset.
# or
# - AirPods Pro/Max?
#   Download and install the (Headitude.app)[https://github.com/DanielRudrich/Headitude/releases/tag/v1.0]
#   Set OSC Settings
#     - Host / IP: localhost
#     - Port: 8000
#     - Message: /quaternion qw -qy qx qz
#
# 1. Open Terminal.app
# 2. Install Homebrew package manager: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# 3. Install uv Python package manager with Homebrew: brew install uv
# 4. Copy the script to a file e.g. os-ws-bridge.py, then start it with: uv run --with python-osc==1.8.3 --with websockets==12.0 osc-ws-bridge.py # 5. Open ambisonics.market in your preferred browser and select Websockets from the Orientation menu
# 6. Enjoy :)


import asyncio

import websockets
from pythonosc.dispatcher import Dispatcher
from pythonosc.osc_server import AsyncIOOSCUDPServer

OSC_IP = "127.0.0.1"
OSC_PORT = 8000
OSC_ADDRESS = "/*"

WEBSOCKET_SERVER_ADDRESS = "127.0.0.1"
WEBSOCKET_SERVER_PORT = 8080

osc_messages = []


def osc_handler(address, *args):
    print(f"Received OSC message {address}: {args}")
    osc_messages.append((address, args))


async def websocket_handler(websocket):
    try:
        while True:
            while osc_messages:
                address, arguments = osc_messages.pop(0)
                message = f"{address}: {arguments}"
                await websocket.send(message)

            await asyncio.sleep(0.02)

    except websockets.exceptions.ConnectionClosed:
        print("WebSocket connection closed")


async def main():
    dispatcher = Dispatcher()
    dispatcher.map(OSC_ADDRESS, osc_handler)
    dispatcher.set_default_handler(osc_handler)

    osc_server = AsyncIOOSCUDPServer(
        (OSC_IP, OSC_PORT), dispatcher, asyncio.get_event_loop()
    )
    await osc_server.create_serve_endpoint()

    await websockets.serve(
        websocket_handler, WEBSOCKET_SERVER_ADDRESS, WEBSOCKET_SERVER_PORT
    )

    print(
        f"WebSocket server running at ws://{WEBSOCKET_SERVER_ADDRESS}:{WEBSOCKET_SERVER_PORT}"
    )
    print(f"OSC server listening at {OSC_IP}:{OSC_PORT}")

    await asyncio.Future()


if __name__ == "__main__":
    asyncio.run(main())

--

+49 30 36726963 // +49 176 70539441
Siemensstraße 12B, 10551 Berlin

--

Am 27.08.26 um 23:57 schrieb Michael Graves:
Is this list alive? This is a second test message.

Michael Graves
[email protected]<mailto:[email protected]>
c: (713) 201-1262

-------------- next part --------------
An HTML attachment was scrubbed...
URL: 
<https://mail.music.vt.edu/mailman/private/sursound/attachments/20260827/57d0d5e7/attachment.htm>
_______________________________________________
Sursound mailing list
[email protected]
https://mail.music.vt.edu/mailman/listinfo/sursound - unsubscribe here, edit 
account or options, view archives and so on.
_______________________________________________
Sursound mailing list
[email protected]
https://mail.music.vt.edu/mailman/listinfo/sursound - unsubscribe here, edit 
account or options, view archives and so on.

Reply via email to