diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2016-07-26 10:32:37 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2016-10-17 16:38:55 -0400 |
commit | 893e0e964b7b623fa6c2b391ceb9cd924a12ec05 (patch) | |
tree | aebb5ac26ece8e524e2ad1b4d9887f1eb054be0b | |
parent | 77cfbc98417db7bdd28b6168f40d018722517d25 (diff) | |
download | ardour-origin/ableton.zip ardour-origin/ableton.tar.gz ardour-origin/ableton.tar.bz2 |
skeleton outline/testing of trigger firing via MIDI note onorigin/ableton
-rw-r--r-- | libs/ardour/ardour/trigger_track.h | 14 | ||||
-rw-r--r-- | libs/ardour/trigger_track.cc | 94 |
2 files changed, 94 insertions, 14 deletions
diff --git a/libs/ardour/ardour/trigger_track.h b/libs/ardour/ardour/trigger_track.h index e6e87db..5a022e9 100644 --- a/libs/ardour/ardour/trigger_track.h +++ b/libs/ardour/ardour/trigger_track.h @@ -30,6 +30,11 @@ #include "ardour/data_type.h" #include "ardour/types.h" +namespace MIDI { + class Parser; + class EventTwoBytes; +} + namespace ARDOUR { @@ -113,6 +118,15 @@ private: Triggers all_triggers; int no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool state_changing); + + void note_on (int note_number, int velocity); + void note_off (int note_number, int velocity); + + /* XXX */ + + boost::shared_ptr<Source> the_source; + boost::shared_ptr<AudioRegion> the_region; + AudioTrigger* the_trigger; }; } /* namespace ARDOUR*/ diff --git a/libs/ardour/trigger_track.cc b/libs/ardour/trigger_track.cc index 0177c73..8cac475 100644 --- a/libs/ardour/trigger_track.cc +++ b/libs/ardour/trigger_track.cc @@ -27,12 +27,39 @@ #include "ardour/session.h" #include "ardour/trigger_track.h" +#include "ardour/sndfilesource.h" +#include "ardour/region_factory.h" + using namespace ARDOUR; +using namespace PBD; +using std::string; +using std::cerr; +using std::endl; TriggerTrack::TriggerTrack (Session& s, std::string name) : Track (s, name, PresentationInfo::TriggerTrack, Normal) , _trigger_queue (1024) { + PropertyList plist; + + the_source.reset (new SndFileSource (_session, "/usr/share/sounds/alsa/Front_Center.wav", 0, Source::Flag (0))); + + plist.add (Properties::start, 0); + plist.add (Properties::length, the_source->length (0)); + plist.add (Properties::name, string ("bang")); + plist.add (Properties::layer, 0); + plist.add (Properties::layering_index, 0); + + boost::shared_ptr<Region> r = RegionFactory::create (the_source, plist, false); + the_region = boost::dynamic_pointer_cast<AudioRegion> (r); + + cerr << "Trigger track has region " << the_region->name() << " length = " << the_region->length() << endl; + + /* XXX the_region/trigger will be looked up in a + std::map<MIDI::byte,Trigger> + */ + the_trigger = new AudioTrigger (the_region); + add_trigger (the_trigger); } TriggerTrack::~TriggerTrack () @@ -57,10 +84,27 @@ TriggerTrack::init () } void +TriggerTrack::note_on (int note_number, int velocity) +{ + if (velocity == 0) { + note_off (note_number, velocity); + return; + } + + queue_trigger (the_trigger); +} + +void +TriggerTrack::note_off (int note_number, int velocity) +{ +} + +void TriggerTrack::add_trigger (Trigger* trigger) { Glib::Threads::Mutex::Lock lm (trigger_lock); all_triggers.push_back (trigger); + cerr << "Now have " << all_triggers.size() << " of all possible triggers\n"; } bool @@ -70,8 +114,26 @@ TriggerTrack::queue_trigger (Trigger* trigger) } int +TriggerTrack::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool state_changing) +{ + bool ignored; + return roll (nframes, start_frame, end_frame, state_changing, ignored); +} + +int TriggerTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool& need_butler) { + /* check MIDI port input buffers for triggers */ + + MidiBuffer& mb (_midi_port->get_midi_buffer (nframes)); + + for (MidiBuffer::iterator ev = mb.begin(); ev != mb.end(); ++ev) { + if ((*ev).is_note_on()) { + cerr << "Trigger => NOTE ON!\n"; + note_on ((*ev).note(), (*ev).velocity()); + } + } + /* get tempo map */ /* find offset to next bar * and beat start @@ -99,11 +161,15 @@ TriggerTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_fr for (uint32_t n = 0; n < vec.len[0]; ++n) { Trigger* t = vec.buf[0][n]; t->bang (*this, beats_now, start_frame); + active_triggers.push_back (t); + cerr << "Trigger goes bang at " << start_frame << endl; } for (uint32_t n = 0; n < vec.len[1]; ++n) { Trigger* t = vec.buf[1][n]; t->bang (*this, beats_now, start_frame); + active_triggers.push_back (t); + cerr << "Trigger goes bang at " << start_frame << endl; } _trigger_queue.increment_read_idx (vec.len[0] + vec.len[1]); @@ -125,17 +191,19 @@ TriggerTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_fr BufferSet& bufs = _session.get_route_buffers (n_process_buffers ()); fill_buffers_with_input (bufs, _input, nframes); - for (uint32_t chan = 0; !err && chan < nchans; ++chan) { + for (Triggers::iterator t = active_triggers.begin(); !err && t != active_triggers.end(); ) { - AudioBuffer& buf = bufs.get_audio (chan); - for (Triggers::iterator t = active_triggers.begin(); !err && t != active_triggers.end(); ) { + AudioTrigger* at = dynamic_cast<AudioTrigger*> (*t); - AudioTrigger* at = dynamic_cast<AudioTrigger*> (*t); + if (!at) { + continue; + } + + for (uint32_t chan = 0; !err && chan < nchans; ++chan) { + + AudioBuffer& buf = bufs.get_audio (chan); - if (!at) { - continue; - } pframes_t to_copy = nframes; Sample* data = at->run (chan, to_copy, start_frame, end_frame, need_butler); @@ -154,6 +222,8 @@ TriggerTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_fr } } + process_output_buffers (bufs, start_frame, end_frame, nframes, declick, true); + return 0; } @@ -237,12 +307,6 @@ TriggerTrack::can_use_mode (TrackMode m, bool& bounce_required) return false; } -int -TriggerTrack::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool state_changing) -{ - return 0; -} - void TriggerTrack::freeze_me (ARDOUR::InterThreadInfo&) { @@ -296,9 +360,11 @@ AudioTrigger::AudioTrigger (boost::shared_ptr<AudioRegion> r) const uint32_t nchans = region->n_channels(); + cerr << "Trigger needs " << nchans << " channels of " << region->length() << " each\n"; + for (uint32_t n = 0; n < nchans; ++n) { data.push_back (new Sample (region->length()));; - region->read (data[n], 0, region->length(), 0); + // region->read (data[n], 0, region->length(), n); } length = region->length(); |