Aura predstavlja minimalistički DJ softver, napisan u programskom jeziku Rust, sa fokusom na obradu zvuka u realnom vremenu. Projekat nudi desktop aplikaciju za DJ-ing, koja podrazumeva analizu i vizuelizaciju audio fajlova, operacije nad njima, podršku za MIDI kontrolere i sinhronizaciju tempa. Osmišljen je kao lagan osnovni alat za DJ-eve, ali može se upotrebiti i kao osnova za dalji razvoj kompleksnijih rešenja.
Inspiracija za alatom potiče iz sopstvenog hobija, za koji nisam uspeo da pronađem alat koji je jednostavan, efikasan, bez suvišnih funkcija i koji može da se koristi na svim operativnim sistemima. Smatram da je Rust adekvatan programski jezik za ovaj problem, s obzirom da pruža dobre performanse u konkurentnom izvršavanju, što je ključno za stabilnu obradu zvuka u realnom vremenu.
- Većina rešenja prisutnih na tržištu je zatvorenog koda, neproširiva i preopterećena funkcijama koje se većinom ne koriste. Sa druge strane jedino rešenje otvorenog koda Mixx, pomalo zaostaje za modernim standardima ostalih komercijalnih rešenja.
- Audio obrada u realnom vremenu, na ovakav način, zahteva istovremeno dekodiranje, analizu, vizuelizaciju i sinhronizaciju audio fajlova uz minimalno kašnjenje i kao takva predstavlja kompleksan inženjerski problem.
- Komercijalna rešenja su uglavnom preskupa za početnike i ljude koji se ovim bave iz hobija, što ograničava pristup kvalitetnim alatima.
Sistem bi podžavao sledeće funkcionalnosti:
- Istovremena reprodukcija i miksovanje dve audio trake sa minimalnim kašnjenjem.
- Podrška za popularne audio formate (za početak .mp3, .m4a) i njihova konverzija u PCM format radi dalje obrade.
- Osnovne operacije kao što su Play, Pause, Cue, podešavanja tempa, Sync, EQ.
- Automatsko računanje BPM-a, prepoznavanje beat-grid-a i generisanje vizuelnog prikaza u vidu waveform-a.
- Integracija sa standardnim MIDI DJ kontrolerima.
- Minimalan interfejs sa vizuelizacijom trenutnih traka i upravljanjem muzičkom bibliotekom (pretraga audio fajlova u fajl sistemu).
- Keširanje analiziranih podataka o trakama u bazi podataka.
Sistem će ugrubo biti podeljen na sledeće podsisteme:
- Audio I/O i miksovanje
- Dekodiranje audio fajlova
- Analiza audio fajlova
- MIDI I/O
- UI
- Perzistencija podataka o trakama
U nastavku je navedena lista biblioteka i alata koji su neophodni za implementaciju sistema. Napomenuo bih da lista nije konačna i moguće je njeno proširenje prilikom implementacije.
- midir - biblioteka za MIDI I/O
- audio-visualiser - biblioteka za vizuelizaciju traka
- rodio - biblioteka za audio playback
- aubio_rs - biblioteka za analizu audio fajlova
- iced - biblioteka za GUI
- dasp - biblioteka za operacije nad audio fajlovima
- rusqlite - biblioteka za perzistenciju podataka
- Po potrebi ostale biblioteke iz RustAudio kolekcije
Projekat je osmišljen za ocenu 10, a planirana je implementacija minimalnog podskupa (ili svih) funkcionalnosti potrebnih za postizanje te ocene.
Trenutni izgled korisničkog interfejsa:
Korisnički interfejs omogućava navigaciju kroz fajl sistem i odabir audio traka za reprodukciju. Pored navigacije kroz direktorijume, File Explorer prikazuje isključivo podržane audio datoteke i njihove metapodatke, kao što su BPM (beats per minute) i dužina trajanja, ostale nepodržane datoteke neće biti prikazane.
Analiza metapodataka (BPM, dužina) vrši se prilikom prve reprodukcije fajla. Ukoliko fajl još uvek nije nijednom reprodukovan, biće prikazane podrazumevane vrednosti (npr. 0). Da bi se izbegla ponovna analiza pri svakom pokretanju, aplikacija kešira (skladišti) prethodno analizirane podatke u lokalni fajl.
Odabrani audio fajl se može učitati na levi ili desni dek klikom na dugmad Load 1 (levi dek) i Load 2 (desni dek).
Dugme Up služi za povratak u roditeljski direktorijum, dok Exit zatvara aplikaciju.
Za svaki aktivni dek (levi i desni) prikazuju se sledeće informacije u realnom vremenu:
- Stanje (PLAYING / PAUSED)
- Naziv fajla koji se reprodukuje
- Trenutni BPM, bazni BPM i brzina reprodukcije (pitch)
- Trenutna glasnoća (volume)
- Trenutna pozicija u odnosu na ukupno trajanje trake
- Vizuelni prikaz (Waveform)
Napredne funkcionalnosti aplikacije zahtevaju MIDI kontroler. Trenutno je zvanično podržan Hercules DJControl Inpulse 200 MK2.
Podrška za druge kontrolere se može jednostavno dodati definisanjem mapiranja MIDI komandi na interne poruke sistema unutar mapping crate-a.
Funkcionalnosti podržane putem MIDI kontrolera uključuju:
- Play / Pause
- Low i High EQ kontrole (podešavanje niskih i visokih frekvencija)
- Precizno pretraživanje trake (seek) pomoću jog wheel-a
- Podešavanje tempa (pitch/BPM)
- Kontrola glasnoće (volume) za svaki dek
- Cue-ing (preslušavanje na slušalicama)
Tok rada aplikacija na visokom nivou prikazan je na dijagramu:
Aplikacija se sastoji od 4 glavna thread-a koji međusobno komuniciraju putem MCPC kanala.
- MIDI Input Thread služi za dekodiranje ulaza sa MIDI kontrolera. Nakon dekodiranja o unetoj akciji obaveštava MIDI Processing Thread.
- MIDI Processing Thread na osnovu dobijenih komandi ažurira stanje kontrolera i komunicira sa Audio izlazom, te na osnovu komandi počinje sa reprodukcijom, podešava brzinu reprodukcije, glasnoću itd. On stanje kontrolera dalje šalje na obradu Progress Thread-u.
- Progress Thread pomera pokazivač pozicije u stanju kontrolera i agregira prethodne komande kako se ne bi gušio UI thread. MIDI kontroler proizvodi ogromnu količinu komandi u jedinici vremena, iz razloga što i najmanji pomeraj klizača, radi preciznosti, registruje kao ulaz. Ukoliko bi se ovakvi podaci odmah slali na UI Thread, on bi bio zagušen i kasnio bi sa prikazivanjem aktuelnih stvari. Agregacija se radi u vremenskom okviru od 50ms i dalje se konačno stanje šalje na prikaz UI Thread-u.
- UI Thread prikazuje dobijeno stanje, ali takođe može i da komunicira sa MIDI Processing Thread-om, kako bi obavestio aplikaciju ukoliko korisnik želi da pokrene reporudukciju nekog fajla koji je prethodno pretražio.
Implementirane su skoro sve stavke iz Predloga Rešenja. Izuzetak predstavlja detekcija beat grid-a i posledično Sync operacija. Pored toga, keširani podaci nisu skladišteni u bazi podataka, već u običnom tekstualnom fajlu.
Lista korišćenih biblioteka je malo izmenjena i konačan spisak se može videti u Cargo.toml fajlu.

