tek/README.md
2024-09-10 23:22:01 +03:00

115 lines
4 KiB
Markdown

> [!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!
A secondary goal is to make it extensible and programmable; 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 watch my trials and tribulations, as well as my comical struggles with maintaining
mental health as a rogue knowledge worker in a cyberpunk dystopia, 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