meadowlarkdaw / meadowlark Goto Github PK
View Code? Open in Web Editor NEWA (currently incomplete) open-source Digital Audio Workstation
License: GNU General Public License v3.0
A (currently incomplete) open-source Digital Audio Workstation
License: GNU General Public License v3.0
to allow easier packaging and automatic version number creation it would be cool to have one initial version tag set. like 0.0.0 or so.
created an arch linux package at https://aur.archlinux.org/packages/meadowlark-git. it takes latest from git and tries to compile it. currently it does not, anything i'm doing wrong?
==> Starting build()...
Compiling meadowlark v0.1.0 (/srv/http/repos/meadowlark-git/src/meadowlark-git)
error[E0308]: mismatched types
--> src/backend/sample_browser_plug.rs:336:37
|
336 | pcm.fill_stereo_f32(playhead as isize, buf_l_part, buf_r_part);
| --------------- ^^^^^^^^^^^^^^^^^ expected `usize`, found `isize`
| |
| arguments to this function are incorrect
|
note: associated function defined here
--> /home/rt/.cargo/git/checkouts/pcm-loader-955ad95aec379986/e5cbddb/src/ram.rs:249:12
|
249 | pub fn fill_stereo_f32(&self, frame: usize, buf_l: &mut [f32], buf_r: &mut [f32]) -> usize {
| ^^^^^^^^^^^^^^^
help: you can convert an `isize` to a `usize` and panic if the converted value doesn't fit
|
336 | pcm.fill_stereo_f32((playhead as isize).try_into().unwrap(), buf_l_part, buf_r_part);
| + +++++++++++++++++++++
error[E0308]: mismatched types
--> src/backend/sample_browser_plug.rs:369:21
|
368 | old_pcm.fill_stereo_f32(
| --------------- arguments to this function are incorrect
369 | old_playhead as isize,
| ^^^^^^^^^^^^^^^^^^^^^ expected `usize`, found `isize`
|
note: associated function defined here
--> /home/rt/.cargo/git/checkouts/pcm-loader-955ad95aec379986/e5cbddb/src/ram.rs:249:12
|
249 | pub fn fill_stereo_f32(&self, frame: usize, buf_l: &mut [f32], buf_r: &mut [f32]) -> usize {
| ^^^^^^^^^^^^^^^
help: you can convert an `isize` to a `usize` and panic if the converted value doesn't fit
|
369 | (old_playhead as isize).try_into().unwrap(),
| + +++++++++++++++++++++
For more information about this error, try `rustc --explain E0308`.
error: could not compile `meadowlark` due to 2 previous errors
==> ERROR: A failure occurred in build().
Aborting...
Doesn't run because compiler complains about the isize:
Meadowlark/src/backend/sample_browser_plug.rs
line 336
pcm.fill_stereo_f32(playhead as isize, buf_l_part, buf_r_part);
line 369
old_playhead as isize,
Changed to usize. Now DAW starts
I can do this myself (I want to). Should I do it? any inconveniences?
Here I'm posting my thoughts on the current design mockup to explain my reasoning behind each element. However, while writing this I noticed a bunch of issues with my inital design. I would love to get any feedback and ideas for this!
This was mostly inspired by this blogpost of an Ableton Redesign. I liked the concept so I thought I'd roll with it. http://nenadmilosevic.co/ableton-live-redesign/
(from left to right)
Current tempo (can be edited by double-clicking and typing in the tempo)
A button that can be tapped in series to set the tempo
Time signature
Open a dialog for editing swing/groove
Concerns: How should this respond when we eventually make the tempo automatable?
(tabs from top to bottom)
Sample browser
Preset browser
Plugin browser
File-system browser
Properties - This will contain a list of editable properties of whatever element (timeline track, audio clip, piano roll note) is currently selected
Improvements: I think we should aim for an Ableton-like search system. We could have a keyboard shortcut to open this search as well. We could also have a toggle in the settings where the left panel is only shown when searching.
We could also have a fuzzy command palette/runner similar to VSCode
Select mode - Used to select & move clips
I Beam
Pencil mode - Pencil-in clips onto the timeline
Erase tool - Erases clips
Slice mode - Slices a clip into two pieces
(on right side)
Drop-down to select grid snapping mode
Button that opens a dialog for editing timeline settings
Improvements: We have a lot of room to fit stuff here. I'm thinking we can add tool buttons that automatically appear based on what is selected (like tools to reverse, pitch shift, time stretch, etc.) when an audio clip is selected.
I also just realized the lack of zoom tools. We should definitely have those.
(top to bottom)
Titlebar with name. This name can be double-clicked to be edited by the user
The little arrows on the left/right sides of the titlebar can be dragged to resize clips
Dragging anywhere else on the titlebar will move the clip
The audio clip also has little handles that adjust the fades on the edges of audio clips
Automation nodes can added/removed/moved directly on the clip itself (like FL Studio)
Concerns: How should we tackle looping clips? Should we have "linked" clips, or should we have a sort-of looped clip mode like Bitwig has?
What should audio waveforms look like when the timeline is really zoomed in? Should we display individual samples (like Audacity)? Should there be a limit to how far the user can zoom in?
How should we handle automation of the tempo (when we get to that after MVP)? Where should the automation lane appear?
This design is very up in the air. We may end up doing something completely different.
(top to bottom)
Drop-down to select the track/bus
A traditional effect rack. Clicking on a plugin will open its UI. Some simple built-in effects can have inline controls like a slider on a "send" plugin.
A button below the bottom plugin that can be clicked to add a new plugin
Pan/Mixer fader
DB Meter
Drop down to select which track/bus to send this track to
Concerns: Should this be on the right side?
Big Concern: Should we even use a traditional vertical-stacked effect rack? The idea is to have a built-in patching plugin. This patching plugin will have built-in controls for things like macros, LFOs, and other control effects (a lot like Bitwig's modifiers). However, I would like more opinions on whether this is a workflow people even want.
We could also opt for a Bitwig/Ableton style horizontal rack with inline UIs. That would definitely have more of a "cool"/"wow" factor. But of course we would need to figure out a system for modulation and modifiers (I don't want it to feel like we're just copying Bitwig).
One issue I have with inline horizontal FX racks is how you constantly have to move back and forth when editing EQs or something across multiple tracks while mixing. I suppose this could be solved by making both an inline and floating version of our built-in plugins, but of course that would be more work.
A status bar
Concerns: Should we even have a status bar?
Build the timeline grid as a widget.
Note that this widget will not actually scroll within a tuix scroll container. Instead, this will just draw the various grid lines as a function of the input data.
When zoomed in far enough, this should show additional detail like beats and beat divisions.
Every beat division is marked with a thin vertical line, every beat is marked with a slightly thicker vertical line, and every 4 beats (1 measure) is marked with an event thicker vertical line.
Every 4 measures (16 beats), the background color of the grid should alternative between two different values of gray.
This widget will take these data points as inputs:
Running 'cargo build' results in:
Compiling femtovg v0.2.2 (https://github.com/femtovg/femtovg?branch=master#e9a74da0)
error: failed to run custom build command for `speech-dispatcher-sys v0.5.2`
Caused by:
process didn't exit successfully: `/home/alex/soft/sound/meadowlark/target/debug/build/speech-dispatcher-sys-1056a37c40a9ff0d/build-script-build` (exit code: 101)
--- stdout
cargo:rustc-link-lib=speechd
--- stderr
wrapper.h:1:10: fatal error: 'speech-dispatcher/libspeechd.h' file not found
wrapper.h:1:10: fatal error: 'speech-dispatcher/libspeechd.h' file not found, err: true
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: ()', /home/alex/.cargo/registry/src/github.com-1ecc6299db9ec823/speech-dispatcher-sys-0.5.2/build.rs:22:10
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
warning: build failed, waiting for other jobs to finish...
error: build failed
Currently the MVP Design Doc states:
MusicalTime
- unit of "musical beats" - internally represented as an f64
"Seconds
- unit of time in seconds - internally represented as an f64
"I have some non-optimal experience using f64
to represent time:
f32
and later an f64
to represent the offset in a particular audio file (playing speed was not 100%, but depended on the note being played). I used two counters: one that counted samples (or frames, if you wish) and one that counts "blocks" (groups of samples). Because of rounding errors, the two diverged very quickly, resulting in audible artifacts. It took me quite some time to figure out what was going on. In the end, I used fixed point arithmetic.f64
to represent timestamps. Since f64
doesn't implement Ord
, I had to do some trickery e.g. for a simple binary search.In my experience, floating points have the following problems:
nan
and inf
? (i.e.: it doesn't implement Ord
)How can these be solved when still using floating points?
nan
etc.What does fixed point solve?
Ord
, but instead you need to watch out for overflow/underflowDoes fixed point arithmetic introduce new problems?
Is there anything that fixed point arithmetic does really fix?
a + (b + c) = (a + b) + c
. This isn't always the case with floating points. I haven't yet encountered a problem where I could pinpoint this floating point behaviour as the cause, but when it does matter, you can be stuck.All in all, with my experience, using fixed point to represent time would be my first attempt, rather than floating points (even high precision floating points). I think my point is more "Have you considered fixed point representations for time", rather than "Fixed point representations are better."
Note: I'm not suggesting to use fixed point numbers to represent actual audio frames. I'm only talking about time here.
Hello, cool project! Any chance you guys can include a cargo.lock file? It's needed to package it in NixOS.
*Current issue mockup, not an issue. Final issue is subject to change.
Automatically display BPM of incoming audio / waveforms
Here are my current thoughts about what we should do for DSP.
Note that we should reference the GNU fork of the Vital plugin called Vitalium and not Vital itself. This is so we can safely assure that any code we are borrowing is GPL licensed.
libsamplerate
library for high-quality offline resampling.A long term goal of this project is to have a complete suite of "fairly good quality" internal plugins that can be used to mix and master a track. Therefore I would like to focus more on effect plugins rather than synth plugins.
We of course don't have the resources to create industry-leading quality plugins. But I do want it to the point where musicians can get a satisfying mix without needing to reach for 3rd party plugins.
For each of these listed plugins, we could either choose to develop it ourself or we can borrow the DSP from one of the listed sources:
Hello There, I want to help your project, I am glad to help you
Here my forked repository
https://github.com/unknownK19/Meadowlark
;) Actually I pause my work at my repository until my Exam over
testing testing testing
Hello. I think it might be useful to have option to choose different scales for “scale highlighting”. I made a concept design how it could looks:
This design has circle of fifths so user can quickly choose from main scales.
In the middle of circle of fifths is piano keyboard. Here user can define custom scales.
“Move notes to new scale” – eg. if project is currently in C major and user change it to C minor then all notes are transposed (E to E♭...).
“Select scale based on selected notes” – shows new dialog with all scales which matches to selected in piano roll notes.
“Preview” – play preview in currently selected scale.
Please note that I also made "Select scale based on selected notes" feature request for Zrythm.
Build the bar on top of the timeline grid that displays marker for measures/beats.
Note that this widget will not actually scroll within a tuix scroll container. Instead, this will just draw the various text as a function of the input data.
When zoomed in far enough, this should display additional detail such as beats & beat divisions. This should be displayed as "measure:beat:beat division". For example, "5:3:1/4" means the 1/4 beat division after the 3rd beat after the 5th measure.
This widget will take these data points as inputs:
testing testing testing!
Pull out all every unique icon from the design mockup into its own SVG file.
The Inkscape file for the design mockup can be found here:
https://github.com/MeadowlarkDAW/Meadowlark/blob/main/assets/design/gui-mockup-main.svg
It will help to refer to the design doc on what each icon represents:
https://github.com/MeadowlarkDAW/Meadowlark/blob/main/DESIGN_DOC.md
These icons were hastily made, so cleaning up these icons would be appreciated (but not necessary for this task).
In this way, this project can be show up on this page:
https://github.com/topics/daw
This may help the project increase the popularity of visits.
How should the workflow of showing, hiding, and arranging various views and panels work?
There are two likely methods for going about this:
This is the approach that "FL Studio" takes. The idea is that every view/panel is a floating window, and these windows can "snap" magnetically to any edge of the screen.
This is the approach that DAWs like Bitwig Studio and Ableton Live take. In this approach every view is a non-floating panel that can be tiled with other panels. Usually each panel has a pre-defined location.
Please post any ideas and design mockups of how each of these approaches could work in this thread.
How should the workflow of arranging synths, audio clips, automation clips, and midi clips?
First, some terminology:
For context, here are some pros and cons to each method:
It is clear there is a split of workflow preference here. This issue is meant to be the place of discussion on how to solve the issue of satisfying both workflow tastes.
Please post any ideas and design mockups of those ideas here :)
The error is here.
thread 'main' panicked at 'Cannot create renderer: ShaderCompileError("Vertex stage: ERROR: 0:1: '' : Version number not supported by OGL driver\n\n")', C:\Users\Zean\.cargo\git\checkouts\vizia-a7ac1d316660c1f9\f9f06ce\crates\vizia_winit\src\window.rs:117:65
Expected: run smoothly
Github actions shows failures. Pull requests and straight commits should not be allowed if the actions are failing. For this issue:
Current failures from commit: 8c94a41
error: could not compile `meadowlark` due to 3 previous errors; 95 warnings emitted
{"reason":"build-finished","success":false}
Clippy results: 0 ICE, 2 errors, 95 warnings, 0 notes, 0 help
Error: Clippy had exited with the 101 exit code
miri - Memory Leak```
error: the evaluated program leaked memory
Error: the evaluated program leaked memory
note: pass -Zmiri-ignore-leaks
to disable this check
error: aborting due to previous error; 3 warnings emitted
Error: aborting due to previous error; 3 warnings emitted
error: test failed, to rerun pass -p meadowlark --bin meadowlark
Caused by:
process didn't exit successfully: /home/runner/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/bin/cargo-miri runner /home/runner/work/Meadowlark/Meadowlark/target/miri/x86_64-unknown-linux-gnu/ci/deps/meadowlark-c20dddbb7b88e334
(exit status: 1)
Error: The process '/home/runner/.cargo/bin/cargo' failed with exit code 1
[clippy](https://github.com/MeadowlarkDAW/Meadowlark/runs/10662656321)
Executing cargo clippy (JSON output)
Clippy results: 0 ICE, 2 errors, 95 warnings, 0 notes, 0 help
Error: Clippy had exited with the 101 exit code
dawproject is a standardised open exchange format for DAWs
Additional context
https://github.com/bitwig/dawproject
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.