«György Ligeti's Poème Symphonique for 100 Metronomes» by alibalighi

on 06 Feb'25 20:50 in contemporary musicligetimetronomes100 metronomespoème symphonique

This piece is inspired by György Ligeti's Poème Symphonique for 100 Metronomes, a work composed in 1962 that explores the concept of a musical labyrinth and the auditory perception of infinity.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/*

Program Note:
This piece is inspired by György Ligeti's Poème Symphonique for 100 Metronomes, a work composed in 1962 that explores the concept of a musical labyrinth and the auditory perception of infinity. Drawing on Ligeti's idea of parallel mirrors reflecting endless images, this program replicates the hypnotic and mesmerizing effect of overlapping independent tempos created by multiple metronomes.
Using modern digital synthesis, the program simulates the gradual deceleration and silencing of 100 independent metronomes distributed across a stereo sound field. Each metronome is set to a unique frequency (spanning from 440 Hz to 880 Hz), tempo (ranging from 80 to 240 BPM), and stereo position (panned across the left and right channels). Instead of physical metronomes placed on resonant surfaces like in Ligeti's original performance, the digital audio synthesis reproduces their ticking pulses to emulate the acoustic complexity and variation.

Similar to the original performance instructions:

- Each metronome operates at its own tempo, creating a complex interplay of rhythms.

- The performance begins with all metronomes ticking simultaneously, but over time, the staggered tempi cause individual ticks to dissolve into silence.

- The spatial panning enhances the sense of physicality and unpredictability inherent in the original piece.

Ali Balighi
www.alibalighi.com
© 2025 by Ali Balighi

*/

(
// Boot the server and define the SynthDef
s.waitForBoot {
    SynthDef(\metronome, { |freq = 440, amp = 0.01, decay = 0.02, pan = 0|
        var env = EnvGen.kr(Env.perc(0.001, decay), doneAction: 2); // Envelope for short tick
        var signal = SinOsc.ar(freq) * env * amp; // Sound generation
        Out.ar(0, Pan2.ar(signal, pan)); // Output with panning
    }).add;

    // Start playing the pattern
    s.sync;

    // Use a function block to ensure variables are scoped properly
    {
        // Declare and initialize the required variables
        var numMetronomes = 100; // Number of metronomes
        var bpmMin = 80; // Minimum BPM
        var bpmMax = 240; // Maximum BPM
        var freqMin = 440; // Minimum frequency
        var freqMax = 880; // Maximum frequency
        var beatsPerMetronome = 50; // Number of beats for each metronome to play

        // Linearly distributed parameters
        var tempos = Array.fill(numMetronomes, { |i| bpmMin + (bpmMax - bpmMin) * (i / (numMetronomes - 1)) });
        var frequencies = Array.fill(numMetronomes, { |i| freqMin + (freqMax - freqMin) * (i / (numMetronomes - 1)) });
        var pans = Array.fill(numMetronomes, { |i| -1 + 2 * (i / (numMetronomes - 1)) }); // Spread panning between -1 and 1

        // Combine parameters into Pbind and Pseq
        Ppar(
            tempos.collect { |tempo, index|
                Pbind(
                    \instrument, \metronome,                         // Use the \metronome SynthDef
                    \freq, frequencies[index],                     // Assign unique frequency
                    \pan, pans[index],                             // Assign unique stereo position
                    \amp, 0.05,                                    // Set amplitude
                    \dur, Pseq([(60 / tempo)], beatsPerMetronome)   // Duration (tempo) repeated
                )
            }
        ).play;
    }.value; // Call the function block
};
)
raw 3453 chars (focus & ctrl+a+c to copy)
reception
comments