13
0
Commit Graph

20807 Commits

Author SHA1 Message Date
6edbc21929
NO-OP: whitespace 2023-09-19 06:18:21 +02:00
d7bbc9078f another instance where we should use timecnt_t::set_time_domain() 2023-09-18 21:10:30 -06:00
1344851912 fix Region::set_position_internal() to use TempoMap provided conversions
rolling our own beat<->audio conversion code here was doomed to fail.

this fixes the absurd length of a consolidated region.
2023-09-18 19:56:06 -06:00
f5fabb595a
Section operations need to use audio-time
cut/copy section does copy the tempo-map, so copying
a 4 Bar MIDI section will be 4 Bars after the paste.

This does not work the other way around:
With a tempo-map, 4 bars may correspond to 10 seconds
at the source position. While 4 bars at the target
position may correspond to a different audio-time
duration. This can lead to gaps or overlaps.
2023-09-18 17:14:40 +02:00
6a8946a746 NOOP: whitespace fix 2023-09-17 20:38:34 -06:00
75e12993c6 temporal: fix grid generation in trivial case (1 tempo, 1 meter at zero)
We need to do the same "round up to bar/beat" trick that we do when we reach a BBT
marker
2023-09-17 20:38:23 -06:00
Holger Dehnhardt
6bcf0c2d74 Make it C++11 compatible 2023-09-17 11:29:47 -06:00
Hoger Dehnhardt
0e759d5523 Console1 - refine channel selection 2023-09-17 11:29:47 -06:00
Hoger Dehnhardt
827f61ad58 Console1: add shift operations for plugins 2023-09-17 11:29:47 -06:00
Hoger Dehnhardt
e22a0eb1db add options to swap mute and solo and to create mapping stops 2023-09-17 11:29:47 -06:00
Hoger Dehnhardt
7634c4936c Store mappings as XML 2023-09-17 11:29:47 -06:00
Hoger Dehnhardt
ac00b4a0bb fix plugin selection 2023-09-17 11:29:47 -06:00
Hoger Dehnhardt
4dd58961d2 Enable controlling of plugin 2023-09-17 11:29:47 -06:00
Hoger Dehnhardt
835598c802 Console1: Add plugin interface 2023-09-17 11:29:47 -06:00
Mads Kiilerich
f1bb18ae53 wscript: drop unused path_prefix
It is not referenced anywhere, and also not set consistently.
2023-09-17 07:34:55 -06:00
Mads Kiilerich
d220f477ed wscript: drop unused "mandatory variables" 'top' and 'out' in libs
Variables by these names are only used from the local wscript and when
running "waf configure", which already for other reasons only can run at
the top-level.

These variables are thus not mandatory and not used.
2023-09-17 07:34:55 -06:00
Mads Kiilerich
69e987909e wscript: inline top = '.' for build_i18n
'top' was a constant that was set to '.', even when inside
subdirectories. It is thus not really top.

I don't know if the intent was to use the actual top (which is available
as bld.top_dir), but for now we make it explicit what we have and do.
2023-09-17 07:34:55 -06:00
Mads Kiilerich
a0916ef368 wscript: drop unused APPNAME assignment in libs
https://waf.io/book/ says
  By default, the project name and version are set to noname and 1.0. To
  change them, it is necessary to provide two additional variables in
  the top-level project file

- and waf code inspection confirms that waf itself only will use the top
level APPNAME.

Also, the 'waf dist' comment doesn't seem relevant - especially after
this change - and is removed too.

(Note: libs/evoral/wscript and libs/temporal/wscript still use APPNAME
for other purposes.)
2023-09-17 07:34:55 -06:00
Mads Kiilerich
3b4cf9191c wscript: drop unused VERSION assignment in libs
https://waf.io/book/ says
  By default, the project name and version are set to noname and 1.0. To
  change them, it is necessary to provide two additional variables in the
  top-level project file

- and waf code inspection confirms that waf itself only will use the top
  level VERSION.

Some wscripts will use
  bld.env['VERSION']
but that will also just use the value set in the top wscript.
2023-09-17 07:34:55 -06:00
Mads Kiilerich
aa3f6e3a5c wscript: drop unused local VERSION variables
pyflakes correctly points out problems like:
  gtk2_ardour/wscript:537:5 local variable 'VERSION' is assigned to but never used
2023-09-17 07:34:55 -06:00
Mads Kiilerich
2e367de4f0 wscript: drop unused imports, manual
Manual fix of pyflake warnings:
libs/ardour/wscript:3:1 'waflib.Tools' imported but unused
wscript:9:1 'waflib.Build.Context' imported but unused
2023-09-17 07:34:55 -06:00
Mads Kiilerich
7737c17d52 wscript: drop unused imports, scripted
Done with ad hoc scripting hacks processing unused imports found by pyflakes:

for f in $( find * -name wscript ); do echo; pyflakes $f; done | grep 'waflib.Logs.* but unused' | cut -d: -f1 | while read f; do sed -i 's/^import waflib.Logs as Logs,/import/g' $f; done
for f in $( find * -name wscript ); do echo; pyflakes $f; done | grep 'waflib.Options.* but unused' | cut -d: -f1 | while read f; do sed -i 's/import waflib.Options as Options, /import /g' $f; done
for f in $( find * -name wscript ); do echo; pyflakes $f; done | grep 'waflib.Options.* but unused' | cut -d: -f1 | while read f; do sed -i 's/^from waflib import Options,/from waflib import/g' $f; done
for f in $( find * -name wscript ); do echo; pyflakes $f; done | grep ' imported but unused$' | sed "s/^\([^:]*\):[0-9]*:[0-9]* '\(.*\)'.*/\1 \2/g" | while read f lib; do sed -i "/^import $lib$/d" $f; done
for f in $( find * -name wscript ); do echo; pyflakes $f; done | grep 'waflib.Options.* but unused' | cut -d: -f1 | while read f; do sed -i '/from waflib import Options$/d' $f; done
for f in $( find * -name wscript ); do echo; pyflakes $f; done | grep 'waflib.TaskGen.* but unused' | cut -d: -f1 | while read f; do sed -i '/from waflib import TaskGen$/d' $f; done
for f in $( find * -name wscript ); do echo; pyflakes $f; done | grep 'waflib.Task.Task.* but unused' | cut -d: -f1 | while read f; do sed -i '/^from waflib.Task import Task$/d' $f; done
for f in $( find * -name wscript ); do echo; pyflakes $f; done | grep 'waflib.Tools.winres.* but unused' | cut -d: -f1 | while read f; do sed -i '/^from waflib.Tools import winres$/d' $f; done
for f in $( find * -name wscript ); do echo; pyflakes $f; done | grep 'waflib.Utils.* but unused' | cut -d: -f1 | while read f; do sed -i '/^import waflib.Utils as Utils$/d' $f; done
2023-09-17 07:34:55 -06:00
Edgar Aichinger
9aaf5d2c8c
update german translation 2023-09-17 14:20:33 +02:00
2242b3706c another pixel width fix, to accomodate for the unliekly
If the line width is odd, not just 1.0, the 0.5 pixel shift is required
2023-09-15 17:34:30 -06:00
0a597bea66 rulers: fix subtle off-by-one pixel error caused by double-rounding
This change also makes it more clear that we're computing window-coordinate system values
for the x-axis than the previous inaccurate version was
2023-09-15 17:34:30 -06:00
4c5c7769bb canvas: skip intermediate Canvas::Rect object (trivial optimization) 2023-09-15 17:34:30 -06:00
8ba74e2a51
Add an argument to move markers during tempo-map 2023-09-14 23:13:11 +02:00
09b919bb85 faderport (classic): fix a variety of SNAFUs since switch to MidiSurface (#9439) 2023-09-14 12:15:19 -06:00
John Emmas
56772b8156 Revert an unintended change from #eff61bde325b 2023-09-14 16:54:15 +01:00
73d559056e partial Route::set_state() calls with a MementoCommand should not reset processor state (#9434) 2023-09-14 07:49:13 -06:00
eff61bde32 JACK: accomodate MSVC in DEBUG_TRACE stmts involving pthread_self 2023-09-14 06:59:29 -06:00
d44c9787b6 MIDI tracks: split immediate events into ardour- and user-generated
This now allows the already-apparently possible recording of user-input from the kbd
in the MIDI track header to actually be successful
2023-09-13 23:58:31 -06:00
2fa6500ec5 NOOP: fix indentation 2023-09-13 10:23:58 -06:00
3c857a78c6 JACK backend: serialize all jack server calls with a mutex
As was noted in 88ee3af3ea it is unsafe/undefined behavior if two threads
sleep on the JACK request file descriptor, since there is no way to control
which one will wake and process the request. Since each thread may have
sent a different request, this can lead to a thread misinterpreting the
response because it is reading the wrong response.

This may (or may not) solve some subtle problems with JACK, but was
revealed by having a control surface (LaunchPad Pro) that registers
three ports from the butler thread at about the same as the GUI
thread is registering the auditioner. One thread read the wrong
response, and because of some slightly weird code/design, it attempts
to rename the port from within the response handler, which in JACK1
leads to deadlock (and later, zombification).
2023-09-13 09:20:41 -06:00
88ee3af3ea JACK backend: add a mutex to serialize per-thread port register requests to server
Without this, two threads can both sleep on the same communication channel, and the wake order
is non-determinate, so the wrong thread may process the response to the other thread's request.
2023-09-12 22:41:26 -06:00
810da43be6
Safeguard stripable_list_to_control_list API
See also 976e03c15c which does this for `route_list_to_control_list`.
Fix crashes with empty route-lists e.g. momentary solo which was
introduced in 03105aa760.
2023-09-13 00:28:57 +02:00
4352f89ff0 align launchpad pro surface protocol name 2023-09-11 17:02:46 -06:00
c625e13a6f
Reduce clutter when loading session with loop range
```
  ARDOUR::TransportFSM::process_events()
  ARDOUR::TransportFSM::enqueue(ARDOUR::TransportFSM::Event*)
  ARDOUR::Session::process_event(ARDOUR::SessionEvent*)
  ARDOUR::SessionEventManager::merge_event(ARDOUR::SessionEvent*)
  ARDOUR::Session::queue_event(ARDOUR::SessionEvent*)
  ARDOUR::Session::request_locate(long, bool, ARDOUR::LocateTransportDisposition, ARDOUR::TransportRequestSource)
  ARDOUR::Session::auto_loop_changed(ARDOUR::Location*)
  ARDOUR::Session::set_auto_loop_location(ARDOUR::Location*)
[...]

```
2023-09-11 20:25:28 +02:00
e99305c4dd add enumeration type for SnapTarget
this defines how the grid interacts with other snap targets (ph, etc)

* Grid: we ignore other snap targets when the grid is enabled
* Both: we snap to both grid and other snap-targets when grid is enabled
* Other: we only snap to other snap-targets and ignore the grid, even
    though the grid is enabled
2023-09-11 12:18:15 -05:00
c7e5f38aa5 remove debug output 2023-09-11 10:26:54 -06:00
4eb58e104c remove double-macro'ed debug of undo history; use nullptr
Also, prefer early return to conditionalized function body
2023-09-11 10:26:54 -06:00
eca4c83b7b temporal: remove concept of inactive tempos 2023-09-11 10:26:54 -06:00
81939faa1a
UF8 surface is currently only for Mixbus 2023-09-11 17:13:22 +02:00
511c3ef048 remove debug output 2023-09-10 18:20:35 -06:00
0e3594bb1c
Add Temporal::Beats Lua bindings 2023-09-10 22:23:57 +02:00
Asahi Lina
d1cc71150f Adjust interpretation of swing amount
Previously,

0 -> no swing (1:1, 50%)
50 -> triplet swing (2:1, 66%)
75 -> hard swing (3:1, 75%)
100 -> sextuplet swing (5:1, 83%) (default!)
150 -> absolute maximum (inf:1, 100%)

This is rather confusing...

One common interpretation uses percentages of the beat, where triplet
swing is 66%. However, that causes precision issues since it's really
66.666...

Since we already default to 100 and take "no swing" as zero, let's make
that reference point triplet swing. Then the scale becomes:

0 -> no swing (1:1)
100 -> triplet swing (2:1)
150 -> hard swing (3:1)
200 -> sextuplet swing (5:1)
300 -> absolute maximum (inf:1)

300 doesn't make any sense, so let's change the range to -250 .. 250
which covers all useful values.

Also remove the division through 100 and back, to avoid rounding issues.

Signed-off-by: Asahi Lina <lina@asahilina.net>
2023-09-09 20:06:37 +09:00
Asahi Lina
f1004a445e Fix quantization swing
- Fix selection of what beats to swing (was always done)
- Fix swing strength (lack of precision rounded to 50% or 100%)
- Fix model offset not being applied properly

Signed-off-by: Asahi Lina <lina@asahilina.net>
2023-09-09 20:06:37 +09:00
4ff8cff024 add velocity sense for MIDI Learn-ed clip triggering 2023-09-08 15:27:11 -06:00
2f25592702 push2: add velocity sensitivity 2023-09-08 14:57:28 -06:00
1249195516 push2: remove debug output 2023-09-08 14:57:07 -06:00
b440488295 launchpad pro: provide velocity info when launching clips/triggers 2023-09-08 14:41:21 -06:00
36048ea651 triggerbox: change API to allow providing velocity information when "banging" triggers
... and by extension using it (based on the magnitude of the velocity effect setting) to set the gain of
audio triggers
2023-09-08 14:41:21 -06:00
e88a121ff8
Fix canvas rectangle bounding box
When drawing the outline of a rectangle, the bounding
box must cover the whole pixel of the line. Otherwise
the line would be left behind when the rectangle shrinks.
2023-09-07 02:45:26 +02:00
aaadc3906c triggerbox: fix crashing bug while processing clips in rubberband
The read_index is adjusted in the loop, which means that the calculation of how much
data can be delivered to the stretcher must also be inside the loop
2023-09-06 14:46:24 -06:00
58b667c6c0 temporal: fix crash caused by unsafe use of tempo map iterators 2023-09-06 14:46:24 -06:00
3675f8f444 launchpad pro: remove debug output 2023-09-06 14:46:24 -06:00
6d9c47c920 launchpad pro: only light Sends button if the selected stripable has 1+ sends 2023-09-06 14:46:24 -06:00
1ec966d964 launchpad pro: allow clear+cue buttons to ... clear a cue 2023-09-06 14:46:24 -06:00
68678aa957 triggerbox: add API to clear a cue (row) 2023-09-06 14:46:24 -06:00
f339236c5b
Add icon for the Grid tool 2023-09-06 19:13:59 +02:00
c2ce0bcb4a
Amend 101744b8, allow when and start to point to the same variable 2023-09-06 01:01:30 +02:00
101744b812
Add method to find a section location by position 2023-09-05 23:08:29 +02:00
5c888f2b90
Fix deadlock when cut/pasting section to itself 2023-09-05 23:08:29 +02:00
5223d05854 launchpad pro: various improvements and fixes 2023-09-04 19:41:25 -06:00
269699c340 temporal: fix get_grid() to work in the presence of "weird" BBT markers 2023-09-04 19:41:25 -06:00
13bdfda81a temporal: add Meter::round_up_to_beat_div()
reimplement round_up_to_beat() in terms of round_up_to_beat_div()
2023-09-04 19:41:25 -06:00
f1f5df7c9a temporal: add BBT_Time::round_up_to_beat_div() 2023-09-04 19:41:25 -06:00
7c5e7ddf59 temporal: improve operator<<() for MusicTimePoint (BBT markers) 2023-09-04 19:41:25 -06:00
0266d98a3b temporal: add TempoMap::{max,min}_notes_per_minute() API 2023-08-31 18:23:40 -06:00
cda0d6ce9f temporal: fix totally broken implementation of TempoMap::shift (timepos...) 2023-08-31 18:22:59 -06:00
c778a6df67 ripple backwards when cutting a section 2023-08-31 18:22:25 -06:00
69cfe9d3f9 add missing ripple during cut/copy/paste of sections 2023-08-31 18:21:56 -06:00
4969fb9e0b libpbd: tweak for printing pthread ID (windows is int/*nix is ptr) 2023-08-31 10:34:48 -06:00
c4cb8dbda9 arithmetic simplification 2023-08-30 16:07:48 -06:00
864b660abe lppro: working send faders, some work on color & pulse for select buttons 2023-08-30 16:06:14 -06:00
e664acc16e lppro: working pan fader controls 2023-08-30 16:06:14 -06:00
75802cc47b lppro: momentary mode for all fader layouts 2023-08-30 16:06:14 -06:00
ee0d5cfc40 lppro: working gain faders 2023-08-30 16:06:14 -06:00
bc7f25e52c libpbd: AbstractUI must call & destroy sigc::trackable callbacks in its destructor
AbstractUI IS-A BaseUI IS-A EventLoop
                       IS-A sigc::trackable

If we have sent a call_slot() request to an EventLoop that has not executed
when the object involved in the call_slot() functor is destroyed, we need to
ensure that the request is invalidated.

To do this, We register "notify" callbacks with the sigc::trackable that is a
base class of the object involved in the functor given to
call_slot(). sigc::trackable will call these "notify" callbacks from its
destructor.

So when the call_slot() functor's relevant object dies, and its sigc::trackable
base class is destroyed, it will invoke all of its the "notify" callbacks, which will
in turn call EventLoop::invalidate_request() and this hopefully marks all the
queued call_slot() functors as "do not call".

However, invalidate_request() requires a lock, and access to the lock is
granted via a pure virtual, EventLoop::slot_invalidation_lock(). In the
heirarchy cited above, this is implemented by AbstractUI.

When we destroy an AbstractUI, ~AbstractUI() is called first, and this destroys
the lock and changes the VTT so that ::slot_invalidation_lock() becomes a pure
virtual again.

Eventually we will call ~trackable() which in turns runs all the "notify"
callbacks, and then removes them. But when these callbacks end up in
EventLoop::invalidate_request(), we try to call ::slot_invalidation_lock() and
C++ will abort because of its (now) pure virtual status.

Therefore, we must invoke the "notify" callbacks before the
::slot_invalidation_lock() becomes pure, and that means inside ~AbstractUI, as
an explicit call to trackable::notify_callbacks().

This has not appeared before (remarkably), but became an issue when the
Launchpad Pro support code's main object (derived from MIDISurface and hence
from AbstractUI) "failed" to use sub-objects for its various methods. So when
it connects to, for example, the Session::RouteAddedOrRemoved signal, it is
connecting itself (derived from a sigc::trackable). When the Launchpad Pro
object is destroyed, it tries to invalidate all the call_slot() requests, but
this requires access to an event loop lock - owned by the Launchpad Pro event
loop, which is already destroyed!

Other surfaces have generally avoided this by using other objects to provide
methods of dealing with signals from libardour objects.
2023-08-30 16:06:14 -06:00
187557df57 midi surfaces: use an event loop invalidator for call_slot() 2023-08-30 16:06:14 -06:00
d5ad9ff033 libpbd/guis: move __invalidator() into PBD::EventLoop
we allow use of/dependency on sigc::trackable there, so this is
both legal but also sensible.

Leave the macro definition of invalidator(x) in gtkmm2ext/gui_thread.h
because it doesn't hurt and makes some sense for it to be there. No
reason for a source module that needs invalidator(x) to load EventLoop
decl.
2023-08-30 16:06:14 -06:00
f5f48b421e lppro: get long press working, add undo/redo/metronome 2023-08-30 16:06:14 -06:00
9ee7c33737 lppro: solo, mute, rec-enable basics 2023-08-30 16:06:14 -06:00
a6e9d6ecd1 lppro: fix selection button color when "off" 2023-08-30 16:06:14 -06:00
784fa82081 lppro: selection enabled and displayed 2023-08-30 16:06:13 -06:00
a49c961189 lppro: handle new slots and new routes and improve color display 2023-08-30 16:06:13 -06:00
5deea0c077 libpbd: change static trigger property change signal to take Trigger*
When we add a region to a slot, we create a new Trigger, set its region,
then arrange for an "atomic" swap with the existing Trigger. This
means that the property change signal is emitted on a Trigger that
does not yet exist inside a TriggerBox, and so cannot be found using
row/col or x,y coordinates. Pass a raw pointer instead (lifetime
management is not an issue ... or is it.
2023-08-30 16:06:13 -06:00
f3861a79b6 lppro: more work on displaying triggers, including return of the color map 2023-08-30 16:06:13 -06:00
f65e0b85a8 libpbd: add operator<< for PropertyChange 2023-08-30 16:06:13 -06:00
1ea104eac1 lppro: fix invalidators 2023-08-30 16:06:13 -06:00
5cfa881fa9 lppro: more state tracking, stop clip handling etc. 2023-08-30 16:06:13 -06:00
9fa2fccb5c lppro: track trigger state changes 2023-08-30 16:06:13 -06:00
6cf7b89aaf triggerbox: fix argument ordering error in static trigger property signal 2023-08-30 16:06:13 -06:00
fef1cfa83b lppro: pads launch clips 2023-08-30 16:06:13 -06:00
c81027fc84 triggerbox: add static signals to allow an object to watch all trigger state changes 2023-08-30 16:06:13 -06:00
2f9fd8e288 launchpad pro: basics of pad/button handling, complete with cue launch and transport control 2023-08-30 16:06:13 -06:00
9438914aca ctrl surfaces: fix logic error in toggle_roll() for surfaces 2023-08-30 16:06:13 -06:00
7406ad01bd lppro: continuing adventures with shadow ports and pad maps 2023-08-30 16:06:13 -06:00
88a599816a fix name of port bundle for MIDI surface shadow port 2023-08-30 16:06:13 -06:00
1d1ba186b9 lppro: reorder x,y <-> note to put upper left at 0,0
This seems like more work than it should be
2023-08-30 16:06:13 -06:00
8209cb0ab5 launchpad pro: remove color map; implement note/x,y mapping 2023-08-30 16:06:13 -06:00
860f354e98 continuing to try to debug LPP initialization in DAW mode 2023-08-30 16:06:13 -06:00
054a09b567 launchpad pro: full communication and note/pad mapping functional 2023-08-30 16:06:13 -06:00
af01a55e48 MIDISurface: minor tweaks to DEBUG_TRACE output 2023-08-30 16:06:13 -06:00
f8ed004be0 make MIDISurface::midi_input_handler() public
It needs to be public to bind it to a signal from a derived class.
Silly C++.
2023-08-30 16:06:13 -06:00
7130deafdf fix AbstractUI redefine of DEBUG_TRACE to still use PBD::debug_print-ish stuff 2023-08-30 16:06:13 -06:00
37f859197b use PBD::DEBUG::Threads as a toggle to show thread ID/name with debug output 2023-08-30 16:06:13 -06:00
a59c217205 extend PBD::Debug API to provide a method that doesn't send to debug Transmitter 2023-08-30 16:06:13 -06:00
36ada549b2 lppro: scroll text method (doesn't seem to work) and new sysex header vector 2023-08-30 16:06:13 -06:00
599998bd1f midisurface: add a vector constructor for MidByteArry
plus a few minor code tweaks
2023-08-30 16:06:13 -06:00
7e0315bc5e lppro: working mode setting and control 2023-08-30 16:06:13 -06:00
45e3408595 minor tweak to MIDISurface API
Allows connecting additional ports to our parsers
2023-08-30 16:06:13 -06:00
13508efef3 lpp: successfully enter programmer mode 2023-08-30 16:06:13 -06:00
b93385e9ae lppro: steps to an ecology of ... no wait, just some stuff 2023-08-30 16:06:13 -06:00
9d153af72d image for launchpad pro "gui" 2023-08-30 16:06:13 -06:00
c4529f4654 NO-OP: variable name tweak 2023-08-30 16:06:13 -06:00
3fa15d9162 skeleton for launchpad pro support 2023-08-30 16:06:13 -06:00
6c44dbf9d6 temporal: a guess at how to use BBT markers from within TempoMap::paste()
Basically, if the paste position is not zero and not on a bar line, we will a BBT marker there,
using the existing tempo & meter at that position before the paste.

If the end of the paste is not on a bar line, we will place a BBT marker there,
using the tempo & meter that existed before the paste.

TempoMap::paste() now also accepts an optional final argument that if provided is
used to name the BBT markers, if they are created
2023-08-30 15:21:55 -06:00
7aa1863c0f somewhat working tempo map cut/copy/paste 2023-08-30 14:16:21 -06:00
a5055a2227 various changes related to tempo map copy/cut/paste section
Tempo map is currently still excluded from the editor operation
2023-08-30 14:16:21 -06:00
2e08ff01f5 temporal: add TempoMapCutBuffer::empty() 2023-08-30 14:16:21 -06:00
6b8c7292a5
Do not use session-range as implicit section 2023-08-29 00:29:06 +02:00
8c9b6812d7 fix crash during tempo mapping
Region _length values are not stashed during tempo mapping
if the region is already in the intermediate time domain, so do
not assert when they cannot be found at the end of the operation
2023-08-27 09:41:47 -06:00
8fd8eaa01d UF8: parameterize the device name and pass to MackieControlProtocol 2023-08-26 17:34:04 -05:00
845600b261 fix off-by-one pixel error caused by using floor() instead of round() 2023-08-26 10:07:41 -06:00
46a916f0b4
Add method to query sections 2023-08-26 14:09:53 +02:00
6cf2659f8b
Add Location flags to define sections 2023-08-26 14:09:53 +02:00
32ef2d5a0f temporal: add a music-time (BBT) point at the cut site 2023-08-25 17:39:00 -06:00
4d8ba938f1 temporal: during cut(), break out of loop once we pass the end time 2023-08-25 17:39:00 -06:00
848f74d803
MCU/UF8: Fix issue with windows build
Enable Surface, show GUI, disable surface. repeat.
Previously this cased a crash in glibmm:

The type name `glibmm__CustomBoxed_N13ArdourSurface6NS_UF86Button2IDE'
has been registered already.
2023-08-25 21:08:14 +02:00
c6b43155bc gain-like automation controls need to use the right limits for group value setting 2023-08-25 12:23:44 -06:00
4f7bd872be
MCU/UF8: use dedicated ctrl-protocol 2023-08-25 18:12:35 +02:00
c0366a5f13
MCU/UF8: Continued work to special case Mackie surface
* Use dedicated port-names for UFx
* Do not show SSL-UFx device-info files in MCU
* Fix Window namespacing/missing symbols
* Address Windows ambiguous symbols (Button, Surface)
  Those used to have a Mackie:: prefix, now they need
  MACKIE_NAMESPACE

When re-opening the GUI, there is still a somewha mysterious warning:
```
glibmm-WARNING **: file value_custom.cc: (Glib::custom_boxed_type_register): The type name `glibmm__CustomBoxed_N13ArdourSurface6NS_UF86Button2IDE' has been registered already.
```
2023-08-25 18:09:27 +02:00
70a4f29c59
Fix location ripple when cutting locations 2023-08-25 04:01:58 +02:00
f38a984396
Fix deadlock when undoing Location removal 2023-08-25 03:36:04 +02:00
efcef70d9a
Ensure that fatal does exit
Previously it was possible to just press "Esc" which closes the
dialog with Gtk::RESPONSE_DELETE_EVENT and Ardour continues
to run (and may or may not crash later).
2023-08-24 20:00:45 +02:00
ec365820d8
MCU/UF8: reuse and special-case Mackie ctrl surface for SSL-UF8
This adds a unique namespace to the MCU source code, so it can be
compiled multiple times resulting in different ctrl surfaces.
2023-08-24 19:19:10 +02:00
e3297a6a84
Fix MIDI deinterlace #9422
De-interlace works by first creating 16 SMF Sources, and then
only using sources that are actually required.

However SourceFactory::createWritable by default emits SourceCreated,
which added all the 16 Sources to the Session. Later adding only the
required Sources resulted in duplicate IDs.
2023-08-22 19:00:58 +02:00
dd4e5dfc96
Build-system: remove duplicate dis/en/able options
e.g. we had both --vst3 (default) and --no-vst3.
A user could specify both, which is confusing.
2023-08-21 19:25:26 +02:00
e9be3beb2a add get/set state methods to TimeDomainProvider
These are not used yet, because only the Session really acts as a Provider
and it uses the Config::default_time_domain to serialize that state
2023-08-16 16:33:17 -06:00
0227eab138 remove unused source file 2023-08-16 12:33:09 -06:00
c5a0c0f6e0 remove some debug output 2023-08-16 09:33:16 -06:00
0e40f030ad reversible domain swaps for Locations 2023-08-16 09:32:41 -06:00
06e9bf6ca4 domain swaps for MIDI CC and other controls 2023-08-16 09:06:10 -06:00
b240423e50 session: add API to get access to the current reversible command (if any) 2023-08-16 09:04:22 -06:00
f7fd015cb3 no, really, no Pitches handling (extends previous commit) 2023-08-15 11:29:52 -06:00
4246009864 no need for domain bouncing for "pitches" in a MIDI model
The Pitches representation is just an optimization in Evoral::Sequence, and just
represents note data differently
2023-08-15 11:25:54 -06:00
a50f38d164 domain bounce handling for sysex and patch changes 2023-08-15 10:27:21 -06:00
f92dcfa068 domain bouncing for Automatable/ControlLists 2023-08-15 08:34:42 -06:00
457b94ba65 fix computation of note length after tempo mapping 2023-08-15 00:04:19 -06:00
71d27e7d81 add a couple of #warnings 2023-08-14 23:42:08 -06:00
076cb86912 next iteration of changes to handle time domain bounces as undoable 2023-08-14 23:42:08 -06:00
fd5dfe27c5
region groups: some operations should implicitly group new regions
* imported regions
* newly-recorded regions
* regions that result from a Split or Separate
* pasted regions
2023-08-10 16:55:25 +02:00
d1ee95e886
region groups: use group-id instead of equivalent-region, when provided 2023-08-10 16:55:25 +02:00
8cd69a633b
region groups: save and restore the group-id counter for this session 2023-08-10 16:55:25 +02:00
1d5ec57794
region groups: define an API in region.h for grouped regions 2023-08-10 16:55:20 +02:00
92fbee6312 do not abort when handling a region whose length has the wrong time domain 2023-08-07 16:36:11 -06:00
e7c35cf601 API change for the start of making tempo mapping undoable 2023-08-07 16:33:16 -06:00
0223be5312 pbd: fairly unconscionable that Undo stuff in libpbd is not namespaced, so now it is 2023-08-07 16:33:16 -06:00
6b34578dfd minor fix for previous commit (this change is still pending) 2023-08-07 16:33:16 -06:00
afe5331a0b pbd: fairly unconscionable that Command in libpbd is not namespaced, so now it is 2023-08-07 16:33:16 -06:00
47a7a16c43 temporal: move another domain-swapping object to the right header 2023-08-07 16:33:16 -06:00
d87b10037b temporal: new object to try to make domain swaps undo-able 2023-08-07 16:33:16 -06:00
52c8a23aff
Add Lua bindings to print plugin control outputs 2023-08-06 21:58:33 +02:00
d035cb0834 some minor cleanups after rebase against master 2023-08-02 17:21:56 -06:00
ada7fc16aa temporal: another place to ensure that a BBT marker defines a beat position 2023-08-02 15:23:43 -06:00
ca348ce0d9 temporal: add TempoMap::replace_bartime() 2023-08-02 15:23:43 -06:00
206f7d3c40 fix compilation errors (last commit happened too early) 2023-08-02 15:23:43 -06:00
aa0e882c5f regions: force position time domain when a region is added to a playlist
Q: why not length time domain also?
2023-08-02 15:23:43 -06:00
1fd5f0d9e9 regions: attempt to prevent accidental time domain changes to length or position 2023-08-02 15:23:43 -06:00
f1b8a98a62 remove debug output 2023-08-02 15:23:43 -06:00
638978c527 fix thinko with tracks-follow-session-time when creating stripable 2023-08-02 15:23:42 -06:00
3367c03353 use tracks-follow-session-time option 2023-08-02 15:23:42 -06:00
08683674ce remove glue-new-regions-to-beats option, add new tracks follow session time option 2023-08-02 15:23:42 -06:00
3d64972ca2 libardour support for propagating track time domain changes into playlists and thence regions 2023-08-02 15:23:42 -06:00
7fe3becf2d temporal: fix TimeDomainProvider::set_time_domain_parent() to unset have_domain 2023-08-02 15:23:42 -06:00
71953a9929 locations: ensure they follow session time when start/end is set 2023-08-02 15:23:42 -06:00
1b9f4999df locations now follow session time domain, always (probably) 2023-08-02 15:23:42 -06:00
0c9bdd817d temporal: fix TimeDomainProvider::set_time_domain() 2023-08-02 15:23:42 -06:00
4cdac29029 attempt to follow time domain changes in playlists when tracks change 2023-08-02 15:23:42 -06:00
1fce815e2d temporal: expand TimeDomainProvider API 2023-08-02 15:22:52 -06:00
1a83860016 forward propagate session default time domain changes 2023-08-02 15:22:52 -06:00
df188996ec session has a default time domain 2023-08-02 15:22:52 -06:00
c293876518 playlist IS-A TimeDomainProvider
It has Session as its initial time domain parent
2023-08-02 15:22:52 -06:00
3b565693c8 objects don't have a time domain, they have a time domain provider (libs) 2023-08-02 15:22:52 -06:00
2bbf06c8cc class name change to clearly disambiguate Evoral::ControlList (a list of time/value pairs) from lists of Controls in libardour 2023-08-02 15:22:45 -06:00
af2e0e279c temporal: initial version of a time domain provider object 2023-08-02 15:20:58 -06:00
961fdc9de6 use a more explantory object name 2023-08-02 15:20:20 -06:00
fa225846af new Temporal API to allow keeping MIDI notes in position after a map-tempo operation 2023-08-02 14:11:06 -06:00
3c44c326c2 add an assert() to check a target in CoreSelection::get_stripables_for_op() 2023-07-31 21:11:36 -06:00
a5477feb27 API changes for ControlGroup::fill_from..()
This reflects better/different use by callers
2023-07-31 18:30:36 -06:00
0e6764c4c8 improve and extend group selection logic 2023-07-31 13:53:42 -06:00
03105aa760 libardour changes to support new selection/group logic 2023-07-31 13:36:14 -06:00
8340be4808 add another version of FooListToControlList 2023-07-31 13:35:37 -06:00
05c6616e32 ControlGroup: fiddle with API for clarity, and add TrimAutomation special case 2023-07-27 13:29:57 -06:00
7662f9af5b ArdourCtrlBase should pass UseGroup when setting control values
None of the things this is used for right now are ever members of persistent
control groups, but it is useful for selection-as-group
2023-07-27 13:28:02 -06:00
5e37a320c0 remove use-selection modifier 2023-07-26 18:24:43 -06:00
f6664570d4 control group: implement ::fill_from_selection and ::size() 2023-07-26 16:41:54 -06:00
eba8eb07d3 automation control: fix logic for ::pop_group() 2023-07-26 16:41:09 -06:00
86a5aec276 change "use selection" modifier to Win/Opt (Level4 modifier) 2023-07-26 16:40:34 -06:00