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.