Commit graph

22045 commits

Author SHA1 Message Date
Paul Davis
7dadddb3dc temporal: provide TempoMap::global_fetch()
This always returns a shared ptr to the global tempo map, without setting the
thread-local pointer
2025-08-23 22:35:16 -06:00
Daniel Appelt
26c9621aca
Add support to create midi regions from Lua 2025-08-23 21:49:48 +02:00
Robin Gareus
a6e3708a8a
NO-OP: format comment 2025-08-23 21:46:35 +02:00
Robin Gareus
a94dba4ef4
Add preference to disable implicit grouping 2025-08-23 09:59:02 +02:00
Franke Burgarino
faebc7ab35 MCU: show surround master in global/mixer view
only if the controller doesn't have a master fader
2025-08-22 14:47:48 -05:00
Franke Burgarino
a57e3db41c MCU: clean up MackieControlProtocol::get_sorted_stripables logic 2025-08-22 13:58:52 -05:00
Franke Burgarino
d49e44c5c7 MCU: add MackieControlProtocol::is_bus 2025-08-22 13:56:50 -05:00
Franke Burgarino
75f8aa3673 MCU: bring back foldbacks with correct sorting 2025-08-22 13:54:53 -05:00
Paul Davis
bb13bd48b2 several more bbt_delta() unit tests 2025-08-22 10:59:06 -06:00
Paul Davis
27ffd1628d temporal: remove iterative bbt_delta() since unit test shows breakage 2025-08-22 10:51:16 -06:00
Paul Davis
fd53cf87ed temporal: new non-iterative implementation of Meter::bbt_delta() 2025-08-22 10:45:12 -06:00
Paul Davis
26e63fca9b add unit test for Meter::bbt_delta() 2025-08-22 10:45:12 -06:00
Paul Davis
05210fc7e2 Evoral: add ControlList::has_event_at (timepos_t) 2025-08-21 18:56:00 -06:00
Paul Davis
40b7b0a55c canvas: fix enter notify event handler to work with gtk ungrabs
GTK delivers both window and root coordinates as (0,0) for GDK_CROSSING_GTK_UNGRAB
modes. We need the real coordinates of the pointer to pick the right canvas item
2025-08-21 18:56:00 -06:00
Paul Davis
5d58ff7ebf tag regions captured inside Ardour with tempo and meter from timeline 2025-08-21 18:56:00 -06:00
Franke Burgarino
fd13fdb1bf MCU: fix pan values for mixbus 2025-08-21 16:57:42 -05:00
Robin Gareus
59989eed3a
Consolidate PI type flags across projects
This is to prevent future conflicts of flags..
2025-08-21 18:28:23 +02:00
Robin Gareus
d7af181037
Amend 28c8dbf128, unsubscribe from destroyed signal
This handles another edge case where the Frame is deleted
before the child widget.
2025-08-21 04:41:17 +02:00
Franke Burgarino
e42cea63d5 MCU: work around mixbus initialization issue 2025-08-20 18:49:19 -05:00
Franke Burgarino
d6697cd702 MCU: fix mcpStripableSorter 2025-08-20 18:49:19 -05:00
Paul Davis
e9460bb372 temporal: fix unused variable warning in TempoMap::paste() 2025-08-20 17:43:45 -06:00
Paul Davis
de843db102 temporal: lots more DEBUG_TRACE statements for grid debugging 2025-08-20 17:43:34 -06:00
Paul Davis
607f3577bd temporal: in the event of the most common logic failure, provide more info
TEMPORAL_MAP_ASSERT() doesn't give us any actual values or context.
2025-08-20 17:43:24 -06:00
Paul Davis
5aed12b90e in launchkey 4 code, use new Meter::bbt_delta() not ::bbt_delta 2025-08-20 17:43:15 -06:00
Paul Davis
a8168f826d remove incorrect bbt_delta() in BBT_Time, provide Meter::bbt_delta
There are two implementations here, the more efficient one (commented out) does
not work correctly yet.
2025-08-20 17:43:05 -06:00
Paul Davis
0dab69fe74 check for null ActionGroup in ActionManager::drop_action_group() 2025-08-20 14:54:07 -06:00
Robin Gareus
724340ce11
Hide debug messages in optimized builds 2025-08-20 21:42:04 +02:00
Franke Burgarino
8bfd8de2f6 MCU: hide phase/solo controls for master 2025-08-20 10:30:05 -05:00
Robin Gareus
28c8dbf128
Handle special case of using unmanaged widgets to Frame
This happens in in Ardour's Preference dialog with
e.g. BufferingOptions:

~OptionEditorContainer deletes the Option, which in turn
deletes the Widget BufferingOptions:_buffering_presets_combo
Since the widget is not managed it is not removed from its
parent.

Later ~OptionEditorContainer disposes the page layout, which
eventually also calls the Frame d'tor, causing a heap-use-after-free.
2025-08-20 16:19:25 +02:00
Franke Burgarino
2f3c700cd0 MCU: give UF1 & UF8 seperate device configs 2025-08-19 15:36:40 -05:00
Franke Burgarino
25d9c2b284 MCU: add master/monitor to global/mixer view if device has no master fader 2025-08-19 15:36:40 -05:00
Robin Gareus
43e4e428f5
Handle case where a custom MenuElem is added to the dropdown 2025-08-19 20:06:04 +02:00
Paul Davis
469f3e4d2a unit tests: fix an unusual deadlock/block in TempoMap::write_copy()
this call works in other tests, no time to investigate it right now, and
technically the test doesn't require a write copy at all.
2025-08-19 10:53:06 -06:00
Paul Davis
69174b555e unit tests: use std::cout for any debug output in tempo map cut buffer test 2025-08-19 10:53:06 -06:00
Paul Davis
1312e8f992 temporal: implement TempoMap::bbt_distance() but do not use it
This was implemented to try to fix paste() but was not needed. It might be
useful in the future, or just as an expression of the logic of this. Note that
the BBT_Offset it returns only has the beats field set, which is ... odd. So
this is likely not quite finished.
2025-08-19 10:53:06 -06:00
Paul Davis
29be601cce temporal: undefine macro after use 2025-08-19 10:53:06 -06:00
Paul Davis
7c9b9ceb7e temporal: show BBT marker point names in operator<< 2025-08-19 10:53:06 -06:00
Paul Davis
2aad1ac5f5 temporal: fix TempoMap::paste() to pass unit test
the BBT times of the newly inserted points during paste() are meaningless until
we recompute them using ::reset_starting_at(). So don't try to compute some
sort of likely value, just use the value from the cut buffer, and call
reset_starting_at() after every point inserted.
2025-08-19 10:53:06 -06:00
Paul Davis
f0111bcea5 temporal: BBT_Time cannot have any round_to_*() or round_up_to_*() methods
A meter (time signature) is required to do the math correctly for any operation that may
cross or reach the next bar boundary, which round_to_*() and round_up_to_*() may do.
2025-08-19 10:53:06 -06:00
Robin Gareus
4859e4e57e
ArdourDropdown: use action's short-label for display text 2025-08-19 18:18:41 +02:00
Robin Gareus
5f12554b56
YTKMM: expose ytk_set_child_packing 2025-08-19 14:20:39 +02:00
Paul Davis
a48ffdf998 refinements to SMF type0 import logic 2025-08-18 16:46:26 -06:00
Paul Davis
4303b77441 MIDI regions attempt to get their tempo & meter from their source file 2025-08-18 16:35:42 -06:00
Paul Davis
c49f607ce6 slightly refine SMF::is_meta() to differentiate realtime system reset 2025-08-18 16:35:41 -06:00
Paul Davis
79da488132 Reimplement MIDI file import to retain metadata in the files written
Previosuly, all meta data was thrown away. Now we retain it, so that MIDI
regions can ask about their source file's tempo & meter.

Significant engineering rework of how this all works, relying on
recently introduced API and API changes in SMF, SMFSource etc.
2025-08-18 16:35:41 -06:00
Paul Davis
48cd807e6a change API of MidiSource::append_event_beats() to allow meta-event legality
Because we want a default argument of false, this involved the usual
inline-non-virtual-method-calls-virtual-with-no-default trick.

Also, do NOT append data to a MidiModel or change the length of an SMFSource
unless we know for sure that added that data to the SMF object.
2025-08-18 16:35:41 -06:00
Paul Davis
586ac7e447 add SMFSource::end_track() to provide source-level access to SMF method 2025-08-18 16:35:41 -06:00
Paul Davis
73065f814a modify API of Evoral::SMF::append_event_beats() to add meta-event legality
If the (new) final argument is true, we allow writing SMF meta events to the
underlying libsmf object (which doesn't care one way or another).
2025-08-18 16:35:41 -06:00
Paul Davis
b60702e014 add Evoral::SMF::end_track()
This changes the assumption that an SMF object only refers to
a single track when being written.

::end_track() is used within begin::write()/end_write() pairs to mark the start
of a new SMF track.
2025-08-18 16:35:41 -06:00
Paul Davis
785047bf47 add Evoral::SMF::is_meta() to test for SMF meta events
These are not legal in "live" MIDI but are allowed in SMF files.
2025-08-18 16:35:41 -06:00