1 of 101

2 of 101

About me

Simon HENRY

2D animation supervisor at CARIBARA Angouleme

worked on two Blender projects :

creator of sound2mesh :

3 of 101

Admo - Aftershock

Amusement - SSKGCCULT

Calm Down - Chris Jones

finding ways to visualize sound

The Idea

(youtube examples)

4 of 101

The Idea

MIDI visualization

“Fast Fourier Transform” tests

(inspired by 3blue1brown)

finding ways to visualize sound

(personal work)

5 of 101

Summary

  1. Spectrogram ?
  2. Prototype
    1. spectrogram
    2. waveform
    3. shader
    4. having fun
  3. sound2mesh
    • FFmpeg to the rescue
    • precision control
    • artistic control
    • User Interface
  4. Tips

6 of 101

Spectrogram ?

.mp3 to .png

7 of 101

“A spectrogram is a visual representation

of the [...] frequencies of a signal

- Wikipedia

Spectrogram ?

8 of 101

Spectrogram ?

waveform

spectrogram

9 of 101

Spectrogram ?

Time

waveform

Amplitude

Time

spectrogram

Frequency

Amplitude

10 of 101

11 of 101

Prototype

moving vertices

12 of 101

Prototype (spectrogram)

base grid

displacement

texture

13 of 101

Prototype (spectrogram)

UV scroll

14 of 101

Waveform

immediate response

15 of 101

Prototype (waveform)

spectrogram

spectrogram + waveform

16 of 101

17 of 101

Shader

color narrative

18 of 101

Prototype (shaders)

base texture

19 of 101

Prototype (shaders)

base texture

height gradient

20 of 101

Prototype (shaders)

base texture

height gradient

custom

21 of 101

Prototype (shaders)

22 of 101

Prototype (shaders)

slopes

valleys

ridges

23 of 101

Prototype (shaders)

24 of 101

Having Fun

♫♪

25 of 101

Having Fun

♪♫ Fruko y Orquesta - Mambo No. 5 (1993)

26 of 101

Having Fun

♪♫ Digging My Potato - The Seatbelts (1998)

27 of 101

Having Fun

♪♫ Cats On Mars - Yōko Kanno (1998)

28 of 101

Having Fun

♪♫ Daft Punk - Touch (2013)

29 of 101

Digging My Potato - The Seatbelts (1998)

close-up view

Having Fun

30 of 101

Having Fun (shape)

arc

31 of 101

Having Fun (shape)

tube (exterior)

32 of 101

Having Fun (shape)

tube (interior)

33 of 101

Having Fun (shape)

camera view

34 of 101

Retrowave

♪♫ Plastic Love - Mariya Takeuchi

35 of 101

Disco

♪♫ Holding Out for a Hero - Jennifer Saunders

36 of 101

Mountains

♪♫ Riding (Day) - The Legend of Zelda: Breath of the Wild

37 of 101

Neon

♪♫ Touch - Daft Punk

38 of 101

Nebula

♪♫ Alfonsina y èl Mar - Rita Payès

39 of 101

sound2mesh

part 1 : FFmpeg to the rescue

40 of 101

Generate spectrogram (Audioalter)

https://audioalter.com/spectrogram

41 of 101

Generate spectrogram (FFmpeg)

https://ffmpeg.org/

42 of 101

Generate spectrogram (FFmpeg)

https://xkcd.com/2347/

43 of 101

Generate spectrogram (FFmpeg)

[…]

showcqt()

showcwt()

showfreqs()

showspectrum()

showvolume()

showwaves

showwavespic

[…]

showspectrumpic()

44 of 101

FFmpeg - showspectrumpic

showspectrumpic(color, limit, frange)

spectrogram color

volume limit

frequency range

45 of 101

FFmpeg - showspectrumpic

showspectrumpic(color, limit, frange)

spectrogram color

46 of 101

FFmpeg - showspectrumpic

channel

cividis

cool

fiery

fire

fruit

green

intensity

magma

moreland

nebulae

plasma

rainbow

terrain

viridis

FFmpeg color gradients

47 of 101

FFmpeg - showspectrumpic

image

luminance

displacement

Blender uses the -luminance -

to calculate displacement

(no matter the hue)

48 of 101

FFmpeg - showspectrumpic

spectrogram

luminance

displacement

Blender uses the -luminance -

to calculate displacement

(no matter the hue)

49 of 101

FFmpeg - showspectrumpic

channel

cividis

cool

fiery

fire

fruit

green

intensity

magma

moreland

nebulae

plasma

rainbow

terrain

viridis

FFmpeg color gradients

50 of 101

FFmpeg - showspectrumpic

showspectrumpic(color, limit, frange)

volume limit

51 of 101

-48 dB

-24 dB

0 dB

audio

spectrogram

FFmpeg - showspectrumpic

faint sound

=

low brightness

loud sound

=

high brightness

52 of 101

FFmpeg - showspectrumpic

without compensation

showspectrumpic()

with

compensation

ffvolumedetect()

showspectrumpic()

use ffvolumedetect() to get the �max volume of the sound

feed the value into showspectrumpic()-

to always get max brightness

53 of 101

FFmpeg - showspectrumpic

-48 dB

-24 dB

0 dB

audio

spectrogram

(with compensation)

same brightness all around !

54 of 101

FFmpeg - showspectrumpic

showspectrumpic(color, limit, frange)

frequency range

55 of 101

FFmpeg - showspectrumpic

lin

log

(linear)

(logarithmic)

56 of 101

FFmpeg - showspectrumpic

lin

log

(linear)

(logarithmic)

57 of 101

FFmpeg - showspectrumpic

github.com/FFmpeg/FFmpeg/blob/master/libavfilter/avf_showspectrum.c

58 of 101

FFmpeg - showspectrumpic

github.com/FFmpeg/FFmpeg/blob/master/libavfilter/avf_showspectrum.c

59 of 101

FFmpeg - showspectrumpic

60 of 101

FFmpeg - showspectrumpic

Uses the formula to -distort UVs-

Can interpolate between lin and log -from a single image-

61 of 101

FFmpeg - showspectrumpic

linear

logarithmic

Allows for both -precise-

and -artistic- control !

62 of 101

Precision Control

0.000000000000001

63 of 101

Geonodes - dynamic graduations

spectrogram

graduations

64 of 101

Geonodes - dynamic graduations

Multiply index

Visualize Numeric Attributes in Geometry Nodes by Ilir Beqiri : youtu.be/_W47HfoeFsg

65 of 101

Geonodes - dynamic graduations

Delete at endpoints

66 of 101

Geonodes - dynamic graduations

Merge by distance

67 of 101

Geonodes - dynamic graduations

Accurate and dynamic feedback for the user !

68 of 101

Artistic Control

♫♪

69 of 101

Geonodes - artistic control

Smooth

70 of 101

Geonodes - artistic control

Contrast

if x < 0.5:

return (x^(k+1))*0.5

if x > 0.5:

return (1-(1-x^(k+1)))*0.5

71 of 101

Geonodes - artistic control

EQ Curve

72 of 101

Geonodes - artistic control

fast and dynamic

slow and gentle

73 of 101

UI

buttons & labels

74 of 101

developing in VScode

User Interface

VScode

Blender

GitHub

75 of 101

User Interface

76 of 101

User Interface

Main Panel

- manage spectrograms in scene

- manage waveforms

- manage volume

77 of 101

User Interface

Settings Panel

- manage selected spectrogram

- manage values + material

78 of 101

User Interface (spectrogram)

- create new spectrogram

- update current spectrogram

Main Panel

79 of 101

User Interface (spectrogram)

- manage multiple spectrograms in scene

- manage waveforms

Main Panel

80 of 101

User Interface (spectrogram)

- spectrogram control (distort UVs)

Settings

81 of 101

User Interface (spectrogram)

- control the shape / resolution of the spectrogram

Geometry

82 of 101

User Interface (spectrogram)

- tools meant for artistic control

Modifiers

83 of 101

User Interface (spectrogram)

- simple toggle displays

Overlays

84 of 101

User Interface (spectrogram)

- gradient presets

Material

85 of 101

User Interface (waveform)

- UI changes based on selection

86 of 101

User Interface (waveform)

- 4 different line types

Line Type

87 of 101

User Interface (waveform)

- adjust waveform thickness, resolution and shape

Settings

88 of 101

User Interface (waveform)

- default emission material

Material

89 of 101

Demo

Flowerboy (by Flowerhead)

90 of 101

91 of 101

Tips

if (fail) : learn

92 of 101

refrain from overusing

buttons and icons

Tips

- often a false solution to a real ergonomic problem

- don’t know where to click ?

multiple buttons, icons everywhere…

93 of 101

Tips

one single button !

icons when needed !

simplify the UI instead !

- clearer and more accessible

- Blender’s UI already offers good ergonomic solutions !

94 of 101

Tips

share your work

- allows for feedback

- helps you focus on the user

95 of 101

Tips

share your work

- allows for feedback

- helps you focus on the user

96 of 101

Tips

2023

2025

commit !

97 of 101

Tips

first commit

bcon 2025

call for content

2023

2025

commit !

98 of 101

Thanks !

99 of 101

Links

github.com/holybobine/blender-sound2mesh

sound2mesh-

- available on github

- free and open source

100 of 101

Links

youtube.com/@sound2mesh

sound2mesh-

- available on youtube :

101 of 101

ma famille, le bon Idaupe, Guillaume, Laly, Célian & Sylvie & les flûtes, Florian & Claire (Jörmna aussi <3), Katoche & Eloïse Pluzune, Romain, l’autre Romain, Maëvé, Vincent, Pilip, Anthony, tous les gens de Caribara Angouleme qui ont patiemment écouté mon frangliche, Mathilde L, Alexis P, Arnaud M, Joël, Emma-Claire Fierce, Mike Hodgetts, et le Plan B qui m’a chouchouté pendant la genèse de ce projet

Thanks !

geonodes & shaders : Simon Thommes, Blender Guru, cgMatter, PolyFjord, Erindale, Ilir Beqiri

python : Dr. Sybren A. Stüvel, blender.stackexchange.com, blenderartists.org

All the wonderful people who supported this project :

My main sources of knowledge :

audioalter.com, FFmpeg, gifcap.dev, ezgif.com

Resources : (without which this conference wouldn’t exist)

github.com/holybobine/blender-sound2mesh

youtube.com/@sound2mesh