Paul Davis
8f815e21ea
temporal: rename Point::sample() to Point::sample_is_dangerous()
...
It is risky to take the sample value returned by this method and then convert it back
to either superclocks or beats, mostly because tempo & meter times are generally in
music time, and converting from superclocks to samples loses precision.
This rename is there to serve as a reminder to developers to be careful when using
this method
2025-12-29 09:14:02 -07:00
Robin Gareus
22eee12f55
Fix crash when changing aux-panner state #10077
...
MixerStrip::show_send() may unset _panner if the send
has no panner. When then triggering an action that emits
`Pannable::automation_state_changed` (like un/link send panners)
of the main panner, Ardour crashed.
Note that PannerUI::set_panner already handed that case.
2025-12-29 09:56:42 +01:00
Robin Gareus
41c90a2063
Fix MIDI import edge-case when doubling allocation is insufficient
...
MIDI file from #10079 - see also 65332e603b
2025-12-29 09:23:56 +01:00
Krzysztof Gajdemski
8b2ede4d1a
Update Polish translation
2025-12-29 09:03:01 +01:00
Paul Davis
369fc2c15c
temporal: fix a major thinko when removing/replacing map points
...
Despite comments already in the code, the logic used to remove a
{Tempo,Meter,BarTime} point from the _points list was incorrect. While it is
true that we can use a duple of (type,time) to find a given point,
::remove_point() was not doing that and instead assumed just the time value
could be used.
This meant that if you placed a tempo and meter at the same point in time, then
changed one of them, ::remove_point() could remove the wrong point from the
_points list.
In #10063 this manifests as the wrong grid being drawn after a tempo point
edit.
This commit alters the ::core_remove_xxx() methods to return a pointer to the
actual Point object that was removed from {_tempos,_meters,_bartimes} and then
we pass that to ::remove_point() for lookup and removal by address.
It also "fixes" a couple of instances of ::core_remove_xxx() without any
removal from the _points list (since ::core_remove_tempo() and
::core_remove_meter() do not do this; ::core_remove_bartime() does,
however). It is not immediately obvious what bad behavior would arise from the
existing code in these cases, but it seems clearly incorrect that the _points
list would contain points no longer present in _tempos or _meters.
2025-12-27 12:14:49 -07:00
Paul Davis
f1b80cdbe1
temporal: add & use a couple of TempMap methods for unit testing
2025-12-27 12:14:49 -07:00
Paul Davis
f742ef661b
temporal: slightly improve addRemoveTest
2025-12-27 12:14:49 -07:00
Paul Davis
fee0af27cf
temporal: new addRemoveTest unit test
2025-12-27 12:14:49 -07:00
Paul Davis
bd5b8b82a6
remove debug output
2025-12-27 12:14:49 -07:00
jujudusud
a64c8a83b9
Update the translation into French
2025-12-24 16:21:44 +01:00
Franke Burgarino
52e493b49b
Fix typo
2025-12-22 13:25:59 -06:00
Paul Davis
adf0d52872
fix editing of meter & tempo points
...
when these points have times set in beat time (which they nearly always do), converting
their superclock time to samples and back loses accuracy. this caused the TempoMap to
find the wrong earlier points in the map.
It is still up for consideration that the editing code ought to identify explicitly
that we're working on an existing point, or adding a new one, and avoid lookup
by time for the existing points
2025-12-21 21:49:19 -07:00
Edgar Aichinger
cf40d5d5d0
add translated string again after typo fix by Alexandr
2025-12-20 16:59:08 +01:00
Edgar Aichinger
ea940a3a53
update german translation
2025-12-20 16:58:43 +01:00
Aleksandr Prokudin
04aa1f6476
Fix a typo spotted by @edogawa
2025-12-20 15:32:59 +01:00
John Emmas
8a3b7f3701
A minor comment change
2025-12-20 12:27:09 +00:00
John Emmas
841ec1c838
Revert some code that got removed accidentally
...
...but keep the new code that's needed for Stephen's build
2025-12-20 12:14:53 +00:00
Robin Gareus
46a03a9328
Who needs unistd.h, now that we have glibmm?
2025-12-18 16:09:13 +01:00
Robin Gareus
d23bcd1685
Fix crash when repeatedly showing group menu
...
route_group_menu needs to be detached before
TimeAxisView::build_display_menu () deletes and recreates
the parent menu.
2025-12-18 03:43:45 +01:00
Robin Gareus
fbc4bc4437
Fix some more dangling references to RouteGroups
...
* do not bind a shared_ptr for Edit Group.
* copy by capture, fixes radio group to not retain a reference
2025-12-17 21:34:50 +01:00
Robin Gareus
635916bf7a
Fix crash when group becomes empty but has a subgroup
...
Session::route_removed_from_route_group() did not delete
the group when it had a subgroup associated with it.
This way it was possible to have an empty track-group that
resulted in various edge-case crashes/assert().
2025-12-17 18:35:45 +01:00
Robin Gareus
370c596322
Backport Mixbus reset-mixer script
2025-12-17 15:15:28 +01:00
Robin Gareus
e9c5c38beb
Fix crash when using group treeview w/o selection
2025-12-17 14:46:07 +01:00
Robin Gareus
13dc1b1058
Don't allow to deactivate master/monitor/surround busses
2025-12-17 14:40:21 +01:00
Paul Davis
a90edc3e1b
when the last route is removed from a RouteGroup-with-VCA, drop weak ref to VCA
2025-12-16 22:30:17 -07:00
Paul Davis
927e2d14dd
fix copy-n-paste coding that hid route groups in mixer UI
2025-12-16 21:45:34 -07:00
Paul Davis
e1f0a6b731
avoid crash during shutdown, caused by accessing a null session during pointer leave event handling
2025-12-16 20:21:23 -07:00
Paul Davis
8b1b1e2362
GroupTabs: use weak_ptr to manage RouteGroups
...
GroupTabs only get updated during ::render() (don't ask, don't tell),
and since there is no ::render() call during Session deletion, owning
a shared_ptr<RouteGroup> makes the RouteGroup outlive the session itself.
2025-12-16 20:20:28 -07:00
Robin Gareus
4ad6ffec3d
Fix crash at exit when route-groups are deleted by route drop ref
...
==1914112==ERROR: AddressSanitizer: heap-use-after-free on address 0x619000483688 at pc 0x7f5b10be03c5 bp 0x7fff55e36670 sp 0x7fff55e36668
READ of size 8 at 0x619000483688 thread T0
#0 0x7f5b10be03c4 in std::__shared_count<(__gnu_cxx::_Lock_policy)2>::__shared_count(std::__weak_count<(__gnu_cxx::_Lock_policy)2> const&, std::nothrow_t) /usr/include/c++/10/bits/shared_ptr_base.h:911
#1 0x7f5b1190ecee in std::__shared_ptr<ARDOUR::VCA, (__gnu_cxx::_Lock_policy)2>::__shared_ptr(std::__weak_ptr<ARDOUR::VCA, (__gnu_cxx::_Lock_policy)2> const&, std::nothrow_t) /usr/include/c++/10/bits/shared_ptr_base.h:1382
#2 0x7f5b1190cc3e in std::shared_ptr<ARDOUR::VCA>::shared_ptr(std::weak_ptr<ARDOUR::VCA> const&, std::nothrow_t) /usr/include/c++/10/bits/shared_ptr.h:417
#3 0x7f5b1190aaae in std::weak_ptr<ARDOUR::VCA>::lock() const /usr/include/c++/10/bits/shared_ptr.h:749
#4 0x7f5b118fea7e in ARDOUR::RouteGroup::remove(std::shared_ptr<ARDOUR::Route>) ../libs/ardour/route_group.cc:267
#5 0x7f5b118fde6e in ARDOUR::RouteGroup::remove_when_going_away(std::weak_ptr<ARDOUR::Route>) ../libs/ardour/route_group.cc:223
#6 0x7f5b11912d3d in void std::__invoke_impl<void, void (ARDOUR::RouteGroup::*&)(std::weak_ptr<ARDOUR::Route>), ARDOUR::RouteGroup*&, std::weak_ptr<ARDOUR::Route>&>(std::__invoke_memfun_deref, void (ARDOUR::RouteGroup::*&)(std::weak_ptr<ARDOUR::Route>), ARDOUR::RouteGroup*&, std::weak_ptr<ARDOUR::Route>&) /usr/include/c++/10/bits/invoke.h:73
#7 0x7f5b119128c8 in std::__invoke_result<void (ARDOUR::RouteGroup::*&)(std::weak_ptr<ARDOUR::Route>), ARDOUR::RouteGroup*&, std::weak_ptr<ARDOUR::Route>&>::type std::__invoke<void (ARDOUR::RouteGroup::*&)(std::weak_ptr<ARDOUR::Route>), ARDOUR::RouteGroup*&, std::weak_ptr<ARDOUR::Route>&>(void (ARDOUR::RouteGroup::*&)(std::weak_ptr<ARDOUR::Route>), ARDOUR::RouteGroup*&, std::weak_ptr<ARDOUR::Route>&) /usr/include/c++/10/bits/invoke.h:95
#8 0x7f5b119125bc in void std::_Bind<void (ARDOUR::RouteGroup::*(ARDOUR::RouteGroup*, std::weak_ptr<ARDOUR::Route>))(std::weak_ptr<ARDOUR::Route>)>::__call<void, , 0ul, 1ul>(std::tuple<>&&, std::_Index_tuple<0ul, 1ul>) /usr/include/c++/10/functional:416
#9 0x7f5b11911fdc in void std::_Bind<void (ARDOUR::RouteGroup::*(ARDOUR::RouteGroup*, std::weak_ptr<ARDOUR::Route>))(std::weak_ptr<ARDOUR::Route>)>::operator()<, void>() /usr/include/c++/10/functional:499
#10 0x7f5b11910e79 in void std::__invoke_impl<void, std::_Bind<void (ARDOUR::RouteGroup::*(ARDOUR::RouteGroup*, std::weak_ptr<ARDOUR::Route>))(std::weak_ptr<ARDOUR::Route>)>&>(std::__invoke_other, std::_Bind<void (ARDOUR::RouteGroup::*(ARDOUR::RouteGroup*, std::weak_ptr<ARDOUR::Route>))(std::weak_ptr<ARDOUR::Route>)>&) /usr/include/c++/10/bits/invoke.h:60
#11 0x7f5b1190f187 in std::enable_if<is_invocable_r_v<void, std::_Bind<void (ARDOUR::RouteGroup::*(ARDOUR::RouteGroup*, std::weak_ptr<ARDOUR::Route>))(std::weak_ptr<ARDOUR::Route>)>&>, void>::type std::__invoke_r<void, std::_Bind<void (ARDOUR::RouteGroup::*(ARDOUR::RouteGroup*, std::weak_ptr<ARDOUR::Route>))(std::weak_ptr<ARDOUR::Route>)>&>(std::_Bind<void (ARDOUR::RouteGroup::*(ARDOUR::RouteGroup*, std::weak_ptr<ARDOUR::Route>))(std::weak_ptr<ARDOUR::Route>)>&) /usr/include/c++/10/bits/invoke.h:110
#12 0x7f5b1190d26a in std::_Function_handler<void (), std::_Bind<void (ARDOUR::RouteGroup::*(ARDOUR::RouteGroup*, std::weak_ptr<ARDOUR::Route>))(std::weak_ptr<ARDOUR::Route>)> >::_M_invoke(std::_Any_data const&) /usr/include/c++/10/bits/std_function.h:291
#13 0x558120310619 in std::function<void ()>::operator()() const /usr/include/c++/10/bits/std_function.h:622
#14 0x7f5b10bcb0d6 in PBD::SignalWithCombiner<PBD::OptionalLastValue<void>, void ()>::operator()() ../libs/pbd/pbd/signals.h:508
#15 0x7f5b10bc779b in PBD::Destructible::drop_references() ../libs/pbd/pbd/destructible.h:33
#16 0x7f5b1196700f in ARDOUR::Session::destroy() ../libs/ardour/session.cc:822
#17 0x7f5b11962f93 in ARDOUR::Session::~Session() ../libs/ardour/session.cc:581
#18 0x7f5b119639a9 in ARDOUR::Session::~Session() ../libs/ardour/session.cc:582
#19 0x558120305a92 in close_session ../luasession/luasession.cc:366
#20 0x55812031911c in luabridge::FuncTraits<void (*)(), void (*)()>::call(void (*)(), luabridge::TypeListValues<void>) ../libs/lua/LuaBridge/detail/FuncTraits.h:73
#21 0x5581203151eb in luabridge::CFunc::Call<void (*)(), void>::f(lua_State*) ../libs/lua/LuaBridge/detail/CFunctions.h:244
#22 0x55812035701f in luaD_precall ../libs/lua/lua-5.3.5/ldo.c:434
#23 0x55812038f1bd in luaV_execute ../libs/lua/lua-5.3.5/lvm.c:1136
#24 0x5581203579a8 in luaD_call ../libs/lua/lua-5.3.5/ldo.c:499
#25 0x558120357a80 in luaD_callnoyield ../libs/lua/lua-5.3.5/ldo.c:509
#26 0x558120346f82 in f_call ../libs/lua/lua-5.3.5/lapi.c:943
#27 0x558120354e59 in luaD_rawrunprotected ../libs/lua/lua-5.3.5/ldo.c:142
#28 0x55812035924f in luaD_pcall ../libs/lua/lua-5.3.5/ldo.c:729
#29 0x558120347226 in lua_pcallk ../libs/lua/lua-5.3.5/lapi.c:969
#30 0x558120393ae9 in LuaState::do_command(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >) ../libs/lua/luastate.cc:64
#31 0x558120306da8 in interactive_interpreter ../luasession/luasession.cc:514
#32 0x558120307b36 in main ../luasession/luasession.cc:641
#33 0x7f5b0e40dd79 in __libc_start_main ../csu/libc-start.c:308
#34 0x558120303179 in _start (/home/rgareus/src/ardour/build/luasession/luasession+0x7a179)
0x619000483688 is located 264 bytes inside of 952-byte region [0x619000483580,0x619000483938)
freed by thread T0 here:
#0 0x7f5b12cac467 in operator delete(void*, unsigned long) ../../../../src/libsanitizer/asan/asan_new_delete.cpp:172
#1 0x7f5b118fc486 in ARDOUR::RouteGroup::~RouteGroup() ../libs/ardour/route_group.cc:168
#2 0x7f5b11c1c34b in std::_Sp_counted_ptr<ARDOUR::RouteGroup*, (__gnu_cxx::_Lock_policy)2>::_M_dispose() /usr/include/c++/10/bits/shared_ptr_base.h:380
#3 0x55812031249a in std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release() /usr/include/c++/10/bits/shared_ptr_base.h:158
#4 0x7f5b10bf9ac4 in std::__shared_count<(__gnu_cxx::_Lock_policy)2>::operator=(std::__shared_count<(__gnu_cxx::_Lock_policy)2> const&) /usr/include/c++/10/bits/shared_ptr_base.h:752
#5 0x7f5b11915cac in std::__shared_ptr<ARDOUR::RouteGroup, (__gnu_cxx::_Lock_policy)2>::operator=(std::__shared_ptr<ARDOUR::RouteGroup, (__gnu_cxx::_Lock_policy)2> const&) /usr/include/c++/10/bits/shared_ptr_base.h:1182
#6 0x7f5b11915cd6 in std::shared_ptr<ARDOUR::RouteGroup>::operator=(std::shared_ptr<ARDOUR::RouteGroup> const&) /usr/include/c++/10/bits/shared_ptr.h:358
#7 0x7f5b11915b75 in ARDOUR::RouteGroupMember::set_route_group(std::shared_ptr<ARDOUR::RouteGroup>) ../libs/ardour/route_group_member.cc:36
#8 0x7f5b118fe9fe in ARDOUR::RouteGroup::remove(std::shared_ptr<ARDOUR::Route>) ../libs/ardour/route_group.cc:265
#9 0x7f5b118fde6e in ARDOUR::RouteGroup::remove_when_going_away(std::weak_ptr<ARDOUR::Route>) ../libs/ardour/route_group.cc:223
#10 0x7f5b11912d3d in void std::__invoke_impl<void, void (ARDOUR::RouteGroup::*&)(std::weak_ptr<ARDOUR::Route>), ARDOUR::RouteGroup*&, std::weak_ptr<ARDOUR::Route>&>(std::__invoke_memfun_deref, void (ARDOUR::RouteGroup::*&)(std::weak_ptr<ARDOUR::Route>), ARDOUR::RouteGroup*&, std::weak_ptr<ARDOUR::Route>&) /usr/include/c++/10/bits/invoke.h:73
#11 0x7f5b119128c8 in std::__invoke_result<void (ARDOUR::RouteGroup::*&)(std::weak_ptr<ARDOUR::Route>), ARDOUR::RouteGroup*&, std::weak_ptr<ARDOUR::Route>&>::type std::__invoke<void (ARDOUR::RouteGroup::*&)(std::weak_ptr<ARDOUR::Route>), ARDOUR::RouteGroup*&, std::weak_ptr<ARDOUR::Route>&>(void (ARDOUR::RouteGroup::*&)(std::weak_ptr<ARDOUR::Route>), ARDOUR::RouteGroup*&, std::weak_ptr<ARDOUR::Route>&) /usr/include/c++/10/bits/invoke.h:95
#12 0x7f5b119125bc in void std::_Bind<void (ARDOUR::RouteGroup::*(ARDOUR::RouteGroup*, std::weak_ptr<ARDOUR::Route>))(std::weak_ptr<ARDOUR::Route>)>::__call<void, , 0ul, 1ul>(std::tuple<>&&, std::_Index_tuple<0ul, 1ul>) /usr/include/c++/10/functional:416
#13 0x7f5b11911fdc in void std::_Bind<void (ARDOUR::RouteGroup::*(ARDOUR::RouteGroup*, std::weak_ptr<ARDOUR::Route>))(std::weak_ptr<ARDOUR::Route>)>::operator()<, void>() /usr/include/c++/10/functional:499
#14 0x7f5b11910e79 in void std::__invoke_impl<void, std::_Bind<void (ARDOUR::RouteGroup::*(ARDOUR::RouteGroup*, std::weak_ptr<ARDOUR::Route>))(std::weak_ptr<ARDOUR::Route>)>&>(std::__invoke_other, std::_Bind<void (ARDOUR::RouteGroup::*(ARDOUR::RouteGroup*, std::weak_ptr<ARDOUR::Route>))(std::weak_ptr<ARDOUR::Route>)>&) /usr/include/c++/10/bits/invoke.h:60
#15 0x7f5b1190f187 in std::enable_if<is_invocable_r_v<void, std::_Bind<void (ARDOUR::RouteGroup::*(ARDOUR::RouteGroup*, std::weak_ptr<ARDOUR::Route>))(std::weak_ptr<ARDOUR::Route>)>&>, void>::type std::__invoke_r<void, std::_Bind<void (ARDOUR::RouteGroup::*(ARDOUR::RouteGroup*, std::weak_ptr<ARDOUR::Route>))(std::weak_ptr<ARDOUR::Route>)>&>(std::_Bind<void (ARDOUR::RouteGroup::*(ARDOUR::RouteGroup*, std::weak_ptr<ARDOUR::Route>))(std::weak_ptr<ARDOUR::Route>)>&) /usr/include/c++/10/bits/invoke.h:110
#16 0x7f5b1190d26a in std::_Function_handler<void (), std::_Bind<void (ARDOUR::RouteGroup::*(ARDOUR::RouteGroup*, std::weak_ptr<ARDOUR::Route>))(std::weak_ptr<ARDOUR::Route>)> >::_M_invoke(std::_Any_data const&) /usr/include/c++/10/bits/std_function.h:291
#17 0x558120310619 in std::function<void ()>::operator()() const /usr/include/c++/10/bits/std_function.h:622
#18 0x7f5b10bcb0d6 in PBD::SignalWithCombiner<PBD::OptionalLastValue<void>, void ()>::operator()() ../libs/pbd/pbd/signals.h:508
#19 0x7f5b10bc779b in PBD::Destructible::drop_references() ../libs/pbd/pbd/destructible.h:33
#20 0x7f5b1196700f in ARDOUR::Session::destroy() ../libs/ardour/session.cc:822
#21 0x7f5b11962f93 in ARDOUR::Session::~Session() ../libs/ardour/session.cc:581
#22 0x7f5b119639a9 in ARDOUR::Session::~Session() ../libs/ardour/session.cc:582
#23 0x558120305a92 in close_session ../luasession/luasession.cc:366
#24 0x55812031911c in luabridge::FuncTraits<void (*)(), void (*)()>::call(void (*)(), luabridge::TypeListValues<void>) ../libs/lua/LuaBridge/detail/FuncTraits.h:73
#25 0x5581203151eb in luabridge::CFunc::Call<void (*)(), void>::f(lua_State*) ../libs/lua/LuaBridge/detail/CFunctions.h:244
#26 0x55812035701f in luaD_precall ../libs/lua/lua-5.3.5/ldo.c:434
#27 0x55812038f1bd in luaV_execute ../libs/lua/lua-5.3.5/lvm.c:1136
#28 0x5581203579a8 in luaD_call ../libs/lua/lua-5.3.5/ldo.c:499
#29 0x558120357a80 in luaD_callnoyield ../libs/lua/lua-5.3.5/ldo.c:509
#30 0x558120346f82 in f_call ../libs/lua/lua-5.3.5/lapi.c:943
#31 0x558120354e59 in luaD_rawrunprotected ../libs/lua/lua-5.3.5/ldo.c:142
#32 0x55812035924f in luaD_pcall ../libs/lua/lua-5.3.5/ldo.c:729
#33 0x558120347226 in lua_pcallk ../libs/lua/lua-5.3.5/lapi.c:969
#34 0x558120393ae9 in LuaState::do_command(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >) ../libs/lua/luastate.cc:64
#35 0x558120306da8 in interactive_interpreter ../luasession/luasession.cc:514
#36 0x558120307b36 in main ../luasession/luasession.cc:641
#37 0x7f5b0e40dd79 in __libc_start_main ../csu/libc-start.c:308
2025-12-17 03:14:22 +01:00
Robin Gareus
167359b300
Fix crashes caused by retaining references in 557058f362
2025-12-17 01:45:19 +01:00
Paul Davis
1721681c7d
fix display of MIDI regions in cue editors even when they do not start at the source start
...
This also shows signs of mild improvements in the initial zoom setting for cue editors,
though more work is needed there
2025-12-16 15:30:06 -07:00
Paul Davis
c05877c801
fix crash when editing MIDI notes in a cue editor (there's no playlist)
2025-12-16 15:30:06 -07:00
Robin Gareus
ef9fc93ffc
Fix another static signal that depends on the session
...
see also 557058f362 and compare to
Mixer_UI::sync_presentation_info_from_treeview
2025-12-16 23:28:06 +01:00
Robin Gareus
557058f362
Fix crash when an early callback changes selection during session load
...
This can happen e.g. from a VST3 plugin's state restore.
2025-12-16 23:22:43 +01:00
Paul Davis
4273652488
RouteGroupMenu must not bind std::shared_ptr<RouteGroup> to menu items
2025-12-16 13:21:49 -07:00
Paul Davis
37c80a0f27
fix a leftover use of shared_from_this()
...
This was left from the experimental phase of shared route groups,
when the GUI was still using raw pointers.
2025-12-16 12:08:24 -07:00
Paul Davis
f351c619de
group tabs changes to avoid dangling references to RouteGroups
...
The menu is built and persists between button presses, and so
cannot contain std::shared_ptr<RouteGroup> bindings.
2025-12-16 12:08:24 -07:00
Paul Davis
db6005945f
changes to RouteGroup API and mgmt to make explicit group removal work
2025-12-16 12:08:24 -07:00
Krzysztof Gajdemski
321e8c368b
Update Polish translation
2025-12-16 19:59:40 +01:00
Robin Gareus
6695748bec
Remove yet another superfluous unistd
2025-12-16 16:27:48 +01:00
Paul Davis
2327070a17
use grid to control distance that arrow keys move automation by
...
Note that this requires a musical grid type; other types will use a single quarter note.
This should likely be addressed.
2025-12-15 17:16:40 -07:00
Paul Davis
3649987871
fix action descriptions for kbd-driven automation actions
2025-12-15 17:16:40 -07:00
Robin Gareus
64fe619e64
Fix Windows builds (RouteGroup Lua bindings)
2025-12-16 01:02:53 +01:00
Robin Gareus
3f2d5bcbda
Sort strips to import in import dialog
2025-12-16 00:29:23 +01:00
Robin Gareus
983de82ffa
Add option to import invisible mixer strips from templates
2025-12-15 23:50:57 +01:00
Robin Gareus
050d6c07a6
Import strips as new tracks in PI sort order
2025-12-15 23:50:57 +01:00
Paul Davis
199702cda6
AxisView::name() is supposed to be public, so make it so for TimeAxisView
2025-12-15 12:06:11 -07:00
Paul Davis
c0846d876f
NO-OP: two random 0 -> nullptr conversions
2025-12-15 12:06:11 -07:00
Robin Gareus
49f359eb8d
Fix RouteGroupList Lua bindings
2025-12-15 20:03:07 +01:00
Paul Davis
e6bb61b86d
in pianorolls, allow note-clicks to select in draw mode, just like the editor
2025-12-15 09:59:58 -07:00