Untitled

 avatar
unknown
plain_text
a month ago
2.9 kB
5
Indexable
// 🌱 Setup iniziale
s.waitForBoot({
    ~buffers = Array.fill(10, { Buffer.alloc(s, 10 * s.sampleRate, 1) });
    "Setup completato: 10 buffer pronti per la registrazione.".postln;
});

// 🎙️ Synth per registrare
SynthDef(\recorder, { |buf, amp = 1|
    var input = SoundIn.ar(0) * amp;
    RecordBuf.ar(input, buf, loop: 0, doneAction: 2);
}).add;

// ▶️ Synth per riprodurre una volta
SynthDef(\player, { |buf, rate = 1|
    var sig = PlayBuf.ar(1, buf, rate, doneAction: 2);
    Out.ar(0, sig ! 2);
}).add;

// 🌀 Synth per loop con velocità crescente
SynthDef(\speedLooper, { |buf, rateStart = 1.0, rateEnd = 8.0, dur = 10|
    var rate = Line.kr(rateStart, rateEnd, dur);
    var sig = PlayBuf.ar(1, buf, rate, loop: 1);
    Out.ar(0, sig ! 2);
}).add;

// 🖼️ GUI TENAGER completa
(
var window, plots;
~loopSynths = Array.newClear(10);
plots = List.new;

window = Window("🎺 TENAGER GUI", Rect(100, 100, 650, 560));
window.background = Color.grey;

10.do { |i|
    var yPos = 10 + (i * 50);

    // 🔴 Record (resetta buffer prima)
    Button(window, Rect(10, yPos, 90, 30))
        .states_([["🔴 Record " ++ i, Color.white, Color.red]])
        .action_({
            Routine({
                ~buffers[i].zero;
                "Registrazione del gesto % inizia in 0.5s...".format(i).postln;
                0.5.wait;
                Synth(\recorder, [\buf, ~buffers[i].bufnum]);
            }).play;
        });

    // ▶️ Play singolo
    Button(window, Rect(110, yPos, 80, 30))
        .states_([["▶️ Play " ++ i, Color.black, Color.green]])
        .action_({
            Synth(\player, [\buf, ~buffers[i].bufnum]);
        });

    // 🌀 Loop con velocità crescente
    Button(window, Rect(200, yPos, 100, 30))
        .states_([["🌀 Loop " ++ i, Color.black, Color.cyan]])
        .action_({
            ~loopSynths[i].notNil.if { ~loopSynths[i].free };
            ~loopSynths[i] = Synth(\speedLooper, [
                \buf, ~buffers[i].bufnum,
                \rateStart, 1.0,
                \rateEnd, 8.0,
                \dur, 10
            ]);
        });

    // ⏹ Stop loop
    Button(window, Rect(310, yPos, 80, 30))
        .states_([["⏹ Stop", Color.white, Color.gray]])
        .action_({
            ~loopSynths[i].notNil.if {
                ~loopSynths[i].free;
                ~loopSynths[i] = nil;
                "Loop % fermato.".format(i).postln;
            };
        });

    // 🌊 Forma d’onda
    plots.add(
        SoundFileView(window, Rect(400, yPos, 230, 30))
            .background_(Color.black)
            .waveColors_([Color.cyan])
            .gridOn_(false)
    );

    // 🔁 Aggiornamento forma d’onda
    Routine({
        loop {
            2.wait;
            plots[i].setBuffer(~buffers[i]);
        }
    }).play(AppClock);
};

window.front;
)
Editor is loading...
Leave a Comment