BA Barış Akın~/blog

·8 dk okuma·7 okunma

Aurora Synth: Rust ile yazılmış, makam akortlu ücretsiz bir wavetable synth, sampler ve modellenmiş piyano

Tek enstrümanda üç motor: mipmap'li wavetable'lar, SFZ sampler ve dalga kılavuzu tellerle modellenmiş bir piyano. Arel-Ezgi-Uzdilek komalarıyla makam akordu, kayıt kullanmadan sentezlenen bir koro ve CC0 kayıtlardan çıkarılan kanun, ud, bağlama ve ney. VST3, CLAP ve tek başına uygulama; macOS ve Windows.

Aurora Synth: Rust ile yazılmış, makam akortlu ücretsiz bir wavetable synth, sampler ve modellenmiş piyano

Aurora, tek bir enstrümanda üç ses motoru: wavetable synth, SFZ sampler ve fiziksel modelli bir piyano. Hepsi aynı filtrelerden, aynı modülasyon matrisinden ve aynı efekt rafından geçiyor; üstüne makam ve maqam akortları yerleşik. macOS ve Windows'ta VST3, CLAP ve tek başına uygulama olarak çalışıyor. Ücretsiz; indirme sayfası aurorasynth.baltavista.com.

Bu yazıda programın içine bakacağım: osilatörlerin aliasing'den nasıl kaçtığına, piyanonun tellerinin nasıl hesaplandığına, Arel-Ezgi-Uzdilek komalarının tuşlara nasıl dağıtıldığına ve kayıt kullanmadan bir koronun nasıl sentezlendiğine. Kod baştan sona Rust: eklenti tarafında nih-plug, arayüzde egui var. Toplam yaklaşık 15 bin satır.

Aurora arayüzü: üstte üç osilatör ve mikser, ortada filtre grafiği ve sürüklenebilir zarflar, altta LFO'lar, mod matrisi, efektler, osiloskop, spektrum ve klavye

Sinyal yolu

SYNTH  : OSC 1/2/3 + Sub + Noise + Ring ─┐
SAMPLED: SFZ sampler ────────────────────┼→ Filter 1 ⇄ Filter 2 → Amp → FX zinciri → Master
MODELED: dalga kılavuzu piyano ──────────┘

Motor seçimi Master panelinde: SYNTH, MODELED ya da SAMPLED. Arkadaki her şey ortak. Bu yüzden örneklenmiş bir kanun, bir supersaw lead ile aynı ladder filtreden, aynı mod matrisinden ve aynı OTT'den geçebiliyor. 94 fabrika preset'inin hepsi bu tek ses mimarisinin üstüne kurulu; ~245 parametrenin hepsi DAW'dan otomasyonla değiştirilebiliyor ve projeyle birlikte kaydediliyor.

Osilatörler ve wavetable'lar

Klasik dalga biçimleri (sinüs, üçgen, testere, kare) PolyBLEP ile üretiliyor: dalganın keskin köşelerinin hemen etrafına küçük bir polinom düzeltmesi ekleniyor, böylece Nyquist'in üstüne taşan harmonikler büyük ölçüde bastırılıyor.

Wavetable tarafında iş daha zor, çünkü dalga biçimi rastgele bir tek periyot ve içinde 1024 harmoniğe kadar her şey olabilir. Aurora her tabloyu oktav başına bir mipmap olarak saklıyor: m. seviyede yalnızca 1 ile 1024 >> m arasındaki harmonikler var. Osilatör çaldığı frekansa bakıp en üst harmoniği hâlâ Nyquist'in altında kalan seviyeyi seçiyor. Yüksek notalar daha az harmonikli bir kopyadan okunuyor ve geri katlanma olmuyor.

Altı yerleşik tablo var (Classic, Harmonic, Vocal, FM, Sync, Fold), her biri 16 kare; WT position mod matrisinin bir hedefi, yani bir LFO ya da zarfla tablonun içinde gezilebiliyor. WAV olarak dışarıdan tablo da yüklenebiliyor: Serum'un clm başlıklı 2048 örneklik kare biçimi, 256/512/1024 kare boyları ya da tek bir periyot.

Üstüne warp modları (Sync, Bend, Mirror, Squeeze/PWM, Quantize), faz modülasyonuyla FM (2→1, 3→2), OSC 1'e hard sync ve dedektörlü, stereo yayılımlı 7 sese kadar unison.

Filtreler

İki filtre seri ya da paralel (dengeli) bağlanabiliyor. Dokuz mod var:

  • SVF: LP24, LP12, BP, HP, Notch. Simper/Zavalishin'in TPT biçiminde, sıfır gecikmeli geri beslemeli (ZDF) durum değişkenli filtre; 24 dB/oktav için iki kat art arda.
  • Ladder: doymalı, ZDF Moog tarzı 4 kutuplu filtre.
  • Comb+ / Comb−: pozitif ve negatif geri beslemeli tarak filtreler.
  • Formant: A-E-I-O-U ünlüleri arasında cutoff ile gezinen sesli harf filtresi.

Drive ve doğrusal olmayan filtreler 2 kat yüksek örnekleme hızında çalışabiliyor (Off, Auto, Always). Auto, yalnızca drive açıkken ya da ladder gibi doymalı bir filtre seçiliyken açılıyor; temiz bir SVF için boşuna CPU harcanmıyor.

Arayüzdeki filtre grafiği bir çizim değil: filtre kodunun içinden, dijital transfer fonksiyonunun gerçek genliği hesaplanarak çiziliyor. Grafiğe tıklayıp sürükleyince cutoff ve rezonans değişiyor.

Modülasyon

Üç zarf (filtre, amp ve ayrı bir mod zarfı), beş şekilli ya da 16 adımlı çizilebilir iki LFO, dört makro düğmesi, velocity, mod wheel, aftertouch, tuş ve rastgele değer kaynak olarak kullanılabiliyor. 8 yuvalı matriste her yuvanın bir de Via ölçekleyicisi var: "LFO 1, mod wheel kadar pitch'e" gibi. Bir parametre modüle edildiğinde düğmesinin etrafında bir halka çıkıyor; halka hem modülasyon aralığını hem de anlık değeri gösteriyor.

Zarflar analog tarzı üstel eğrilerle çalışıyor ve arayüzde düğümleri sürüklenerek düzenlenebiliyor. Çalan seslerin zarf ve LFO konumları grafiğin üstünde canlı olarak görünüyor.

Modellenmiş piyano

MODELED motoru örnek kullanmıyor; her tuşta 1 ile 3 arası, hafifçe birbirinden akortsuz tel var (bas bölgede tek, ortada iki, tizde üç). Her tel bir dijital dalga kılavuzu: bir gecikme hattı ve hattı kapatan üç filtre.

  1. Kayıp filtresi. Tek kutuplu bir alçak geçiren; tiz harmonikler her turda biraz daha sönüyor, bu yüzden nota zamanla koyulaşıyor.
  2. Dağılım (dispersion) allpass'ları. Gerçek bir piyano teli sert olduğu için harmonikleri tam katlar değil, biraz yukarı gerilmiş. Zincirdeki dört taneye kadar birinci dereceden allpass bu gerilmeyi taklit ediyor.
  3. Thiran kesirli gecikmesi. Gecikme hattı tam sayı uzunlukta, ama doğru akort için kesirli bir uzunluk gerekiyor. Kalan kesri Thiran allpass'ı karşılıyor.

İnce nokta şu: kayıp filtresi de allpass'lar da sinyali bir miktar geciktiriyor ve bu gecikme frekansa bağlı. Hesaba katılmazsa tizler bariz şekilde pes çalar. Aurora her tel için bu filtrelerin temel frekanstaki faz gecikmesini tek tek hesaplıyor ve gecikme hattının uzunluğundan düşüyor:

let w = 2.0 * PI * f / sr;
let mut fixed = lp_delay(b, w);
for d in self.disp.iter_mut().take(n_disp) {
    d.a = disp_a;
    fixed += ap_delay(disp_a, w);
}
let total = sr / f - fixed;
let m = (total - 0.5).floor().max(2.0);
let frac = (total - m).clamp(0.1, 1.9);
self.thiran.a = (1.0 - frac) / (1.0 + frac);

Sönümleme süresi de tuşa göre değişiyor: en basta ~16 saniyeden en tizde ~1 saniyeye. Kayıp filtresi yüksek notalarda bu süreyi tek başına tüketmesin diye, temel frekanstaki kaybı bütçenin yarısını aşmayana kadar yumuşatılıyor.

Teli uyaran çekiç, velocity'ye bağlı bir yarım sinüs darbesi: sert vuruşlar daha kısa, dolayısıyla daha parlak darbe veriyor. Darbe, çekicin telin neresine vurduğuna göre (telin 1/16'sı ile 1/5'i arası) bir tarak filtreden geçiyor; bu, gerçek piyanoda vurma noktasındaki düğümlere denk gelen harmoniklerin eksik olmasını taklit ediyor. Sonra damper'lar (en üst oktavda gerçek piyanodaki gibi damper yok), sustain pedalı ve gövde rengini veren küçük bir rezonatör grubu geliyor.

Sampler

SAMPLED motoru bir SFZ okuyucu: bölgeler, velocity katmanları, döngüler ve döngü çapraz geçişleri, rt_decay'li release tetikleri, amp_veltrack, bölge başına alçak geçiren, lorand/hirand ile round-robin. Örnekler WAV ya da FLAC olabiliyor; x.wav diyen bir SFZ, x.flac dosyasını da buluyor. SFZ'si olmayan, A0v1.wav gibi adlandırılmış klasörler de dosya adından okunuyor.

İki pratik sorunu otomatik çözüyor:

  • Ses seviyesi. Farklı kütüphanelerin seviyeleri çok farklı. Aurora her setin ilk saniyesindeki en yüksek 50 ms'lik pencerenin RMS'ini ölçüp setleri Salamander piyanosuna göre eşitliyor. Pencere yaklaşımı hem tellerin çekildiği hem yayla çalındığı sesler için adil.
  • Bellek. Bazı kütüphanelerde 16 velocity katmanı var. Aurora fazlasını 6 katmana inceltiyor, ama bütün velocity aralığının hâlâ kapsandığından emin oluyor ve yalnızca kalan dosyaları belleğe yüklüyor.

Preset tarayıcısı: Lead, Pluck ve Bass kategorilerindeki preset'ler, üstte kategori filtreleri

Makam akordu

Yalnızca on iki nota değil, makam çalıyor. Bir makam ve kök nota seçince bütün motorlar (synth, sampler, piyano) o makamın aralıklarına akort ediliyor. Ekrandaki klavye her tuşun 12-TET'ten sapmasını sent olarak gösteriyor.

Türk makamları Arel-Ezgi-Uzdilek kuramındaki yerlerinde: oktav 53 Holder komasına bölünüyor (1 koma ≈ 22.64 sent) ve her makam, kökün üstündeki derecelerin koma cinsinden konumuyla tanımlanıyor:

const KOMA: f32 = 1200.0 / 53.0;

5 => &[5, 17, 22, 31, 40, 44],  // Hicaz: Hicaz dörtlüsü + Rast beşlisi
3 => &[9, 17, 22, 31, 40, 48],  // Rast: Rast dörtlüsü + Rast beşlisi

Her derece sente çevrilip en yakın klavye tuşuna yerleştiriliyor; tuşun ne kadar kaydırılacağı aradaki fark. Örneğin Re üstünde Hicaz'da Mi♭ +13 sent, Fa♯ −15 sent, Si +6 sent kayıyor. Sonuç, her MIDI notası için bir perde kayması tutan 128 girişlik bir tablo; motorlar bunu notalarına ekliyor.

Rast, Uşşak, Hicaz, Hicazkar, Saba, Hüseyni, Nihavend ve Kürdi'nin yanında çeyrek sesli Arap Bayati ve Rast, 5-limit saf akort ve Pisagor akordu var. Bunlar yetmezse Scala .scl dosyaları yükleniyor: 53-EDO, 24-EDO ya da istediğiniz herhangi bir dizi, oktav başına istediğiniz kadar notayla.

Kayıtsız bir koro

Voices paketindeki "Elven" koro ve solo soprano hiçbir kayıt içermiyor; tamamı bir Python betiğiyle toplamalı (additive) sentezle üretiliyor. Her nota bir topluluk: her şarkıcı için ayrı bir gırtlak benzeri harmonik kaynağı, kendi akortsuzluğu, vibratosu, perde kayması ve nefes gürültüsüyle.

Gerçekçiliği veren ayrıntı formantların nasıl uygulandığı. Ünlü harf formantları (örneğin "aah" için 850, 1220, 2810 Hz) her harmoniğin anlık frekansında hesaplanıyor. Vibrato bir harmoniği formant tepesine yaklaştırıp uzaklaştırdıkça o harmoniğin şiddeti de değişiyor; gerçek bir seste duyulan parıltı buradan geliyor. Sabit bir filtre bunu vermez.

Türk ve Arap çalgıları

Kanun, bağlama, ud, ney, darbuka ve def CC0 lisanslı kayıtlardan geliyor, ama bu kayıtlar hazır örnek setleri değil: bir kanunun kromatik gezinişi, bir ney taksimi. Başka bir Python betiği bunlardan enstrüman çıkarıyor: telli çalgılarda notaları atak (onset) tespitiyle, ney'de perdenin sabit kaldığı aralıkları izleyerek buluyor; her notanın perdesini ölçüp her yarım ses için en iyi alımı seçiyor ve kalan akortsuzluğu SFZ'deki tune ile düzeltiyor. Bu preset'lerin makam akortlu sürümleri de var: Sol üstünde Rast, La üstünde Uşşak, Hicaz ve Hüseyni, Re üstünde Bayati.

Efektler ve gerisi

Efekt zinciri çiplerden oluşuyor ve çipler sürüklenerek sıralanıyor: drive, bitcrusher, phaser, flanger, chorus, tempoya senkron ping-pong delay, 3 bantlı EQ, kompresör, OTT çok bantlı kompresör ve bir FDN reverb. Reverb'de predelay'in ardından dört difüzyon allpass'ı ve Householder geri besleme matrisli sekiz gecikme hattı var; her hatta ayrı sönümleme ve hafif bir modülasyon.

Bunlara ek olarak altı modlu, tempoya senkron bir arpejatör; 16 sesli poly, mono ve glide'lı legato; osiloskop, FFT spektrum analizörü ve stereo seviye göstergeleri; ekran klavyesi ve bilgisayar klavyesinden çalma var.

DAW'da ve DAW'sız

Ableton Live 12'de her izi bir Aurora örneği olan bir oturum; sağda Aurora'nın keman sampler'ı açık

Eklenti nih-plug ile VST3 ve CLAP olarak derleniyor; MIDI DAW'dan örnek doğruluğunda geliyor, arpejatör ve LFO'lar DAW temposunu izliyor. Ableton Live 12'de denendi; yukarıdaki oturumda her iz bir Aurora: örneklenmiş yaylılar, klavsen ve synth katmanları aynı anda çalıyor. AU sürümü henüz yok, bu yüzden Logic ve GarageBand yükleyemiyor; onlar için tek başına uygulama var.

Tek başına uygulamada ses cpal'den, MIDI midir'den geliyor ve bir MIDI dosya çalar yerleşik: bir .mid dosyasını pencereye sürükleyip hangi partilerin çalacağını seçebilir, tempoyu değiştirip üstüne klavyeden eşlik edebilirsiniz. Çok partili dosyalarda ana melodi otomatik seçiliyor. İki özelliğin de videosu sitede var.

macOS paketi Apple Silicon ve Intel için evrensel (lipo ile birleştirilmiş); Windows paketi macOS'tan mingw-w64 ile çapraz derleniyor. Örnek paketleri FLAC ve iki sistemde de aynı: Piyano (Salamander Grand ve Upright KW, ~93 MB), Orkestra (VSCO 2 CE yaylıları, nefeslileri, bakır üflemelileri ve klavseni, ~255 MB), World (~32 MB) ve Voices (~22 MB). Synth preset'leri hiçbir paket gerektirmiyor; paket isteyen preset'ler tarayıcıda işaretli.

Deneyin

Aurora'yı aurorasynth.baltavista.com adresinden indirebilirsiniz. Başlamak için iyi bir yol: Turkish & Arabic kategorisinden Hicaz akortlu bir kanun preset'i açıp ekran klavyesinde tuşların üstündeki sent sapmalarına bakmak.

BA
Barış Akın

25 yılı aşkın deneyime sahip yazılım çözümleri mimarı. FinTech ve dağıtık sistemler; OxiDB, Rill ve Cobra'nın geliştiricisi.