- Rust 99.5%
- Nix 0.4%
- Shell 0.1%
A 4 Deck DJ Software for Linux in the making
Screenshot of the guiScreenshot of the gui Screenshot of the gui Screenshot of the gui
Talk
I held a talk about LibreDJ at the Quellcode. I presented the project's idea & philosophy and how I'm using it to DJ/perform with.
Goals
- 4 Decks
- Good beat jumping/looping
- Good performance
- Low latency
- As best as possible playback/resampling
- Minimal & clean user interface
- Good library management
- Completely usable with Keyboard
Non-Goals
- No mixing/eq/effects. Use an external mixer or something like equis
- Session management. Use qpwgraph for this
- Radio Broadcasting
- Stem seperation (I'm up to support stem files though)
- Rekordbox/Serato export/import
- If there's a good crate, maybe though
Supported Hardware
- Denon SC2000
How to run
Make sure you have pipewire/jack installed and a rust compiler.
- git clone the repo
- PIPEWIRE_QUANTUM=256 PLAYLISTS=/path/to/playlists LIBRARY=/path/to/your/music cargo run --release
Configuration
Supported environment variables:
LIBRARY=/path/to/your/libraryRoot path of library. LibreDJ will read from this directory.PLAYLIST=/path/to/your/playlistsPath where playlists are loaded from (and saved to)HISTORY=/path/to/your/historyIf set, history.m3u will be saved hereBINDING=fr_FRSet path from which a keyboard bindings file should get loadedSHOW_FPS=on|offDisplay FPS & frame time information in top bar
Keybindings
By default, the bindings are (for en_US keyboard) :
Esc=> Open MenuArrow Keys=> navigate library/file browser/popupEnter=> Load track to current DeckF1-F4=> Switch between Deck 1-4q=> Cuew=> Playa s d f=> Nudgingz x c v=> Adjusting Pitchi o p [ ]=> Set loop starting at current playheadI O P { }=> Set loop endingt at current playheadn m , . /- => Jump x beats forwardN M < > ?=> Jump x beats backwardsSpace=> Switch waveform zoom-=> Zoom out of Waveform==> Zoom in on WaveformF11=> Toggle fullscreen
To quit the program first press Esc, then q.
Customize Keybindings
The Keybindings are almost completely customizable. To do so, copy any existing binding to a new ron file (https://github.com/ron-rs/ron). Then select the keyboard binding file by setting the env variable BINDING.
- git clone the repo
- PIPEWIRE_QUANTUM=256 BINDING=/path/to/your/bindings.ron gui
Some alternatives layouts are provided in resources/keyboard_bindings. We currently support de_DE, fr_FR and en_US.
You can extend/alter the bindings map. Please have a look at the file and if you have questions feel free to ask.
Hacking
Hot Reloading
With the help of the subsecond crate of dioxus we can have hot reloading in the gui.
- Make sure you configured your rustc to use the mold linker
- Install dioxus cli with
cargo install dioxus-cli --version <CURRENTSUBSECONDVERSIONSEECARGOTOML> - Wrap any code with
crate::hotreload(|| { <YOURCODE> } )to enable hot reloading for this code - Run the gui with
dxExample:PIPEWIRE_QUANTUM=256 PLAYLIST=/home/foo/Musik/Techno/Playlists/ LIBRARY=/home/k/Musik/Techno HISTORY=/home/foo/Musik/Techno/Playlists/History pw-jack dx serve --hot-patch --features hotreload