Commit graph

134 commits

Author SHA1 Message Date
Paul Davis
17ace643e4 OMNIBUS COMMIT: prefer const XMLNode::property method (and provide a real one) 2016-05-04 23:09:45 -04:00
Robin Gareus
e2902a0b76 clarify midi-iterator comment 2015-08-27 14:43:28 +02:00
Robin Gareus
1387e756de fix linked midi-regions on different tracks #6541
A somewhat hacky solution to address missing note-off events when a
linked midi-region is used on separate tracks at the same time.
see the source-code comment for further info.
2015-08-25 03:48:54 +02:00
David Robillard
c9023ae73d Fix mute of MIDI tracks with channel forcing.
This moves MIDI channel filtering into a reusable class and moves filtering to
the source, rather than modifying the buffer afterwards.  This is necessary so
that the playlist trackers reflect the emitted notes (and thus are able to stop
them in situations like mute).

As a perk, this is also faster because events are just dropped on read, rather
than pushed into a buffer then later removed (which is very slow).

Really hammering on mute or solo still seems to produce stuck notes
occasionally (perhaps related to multiple-on warnings).  I am not yet sure why,
but occasional beats always.
2015-03-29 00:51:56 -04:00
David Robillard
a8aae56d92 Handle edits while playing precisely.
This avoids stuck notes if active notes are edited, but without stopping all
active notes in the region on any edit as before.

This implementation injects note ons in places that aren't actually note
starts.  Depending on how percussive the instrument is, this may not be
desired.  In the future, an option for this would be an improvement, but there
are other places where "start notes in the middle" is a reasonable option.  I
think that should be handled universally if we're to do it at all, so not
considering it a part of this fix for now.
2015-03-05 17:30:31 -05:00
David Robillard
2a251b4570 MusicalTime => Beats. 2015-01-07 00:12:07 -05:00
David Robillard
97d344f740 Fix MIDI CC record/playback crash. 2014-12-30 14:45:11 -05:00
David Robillard
a85827da1c Revert "Fix occasional MIDI read crash."
This reverts commit ec947ff8fd.
2014-12-30 13:03:22 -05:00
David Robillard
ec947ff8fd Fix occasional MIDI read crash.
Locking should prevent this from being a problem, but taking a reference to the
cached iterator and mutating it directly causes occasional crashes for me for
reasons I can't quite figure out.

This fixes the issue and is arguably more sane anyway, so whatever.
2014-12-28 16:06:44 -05:00
David Robillard
a706755710 Fix various MIDI locking issues.
Attempt to make mistakes much less likely in the future by statically requiring
caller to pass scoped locks where necessary.
2014-12-17 16:07:29 -05:00
David Robillard
eb86971d2d Invalidate iterator whenever model changes.
I suspect this is an underlying cause of several tricky to reproduce bugs, but
we'll have to wait around and see...
2014-12-06 22:43:06 -05:00
David Robillard
0bf778c847 Make recorded MIDI controls discrete, take 2.
Hopefully-desired behaviour is that controls created in the GUI are linear, so
clicking in stuff works like other automation, but controls that originated
from recording are set to discrete so Ardour plays back the input exactly,
instead of doing crazy things like linear interpolation of already high-rate
user input, hold pedals, and so on.

Hopefully that remains the desired behaviour, because we're basically screwed
for ever making any control discrete by default, since we only save the mode to
XML at all if it's not the default, which is currently linear.
2014-12-05 00:15:40 -05:00
David Robillard
767c0238a3 Replace half-baked param metadata with descriptor.
Among other things, this means that automation controls/lists have the actual
min/max/normal/toggled of parameters, and not those inferred from the Parameter
ID, which is not correct for things like plugin parameters.

Pushing things down to the Evoral::ParmeterDescriptor may be useful in the
future to have lists do smarter things based on parameter range, but currently
I have just pushed down the above-mentioned currently used attributes.
2014-12-01 23:35:24 -05:00
David Robillard
1693e57e0e Move EventRingBuffer to libardour.
This is not used anywhere in Evoral and is just a wrapper around the PBD
RingBuffer anyway.  Towards a (once again?) independently buildable/testable
Evoral and fewer cross-dependencies.
2014-11-30 23:56:19 -05:00
David Robillard
c1cfa12d6e Wrap MusicalTime in a class.
This lets us get a more explicit handle on time conversions, and is the main
step towards using actual beat:tick time and getting away from floating point
precision problems.
2014-11-22 04:05:42 -05:00
David Robillard
4bc0d1c475 Fix lost MIDI note offs and controllers.
Fix initial read of discrete MIDI controllers.

Fix spurious note offs when starting to play in the middle of a note.

Faster search for initial event when cached iterator is invalid.

So much for dropping the cached iterator.  The iterator is responsible for
handling note offs, so that doesn't work.  This design means we have some stuck
note issues at the source read level, but they should be taken care of by the
state tracker anyway.
2014-11-20 15:36:11 -05:00
David Robillard
8f8a4878f3 Clean up some MIDI code. 2014-11-20 11:31:31 -05:00
David Robillard
a9936205b1 Fix dropped MIDI events, especially with record enabled.
I am not precisely sure why the cached iterator was causing this problem, it
shouldn't be invalidated, and the times make sense.  It may be some lock
related issue since the iterator holds a lock on the source.

In any case, this cached iterator was just to avoid repeated linear search of
the model, but since the model has a logarithmic search, instead just scrap all
this problematic persistent state and search for the appropriate start time
every read.  No need to be careful about invalidating when anything changes.
2014-11-19 19:24:16 -05:00
Paul Davis
343b06d8d3 dramatic change in logic and naming for operations related to adding a MIDI region on demand and cloning/unlinking
Existing code would cause data loss due to creation of two Source objects referring the same path, one with removable flags and one without. Careful code review suggested a variety of thinkos, function naming problems and other confusion that caused this. I have tried ot extensively comment what is going on with these operations, because it is one key area in which MIDI differs from audio: with audio, capture is the only way to add a new audio region, but for MIDI there are GUI input events that can add a new region.
2014-04-14 02:17:30 -04:00
Paul Davis
c52f7957a9 redesign technique for naming/creating regions for MIDI clone (or other non-capture driven MIDI region creation operations).
See comments in Session::new_midi_source_name() for details.
2014-04-10 08:58:04 -04:00
Paul Davis
fc691cb3ba after cloning a MIDI region, mark the source file as non-removable. Fixes reports about missing MIDI files on the forums and IRC 2014-04-04 15:26:44 -04:00
Paul Davis
23bec25bf5 Remove non-portable and unnused header includes 2013-07-11 11:34:37 -04:00
Paul Davis
b691d4bf04 fix up some confusion with filesources' _origin and _file_is_new members. if _origin is set, it means that the file is "external" to the session (aka "embedded") and for some purposes this is more significant than _file_is_new. rename SourceFactory::createReadable() to ::createExternal() to more clearly indicate its purpose; remove never-supplied "origin" argument from SourceFactor::createWritable(). Fixes problems caused by 864ce8f0 2013-03-30 14:02:26 -04:00
David Robillard
e781c1cf0d Fix MIDI loop recording.
This changes how things work a bit, but I am committing it for 3.0 since the
previous revision often crashed (and never worked), this one seems to work
fine, and the code is quite a bit more cogent.

I have tested the following use cases with live input and audible output:

 * Non-loop recording, armed before roll
 * Non-loop recording, arm while rolling
 * Loop recording, armed before roll
 * Loop recording, arm during roll

In the last case, the source/region is created starting at the loop start
rather than the current transport frame as usual so time makes sense when it
wraps around.

See the documentation added to the code for details, but the basic idea here is
to simply push MIDI events to the source with increasing monotonic time,
ignoring looping altogether.  Essentially we pretend the loop does not exist,
but the source knows all the details so it can implement whatever behaviour is
appropriate.

Currently, this is simply recording a complete non-destructive copy of the
input, which is a good thing.  Perhaps not what the user expects of loop
recording, but at least it works and is one sensible option.  We will need to
add more later.

Display while recording is a little bit wacky, but whatever.


git-svn-id: svn://localhost/ardour2/branches/3.0@13940 d708f5d6-7413-0410-9779-e7cbd77b26cf
2013-01-21 06:00:15 +00:00
David Robillard
76547b5c4b More style-only changes.
git-svn-id: svn://localhost/ardour2/branches/3.0@13939 d708f5d6-7413-0410-9779-e7cbd77b26cf
2013-01-21 02:35:53 +00:00
Paul Davis
760ccbabfb add -Wpointer-arith -Wcast-qual -Wcast-align and others to compile flags, and fix const cast warnings generated by new flags
git-svn-id: svn://localhost/ardour2/branches/3.0@13124 d708f5d6-7413-0410-9779-e7cbd77b26cf
2012-08-10 15:57:09 +00:00
Paul Davis
3cd8138a41 convert from Glib:: to Glib::Threads for all thread-related API
git-svn-id: svn://localhost/ardour2/branches/3.0@13084 d708f5d6-7413-0410-9779-e7cbd77b26cf
2012-07-25 17:48:55 +00:00
Paul Davis
3c252e9321 lots more fidgety work on automation. sort of works now, but undo/redo needs attention
git-svn-id: svn://localhost/ardour2/branches/3.0@13047 d708f5d6-7413-0410-9779-e7cbd77b26cf
2012-07-17 03:10:40 +00:00
Tim Mayberry
105caf23da Use std::string instead of PBD::sys::path in pbd/search_path.h, pbd/file_utils.h and ardour/session_dir.h
git-svn-id: svn://localhost/ardour2/branches/3.0@12829 d708f5d6-7413-0410-9779-e7cbd77b26cf
2012-06-23 05:06:54 +00:00
David Robillard
6fa6514cfd Remove over 500 unnecessary includes (including 54 of session.h).
It's slightly possible that this causes trivial build failures on different
configurations, but otherwise shouldn't cause any problems (i.e. no actual
changes other than include/naming/namespace stuff).  I deliberately avoided
removing libardour-config.h since this can mysteriously break things, though a
few of those do seem to be unnecessary.

This commit only targets includes of ardour/*.h.  There is also a very large
number of unnecessary includes of stuff in gtk2_ardour; tackling that should
also give a big improvement in build time when things are modified.


git-svn-id: svn://localhost/ardour2/branches/3.0@12420 d708f5d6-7413-0410-9779-e7cbd77b26cf
2012-05-24 06:09:29 +00:00
Paul Davis
7873fdb55c alter API for MIDI cloning to facilitate export
git-svn-id: svn://localhost/ardour2/branches/3.0@12401 d708f5d6-7413-0410-9779-e7cbd77b26cf
2012-05-23 20:32:29 +00:00
Carl Hetherington
3f647a9dcd Simplify slightly odd update_length() signature.
git-svn-id: svn://localhost/ardour2/branches/3.0@11900 d708f5d6-7413-0410-9779-e7cbd77b26cf
2012-04-11 15:47:33 +00:00
Paul Davis
ed2beaffee main fix: when transport stops, clear per-region per-playlist note trackers even if there is no capture data to process; side effects: remove unused MidiBuffer::merge() and add DEBUG::MidiTrackers as well as more and better MIDI debug tracing facilities
git-svn-id: svn://localhost/ardour2/branches/3.0@11057 d708f5d6-7413-0410-9779-e7cbd77b26cf
2011-12-22 20:14:47 +00:00
Paul Davis
2929cd1c36 tweak debug output
git-svn-id: svn://localhost/ardour2/branches/3.0@10780 d708f5d6-7413-0410-9779-e7cbd77b26cf
2011-11-22 20:29:41 +00:00
Carl Hetherington
75e6adcf03 Remove unused read/write data count code.
git-svn-id: svn://localhost/ardour2/branches/3.0@10300 d708f5d6-7413-0410-9779-e7cbd77b26cf
2011-10-24 20:45:29 +00:00
Carl Hetherington
90a2cc0746 The most minor of formatting tweaks.
git-svn-id: svn://localhost/ardour2/branches/3.0@10139 d708f5d6-7413-0410-9779-e7cbd77b26cf
2011-09-27 01:20:58 +00:00
Paul Davis
c99738d88e try to fix data loss at end of a capture pass for MIDI - add a new virtual method to MidiSource that specifies what should be done with stuck notes, remove duplicate(i hope) _last_flush_frame from SMFSource that mirrored, more or less, MidiSource::_last_write_end; use new virtual method when stopping after capture.
git-svn-id: svn://localhost/ardour2/branches/3.0@9910 d708f5d6-7413-0410-9779-e7cbd77b26cf
2011-07-20 18:13:03 +00:00
Paul Davis
828939a7f5 more MIDI I/O debugging output
git-svn-id: svn://localhost/ardour2/branches/3.0@9901 d708f5d6-7413-0410-9779-e7cbd77b26cf
2011-07-19 11:57:09 +00:00
Paul Davis
a5efa9a500 initial pass at session-renaming functionality
git-svn-id: svn://localhost/ardour2/branches/3.0@9876 d708f5d6-7413-0410-9779-e7cbd77b26cf
2011-07-14 17:41:06 +00:00
David Robillard
a473d630eb Fix broken whitespace. I'd apologize for the compile times if it was my fault :D
git-svn-id: svn://localhost/ardour2/branches/3.0@9654 d708f5d6-7413-0410-9779-e7cbd77b26cf
2011-06-01 16:50:12 +00:00
Paul Davis
de9e216cb5 (1) push a locate all the way through the processing heirarchy so that MIDI output ports can resolve any notes currently playing (2) remove MidiStateTracker from MidiPort and use a fixed set of MIDI messages (sustain-off and all-notes-off, per channel) to do note resolution (3) move note resolution caused by a LoopEvent psuedo-event to within the main MidiPort::flush_output() loop, so that we resolve (turn off) Notes that come before the loop point, rather than send them out after the note resolution messages
git-svn-id: svn://localhost/ardour2/branches/3.0@9635 d708f5d6-7413-0410-9779-e7cbd77b26cf
2011-05-30 21:37:58 +00:00
David Robillard
0906b39918 Fix my name :)
git-svn-id: svn://localhost/ardour2/branches/3.0@9302 d708f5d6-7413-0410-9779-e7cbd77b26cf
2011-04-06 15:00:16 +00:00
Paul Davis
3a40d9ef6b minor tweaks to debug output and comments and header order
git-svn-id: svn://localhost/ardour2/branches/3.0@9285 d708f5d6-7413-0410-9779-e7cbd77b26cf
2011-04-04 21:48:17 +00:00
Carl Hetherington
1bff54a23c Slightly improve debug output.
git-svn-id: svn://localhost/ardour2/branches/3.0@9216 d708f5d6-7413-0410-9779-e7cbd77b26cf
2011-03-26 21:06:29 +00:00
Paul Davis
5e431d1d58 remove entire "stub" file concept; open new audio and MIDI files on demand (at first write); could be a few gotchas with some corner case scenarios, but apparently works OK
git-svn-id: svn://localhost/ardour2/branches/3.0@9038 d708f5d6-7413-0410-9779-e7cbd77b26cf
2011-03-02 17:05:16 +00:00
Carl Hetherington
78310ad792 Hopefully fix disappearing MIDI recorded regions on the first record of a new session.
git-svn-id: svn://localhost/ardour2/branches/3.0@8993 d708f5d6-7413-0410-9779-e7cbd77b26cf
2011-03-01 02:03:52 +00:00
David Robillard
f6ed36a457 Fix more broken whitespace.
git-svn-id: svn://localhost/ardour2/branches/3.0@8314 d708f5d6-7413-0410-9779-e7cbd77b26cf
2010-12-20 22:51:17 +00:00
Carl Hetherington
73192bc1a7 Remove all use of nframes_t.
git-svn-id: svn://localhost/ardour2/branches/3.0@8166 d708f5d6-7413-0410-9779-e7cbd77b26cf
2010-12-03 22:26:29 +00:00
Paul Davis
66a9112d48 add "origin" property to FileSource so that we can track multiple imports
git-svn-id: svn://localhost/ardour2/branches/3.0@7986 d708f5d6-7413-0410-9779-e7cbd77b26cf
2010-11-09 18:19:53 +00:00
Carl Hetherington
8222348761 Improve GUI display during MIDI record in various ways.
git-svn-id: svn://localhost/ardour2/branches/3.0@7875 d708f5d6-7413-0410-9779-e7cbd77b26cf
2010-10-05 00:27:26 +00:00