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, 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.

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
loudnessbilgisi 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ü.
| Pedal | Esin kaynağı | Karakter |
|---|---|---|
| Screamer | Ibanez TS808 | yalnızca ortalar, op-amp geri beslemesinde yumuşak kırpılıyor; temiz sinyal geri karışıyor |
| Transparent | Klon Centaur | temiz yol ile germanyum kırpılan yolun karışımı |
| Blues | Boss BD-2 | iki ayrık kat, asimetrik yumuşak kırpma |
| Rodent | ProCo RAT | kazanç arttıkça bant genişliği daralan op-amp, toprağa sert diyot kırpma |
| Dist One | Boss DS-1 | transistör boost, sert silikon kırpma, ortası oyuk ton |
| Fuzz | Big Muff | art arda iki kırpma katı |
| Yellow 250 | DOD 250 | ~720 Hz üstünde kazancı artan 741, silikon diyotlar |
| Fuzz Face | Dallas Arbiter | geri beslemeli germanyum çifti, yuvarlak ve yamuk kırpma |
| Treble Booster | Rangemaster | üst ortaları yükseltip hafifçe doyuran tek germanyum transistör |
| Clean Boost | MXR Micro Amp | 0 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:
- 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.
- LEARN'e basınca, teller susarken 2 saniye boyunca her bandın gürültü seviyesi ölçülüyor.
- Ç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.