Lucy
Live Demo
Data to Music
In this piece, I wanted to explore the idea of generating music and visualization in sync from a data source.
So I took the daily average temperature and wind speed from Yikima Valley, WA, for July 2022. (More exciting news on why I picked this location soon.)
Then I used AbletonOSC to generate midi notes for synthetic music. Each day’s temperature is rounded up to an integer, and shifted down with a constant of 10 as the pitch of the note. Each day’s wind speed is the velocity of the midi note. Each note lasted 8 beats and is 4 beats apart each.

The source code looks something like:
client.send_message("/live/clip/add/notes", (track_id, clip_id, 65, 0.0, 8, 4.8, 0))
client.send_message("/live/clip/add/notes", (track_id, clip_id, 64, 4.0, 8, 6.4, 0))
client.send_message("/live/clip/add/notes", (track_id, clip_id, 60, 8.0, 8, 9.4, 0))
client.send_message("/live/clip/add/notes", (track_id, clip_id, 56, 12.0, 8, 5.7, 0))
client.send_message("/live/clip/add/notes", (track_id, clip_id, 56, 16.0, 8, 5.6, 0))
client.send_message("/live/clip/add/notes", (track_id, clip_id, 58, 20.0, 8, 5.0, 0))
client.send_message("/live/clip/add/notes", (track_id, clip_id, 58, 24.0, 8, 3.4, 0))
client.send_message("/live/clip/add/notes", (track_id, clip_id, 62, 28.0, 8, 6.5, 0))
client.send_message("/live/clip/add/notes", (track_id, clip_id, 61, 32.0, 8, 6.9, 0))
client.send_message("/live/clip/add/notes", (track_id, clip_id, 64, 36.0, 8, 4.2, 0))
client.send_message("/live/clip/add/notes", (track_id, clip_id, 65, 40.0, 8, 5.3, 0))
client.send_message("/live/clip/add/notes", (track_id, clip_id, 69, 44.0, 8, 6.2, 0))
client.send_message("/live/clip/add/notes", (track_id, clip_id, 70, 48.0, 8, 7.0, 0))
client.send_message("/live/clip/add/notes", (track_id, clip_id, 67, 52.0, 8, 5.8, 0))
client.send_message("/live/clip/add/notes", (track_id, clip_id, 69, 56.0, 8, 6.4, 0))
client.send_message("/live/clip/add/notes", (track_id, clip_id, 66, 60.0, 8, 6.7, 0))
client.send_message("/live/clip/add/notes", (track_id, clip_id, 60, 64.0, 8, 8.3, 0))
client.send_message("/live/clip/add/notes", (track_id, clip_id, 60, 68.0, 8, 4.0, 0))
client.send_message("/live/clip/add/notes", (track_id, clip_id, 65, 72.0, 8, 4.7, 0))
client.send_message("/live/clip/add/notes", (track_id, clip_id, 71, 76.0, 8, 5.8, 0))
client.send_message("/live/clip/add/notes", (track_id, clip_id, 69, 80.0, 8, 6.8, 0))
client.send_message("/live/clip/add/notes", (track_id, clip_id, 68, 84.0, 8, 9.2, 0))
client.send_message("/live/clip/add/notes", (track_id, clip_id, 66, 88.0, 8, 4.7, 0))
client.send_message("/live/clip/add/notes", (track_id, clip_id, 70, 92.0, 8, 6.0, 0))
client.send_message("/live/clip/add/notes", (track_id, clip_id, 71, 96.0, 8, 5.5, 0))
client.send_message("/live/clip/add/notes", (track_id, clip_id, 74, 100.0, 8, 5.8, 0))
client.send_message("/live/clip/add/notes", (track_id, clip_id, 78, 104.0, 8, 5.0, 0))
client.send_message("/live/clip/add/notes", (track_id, clip_id, 78, 108.0, 8, 5.7, 0))
client.send_message("/live/clip/add/notes", (track_id, clip_id, 79, 112.0, 8, 7.6, 0))
client.send_message("/live/clip/add/notes", (track_id, clip_id, 77, 116.0, 8, 4.7, 0))
client.send_message("/live/clip/add/notes", (track_id, clip_id, 76, 120.0, 8, 5.1, 0))
I picked the Drifting Ambient pack to give the sound a mysterious and windy feel.
Music to Visualization
Next, with the music, I used p5.js to visualize the sound.
We went through some iterations and landed at a minimal, mysterious line animation in sync with the volume of the music.



Older Iterations
Some of my older iterations involved using ChatGPT to write poems about grapes and Lilac flowers, and display random words drawn from these poems alongside a circular visualization.


