Metlivi Blog

SuperCollider’da Bir Modülasyon Konumunu Duraklatıp Sonraki Tetiklemede Geriye Doğru Devam Ettirme

Bir modülasyon konumunu duraklatıp geriye doğru devam ettirmek için, faz üretecini artış değeri sıfır olacak şekilde çalışır durumda tutun; ardından sonraki tetiklemede bu artış değerini negatif bir değere değiştirin. Hareketin tutulan konumdan sürmesi için faz sıfırlama girişini bu tetiklemelere bağlamayın.

Bu eğitim, SuperCollider’da bu davranışı oluşturuyor: yükselen bir perde taraması ilk tetiklemede duraklıyor, ikincisinde ise izlediği yolu geri sarıyor. Art arda gelen olaylarla kontrol edilen, tekrarlanabilir bir modülasyon hareketi isteyen bir ses tasarımcısına yöneliktir. Aynı faz sinyali daha sonra başka bir parametreyi de kontrol edebilir.

29 Ekim 20266 dakikalık okumaYazan: Metlivi Editorial Team
Bölüm 1

Duraklama Sırasında Neler Korunmalı?

Modülasyonu birbirine bağlı iki işlem olarak ele alın: bir konum bir döngü boyunca hareket eder, bir eşleme de bu konumu kullanışlı bir parametre değerine dönüştürür. Burada konum sıfırdan bire doğru ilerler ve eşleme bunu osilatör frekansına dönüştürür.

SuperCollider’daki Phasor konumu sağlar. rate argümanı, örnek başına artış miktarını belirtir; tetikleme girişi ise konumu resetPos değerine sıçratır. Bunlar ayrı kontrollerdir; bu yüzden yönü değiştirmek için kullanılan tetikleme konumu da sıfırlamamalıdır. Phasor belgeleri

Uygulama, dahili bir seviyeyi korur ve artış değerini bu seviyeye ekler. Bu davranışa göre sıfır hız seviyeyi sabit tutarken negatif hız aşağı doğru hareket ettirir. Aşağıdaki yama, duraklama boyunca üretecin durumunu koruyarak bunu doğrudan uygular. SuperCollider 3.14.0 TriggerUGens.cpp uygulaması

Bölüm 2

Ardışık Her Tetikleme Ne Yapmalı?

Sesi bağlamadan önce olay sırasını belirleyin. Bu yamada hareket hemen ileri yönde başlar. Sonraki her tetikleme bir sonraki duruma geçer:

Alınan tetikleme sayısı Durum Yön çarpanı
0 İleri hareket et +1
1 Geçerli konumu tut 0
2 Geriye doğru devam et −1
3 Geçerli konumu tut 0
4 İleri yönde devam et +1

Bu dört durumlu döngü, iki bekleme durumunu birbirinden ayırır: biri geriye doğru harekete, diğeri ileri yönde harekete geçiş sağlar. Böylece ek bir yön düğmesi gerekmeden tekrarlanan hareketler öngörülebilir olur.

PulseCount, girişi negatif olmayan bir değerden pozitif bir değere geçtiğinde artar. Sayının dörde göre kalanı alındığında 0–3 arasında tekrarlanan indeksler elde edilir. Ardından Select, [1, 0, -1, 0] içinden karşılık gelen çarpanı seçer. Bunlar PulseCount ve Select için belgelenmiş işlevlerdir.

Bölüm 3

Tam Yama Nasıl Oluşturulur?

Ses çıkışı çalışan yerel bir SuperCollider kurulumu kullanın; örnek 3.14.0 belgelerini temel alır. Yerleşik birim üreteçlerini kullanır ve kendi sesini üretir; bu nedenle örnek dosyası veya eklenti gerekmez. Kod bloğunun tamamını bir kez değerlendirin ve hazır mesajını bekleyin.

waitForBoot, gerekirse sunucuyu başlatır. Tanım, synth oluşturulmadan önce gönderilir; s.sync ise bekleyen sunucu işlemlerini bekler. Server belgelerine ve SynthDef belgelerine bakın.

(
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;
});
)

Artış değeri, yönün örnek süresiyle çarpılıp döngü süresine bölünmesiyle hesaplanır. SampleDur, sunucu örnekleme hızının tersini döndürür; bu nedenle sekiz saniyelik ayar belirli bir örnekleme hızı varsaymaz. SampleDur belgeleri

Perde eşlemesi 220–880 Hz aralığını kapsar. LinExp, doğrusal bir giriş aralığını üstel bir çıkış aralığına dönüştürür; hedef uç noktalarının sıfırdan farklı ve aynı işaretli olması gerekir. Burada iki uç nokta da bu koşulu karşılar. LinExp belgeleri

SuperCollider örneğini, erişilen belgelerle karşılaştırarak inceledim. Araştırma ortamında SuperCollider çalışma zamanı bulunmadığından bu yamayı çalıştırmadım veya dinlemedim. Ayrı bir deterministik aritmetik kontrolü, yön sırasını ve sıfır artışla bekleme davranışını doğruladı.

Bölüm 4

Nasıl Duraklatıp Geriye Doğru Devam Ettirebilirsiniz?

Hazır mesajını aldıktan sonra perdenin yaklaşık iki saniye yükselmesine izin verin. Ardından bu etkileşim komutunu bir kez değerlendirin:

~pauseReverseSynth.set(\t_step, 1);

Durum 1 olmalı ve yazdırılan faz tek bir değerde sabitlenmelidir. Biraz bekleyin, ardından aynı komutu yeniden değerlendirin. Durum 2 olmalı ve faz, tutulan konumdan azalmaya başlamalıdır. Üçüncü değerlendirme alçalan taramayı duraklatır; dördüncüsü yeniden ileri yönde başlatır.

t_ öneki, t_step öğesini bir tetikleme kontrolüne dönüştürür. Bu değerin ayarlanması, kontrol hızında bir darbe oluşturur; böylece aralarında normal aralıklar bırakarak yapılan değerlendirmelerde her seferinde ayrıca sıfır göndermek gerekmeden aynı komut tekrar kullanılabilir. SynthDef tetikleme kontrolü belgeleri

Örnek bir zamanlama hesabına göre, sekiz saniyelik bir döngü her saniye aralığının 0.125’i kadar ilerler. Bu nedenle iki saniye sonra duraklatıldığında konum yaklaşık 0.25 olur. Duraklama süresi ne olursa olsun, bir saniyelik geriye doğru hareket konumu yaklaşık 0.125’e getirir. Bunlar hesaplanan beklentilerdir; gerçek durma konumunu komutları elle ne zaman verdiğiniz belirler.

Bitirmek için temizleme komutunu değerlendirin:

~pauseReverseSynth.free;
Bölüm 5

Konumun Gerçekten Sabit Kaldığını Nasıl Doğrulayabilirsiniz?

Temel tanılama aracı olarak yazdırılan faz değerini kullanın. İleri hareket sırasında artmalı; bekleme durumlarının ikisinde de sabit kalmalı; geriye doğru hareket sırasında ise döngü sınırına ulaşana kadar azalmalıdır.

Yama saniyede iki kez çıktı verir; bu nedenle ekranda her örnek değil, davranışın belirli aralıklarla alınmış değerleri gösterilir. Duraklama sırasında art arda gelen birkaç okumayı gözlemleyin, ardından devam ettikten sonraki ilk azalan okumalarla karşılaştırın. Poll, birim üreteci değerlerinde hata ayıklamak için tasarlanmıştır; tanımı normal kullanım için uyarlarken iki yoklama satırını kaldırın. Poll belgeleri

Bu test, yalnızca dinlemekten daha fazla bilgi verir. Sesin sabit kalması, hedef değerinin artık değişmediğini gösterir; sabit faz okuması ise altta yatan konumun da durduğunu doğrular. Test boyunca eşlemeyi sabit tutmak sonucu yorumlamayı kolaylaştırır.

Bölüm 6

Yama Neden Yeniden Başlıyor, Sıçrıyor veya Bir Tetiklemeyi Kaçırıyor Olabilir?

Devam ettiğinizde başa dönüyor. Olayın Phasor’ın tetikleme girişine de ulaşıp ulaşmadığını kontrol edin. Bu giriş konumu açıkça sıfırlar. Bu yamada giriş sıfırda kalırken olaylar yalnızca durum sayacına gider. Phasor belgeleri

Bir uç noktaya ulaştıktan sonra sıçrıyor. Bu örnek bilerek döngü oluşturur. Uygulama, negatif yönde hareket sırasında da fazı yapılandırılmış aralığa sarar. Geriye doğru hareket sıfırı geçince faz üst sınıra yakın bir değere döner ve bu rampa eşlemesiyle perdede sıçrama oluşur. Önce duraklama ve yön değiştirmeyi bu sınırdan uzakta deneyin. Phasor uygulaması

Arka arkaya verilen hızlı komutlar birden fazla durum oluşturmuyor. Sayacın artması için birbirinden ayrı yükselen geçişler gerekir. Tetikleme kontrolleri kontrol hızında çalışır; bu nedenle tek bir kontrol bloğu içinde gelen birden fazla komutun ayrı olaylara dönüşeceğini varsaymayın. Önce komutları bilinçli aralıklarla verin; sık zamanlanmış diziler için olay kaynağını ayrı darbeler oluşturacak şekilde tasarlayın. PulseCount belgeleri, SynthDef belgeleri

Faz sabitken ses değişiyor. Hedef eşlemeyi veya başka bir ses parametresini de değiştirip değiştirmediğinizi kontrol edin. Bu testte perde uç noktalarını sabit bırakın ve modülasyon aktarımını tek başına incelemek için yazdırılan fazı kullanın.

Tamamlanan hareket sırası ileri, bekleme, geri, bekleme ve yeniden ileridir. Bu sıra doğru çalıştığında durum sayacını ve faz üretecini yeniden kullanılabilir bir modülasyon kaynağı olarak koruyun ve hedef eşlemeyi oluşturduğunuz sese göre değiştirin.

Bölüm 7

Kaynaklar

İlgili okumalar

Bu konuyu keşfetmeye devam et