Wavy Waves
Published @ 03-05-2026
— “The river as modulation source”
This project was done in collaboration with Simon and Michiel. It was part of a bigger soundscape setup. We made it for kaalstaart, which is a really cool traveling art festival. More specifically “beta-kunst” (art which incorporates science-related subjects).
Concept
We wanted to measure the water level, so we could use that signal as a modulation source in a soundscape.
So we made a device for that: A water level sensor.
One which works by measuring the air pressure in an enclosed tube. So I suppose you could call it an ”indirect” water level sensor. Our theory was that the amount of water between the opening in the tube (the bottom) and the surface of the water. Would be (in some factor) proportional to the air-pressure inside the tube, Which we could then sample and turn into a very low frequency audio signal.
If you want to check out the project: github - Wavy Waves
Initial ideas
Before settling on the final setup, we had some other ideas. For the first one for example, we wanted to use a float (like in a carburetor) with an arm attached to it. We would then measure the movement of the arm, which as a bonus would give us some mechanical amplification. The downside of course is that this arm has some weight to it, so we thought of using springs to “balance” it. It quickly became too complicated… So we never actually built it.
Final idea
Then Simon had the idea which would become our current setup. An enclosed tube, with only one side capped off. The air compresses due to the force the water exerts on it from below, pretty clever. 🤓
Hardware overview
This was really fun to work on. It was my first time working directly with FreeRTOS and ESP-NOW. Which is actually a pretty cool simple way of doing wireless data without having to use any external hardware. (looking at you LoRa)👀.
The setup constisted of 2 kinds of devices: the Mothership and the Sensor.
We had a total of 2 sensors fastened to a wooden board with a long stick and hard drive magnets attached to the back. That way we can lower it to almost water level and stick it to the hull of the ship.

Both of the devices are being powered by a +12V cable with waterproof connectors. The sensor sends its collected samples to the Mothership using ESP-NOW, Which then outputs the values in stereo over a DAC module that you can plug into your favourite synth.
Sensor
This is a pretty small perfboard. It contains an ESP32, BMP280, and Buck-converter module.
It hangs close to the cap which seals the tube.
This guy reads out the BMP280 at 80Hz fill up its Queue - which is being used as a ringbuffer.
The 80Hz cycle is done using hardware timer, firing an ISR.
Then sends it to the mothership over ESP-NOW.

Mothership
The Mothership is responsible for turning the received samples into analog signals. An interrupt fires whenever the radio has received a new ESP-NOW packet. This gets parsed and put into another queue. There is a 160Hz playback loop (because we are receiving from 2 sensors) which reads the sample from the queue and pushes it into the DAC.
This was my first time using any RTOS, and FreeRTOS was pretty simple to work with. Of course this project just scratches the surface and there are definitely timing related issues. But for the most part I’m pretty happy with how this part turned out.
The festival
Kaalstaart
The festival is held on 3 separate small cargo ships (binnenvaartschepen) that are docked together. This was perfect for us, because of the really good water access.
Simon and Michiel set up a soundscape in the ship’s workshop - yes indeed this ship has a workshop. They set up a reel to reel tape loop using 3 separate tape machines: An old dictaphone, its tape containing a French language course, A bunch of old test equipment, and lots of other doo-hickeys.
In addition to all that, we wanted to add an external modulation source: ✨ Waves (the wet kind) ✨

Here is a video of the setup with some audio.
Reality hits
On the first few days of the fesitval, the ships were docked in the Amstersfoort Insteekhaven. We didn’t get much signal from the “waves” or lack thereof. This was probably due to the relatively small body of water in which we were docked. Or so we thought..
A week later, we were in Wageningen, which looked slightly bigger but was even further from the river. Still very little signal…
But then the final week in Wijk Bij Duurstede, we were in what you would call a prime spot. Docked on the side of the river (very beautiful spot btw) same faken signal, pretty much zilch.
So in the end, we couldn’t use our sensor properly, but it was really fun to work on.
We’re thinking that the water is not exerting enough force on the air inside the tube, which somehow does not make that much sense to me. Of course there will not be any large forces acting on the air inside the tube.
But the BMP280 can measure down to 0.00003bar (even lower with oversampling), so you’d expect there to be at least a small amount of signal.
But nothing, even with relatively large waves we got about +-4, with our full range being something around ~200 (maybe even higher. I honestly don’t remember).
Future V2
I’m thinking of doing a float inside a tube that has a cap at the top, but also a small hole allowing for regular airflow. We can then use a ToF distance sensor to measure the distance between the float and the top tube. With this approach we won’t have to worry about weird physics.