> [!WARNING] > > As of 2024-09-10, I'm working hard to bring this project back > to a usable state (as seen e.g. [here](https://mastodon.social/@unspeaker/112752419822653484)). > > I reached the limit of how much of the UI I can write imperatively, > and started refactoring it in a more declarative style. I'm quite > excited about how the interface logic is turning out! > > Your moral support means a lot to me. > Feel free to [contact me on Mastodon](https://mastodon.social/@unspeaker)! > > (Especially if you know how to host LV2 plugin UIs in `winit` 😁) > > - the author # tek Tek is a [MIDI](https://en.wikipedia.org/wiki/MIDI) sequencer, sampler, and plugin host for the Linux terminal. It's written in [Rust](https://www.rust-lang.org/), and targets [JACK](https://jackaudio.org/) (or [Pipewire](https://www.pipewire.org/)'s JACK implementation). My goal is to have a pop-up scratchpad for musical ideas that doesn't get in the way of building upon them. Kind of like [Ableton](https://www.ableton.com/) — but for free systems, and without all the bloat! Besides Ableton, I'm also inspired by the workflow of trackers and various old-school hardware sequencers (of which I've broken several). I've found that every existing music-making tool takes me about 80% of the way to the music I want to make. And so, after a decade of fucking around, I've decided it's finally time to make good on my old dream to build the instrument that will take me 100% there. A secondary goal is to make my music making environment extensible, programmable, and interoperable; the intended project format is an [S-expression](https://en.wikipedia.org/wiki/S-expression)-based notation ([EDN](https://en.wikipedia.org/wiki/Clojure#Extensible_Data_Notation), [Steel](https://github.com/mattwparas/steel), or similar... though I've also been looking for an excuse to embed a [Forth](https://en.wikipedia.org/wiki/Forth_(programming_language)) 😏) You can follow my progress, my tragicomical struggles with maintaining mental health as a rogue knowledge worker in a cyberpunk dystopia, and various other trials'n'tribulations, on [Mastodon](https://mastodon.social/@unspeaker). --- See `demos/project.edn` for the initial contents of the session. ## Requirements * Linux * Rust toolchain * JACK or Pipewire ### Recommended * MIDI controller * Samples at ~/Lab/Music/pak * Odin2 LV2 ~/.lv2/Odin2.lv2 ## Overview Tek is inspired by "clip launching" workflows as exemplified by Ableton Live, Bitwig Studio, Ardour, and probably others. The main view consists of three sections: * The **arranger view** corresponds to Ableton's Session and Arrangement views. It allows you to put together a musical composition as a sequence of **phrases**, playing simultaneously across multiple **tracks**. * The **sequencer view** allows you to edit phrases, which consist of MIDI events. * The **chain view** allows you to add **devices** to each track. Devices determine how a given phrase will sound. Currently, there are two devices implemented: **sampler** and **plugin**. > [!NOTE] > Use `Tab` to switch focus between views. Use `Enter` to exclusively focus the highlighted view, > and `Esc` to unfocus it. When a view is focused, use the `Arrow Keys` and `Enter` to navigate. > Use `;` (semicolon) to open the command palette, which will list the remaining keybindings. ## TODO: * Control: * [ ] Customize key map * [ ] MIDI map * [ ] Scriptable * [ ] Command panel * [ ] Search panel * Save project: * [ ] Preserve EDN layout * Samples: * [x] Sample browser * [ ] Resample * [ ] Repitch * [ ] Sample editor * [ ] Envelope * [ ] Stretch sample to BPM * [ ] Set BPM from sample * [ ] Map MIDI note to sample * [ ] Multisample * Sequencer/Arranger: * [x] Fix next/prev clip * [ ] Move clip/track/scene * [ ] Set track gain * [ ] Play from one clip, record into another * [ ] Offbeat of next clip starts during end of first * [ ] Pattern chain * [ ] Actually sync * Chain: * [ ] Add device * [ ] View and connect device ports in chain view * [ ] Open LV2 GUI * [ ] Pin favorite FX parameters with `*` * [ ] Parallel monitoring chain * [ ] Support CLAP plugins * [ ] Support VST2 * [ ] Support VST3 * Transport: * [x] Focus transport to set BPM/sync/quant with `.,` * [ ] Double/halve BPM with `xX` * Rendering: * [ ] LineBuffer for scroll? * [ ] Buffered rendering with e.g. needs_update (only needed if the release build becomes slow) * [x] Buffered sequencer * [ ] Buffered chain view