Blog Metlivi

Cara Menjeda Posisi Modulasi dan Melanjutkannya ke Arah Sebaliknya pada Trigger Berikutnya di SuperCollider

Untuk menjeda posisi modulasi dan melanjutkannya ke arah sebaliknya, biarkan generator fasenya tetap berjalan dengan inkremen nol, lalu ubah inkremen tersebut menjadi nilai negatif pada trigger berikutnya. Biarkan input reset fase tidak terhubung ke trigger-trigger tersebut agar pergerakan berlanjut dari posisi yang ditahan.

Tutorial ini membuat perilaku tersebut di SuperCollider: sapuan nada yang naik dijeda pada trigger pertama dan menelusuri kembali jalurnya pada trigger kedua. Tutorial ini ditujukan bagi desainer suara yang menginginkan gestur modulasi berulang yang dikendalikan oleh peristiwa berurutan. Sinyal fase yang sama nantinya dapat menggerakkan parameter lain.

29 Oktober 2026Bacaan 6 menitOleh Metlivi Editorial Team
Bagian 1

Apa yang Harus Dipertahankan Selama Jeda?

Anggap modulasi sebagai dua operasi yang saling terhubung: posisi bergerak melalui suatu siklus, dan pemetaan mengubah posisi itu menjadi nilai parameter yang berguna. Di sini, posisi bergerak dari nol menuju satu, dan pemetaan mengubahnya menjadi frekuensi osilator.

Phasor di SuperCollider menyediakan posisi tersebut. Argumen rate menentukan inkremen per sampel; input trigger-nya justru melompat ke resetPos. Keduanya adalah kontrol terpisah, jadi trigger yang digunakan untuk mengubah arah tidak boleh sekaligus mereset posisi. Dokumentasi Phasor

Implementasi ini mempertahankan level internal dan menambahkan laju padanya. Berdasarkan perilaku tersebut, laju nol menahan level, sedangkan laju negatif menggerakkannya ke bawah. Patch di bawah menerapkan hal ini secara langsung, dengan mempertahankan status generator selama jeda. Implementasi TriggerUGens.cpp SuperCollider 3.14.0

Bagian 2

Apa yang Harus Dilakukan Setiap Trigger Berurutan?

Tentukan urutan peristiwa sebelum menghubungkan suara. Untuk patch ini, pergerakan langsung dimulai ke arah depan. Setiap trigger berikutnya melanjutkan ke satu status berikutnya:

Jumlah trigger yang diterima Status Pengali arah
0 Bergerak ke depan +1
1 Menahan posisi saat ini 0
2 Melanjutkan ke arah belakang −1
3 Menahan posisi saat ini 0
4 Melanjutkan ke arah depan +1

Siklus empat status ini memisahkan kedua status tertahan: satu diikuti gerakan ke belakang, dan yang lain diikuti gerakan ke depan. Dengan begitu, gestur berulang menjadi mudah diprediksi tanpa memerlukan tombol arah tambahan.

PulseCount bertambah saat inputnya berubah dari non-positif menjadi positif. Mengambil hitungan modulo empat menghasilkan indeks berulang 0–3. Select kemudian memilih pengali yang sesuai dari [1, 0, -1, 0]. Berikut adalah fungsi yang didokumentasikan untuk PulseCount dan Select.

Bagian 3

Bagaimana Cara Membuat Patch Lengkap?

Gunakan instalasi SuperCollider lokal dengan keluaran audio yang berfungsi; contoh ini mengikuti dokumentasi versi 3.14.0. Contoh ini menggunakan unit generator bawaan dan menghasilkan suaranya sendiri, jadi tidak memerlukan berkas sampel atau ekstensi. Evaluasi seluruh blok sekali dan tunggu pesan siap.

waitForBoot memulai server jika diperlukan. Definisi dikirim sebelum synth dibuat, dengan s.sync menunggu operasi server yang masih berjalan. Lihat dokumentasi Server dan dokumentasi SynthDef.

(
s = Server.default;
s.waitForBoot({
    SynthDef(\pauseReverseMod, {
        |out = 0, t_step = 0, cycleSeconds = 8, amp = 0.08|
        var state, direction, increment, phase, frequency, sound;

        state = PulseCount.kr(t_step) % 4;
        direction = Select.kr(state, [1, 0, -1, 0]);

        // A full 0..1 traversal takes cycleSeconds seconds.
        increment = direction * SampleDur.ir
            / cycleSeconds.max(0.01);

        // State-changing triggers never reset this phase.
        phase = Phasor.ar(
            trig: 0,
            rate: increment,
            start: 0,
            end: 1,
            resetPos: 0
        );

        frequency = LinExp.ar(phase, 0, 1, 220, 880);
        sound = SinOsc.ar(frequency, 0, amp);
        Out.ar(out, sound ! 2);

        Poll.kr(Impulse.kr(2), state, "state");
        Poll.kr(Impulse.kr(2), A2K.kr(phase), "phase");
    }).add;

    s.sync;
    ~pauseReverseSynth = Synth(\pauseReverseMod);
    "Ready: evaluate ~pauseReverseSynth.set(\\t_step, 1);".postln;
});
)

Inkremen adalah arah dikalikan durasi sampel lalu dibagi durasi siklus. SampleDur mengembalikan kebalikan dari laju sampel server, sehingga pengaturan delapan detik tidak mengasumsikan laju sampel tertentu. Dokumentasi SampleDur

Pemetaan nada mencakup rentang 220–880 Hz. LinExp mengubah rentang input linear menjadi rentang output eksponensial; titik ujung tujuan harus bukan nol dan bertanda sama. Kedua titik ujung di sini memenuhi persyaratan tersebut. Dokumentasi LinExp

Saya memeriksa contoh SuperCollider berdasarkan dokumentasi yang diperoleh. Runtime SuperCollider tidak tersedia di lingkungan riset, jadi saya tidak menjalankan atau mendengarkan patch ini. Pemeriksaan aritmetika deterministik yang terpisah memverifikasi urutan arah dan perilaku penahanan dengan inkremen nol.

Bagian 4

Bagaimana Cara Menjeda dan Melanjutkan ke Arah Belakang?

Setelah pesan siap muncul, biarkan nada naik selama kira-kira dua detik. Lalu evaluasi perintah interaksi ini sekali:

~pauseReverseSynth.set(\t_step, 1);

Status seharusnya menjadi 1, dan fase yang tercetak seharusnya menetap pada satu nilai. Tunggu sebentar, lalu evaluasi perintah yang sama sekali lagi. Status seharusnya menjadi 2, dan fase seharusnya menurun dari posisi yang ditahan. Evaluasi ketiga menahan sapuan yang menurun; evaluasi keempat memulainya kembali ke arah depan.

Prefiks t_ membuat t_step menjadi kontrol trigger. Mengaturnya menghasilkan impuls pada laju kontrol, sehingga perintah yang sama dapat digunakan berulang kali tanpa mengirim nol secara terpisah secara manual di antara evaluasi biasa yang diberi jeda. Dokumentasi kontrol trigger SynthDef

Sebagai perhitungan waktu ilustratif, siklus delapan detik bergerak maju sebesar 0.125 dari rentangnya per detik. Jadi, jika dijeda setelah dua detik, posisinya tertahan kira-kira pada 0.25. Setelah durasi jeda berapa pun, satu detik gerakan ke belakang membawanya ke kira-kira 0.125. Ini adalah perkiraan hasil perhitungan; waktu perintah manual menentukan posisi berhenti yang sebenarnya.

Untuk mengakhiri, evaluasi perintah pembersihan:

~pauseReverseSynth.free;
Bagian 5

Bagaimana Cara Memastikan Posisi Benar-Benar Tetap?

Gunakan fase yang tercetak sebagai diagnostik utama. Saat bergerak ke depan, nilainya seharusnya meningkat; selama salah satu status tertahan, nilainya seharusnya tetap konstan; saat bergerak ke belakang, nilainya seharusnya menurun hingga mencapai batas siklus.

Patch ini mencetak nilainya dua kali per detik, jadi tampilan tersebut mengambil sampel perilaku dan tidak menunjukkan setiap sampel. Amati beberapa pembacaan berturut-turut selama jeda, lalu bandingkan dengan pembacaan menurun pertama setelah dilanjutkan. Poll ditujukan untuk men-debug nilai unit generator; hapus dua baris polling saat mengadaptasi definisi ini untuk penggunaan rutin. Dokumentasi Poll

Tes ini memberikan informasi lebih banyak daripada hanya mendengarkan. Suara yang stabil menunjukkan bahwa nilai tujuan berhenti berubah, sementara pembacaan fase yang stabil memastikan bahwa posisi dasarnya juga berhenti. Mempertahankan pemetaan tetap selama tes akan memudahkan interpretasi hasil.

Bagian 6

Mengapa Patch Bisa Dimulai Ulang, Melompat, atau Tidak Menangkap Trigger?

Patch dimulai ulang saat dilanjutkan. Periksa apakah peristiwa tersebut juga mencapai input trigger Phasor. Input itu secara eksplisit mereset posisi. Dalam patch ini, input tersebut tetap bernilai nol, sedangkan peristiwa hanya dikirim ke penghitung status. Dokumentasi Phasor

Posisi melompat setelah mencapai titik ujung. Contoh ini memang sengaja dibuat berulang. Implementasi membungkus fase kembali ke rentang yang dikonfigurasi, termasuk saat bergerak negatif. Setelah gerakan ke belakang melewati nol, fase kembali mendekati batas atas, sehingga terjadi lompatan nada dengan pemetaan ramp ini. Uji jeda dan pembalikan arah terlebih dahulu jauh dari batas tersebut. Implementasi Phasor

Beberapa perintah cepat tidak menghasilkan beberapa perubahan status. Penghitung memerlukan transisi naik yang terpisah. Kontrol trigger beroperasi pada laju kontrol, jadi jangan berasumsi bahwa beberapa perintah yang tiba dalam satu blok kontrol akan menjadi peristiwa terpisah. Mulailah dengan perintah yang diberi jeda cukup; untuk urutan dengan pengaturan waktu yang rapat, rancang sumber peristiwa agar menghasilkan pulsa yang terpisah. Dokumentasi PulseCount, dokumentasi SynthDef

Suara berubah saat fase ditahan. Periksa apakah Anda juga mengubah pemetaan tujuan atau parameter suara lainnya. Untuk tes ini, biarkan titik ujung nada tetap dan gunakan fase yang tercetak untuk mengisolasi pemindahan modulasi.

Gestur lengkapnya adalah bergerak ke depan, menahan, bergerak ke belakang, menahan, lalu bergerak ke depan lagi. Setelah urutan tersebut berfungsi dengan benar, pertahankan penghitung status dan generator fase sebagai sumber modulasi yang dapat digunakan kembali, lalu ubah pemetaan tujuan agar sesuai dengan suara yang sedang Anda buat.

Bagian 7

Sumber

Bacaan terkait

Lanjutkan topik ini