Skip to content

Latest commit

 

History

36 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Aura - Minimalistički DJ softver

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.

Motivacija

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.

Opis problema

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

Predlog rešenja

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.

Podsistemi

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

Alati / Biblioteke / Framework-ovi

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

Akademske informacije

Projekat je osmišljen za ocenu 10, a planirana je implementacija minimalnog podskupa (ili svih) funkcionalnosti potrebnih za postizanje te ocene.

Implementacija

Trenutni izgled korisničkog interfejsa:

UI

File Explorer

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.

Informacije o trenutnom stanju deck-ova

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)

MIDI kontrole

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)

Opis rada aplikacije

Tok rada aplikacija na visokom nivou prikazan je na dijagramu:

app-diagram

Aplikacija se sastoji od 4 glavna thread-a koji međusobno komuniciraju putem MCPC kanala.

  1. MIDI Input Thread služi za dekodiranje ulaza sa MIDI kontrolera. Nakon dekodiranja o unetoj akciji obaveštava MIDI Processing Thread.
  2. 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.
  3. 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.
  4. 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.

Poređenje sa specifikacijom

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.

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages