WaveSurfer.js v7 kullanılacak. CDN üzerinden yüklenecek, npm install'a gerek yok.
Mevcut player.blade.php içindeki progress bar yerine WaveSurfer entegre edilecek.
Değiştirilecek Alan:
Satır 449-456 arası: .player-progress-bar div'i
Mevcut sistemde Howler.js kullanılıyor. WaveSurfer sadece görselleştirme yapacak, ses çalma Howler.js'te kalacak.
resources/views/themes/muzibu/layouts/app.blade.php dosyasına WaveSurfer.js CDN'ini ekleyeceğiz.
Konum: <head> bölümü, diğer script'lerden önce
CDN URL:
https://unpkg.com/wavesurfer.js@7
Mevcut progress bar yerine WaveSurfer container ekleyeceğiz.
Değişim:
• Eski: <div class="player-progress-bar">
• Yeni: <div id="waveform-container">
Alpine.js'in init() fonksiyonunda WaveSurfer instance'ı oluşturulacak.
Temel Ayarlar:
container: '#waveform-container'waveColor: '#4b5563' (gri, henüz çalınmamış kısım)progressColor: '#1DB954' (yeşil, çalınan kısım)cursorColor: '#ffffff' (beyaz cursor)barWidth: 2 (dalga çubuğu genişliği)barGap: 1 (çubuklar arası boşluk)height: 60 (piksel, responsive olacak)backend: 'WebAudio' (en iyi performans)interact: true (tıklama ile seek)Her şarkı değiştiğinde WaveSurfer'a yeni ses dosyası yüklenecek.
Çalışma Mantığı:
wavesurfer.load(url) çağrılırready event'i tetiklenirWaveSurfer sadece görsel, playback Howler.js'te. İkisi senkronize çalışacak.
Senkronizasyon Noktaları:
requestAnimationFrame loop'unda WaveSurfer güncellenirWaveSurfer'ın event'lerini dinleyip uygun aksiyonlar alacağız.
Dinlenecek Event'ler:
ready: Waveform hazır, loading kaldırloading: Yükleniyor, progress gösterclick: Kullanıcı tıkladı, seek yaperror: Hata oluştu, fallback gösterWaveSurfer container'ını mevcut player tasarımına uygun şekilde stilize edeceğiz.
Tasarım İlkeleri:
Mobil cihazlarda daha küçük, masaüstünde daha büyük waveform.
Breakpoint'ler:
WaveSurfer yüklenemezse veya hata verirse eski progress bar gösterilecek.
Canlıya çıkmadan önce kapsamlı test.
Test Senaryoları:
WaveSurfer instance'ı Alpine.js'in $refs içinde saklanacak.
Örnek Yapı:
this.wavesurfer: WaveSurfer instancethis.isWaveformReady: Boolean (hazır mı?)this.waveformError: Boolean (hata var mı?)Waveform rendering performanslı olmalı, UI donmamalı.
Optimizasyon Stratejileri:
requestAnimationFrame kullanımı (smooth progress)Şarkı değiştikçe eski waveform temizlenmeli (memory leak önleme).
Cleanup İşlemleri:
wavesurfer.destroy()Sorun: Büyük ses dosyaları (5+ MB) waveform oluştururken yavaş olabilir.
Çözüm:
• Loading skeleton göster
• barWidth: 2 (daha az detay = daha hızlı)
• Backend'de pre-generated waveform JSON'ları (ileride)
Sorun: HLS stream'ler (m3u8) direkt WaveSurfer ile kullanılamaz.
Çözüm:
• WaveSurfer için direkt MP3/M4A URL'i kullan
• HLS sadece Howler.js için
• Dual source: HLS (playback) + MP3 (waveform)
Sorun: Ses dosyası farklı domain'deyse CORS hatası verebilir.
Çözüm:
• crossOrigin: 'anonymous' ayarı
• Backend CORS header'ları düzenle
• Proxy kullan (gerekirse)
Backend'de şarkı yüklenirken waveform JSON'u oluştur, frontend'de direkt yükle (çok daha hızlı).
Şarkının intro, verse, chorus kısımlarını işaretle (müzik teorisi analizi gerekir).
WaveSurfer'ın minimap plugin'i ile tüm şarkıyı küçük bir preview'da göster.
Waveform yerine spektrogram gösterimi (frekans analizi).