30 #include <glibmm/threads.h>
62 class RubberBandStretcher;
227 for (
int i = 0; i<16; i++) {
241 #define TRIGGERBOX_PROPERTY_DECL(name,type) void set_ ## name (type); type name () const;
242 #define TRIGGERBOX_PROPERTY_DECL_CONST_REF(name,type) void set_ ## name (type const &); type name () const
262 #undef TRIGGERBOX_PROPERTY_DECL
263 #undef TRIGGERBOX_PROPERTY_DECL_CONST_REF
268 void bang (
float velocity = 1.0f);
302 bool armed()
const {
return _armed; }
326 bool active()
const {
return _state >= Running; }
329 void set_region (std::shared_ptr<Region>,
bool use_thread =
true);
333 std::shared_ptr<Region>
the_region()
const {
return _region; }
336 uint32_t
index()
const {
return _index; }
361 template<
typename TriggerType>
387 void*
ui ()
const {
return _ui; }
390 std::shared_ptr<TriggerBox>
boxptr()
const;
516 return audio_run<true> (bufs, start_sample, end_sample,
start, end, nframes, dest_offset, bpm, quantize_offset);
519 bool playable()
const {
return data.length || _region; }
551 RubberBand::RubberBandStretcher*
stretcher() {
return (_stretcher); }
612 bool playable()
const {
return rt_midibuffer.load() || _region; }
622 return midi_run<true> (bufs, start_sample, end_sample,
start, end, nframes, dest_offset, bpm, quantize_offset);
671 std::vector<int>
const &
channel_map()
const {
return _channel_map; }
776 void*
operator new (size_t);
777 void operator delete (
void* ptr, size_t);
826 static const int32_t default_triggers_per_box = 8;
828 static const int32_t default_triggers_per_box = 16;
847 bool armed()
const {
return (
bool) _arm_info.load(); }
855 bool empty()
const {
return _active_slots == 0; }
858 int32_t
order()
const {
return _order; }
972 void dump (std::ostream &)
const;
1047 void*
operator new (size_t);
1048 void operator delete (
void* ptr, size_t);
1100 std::shared_ptr<ARDOUR::Trigger>
trigger()
const { std::shared_ptr<ARDOUR::TriggerBox>
box (
weak_box.lock());
return box ?
box->trigger (
_slot) : std::shared_ptr<ARDOUR::Trigger>(); }
1103 std::shared_ptr<ARDOUR::TriggerBox>
box()
const {
return weak_box.lock(); }
RubberBand::RubberBandStretcher * _stretcher
samplepos_t _legato_offset
int set_region_in_worker_thread_from_capture(std::shared_ptr< Region >)
SegmentDescriptor get_segment_descriptor() const
RubberBand::RubberBandStretcher * alloc_stretcher() const
samplepos_t last_readable_sample
void set_segment_tempo(double t)
void set_end(timepos_t const &)
timepos_t current_length() const
void set_start(timepos_t const &)
timepos_t compute_end(Temporal::TempoMap::SharedPtr const &, Temporal::BBT_Time const &, samplepos_t, Temporal::Beats &)
timepos_t natural_length() const
XMLNode & get_state() const
void reload(BufferSet &, void *)
uint32_t channels() const
AudioTrigger(uint32_t index, TriggerBox &)
double segment_tempo() const
RubberBand::RubberBandStretcher * stretcher()
void set_length(timecnt_t const &)
size_t data_length() const
int set_state(const XMLNode &, int version)
int set_region_in_worker_thread(std::shared_ptr< Region >)
virtual void setup_stretcher()
void captured(SlotArmInfo &, BufferSet &)
samplepos_t _start_offset
void _startup(BufferSet &, pframes_t dest_offset, Temporal::BBT_Offset const &)
int set_region_in_worker_thread_internal(std::shared_ptr< Region > r, bool from_capture)
void set_legato_offset(timepos_t const &)
void set_segment_beatcnt(double count)
StretchMode stretch_mode() const
int load_data(std::shared_ptr< AudioRegion >)
void set_stretch_mode(StretchMode)
samplecnt_t got_stretcher_padding
bool probably_oneshot() const
timepos_t start_offset() const
pframes_t audio_run(BufferSet &bufs, samplepos_t start_sample, samplepos_t end_sample, Temporal::Beats const &start, Temporal::Beats const &end, pframes_t nframes, pframes_t dest_offset, double bpm, pframes_t &quantize_offset)
Sample const * audio_data(size_t n) const
pframes_t run(BufferSet &bufs, samplepos_t start_sample, samplepos_t end_sample, Temporal::Beats const &start, Temporal::Beats const &end, pframes_t nframes, pframes_t dest_offset, double bpm, pframes_t &quantize_offset)
void start_and_roll_to(samplepos_t start, samplepos_t position, uint32_t cnt)
void jump_stop(BufferSet &bufs, pframes_t dest_offset)
RTMidiBufferBeats const & rt_midi_buffer() const
void set_legato_offset(timepos_t const &)
samplepos_t last_event_samples
void check_edit_swap(timepos_t const &, bool playing, BufferSet &)
void shutdown(BufferSet &bufs, pframes_t dest_offset)
Temporal::Beats play_start() const
Temporal::Beats loop_start() const
std::atomic< PendingSwap * > old_pending_swap
uint32_t last_event_index
timepos_t current_length() const
void adjust_bounds(Temporal::Beats const &start, Temporal::Beats const &end, Temporal::Beats const &length, bool from_region)
void _startup(BufferSet &, pframes_t dest_offset, Temporal::BBT_Offset const &)
XMLNode & get_state() const
Temporal::Beats _play_start
void set_used_channels(Evoral::SMF::UsedChannels)
void compute_and_set_length()
void estimate_midi_patches()
Temporal::Beats _loop_end
void reload(BufferSet &, void *)
virtual double segment_tempo() const
Temporal::DoubleableBeats last_event_beats
Temporal::Beats _loop_start
void unset_all_patch_changes()
void bounds_changed(Temporal::timepos_t const &start, Temporal::timepos_t const &end)
timepos_t compute_end(Temporal::TempoMap::SharedPtr const &, Temporal::BBT_Time const &, samplepos_t, Temporal::Beats &)
bool patch_change_set(uint8_t channel) const
void unset_channel_map(int channel)
timepos_t natural_length() const
Temporal::Beats final_beat
Temporal::Beats _play_end
pframes_t midi_run(BufferSet &, samplepos_t start_sample, samplepos_t end_sample, Temporal::Beats const &start_beats, Temporal::Beats const &end_beats, pframes_t nframes, pframes_t offset, double bpm, pframes_t &quantize_offset)
void unset_patch_change(uint8_t channel)
void set_patch_change(Evoral::PatchChange< MidiBuffer::TimeType > const &)
int set_state(const XMLNode &, int version)
MIDITrigger(uint32_t index, TriggerBox &)
pframes_t run(BufferSet &bufs, samplepos_t start_sample, samplepos_t end_sample, Temporal::Beats const &start, Temporal::Beats const &end, pframes_t nframes, pframes_t dest_offset, double bpm, pframes_t &quantize_offset)
std::vector< int > const & channel_map() const
std::shared_ptr< MidiModel > _model
Evoral::SMF::UsedChannels used_channels() const
bool probably_oneshot() const
uint32_t first_event_index
Temporal::Beats play_end() const
Temporal::Beats loop_end() const
std::atomic< PendingSwap * > pending_swap
virtual void setup_stretcher()
Temporal::BBT_Offset _legato_offset
void set_length(timecnt_t const &)
void jump_stop(BufferSet &bufs, pframes_t dest_offset)
void model_contents_changed()
virtual void set_segment_tempo(double t)
int channel_map(int channel)
SegmentDescriptor get_segment_descriptor() const
void set_channel_map(int channel, int target)
std::atomic< RTMidiBufferBeats * > rt_midibuffer
Evoral::PatchChange< MidiBuffer::TimeType > const patch_change(uint8_t) const
void set_start(timepos_t const &)
int set_region_in_worker_thread(std::shared_ptr< Region >)
timepos_t start_offset() const
PBD::ScopedConnection content_connection
void setup_event_indices()
int load_data(std::shared_ptr< MidiRegion >)
Temporal::DoubleableBeats data_length
void start_and_roll_to(samplepos_t start, samplepos_t position, uint32_t cnt)
void set_end(timepos_t const &)
Temporal::BBT_Offset _start_offset
void captured(SlotArmInfo &, BufferSet &)
int set_region_in_worker_thread_from_capture(std::shared_ptr< Region >)
CrossThreadChannel _xthread
void wait_until_finished()
void build_source(Trigger *, Temporal::timecnt_t const &duration)
void set_region(TriggerBox &, uint32_t slot, std::shared_ptr< Region >)
void queue_request(Request *)
void build_midi_source(MIDITrigger *, Temporal::timecnt_t const &)
void build_audio_source(AudioTrigger *, Temporal::timecnt_t const &)
static void init_request_pool()
void delete_trigger(Trigger *)
void request_delete_trigger(Trigger *t)
void request_build_source(Trigger *t, Temporal::timecnt_t const &duration)
PBD::RingBuffer< Request * > requests
static void * _thread_work(void *arg)
static TriggerBoxThread * worker
static void static_parameter_changed(std::string const &)
void used_regions(std::set< std::shared_ptr< Region >> &)
int32_t active_scene() const
static TriggerMidiMapMode _midi_map_mode
static PBD::Signal< void()> TriggerRecEnableChanged
void arm_from_another_thread(Trigger &slot, samplepos_t, uint32_t chans)
static PBD::ScopedConnectionList static_connections
void process_ui_trigger_requests()
TriggerBox(Session &, DataType dt)
double position_as_fraction() const
void set_record_enabled(bool yn)
void process_request(BufferSet &, Request *)
bool configure_io(ChanCount in, ChanCount out)
EventRingBuffer< samplepos_t > _gui_feed_fifo
PBD::ScopedConnection stop_all_connection
void fast_forward_nothing_to_do()
void process_requests(BufferSet &)
TriggerPtr get_next_trigger()
static PBD::Signal< void(PBD::PropertyChange, int)> TriggerBoxPropertyChange
static void static_init(Session &)
void maybe_swap_pending(uint32_t)
void set_all_quantization(Temporal::BBT_Offset const &)
void set_armed(SlotArmInfo *)
static TriggerMidiMapMode midi_map_mode()
void deep_sources(std::set< std::shared_ptr< Source >> &)
void cancel_locate_armed()
int set_state(const XMLNode &, int version)
static void maybe_request_roll(Session &)
void set_from_selection(uint32_t slot, std::shared_ptr< Region >)
XMLNode & get_state() const
PBD::Signal< void(uint32_t)> TriggerSwapped
int handle_stopped_trigger(BufferSet &bufs, pframes_t dest_offset)
static void set_first_midi_note(int n)
static void add_custom_midi_binding(std::vector< uint8_t > const &, int x, int y)
void fast_forward(CueEvents const &, samplepos_t transport_postiion)
void dump(std::ostream &) const
TriggerPtr trigger(Triggers::size_type)
static CueRecords cue_records
int determine_next_trigger(uint32_t n)
void non_realtime_transport_stop(samplepos_t now, bool flush)
TriggerPtr peek_next_trigger()
static void midi_input_handler(MIDI::Parser &, MIDI::byte *, size_t, samplecnt_t)
static void set_midi_map_mode(TriggerMidiMapMode m)
static PBD::ScopedConnection midi_input_connection
DataType data_type() const
void begin_midi_learn(int index)
static void clear_custom_midi_bindings()
PBD::Signal< void(samplecnt_t)> Captured
static std::pair< int, int > learning_for
PBD::RingBuffer< Request * > RequestBuffer
static Temporal::BBT_Offset assumed_trigger_duration()
void midi_unlearn(int index)
static void begin_process_cycle()
bool can_support_io_configuration(const ChanCount &in, ChanCount &out)
void non_realtime_locate(samplepos_t now)
void set_all_launch_style(ARDOUR::Trigger::LaunchStyle)
static bool lookup_custom_midi_binding(std::vector< uint8_t > const &, int &x, int &y)
static std::atomic< int > active_trigger_boxes
static void set_cue_recording(bool yn)
void set_all_follow_action(ARDOUR::FollowAction const &, uint32_t n=0)
std::map< std::vector< uint8_t >, std::pair< int, int > > CustomMidiMap
static std::shared_ptr< MidiPort > current_input
void set_pending(uint32_t slot, Trigger *)
static int first_midi_note()
static CustomMidiMap _custom_midi_map
void set_order(int32_t n)
PBD::Signal< void()> ArmedChanged
void clear_all_triggers()
void maybe_capture(BufferSet &bufs, samplepos_t start_sample, samplepos_t end_sample, double speed, pframes_t nframes)
PBD::Signal< void()> EmptyStatusChanged
void stop_all_quantized()
void parameter_changed(std::string const &)
void request_reload(int32_t slot, void *)
static Temporal::BBT_Offset _assumed_trigger_duration
void bang_trigger_at(Triggers::size_type row, float velocity=1.0f)
PBD::Signal< void()> RecEnableChanged
static void remove_custom_midi_binding(int x, int y)
static bool roll_requested
std::vector< Trigger * > PendingTriggers
RecordState _record_state
std::shared_ptr< MidiBuffer > get_gui_feed_buffer() const
static int save_custom_midi_bindings(std::string const &path)
std::vector< TriggerPtr > Triggers
PBD::RingBuffer< uint32_t > explicit_queue
static PBD::Signal< void()> TriggerMIDILearned
void queue_explict(uint32_t)
static std::atomic< bool > _cue_recording
static void set_assumed_trigger_duration(Temporal::BBT_Offset const &)
void reload(BufferSet &bufs, int32_t slot, void *ptr)
void realtime_handle_transport_stopped()
void unbang_trigger_at(Triggers::size_type row)
static PBD::PropertyChange all_trigger_props()
void process_midi_trigger_requests(BufferSet &)
static void start_transport_stop(Session &)
bool fast_forwarding() const
static XMLNode * get_custom_midi_binding_state()
TriggerPtr currently_playing() const
static int load_custom_midi_bindings(XMLNode const &)
void add_trigger(TriggerPtr)
void finish_recording(BufferSet &bufs)
void run(BufferSet &bufs, samplepos_t start_sample, samplepos_t end_sample, double speed, pframes_t nframes, bool result_required)
static bool cue_recording()
void send_property_change(PBD::PropertyChange pc)
void enqueue_trigger_state_for_region(std::shared_ptr< Region >, std::shared_ptr< Trigger::UIState >)
Glib::Threads::Mutex _gui_feed_reset_mutex
bool _cancel_locate_armed
static PBD::Signal< void()> CueRecordingChanged
static int _first_midi_note
void run_cycle(BufferSet &bufs, samplepos_t start_sample, samplepos_t end_sample, double speed, pframes_t nframes)
static void input_port_check()
void set_region(uint32_t slot, std::shared_ptr< Region > region)
void set_from_path(uint32_t slot, std::string const &path)
Glib::Threads::RWLock trigger_lock
std::atomic< SlotArmInfo * > _arm_info
void set_all_probability(int zero_to_a_hundred)
void stop_all_immediately()
MidiStateTracker * tracker
TriggerPtr trigger_by_id(PBD::ID)
static std::shared_ptr< MIDI::Parser > input_parser
TriggerPtr _currently_playing
RecordState record_enabled() const
TriggerReference(std::shared_ptr< ARDOUR::TriggerBox > b, uint32_t s)
std::shared_ptr< ARDOUR::Trigger > trigger() const
void set(std::shared_ptr< ARDOUR::TriggerBox > b, uint32_t s)
std::shared_ptr< ARDOUR::TriggerBox > box() const
std::weak_ptr< ARDOUR::TriggerBox > weak_box
uint32_t loop_count() const
void process_state_requests(BufferSet &bufs, pframes_t dest_offset)
Temporal::Meter meter() const
virtual void shutdown(BufferSet &bufs, pframes_t dest_offset)
bool will_not_follow() const
samplecnt_t process_index
PBD::Property< bool > _cue_isolated
virtual void set_patch_change(Evoral::PatchChange< MidiBuffer::TimeType > const &)
std::vector< int > _channel_map
PBD::Property< LaunchStyle > _launch_style
virtual Evoral::SMF::UsedChannels used_channels() const
virtual Evoral::PatchChange< MidiBuffer::TimeType > const patch_change(uint8_t) const
PBD::Property< Temporal::BBT_Offset > _quantization
virtual timepos_t current_length() const =0
Temporal::BBT_Offset _start_quantization
PBD::Property< FollowAction > _follow_action0
pframes_t compute_next_transition(samplepos_t start_sample, Temporal::Beats const &start, Temporal::Beats const &end, pframes_t nframes, Temporal::BBT_Argument &t_bbt, Temporal::Beats &t_beats, samplepos_t &t_samples, Temporal::TempoMap::SharedPtr const &tmap)
PBD::Property< FollowAction > _follow_action1
virtual bool patch_change_set(uint8_t channel) const
void begin_stop(bool explicit_stop=false)
PBD::Property< float > _velocity_effect
virtual void bounds_changed(Temporal::timepos_t const &start, Temporal::timepos_t const &end)
PBD::Property< bool > _stretchable
samplepos_t transition_samples
static PBD::Signal< void(Trigger const *)> TriggerArmChanged
void region_property_change(PBD::PropertyChange const &)
void set_region_internal(std::shared_ptr< Region >)
double position_as_fraction() const
samplepos_t final_processed_sample
static void request_trigger_delete(Trigger *t)
static Trigger *const MagicClearPointerValue
PBD::ScopedConnection region_connection
virtual void set_end(timepos_t const &)=0
PBD::Property< int > _follow_action_probability
virtual void jump_stop(BufferSet &bufs, pframes_t dest_offset)
virtual int set_region_in_worker_thread(std::shared_ptr< Region >)=0
virtual void captured(SlotArmInfo &, BufferSet &)
virtual void unset_patch_change(uint8_t channel)
virtual timepos_t compute_end(Temporal::TempoMap::SharedPtr const &, Temporal::BBT_Time const &, samplepos_t, Temporal::Beats &)=0
virtual void jump_start()
virtual void start_and_roll_to(samplepos_t start, samplepos_t position, uint32_t cnt)=0
void when_stopped_during_run(BufferSet &bufs, pframes_t dest_offset)
std::atomic< int > _unbang
virtual timepos_t start_offset() const =0
int set_state(const XMLNode &, int version)
PBD::Signal< void()> ArmChanged
PBD::Property< std::string > _name
PBD::Property< gain_t > _gain
std::shared_ptr< TriggerBox > boxptr() const
static void make_property_quarks()
virtual SegmentDescriptor get_segment_descriptor() const =0
Temporal::BBT_Argument compute_start(Temporal::TempoMap::SharedPtr const &, samplepos_t start, samplepos_t end, Temporal::BBT_Offset const &q, samplepos_t &start_samples, bool &will_start)
samplepos_t expected_end_sample
std::shared_ptr< Region > the_region() const
PBD::Property< uint32_t > _follow_count
virtual void set_used_channels(Evoral::SMF::UsedChannels)
virtual int set_region_in_worker_thread_from_capture(std::shared_ptr< Region >)=0
PBD::Property< StretchMode > _stretch_mode
void set_ui_state(UIState &state)
Trigger(uint32_t index, TriggerBox &)
virtual void set_legato_offset(timepos_t const &offset)=0
timepos_t current_pos() const
gain_t _pending_velocity_gain
virtual timepos_t natural_length() const =0
bool cue_launched() const
void set_pending(Trigger *)
virtual void reload(BufferSet &, void *)=0
virtual void setup_stretcher()=0
virtual bool probably_oneshot() const =0
void set_velocity_gain(gain_t g)
virtual void _startup(BufferSet &, pframes_t dest_offset, Temporal::BBT_Offset const &)
std::shared_ptr< Region > _region
void startup_from_ffwd(BufferSet &, uint32_t loop_cnt)
virtual void set_length(timecnt_t const &)=0
virtual double segment_tempo() const =0
PBD::Property< bool > _legato
virtual void unset_all_patch_changes()
Trigger * swap_pending(Trigger *)
PBD::Property< color_t > _color
void begin_switch(TriggerPtr)
Evoral::SMF::UsedChannels _used_channels
bool compute_quantized_transition(samplepos_t start_sample, Temporal::Beats const &start, Temporal::Beats const &end, Temporal::BBT_Argument &t_bbt, Temporal::Beats &t_beats, samplepos_t &t_samples, Temporal::TempoMap::SharedPtr const &tmap, Temporal::BBT_Offset const &q)
XMLNode & get_state() const
PBD::Property< Temporal::BBT_Offset > _follow_length
static PBD::Signal< void(PBD::PropertyChange, Trigger *)> TriggerPropertyChange
void set_region(std::shared_ptr< Region >, bool use_thread=true)
double estimated_tempo() const
void get_ui_state(UIState &state) const
std::atomic< Trigger * > _pending
Temporal::BBT_Time _transition_bbt
void bang(float velocity=1.0f)
Temporal::Beats transition_beats
void maybe_compute_next_transition(samplepos_t start_sample, Temporal::Beats const &start, Temporal::Beats const &end, pframes_t &nframes, pframes_t &dest_offset)
PBD::Property< bool > _use_follow_length
Temporal::BBT_Offset _nxt_quantization
virtual void set_segment_tempo(double t)=0
virtual bool playable() const =0
void send_property_change(PBD::PropertyChange pc)
virtual pframes_t run(BufferSet &, samplepos_t start_sample, samplepos_t end_sample, Temporal::Beats const &start, Temporal::Beats const &end, pframes_t nframes, pframes_t offset, double bpm, pframes_t &quantize_offset)=0
virtual void set_start(timepos_t const &)=0
void set_next_trigger(int n)
void start_and_roll_to(samplepos_t start_pos, samplepos_t end_position, TriggerType &trigger, pframes_t(TriggerType::*run_method)(BufferSet &bufs, samplepos_t start_sample, samplepos_t end_sample, Temporal::Beats const &start_beats, Temporal::Beats const &end_beats, pframes_t nframes, pframes_t dest_offset, double bpm, pframes_t &), uint32_t cnt)
bool explicitly_stopped() const
PBD::Property< bool > _allow_patch_changes
std::atomic< unsigned int > last_property_generation
virtual void check_edit_swap(timepos_t const &time, bool playing, BufferSet &bufs)
virtual void tempo_map_changed()
void startup(BufferSet &, pframes_t dest_offset, Temporal::BBT_Offset const &start_quantization=Temporal::BBT_Offset(9, 3, 0))
bool internal_use_follow_length() const
std::bitset< 16 > UsedChannels
std::shared_ptr< TempoMap const > SharedPtr
GtkImageIconNameData name
PBD::PropertyDescriptor< uint32_t > queued
PBD::PropertyDescriptor< gain_t > gain
PBD::PropertyDescriptor< bool > legato
PBD::PropertyDescriptor< bool > tempo_meter
PBD::PropertyDescriptor< Temporal::BBT_Offset > follow_length
PBD::PropertyDescriptor< bool > use_follow_length
PBD::PropertyDescriptor< bool > running
PBD::PropertyDescriptor< Trigger::LaunchStyle > launch_style
PBD::PropertyDescriptor< uint32_t > color
PBD::PropertyDescriptor< uint32_t > currently_playing
PBD::PropertyDescriptor< int > follow_action_probability
PBD::PropertyDescriptor< bool > allow_patch_changes
PBD::PropertyDescriptor< timecnt_t > length
PBD::PropertyDescriptor< bool > cue_isolated
PBD::PropertyDescriptor< Temporal::BBT_Offset > quantization
PBD::PropertyDescriptor< bool > region
PBD::PropertyDescriptor< bool > patch_change
PBD::PropertyDescriptor< FollowAction > follow_action1
PBD::PropertyDescriptor< timepos_t > start
PBD::PropertyDescriptor< float > velocity_effect
PBD::PropertyDescriptor< FollowAction > follow_action0
PBD::PropertyDescriptor< uint32_t > follow_count
PBD::PropertyDescriptor< bool > stretchable
PBD::PropertyDescriptor< bool > used_channels
PBD::PropertyDescriptor< Trigger::StretchMode > stretch_mode
PBD::PropertyDescriptor< bool > channel_map
PBD::RingBuffer< CueRecord > CueRecords
std::shared_ptr< Trigger > TriggerPtr
std::vector< CueEvent > CueEvents
Temporal::samplecnt_t samplecnt_t
RTMidiBufferBase< Temporal::Beats, Temporal::Beats > RTMidiBufferBeats
std::string cue_marker_name(int32_t)
Temporal::samplepos_t samplepos_t
DEFINE_ENUM_CONVERT(ARDOUR::Track::FreezeState)
samplecnt_t append(Sample const *src, samplecnt_t cnt, uint32_t chan)
void alloc(samplecnt_t cnt, uint32_t nchans)
static const int32_t stop_all
CueRecord(int32_t cn, samplepos_t t)
Temporal::Beats loop_start
RTMidiBufferBeats * rt_midibuffer
Temporal::Beats play_start
Temporal::Beats end_beats
AudioTrigger::AudioData audio_buf
Temporal::Beats start_beats
samplepos_t start_samples
RTMidiBufferBeats * midi_buf
RubberBand::RubberBandStretcher * stretcher
Temporal::timecnt_t duration
static PBD::MultiAllocSingleReleasePool * pool
std::shared_ptr< Region > region
static PBD::MultiAllocSingleReleasePool * pool
std::atomic< bool > stop_all
int follow_action_probability
Temporal::BBT_Offset quantization
Temporal::BBT_Offset follow_length
FollowAction follow_action0
std::atomic< unsigned int > generation
Evoral::SMF::UsedChannels used_channels
Evoral::PatchChange< MidiBuffer::TimeType > patch_change[16]
FollowAction follow_action1
#define TRIGGERBOX_PROPERTY_DECL_CONST_REF(name, type)
#define TRIGGERBOX_PROPERTY_DECL(name, type)