Skip to content

Commit

Permalink
Update README
Browse files Browse the repository at this point in the history
  • Loading branch information
PetrGlad committed Oct 10, 2023
1 parent ca1cfa2 commit 1b6435e
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 23 deletions.
53 changes: 32 additions & 21 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,19 +35,25 @@ I use Pianoteq, but that is a commercial product.

## TODO

- [ ] Have a separate edit-position and play-start cursors, so it is possible to jump back to listen to the modified
version.
- [ ] Editing sustain events.
- [ ] Note input (with mouse).
- [ ] Allow editing sustain events.
- [ ] Do not save a new snapshot when there are no changes.
- [ ] Automatically create a snapshot on an edit command.
- [ ] Multi-track UI (for snippets and copy/paste buffer).
- [ ] Time marks on stave.
- [ ] Time bookmarks.
- [ ] Do not save a new snapshot when there are no changes.
- [ ] Time marks on stave (minute:second).
- [ ] Consider TransportTime to be signed (see also StaveTime). There are too many conversions forth and back. We can
- [ ] Have a separate edit-position and play-start cursors, so it is easier to jump back and listen to the modified
version.
- [ ] Time bookmarks.
restrict time to positives only in the engine.
- [ ] Find a way to separate actions from view logic with egui. It looks too messy now.
- [ ] Minimize use of unwrap. The biggest contention currently is event data shared between engine and stave.
- [ ] Multi-track UI (for snippets, flight recorder, and copy/paste buffer). Can show only one at a time, though. Use
tabs?
- [ ] Zoom to fit whole composition.
- [ ] Visual hint for out-of-view selected notes. Scroll to the earliest of the selected notes on an action, if none of
them are currently visible.
- [ ] Flight recorder (always record what is coming from the MIDI controller into a separate file).
- [ ] Copy/cut/paste.
- [x] Note selection.
- [x] Simple undo/redo.
- [x] Time selection.
Expand All @@ -68,21 +74,26 @@ I use Pianoteq, but that is a commercial product.

Big scary problems

* Should eventually migrate away from VST2 (unsupported and unreliable). VST3 is GPL. LV2 seem like a decent choice.
Here seem to be a LV2 host implementation in Rust https://github.com/wmedrano/livi-rs. Can also implement one from
scratch, or use JACK API and register emmate as a MIDI sequencer. Pipewire seem to SUPPORT JACK also (see `pw-jack`).
* May need to use midi events directly (instead of intermediate internal representation). E.g.
`track::to_lane_events` may not be necessary. This will require
* Should eventually migrate away from VST2. The bindings are unsupported anymore, and there are SIGSEGVs that I have not
managed to resolve so far. Also, there are licensing issues with the VST2 API itself.
VST3 is GPL. LV2 seem like a decent choice. Here seem to be an LV2 host implementation in
Rust https://github.com/wmedrano/livi-rs. Can also implement one from scratch, or use JACK API and register emmate as
a MIDI sequencer. Pipewire seems to SUPPORT JACK API as well (see `pw-jack`).
* May need to use midi events directly (instead of intermediate internal representation). E.g. `track::to_lane_events`
may not be necessary. In particular tail shifts will become simpler. This will require
* To handle ignored/unused events along with notes and sustain.
* Midi events have starting times relative to previous ones. May need some indexing mechanism (e.g. a range tree)
that would help to find absolute timings of the midi events, and connect beginnings and endings of notes.
that would help to find absolute timings of the midi events, and connect beginnings and endings of notes. MIDI
allows overlapping notes index should be able to handle that.
* Optimize rendering drawing only visible items, may also need some index. In the simplest casevisible notes can be
determined when zoom changes, and then re-use the visible set.

Have to explore following options for the further development

* Use [Tokio](https://github.com/tokio-rs/tokio) for scheduling instead of spinning in a thread.
* Ideally, this should be a part of some open source DAW. I found one that is written in Rust,
[MeadowlarkDAW](https://github.com/MeadowlarkDAW/Meadowlark). It is open source but not a collaborative project (as
stated in its README).
* Use [Tokio](https://github.com/tokio-rs/tokio) for scheduling instead of explicitly spinning in a thread.
* Ideally, the editor should be a part of some open source DAW. I found one that is written in
Rust, [MeadowlarkDAW](https://github.com/MeadowlarkDAW/Meadowlark). It is open source but not a collaborative
project (as stated in its README).

# Implementation notes

Expand All @@ -95,17 +106,17 @@ Unless stated otherwise

SMD - Standard MIDI File.

Rodio and other libraries use interleaved stream format 1 sample of each channel, then 2 sample of each channel and so
on (ch1s1, ch2s1, ...., ch1s2, ch2s2, ....). This seems to be a convention but is not documented anywhere for some
reason.
Rodio and other libraries use interleaved stream format: 1st sample of each channel, then 2nd sample of each channel,
and so on (ch1s1, ch2s1, ...., ch1s2, ch2s2, ....). This seems to be a convention but is not documented anywhere for
some reason.

Diagnostic commands

* `amidi --list-devices`
* `aseqdump --list`
* `aseqdump --port='24:0'`

MIDI CC controllers list
MIDI CC controller ids list

* https://nickfever.com/music/midi-cc-list
* https://soundslikejoe.com/2014/03/midi-cc-reference-chart/
Expand Down
2 changes: 1 addition & 1 deletion src/app.rs
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ impl eframe::App for EmApp {
self.toggle_pause();
}
ui.heading(format!(
"🌳 {:} [{:}]",
"🌲 {:} [{:}]",
self.project.directory.display(),
self.project.version()
));
Expand Down
2 changes: 1 addition & 1 deletion src/default-config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

# Path to the VST's shared library.
vst_plugin_path = "/home/petr/opt/Pianoteq 7/x86-64bit/Pianoteq 7.so"
# vst_plugin_path="/usr/lib/vst/amsynth_vst.so"
# vst_plugin_path="/home/petr/opt/Pianoteq 7/x86-64bit/Pianoteq 7.lv2/Pianoteq_7.so"
# vst_plugin_path="/usr/lib/x86_64-linux-gnu/vst/amsynth_vst.so"

# A preset to use in the VST plugin.
vst_preset_id = 4 # For Pianoteq
Expand Down

0 comments on commit 1b6435e

Please sign in to comment.