Wavy Waves
Published @ 03-05-2026
— “The canal as modulation source”
This project was done in collaboration with Simon, Michiel and myself. 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 in to a very low frequency audio signal.
If you want to check out the project: github - Wavy Waves
Initial ideas
Before setteling 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 to 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 kind of devices, the Mothership and the Sensor.
We have a total of 2 sensors fastened to a wooden board with a long stick and harddrive 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 essentially 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 are receiving from 2 sensors) which reads the sample from the queue and pushes 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 were 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 seperate small cargo ships (binnenvaartschepen) they docked together. This was a perfect for us, because of the really good water access.
Simon and Michiel had setup a soundscape in the ship’s workshop - yes indeed this ship has a workshop. They had setup a reel to reel tape loop using 3 seperate 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 there of. 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 exterting 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 think that there would be even 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 with does have 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.