Cara Menjeda Posisi Modulasi dan Menyambung Semula ke Arah Songsang pada Picu Seterusnya dalam SuperCollider
Untuk menjeda posisi modulasi dan menyambung semula ke arah songsang, biarkan penjana fasa terus berjalan dengan kenaikan sifar, kemudian tukar kenaikan itu kepada nilai negatif pada picu seterusnya. Biarkan input tetapan semula fasa tidak disambungkan kepada picu tersebut supaya pergerakan bersambung dari posisi yang ditahan.
Tutorial ini membina tingkah laku tersebut dalam SuperCollider: sapuan pic menaik dijeda pada picu pertama dan menjejaki semula laluannya pada picu kedua. Tutorial ini ditujukan kepada pereka bunyi yang mahukan gerak modulasi berulang yang dikawal oleh peristiwa berturutan. Isyarat fasa yang sama kemudian boleh mengawal parameter lain.
Apakah yang Mesti Dikekalkan Semasa Jeda?
Anggap modulasi sebagai dua operasi yang saling berkait: posisi bergerak melalui satu kitaran, dan pemetaan menukarkan posisi itu kepada nilai parameter yang berguna. Di sini, posisi bergerak dari sifar ke arah satu, dan pemetaan menukarkannya kepada frekuensi pengayun.
Phasor SuperCollider menyediakan posisi tersebut. Argumennya rate menentukan kenaikan bagi setiap sampel; input picunya pula melompat ke resetPos. Kedua-duanya ialah kawalan berasingan, jadi picu yang digunakan untuk menukar arah tidak sepatutnya turut menetapkan semula posisi. Dokumentasi Phasor
Pelaksanaan ini mengekalkan aras dalaman dan menambah kadar kepadanya. Berdasarkan tingkah laku itu, kadar sifar menahan aras, manakala kadar negatif menggerakkannya ke bawah. Tampalan di bawah menerapkan perkara ini secara langsung, sambil mengekalkan keadaan penjana sepanjang jeda. Pelaksanaan TriggerUGens.cpp SuperCollider 3.14.0
Apakah yang Patut Dilakukan oleh Setiap Picu Berturutan?
Tentukan urutan peristiwa sebelum menyambungkan bunyi. Untuk tampalan ini, pergerakan bermula serta-merta ke hadapan. Setiap picu seterusnya menggerakkan satu keadaan:
| Picu diterima | Keadaan | Pengganda arah |
|---|---|---|
| 0 | Bergerak ke hadapan | +1 |
| 1 | Tahan posisi semasa | 0 |
| 2 | Sambung semula ke arah belakang | −1 |
| 3 | Tahan posisi semasa | 0 |
| 4 | Sambung semula ke hadapan | +1 |
Kitaran empat keadaan ini memisahkan dua keadaan tertahan: satu membawa kepada pergerakan ke belakang, dan satu lagi membawa kepada pergerakan ke hadapan. Ini menjadikan gerak berulang mudah dijangka tanpa memerlukan butang arah tambahan.
PulseCount bertambah apabila inputnya berubah daripada bukan positif kepada positif. Mengambil kiraan modulo empat menghasilkan indeks berulang 0–3. Select kemudian memilih pengganda yang sepadan daripada [1, 0, -1, 0]. Inilah fungsi yang didokumenkan bagi PulseCount dan Select.
Bagaimanakah Anda Membina Tampalan Lengkap?
Gunakan pemasangan SuperCollider setempat dengan output audio yang berfungsi; contoh ini mengikuti dokumentasi versi 3.14.0. Contoh ini menggunakan penjana unit terbina dalam dan menjana bunyinya sendiri, jadi tiada fail sampel atau sambungan diperlukan. Nilai seluruh blok sekali dan tunggu mesej sedia.
waitForBoot memulakan pelayan jika perlu. Takrif dihantar sebelum sintesis dicipta, dengan s.sync menunggu sehingga operasi pelayan yang tertangguh selesai. 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;
});
)
Kenaikan ialah arah didarab dengan tempoh sampel dan dibahagi dengan tempoh kitaran. SampleDur mengembalikan nilai timbal balik kadar sampel pelayan, jadi tetapan lapan saat ini tidak mengandaikan kadar sampel tertentu. Dokumentasi SampleDur
Pemetaan pic merangkumi 220–880 Hz. LinExp menukarkan julat input linear kepada julat output eksponen; titik hujung destinasi mestilah bukan sifar dan mempunyai tanda yang sama. Kedua-dua titik hujung di sini memenuhi syarat itu. Dokumentasi LinExp
Saya meneliti contoh SuperCollider dengan merujuk dokumentasi yang diperoleh. Runtime SuperCollider tidak tersedia dalam persekitaran penyelidikan, jadi saya tidak menjalankan atau mendengar tampalan ini. Semakan aritmetik deterministik yang berasingan mengesahkan urutan arah dan tingkah laku tahan dengan kenaikan sifar.
Bagaimanakah Anda Menjeda dan Menyambung Semula ke Arah Songsang?
Selepas mesej sedia muncul, biarkan pic meningkat selama kira-kira dua saat. Kemudian nilai arahan interaksi ini sekali:
~pauseReverseSynth.set(\t_step, 1);
Keadaan sepatutnya menjadi 1, dan fasa yang dicetak sepatutnya kekal pada satu nilai. Tunggu seketika, kemudian nilai arahan yang sama sekali lagi. Keadaan sepatutnya menjadi 2, dan fasa sepatutnya menurun dari posisi yang ditahan. Penilaian ketiga menahan sapuan menurun; penilaian keempat memulakannya semula ke hadapan.
Awalan t_ menjadikan t_step kawalan picu. Menetapkannya menghasilkan impuls pada kadar kawalan, membolehkan arahan yang sama digunakan berulang kali tanpa menghantar sifar berasingan secara manual antara penilaian biasa yang dijarakkan. Dokumentasi kawalan picu SynthDef
Sebagai contoh pengiraan masa, kitaran lapan saat bergerak sebanyak 0.125 daripada julatnya setiap saat. Oleh itu, jeda selepas dua saat menahan nilai kira-kira 0.25. Selepas sebarang tempoh jeda, satu saat pergerakan ke belakang membawanya ke kira-kira 0.125. Ini ialah jangkaan yang dikira; masa arahan manual menentukan posisi berhenti yang sebenar.
Untuk selesai, nilai arahan pembersihan:
~pauseReverseSynth.free;
Bagaimanakah Anda Boleh Mengesahkan bahawa Posisi Benar-benar Tidak Berubah?
Gunakan fasa yang dicetak sebagai diagnostik utama. Semasa pergerakan ke hadapan, nilainya sepatutnya meningkat; dalam mana-mana keadaan tertahan, nilainya sepatutnya kekal; semasa pergerakan ke belakang, nilainya sepatutnya menurun sehingga mencapai sempadan kitaran.
Tampalan ini mencetak dua kali sesaat, jadi paparan mengambil sampel tingkah laku dan bukannya menunjukkan setiap sampel. Perhatikan beberapa bacaan berturut-turut semasa jeda, kemudian bandingkan bacaan menurun pertama selepas sambung semula. Poll bertujuan untuk menyahpepijat nilai penjana unit; buang dua baris pengundian apabila menyesuaikan takrif untuk kegunaan biasa. Dokumentasi Poll
Ujian ini lebih bermaklumat daripada mendengar sahaja. Bunyi yang mantap menunjukkan bahawa nilai destinasi berhenti berubah, manakala bacaan fasa yang stabil mengesahkan bahawa posisi asas turut berhenti. Mengekalkan pemetaan yang tetap sepanjang ujian memudahkan tafsiran hasil.
Mengapakah Tampalan Mungkin Bermula Semula, Melompat atau Terlepas Picu?
Ia bermula semula apabila anda menyambung semula. Periksa sama ada peristiwa itu turut sampai ke input picu Phasor. Input tersebut menetapkan semula posisi secara jelas. Dalam tampalan ini, input itu kekal pada sifar, manakala peristiwa hanya dihantar kepada pembilang keadaan. Dokumentasi Phasor
Ia melompat selepas mencapai titik hujung. Contoh ini sengaja berulang. Pelaksanaannya membalut fasa ke dalam julat yang dikonfigurasikan, termasuk semasa pergerakan negatif. Apabila pergerakan ke belakang melepasi sifar, fasa kembali hampir ke sempadan atas, lalu menghasilkan lonjakan pic dengan pemetaan ramp ini. Uji jeda dan pembalikan jauh dari sempadan itu terlebih dahulu. Pelaksanaan Phasor
Beberapa arahan pantas tidak menghasilkan beberapa keadaan. Pembilang memerlukan peralihan menaik yang berasingan. Kawalan picu beroperasi pada kadar kawalan, jadi jangan anggap beberapa arahan yang tiba dalam satu blok kawalan akan menjadi peristiwa berasingan. Mulakan dengan arahan yang disengajakan dan dijarakkan; untuk urutan yang waktunya rapat, reka sumber peristiwa agar menghasilkan denyutan yang berasingan. Dokumentasi PulseCount, Dokumentasi SynthDef
Bunyi berubah semasa fasa ditahan. Periksa sama ada anda turut menukar pemetaan destinasi atau parameter bunyi yang lain. Untuk ujian ini, kekalkan titik hujung pic dan gunakan fasa yang dicetak untuk mengasingkan pengangkutan modulasi.
Gerak lengkapnya ialah ke hadapan, tahan, ke belakang, tahan, kemudian ke hadapan semula. Setelah urutan itu berfungsi dengan betul, kekalkan pembilang keadaan dan penjana fasa sebagai sumber modulasi yang boleh digunakan semula, dan ubah pemetaan destinasi mengikut bunyi yang anda bina.
Sumber
- Phasor — Bantuan SuperCollider 3.14.0
- TriggerUGens.cpp — SuperCollider, Versi 3.14.0
- PulseCount — Bantuan SuperCollider 3.14.0
- Select — Bantuan SuperCollider 3.14.0
- Server — Bantuan SuperCollider 3.14.0
- SynthDef — Bantuan SuperCollider 3.14.0
- SampleDur — Bantuan SuperCollider 3.14.0
- LinExp — Bantuan SuperCollider 3.14.0
- Poll — Bantuan SuperCollider 3.14.0
