İçeriğe geç
← Blog

Mac'te tek bir bas notasını kısmak

4 dk okuma

Çoğu odanın bir bas notasıyla arası fazla iyidir. Ses paralel duvarlar arasında gidip geliyor ve bazı frekanslarda yansımalar üst üste biniyor. Yanlış yere oturursan 40 ile 250 Hz arasında bir yerdeki tek bir nota, etrafındaki her şeyden çok daha yüksek çıkıyor. Filtre koduna bıraktığım yorumda da oda gümlemelerinin "genelde çevrelerinden 10 ile 15 dB yukarıda durduğu" yazıyor.

Bilinen çözümler bu soruna pek uymuyor. Bas ayarını kısarsan, tek bir notayı yola getirmek için bütün bas notalarını kısmış oluyorsun. Tam bir room correction paketi ise frekans cevabı grafiklerinden ve Q değerlerinden anlamanı bekliyor. Ben tam tersini istedim. O tek notayı bulsun, sadece onu kıssın ve aradan çekilsin. Unboom böyle ortaya çıktı.

Gümlemeyi bulmak

Tarama, 40'tan 250 Hz'e 14 saniyelik logaritmik bir sweep çalıyor ve Mac'in mikrofonuyla dinliyor. FFT yok. Dedektör her an hangi frekansı çaldığını tam olarak bildiği için sadece o frekansı ölçüyor. Bunu iki yanına koyduğu birkaç dar ölçüm noktasıyla yapıyor ve sonucu alakasız frekanslardan okuduğu gürültüyle karşılaştırıyor.

Bundan önce iki kontrol var. Önce tarama odanın iki saniye sessiz kalmasını bekliyor. Sonra döngüde çalan kısa bir sweep seviyeyi ayarlıyor. Ton mikrofona -45 ile -10 dB arasında ulaşmalı, bunu art arda iki kez tutturmalı ve iki ölçüm arasındaki fark 3 dB'yi geçmemeli. Sinyalin gürültüden 12 dB'den az yüksek olduğu okumalar çöpe gidiyor. Okumaların %15'inden fazlası gürültülüyse uygulama tahmin yürütmek yerine taramayı geçersiz sayıyor.

Temiz eğride analiz tarafı, komşularından en az 2,5 dB yükselen bir tepe arıyor. Tepenin ne kadar yükseldiğine göre Hafif (-6 dB), Orta (-9 dB) ya da Güçlü (-12 dB) seçiliyor. Odada ikinci, daha küçük bir gümleme varsa onu ikinci bir kesme halledebiliyor. Yeter ki ikisi üst üste binip bir çukur açmayacak kadar birbirinden uzak olsun.

Tarama net duyamazsa elle çalışan bir fallback var. Sweep çalarken gümlemeyi duyduğun anda "Gümleme bu" düğmesine basıyorsun. Mikrofon açıksa basış en yakın gerçek tepeye oturuyor. Kapalıysa 0,3 saniye artı çıkış gecikmesi kadar geri gidiyor, çünkü bir insan aşağı yukarı o kadar geç basıyor.

Her uygulamayı düzeltmek

Eskiden Mac'te bütün uygulamaların sesini düzeltmek istersen sanal bir ses sürücüsü kurman gerekiyordu. macOS 14.2 ile Core Audio'ya process tap geldi ve daha temiz bir yol açıldı. Benim kurduğum yol dört parçadan oluşuyor.

  • Private bir tap sistem miksini yakalıyor ve orijinal sesi susturuyor.
  • Bir audio unit tap'i okuyor, bir diğeri gerçek hoparlörlere çalıyor.
  • İkisinin arasında lock-free bir buffer duruyor.
  • Asıl işi, sadece kesen (cut-only) bir peaking filtre yapıyor.

Gecikmenin zarar vereceği uygulamaları tap'in dışında bıraktım. Bunlar müzik prodüksiyon uygulamaları, bir girişten kayıt yapan her şey ve VoiceOver. Tap üzerinden giden her yol gecikme ekler. Ben yaklaşık 45 ms ölçtüm. Müzik ve video için sorun değil ama gitar kaydı alan biri için olmaz.

Mac hiç susmamalı

Ses yolunun ortasında duran bir uygulama, kötü ses çıkarmaktan daha kötüsünü yapabilir. Mac'i tamamen susturabilir. O yüzden bütün tasarımı tek bir kural üstüne kurdum. Ne ters giderse gitsin, orijinal sesini duyacaksın.

Tap kaynağı sadece kendisi çalışırken susturduğu için, uygulama çökerse ya da kapanırsa ses doğrudan macOS'e geri dönüyor. Bir sağlık kontrolü yolu her 0,75 saniyede bir yokluyor. Çalma durduğu halde yakalama ilerlemeye devam ederse ya da tam tersi olursa ve bu yaklaşık iki saniye sürerse tap'i bırakıyor, ardından 2, 5 ve 15 saniye sonra yeniden deniyor. Düzeltmeyi kapattığında kesme bir anda kalkmıyor, yavaşça sönüyor. Böylece klik sesi duyulmuyor.

Kendi testini hak eden bug'lar

Commit log'daki en kötüleri şunlar.

  • Hoparlörler 44,1 kHz'deyken ses tamamen gidiyordu. Tap 48 kHz'de, hoparlörler 44,1'de çalışıyordu ve tap'e alınan uygulamalar susmuş halde kalırken her render çağrısı hata veriyordu. Artık yol çıkışın örnekleme hızına uyuyor, hızlar tutmazsa hiç başlamıyor.
  • Ses iki üç dakikada bir kopuyordu. Köprünün iki tarafı farklı saatlerle çalıştığı için buffer yavaş yavaş kayıyordu. Çözümü adaptif bir buffer oldu. Kopma olunca büyüyor, on dakika temiz geçince küçülüyor ve kaymayı kısa, faz hizalı eklemelerle düzeltiyor.
  • Uygulamanın iki kopyası açıkken birbirini düzeltiyordu. Artık sesi sadece bir kopya yönlendiriyor.
  • Uyku, uyanma ve örnekleme hızı değişikliklerinde yolu sıfırdan yeniden kuruyor. Yeniden kurulum başarısız olursa kontrol macOS'te kalıyor.

Bunların her biri bir teste dönüştü. Şu an yüzü aşkın test var. İsimleri testPlaybackStallReleasesTheTap ya da testFailedRebuildLeavesMacOSOutputRestored gibi ve hepsi istediğim anda bozulan sahte cihazlara karşı çalışıyor. Gerisini bir donanım kontrol listesiyle deniyorum. Şarkının ortasında kill -9 atıyorum, USB arayüzünü söküyorum, AirPods'a geçiyorum.

Rakamları saklamak

Bunların hiçbiri arayüzde görünmüyor. Unboom menü çubuğunda duran bir uygulama ve içinde tek bir aç/kapa düğmesi, bir oda taraması ve üç güç seviyesi var. Profiller çıkış cihazına bağlı, yani hoparlörden kulaklığa geçince doğru profil kendiliğinden devreye giriyor. Uygulamanın ilk planında kalın harflerle yazılmış tek bir fikir vardı. Aşırı sadelik. Yukarıda anlattığım her şey bunun bedeli.


Unboom, 14 günlük deneme süresiyle Mac App Store'da. Önce kendi odanın gümlemesini duymak istersen Boom Finder aynı sweep'i tarayıcında çalıştırıyor, bir şey indirmene gerek yok.