BA Barış Akın~/blog

·6 dk okuma·75 okunma

BarisAMP: Rust ile yazılmış ücretsiz gitar amfisi, pedal ve NAM eklentisi

Devreden hesaplanan JCM800 ton katı, NeuralAmpModelerCore ile örnek örnek eşleşen NAM çıkarımı, sıfır gecikmeli kabin konvolüsyonu ve öğrenen 12 bantlı gürültü bastırıcı: BarisAMP'in içinde neler var, VST3, CLAP ve AU olarak nasıl paketleniyor.

BarisAMP: Rust ile yazılmış ücretsiz gitar amfisi, pedal ve NAM eklentisi

BarisAMP, tek bir uygulamada eksiksiz bir gitar rig'i: amfi, pedallar, kabinler ve nöral amfi yakalamaları. macOS ve Windows'ta tek başına uygulama olarak ya da VST3, CLAP ve (macOS'ta) Audio Unit eklentisi olarak çalışıyor. Ücretsiz; indirme sayfası barisamp.baltavista.com.

Bu yazıda programın içine bakacağım: amfi modelinin devreden nasıl hesaplandığına, NAM yakalamalarının nasıl çalıştırıldığına, sıfır gecikmeli kabin konvolüsyonuna, öğrenen gürültü bastırıcıya ve eklentinin DAW'lara nasıl paketlendiğine. Kod Rust ile yazıldı; eklenti tarafında nih-plug, arayüzde egui var.

BarisAMP arayüzü: altın renkli amfi paneli, altında pedal, efekt ve EQ sıraları

Sinyal zinciri

Denoise → Gate → Comp → Wah → Pitch → Swell → Drive → Amp / NAM
        → Cabinet → EQ → Mod → Delay → Reverb → Looper → Limiter

Kabine kadar her şey mono: arabirimin bütün giriş kanalları toplanıyor, böylece gitar hangi girişe takılıysa çalıyor. Modülasyon, ping-pong delay ve reverb'ler sinyali stereo yapıyor. Modülasyon istenirse amfiden önceye, bir pedal gibi alınabiliyor.

Amfi modeli

Yerleşik amfi bir JCM800'ün yapısını izliyor: iki triode preamp katı, pasif ton katı ve bir power amp. Her triode katı asimetrik bir yumuşak kırpıcı:

fn triode(x: f32, bias: f32) -> f32 {
    (x + bias).tanh() - bias.tanh()
}

bias, lambanın grid bias'ı gibi çalışma noktasını kaydırıyor. Eğri sıfırın etrafında simetrik olmadığı için çift harmonikler çıkıyor; sondaki - bias.tanh() de oluşan DC'yi geri alıyor. Katların arasında gerçek amfideki kuplaj kondansatörlerinin yerini tutan 30 Hz'lik yüksek geçiren ve tizleri yumuşatan alçak geçiren filtreler var.

HIGH ve LOW girişleri de bir JCM800'deki gibi: LOW girişi ilk triode katını atlayıp yerine sabit, doğrusal bir kazanç koyuyor. Daha temiz ve daha sessiz bir ses.

Kırpma doğrusal olmayan bir işlem ve sinyale Nyquist'in üstünde harmonikler ekliyor. Bunlar örnekleme hızında geri katlanıp (aliasing) metalik bir pürüz yapıyor. Bu yüzden amfi ve drive pedalları 4 kat yüksek örnekleme hızında çalışıyor: sinyal sıfır doldurularak dört katına çıkarılıyor, 8. dereceden Butterworth filtrelerle süzülüyor, işleniyor ve aynı filtreyle geri indiriliyor.

Ton katı devreden hesaplanıyor

Birçok amp simülatörü BASS, MIDDLE ve TREBLE'ı üç ayrı EQ bandı olarak yapar. Gerçek amfide öyle değil: Fender, Marshall ve Vox'taki pasif "FMV" ton katında üç pot birbirini etkiler ve hepsi ortadayken bile orta frekanslarda bir çukur oluşur.

BarisAMP bu devreyi D. Yeh ve J. O. Smith'in "Discretization of the '59 Fender Bassman Tone Stack" makalesindeki gibi modelliyor. Devrenin üçüncü dereceden analog transfer fonksiyonu, parça değerlerinden ve pot konumlarından doğrudan hesaplanıyor, sonra bilineer dönüşümle sayısala çevriliyor. Kullanılan değerler JCM800'ün ton katı: 220k treble, 1M bass, 22k middle potu, 33k eğim direnci, 470 pF ve iki 22 nF. Bir pot çevrildiğinde katsayılar yeniden hesaplanıyor.

Pasif ton katı sinyali epey zayıflatır; gerçek amfide bunu ardından gelen kat telafi eder. Burada da ton katı bütün potlar ortadayken 1 kHz'deki kaybı ölçülüp geri veriliyor.

Neural Amp Modeler

Yerleşik amfinin yanında, AMP seçicisi NAM'a çevrilince Neural Amp Modeler yakalamaları yüklenebiliyor. NAM, gerçek bir amfiden kaydedilmiş giriş ve çıkış sinyalleriyle eğitilmiş bir sinir ağı; topluluğun paylaştığı binlerce .nam dosyası var.

Çıkarım kodu NeuralAmpModelerCore'dan (MIT) Rust'a taşındı: WaveNet (standard, lite, feather, nano), LSTM ve A2 kap biçimi. Taşımanın doğruluğu testlerle kontrol ediliyor: örnek modellere aynı giriş veriliyor ve çıkışın NeuralAmpModelerCore'un çıkışıyla örnek örnek eşleşmesi bekleniyor.

Birkaç pratik ayrıntı:

  • Ses seviyesi. Modellerin çıkış seviyeleri birbirinden çok farklı olabiliyor. Dosyada loudness bilgisi varsa model -18 dB'ye normalize ediliyor; yoksa, NAM eğiticisinin kullandığı standart giriş sinyali modele çalınıp seviye ölçülüyor.
  • Örnekleme hızı. Model 48 kHz'de eğitildiyse ve DAW 44.1 kHz'de çalışıyorsa sinyal modelin hızına çevrilip geri çevriliyor.
  • Hız. WaveNet'in yükü dilate edilmiş konvolüsyonlar. Apple Silicon'da bunlar 4 çıkış × 16 örneklik karolar halinde hesaplanıyor; toplamlar NEON yazmaçlarında tutuluyor ve çekirdeğin FMA tepe hızına yaklaşıyor. Bu değişiklik WaveNet'i yaklaşık 2.3 kat hızlandırdı. Apple M4'te standart bir WaveNet bir çekirdeğin yaklaşık %2'sini kullanıyor, yerleşik amfi %1'in altında.

GPU'yu denemedim bile: ses tamponu boyutlarında GPU'ya gidip gelmek işin kendisinden pahalı ve zamanlaması garanti değil.

On drive pedalı

Her pedal klasik bir devrenin sadeleştirilmiş modeli: kazanç katının etrafındaki filtreleme, kazancın kendisi ve kırpmanın türü.

PedalEsin kaynağıKarakter
ScreamerIbanez TS808yalnızca ortalar, op-amp geri beslemesinde yumuşak kırpılıyor; temiz sinyal geri karışıyor
TransparentKlon Centaurtemiz yol ile germanyum kırpılan yolun karışımı
BluesBoss BD-2iki ayrık kat, asimetrik yumuşak kırpma
RodentProCo RATkazanç arttıkça bant genişliği daralan op-amp, toprağa sert diyot kırpma
Dist OneBoss DS-1transistör boost, sert silikon kırpma, ortası oyuk ton
FuzzBig Muffart arda iki kırpma katı
Yellow 250DOD 250~720 Hz üstünde kazancı artan 741, silikon diyotlar
Fuzz FaceDallas Arbitergeri beslemeli germanyum çifti, yuvarlak ve yamuk kırpma
Treble BoosterRangemasterüst ortaları yükseltip hafifçe doyuran tek germanyum transistör
Clean BoostMXR Micro Amp0 ile +20 dB arası düz kazanç

Pedalların doğal seviyeleri çok farklı olduğu için her birinin bir çıkış katsayısı var; yarım DRIVE'da hepsi birim kazanca yakın çalıyor, pedal değiştirince ses birden patlamıyor.

Sıfır gecikmeli kabin

Kabin sesi impulse response (IR) konvolüsyonuyla yapılıyor. 21 IR gömülü geliyor (Greenback'li bir Marshall 1960AX, V30'lu bir 4x12 ve diğerleri); kendi WAV dosyalarınızı da yükleyebilirsiniz.

Uzun bir IR'yi örnek örnek konvolüsyonla işlemek çok pahalı, FFT ile işlemek ise bir blokluk gecikme ekler. BarisAMP ikisini birleştiriyor:

  • IR'nin ilk 64 örneği doğrudan FIR olarak hesaplanıyor, yani çıkış hiç beklemiyor.
  • Geri kalanı 64'lük parçalara bölünüp overlap-save FFT konvolüsyonuyla işleniyor. Kuyruktaki her parça yalnızca tamamlanmış giriş bloklarına ihtiyaç duyduğu için o da gecikme eklemiyor.

Öğrenen gürültü bastırıcı

Yüksek gain'de en büyük dert hışırtı. Klasik noise gate nota çalarken açılır ve o sırada hışırtının hepsini geçirir. BarisAMP'teki DENOISE başka türlü çalışıyor:

  1. Sinyal 150 Hz ile 10 kHz arasındaki kesim noktalarıyla 12 banda bölünüyor. Bölme sıfır gecikmeli Linkwitz-Riley (24 dB/oktav) filtrelerle yapılıyor ve her bant üstündeki kesimlerin allpass'larından da geçiyor; böylece bantlar toplandığında genlik düz kalıyor.
  2. LEARN'e basınca, teller susarken 2 saniye boyunca her bandın gürültü seviyesi ölçülüyor.
  3. Çalarken her bant, öğrenilen gürültü seviyesine yaklaştıkça 3:1 oranında yumuşakça kısılıyor.

Sonuç: bir nota sürerken, notanın ulaşmadığı yüksek bantlardaki hışırtı da bastırılmaya devam ediyor.

Gerisi

Pedal, auto ve LFO wah; octave, Octavia, harmonizer ve whammy; Slow Gear tarzı volume swell; chorus, flanger, phaser, tremolo, Uni-Vibe ve ayrı korna ve davullu rotary hoparlör; analog, tape, dijital, ping-pong, Echorec tarzı çok kafalı ve ters delay (tap tempo ve DAW temposuna senkron); room, hall, plate, spring ve shimmer reverb (freeze ile). Üstüne kromatik akort aleti, 60 saniyelik overdub'lı looper, canlı spektrumlu 8 bantlı EQ, kompresör ve limiter. Fabrika preset'leri arasında Gilmour, Malmsteen, Metallica ve Slayer'dan esinlenen sesler var.

Ses thread'inin kuralları

Ses thread'i bellek ayırmıyor; debug derlemelerinde nih-plug'ın assert_process_allocs özelliği bunu denetliyor. IR ve NAM modeli yüklemek başka bir thread'de yapılıyor, hazır olan nesne ses thread'ine yalnızca takas ediliyor. Böylece çalarken yeni bir model yüklemek ses kesintisi yapmıyor.

VST3, CLAP ve Audio Unit

Eklentinin kendisi nih-plug'ın derlediği CLAP. nih-plug'ın kendi VST3 çıktısını kapattım, çünkü kullandığı VST3 bağlayıcıları GPLv3. Onun yerine clap-wrapper, Steinberg'in VST3 SDK'sı ve Apple'ın AudioUnitSDK'sı ile CLAP'i VST3 ve AUv2 olarak sarıyor. clap-wrapper'a küçük bir yama uyguluyorum: Logic'in doğrulaması için kanal düzenlerini (1→2, 2→2, 1→1) bildiriyor, sürüm numarasını AU sürümüne taşıyor ve VST3 durumu yüklendikten sonra parametre değerlerini geri okuyor.

Değişmemesi gereken şeyler de var: VST3 sınıf kimliği ve AU kimlikleri ("aufx", "Bamp", "Bars") ilk sürümden beri aynı. Değişselerdi DAW'lar eski projelerde eklentiyi bulamazdı. Sürümler auval -strict ve Steinberg'in validator'ı ile doğrulanıyor; Windows VST3'ü ayrıca GitHub Actions'ta test ediliyor.

macOS paketleri Apple Silicon için (macOS 11 ve sonrası), Windows paketleri 64 bit Windows 10 ve 11 için. Windows sürümleri macOS'tan mingw-w64 ile çapraz derleniyor.

Deneyin

BarisAMP'i barisamp.baltavista.com adresinden indirebilirsiniz. Bir NAM yakalaması yükleyip arkasına sevdiğiniz bir kabin IR'si koymak, başlamak için iyi bir yol.

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.