summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2007-08-06 05:30:18 +0000
committerDavid Robillard <d@drobilla.net>2007-08-06 05:30:18 +0000
commitf68caf23ddd0bfe5c189b94f0f57b194c1e2d912 (patch)
tree69248108d45aa89feaa68679b540b9a73edc5680 /gtk2_ardour
parentd594470148c5ac722937aa4765a15f92082c4b86 (diff)
Genericificationalizeified AudioFilter (now Filter).
Added primitive (non-undoable, placeholder, etc) quantization. git-svn-id: svn://localhost/ardour2/trunk@2254 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour')
-rw-r--r--gtk2_ardour/editor.cc86
-rw-r--r--gtk2_ardour/editor.h9
-rw-r--r--gtk2_ardour/editor_actions.cc2
-rw-r--r--gtk2_ardour/editor_ops.cc52
-rw-r--r--gtk2_ardour/midi_region_view.cc6
-rw-r--r--gtk2_ardour/midi_region_view.h5
-rw-r--r--gtk2_ardour/public_editor.h3
-rw-r--r--gtk2_ardour/region_view.h2
8 files changed, 121 insertions, 44 deletions
diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc
index bb7ae142ec..8b087e7096 100644
--- a/gtk2_ardour/editor.cc
+++ b/gtk2_ardour/editor.cc
@@ -50,7 +50,7 @@
#include <ardour/location.h>
#include <ardour/audioplaylist.h>
#include <ardour/audioregion.h>
-#include <ardour/region.h>
+#include <ardour/midi_region.h>
#include <ardour/session_route.h>
#include <ardour/tempo.h>
#include <ardour/utils.h>
@@ -1531,7 +1531,7 @@ Editor::add_region_context_items (Menu_Helpers::MenuList& edit_items)
while (i != selection->regions.end() && boost::dynamic_pointer_cast<AudioRegion>((*i)->region()) == 0) {
++i;
}
- bool const have_selected_audio_region = (i != selection->regions.end());
+ const bool have_selected_audio_region = (i != selection->regions.end());
if (have_selected_audio_region) {
@@ -1551,9 +1551,19 @@ Editor::add_region_context_items (Menu_Helpers::MenuList& edit_items)
items.push_back (MenuElem (_("Normalize"), mem_fun (*this, &Editor::normalize_regions)));
}
- items.push_back (MenuElem (_("Reverse"), mem_fun(*this, &Editor::reverse_regions)));
- items.push_back (SeparatorElem());
+ /* Find out if we have a selected MIDI region */
+ i = selection->regions.begin();
+ while (i != selection->regions.end() && boost::dynamic_pointer_cast<MidiRegion>((*i)->region()) == 0) {
+ ++i;
+ }
+ const bool have_selected_midi_region = (i != selection->regions.end());
+
+ if (have_selected_midi_region) {
+
+ items.push_back (MenuElem (_("Quantize"), mem_fun(*this, &Editor::quantize_regions)));
+ items.push_back (SeparatorElem());
+ }
/* range related stuff */
@@ -2200,24 +2210,24 @@ Editor::snap_to (nframes64_t& start, int32_t direction, bool for_mark)
break;
case SnapToAThirtysecondBeat:
- start = session->tempo_map().round_to_beat_subdivision (start, 32);
- break;
+ start = session->tempo_map().round_to_beat_subdivision (start, 32);
+ break;
case SnapToASixteenthBeat:
- start = session->tempo_map().round_to_beat_subdivision (start, 16);
- break;
+ start = session->tempo_map().round_to_beat_subdivision (start, 16);
+ break;
case SnapToAEighthBeat:
- start = session->tempo_map().round_to_beat_subdivision (start, 8);
- break;
+ start = session->tempo_map().round_to_beat_subdivision (start, 8);
+ break;
case SnapToAQuarterBeat:
- start = session->tempo_map().round_to_beat_subdivision (start, 4);
- break;
+ start = session->tempo_map().round_to_beat_subdivision (start, 4);
+ break;
- case SnapToAThirdBeat:
- start = session->tempo_map().round_to_beat_subdivision (start, 3);
- break;
+ case SnapToAThirdBeat:
+ start = session->tempo_map().round_to_beat_subdivision (start, 3);
+ break;
case SnapToEditCursor:
start = edit_cursor->current_frame;
@@ -2308,6 +2318,52 @@ Editor::snap_to (nframes64_t& start, int32_t direction, bool for_mark)
}
}
+double
+Editor::snap_length_beats (nframes_t start)
+{
+ if (!session) {
+ return 1.0;
+ }
+
+ const nframes64_t one_second = session->frame_rate();
+ const nframes64_t one_minute = session->frame_rate() * 60;
+ const nframes64_t one_smpte_second = (nframes64_t)(rint(session->smpte_frames_per_second()) * session->frames_per_smpte_frame());
+ nframes64_t one_smpte_minute = (nframes64_t)(rint(session->smpte_frames_per_second()) * session->frames_per_smpte_frame() * 60);
+ nframes64_t presnap = start;
+
+ /* FIXME: This could/should also work with non-tempo based snap settings (ie seconds) */
+
+ switch (snap_type) {
+ case SnapToBar:
+ return session->tempo_map().meter_at(start).beats_per_bar();
+
+ case SnapToBeat:
+ return 1.0;
+
+ case SnapToAThirtysecondBeat:
+ return 1.0 / (double)32.0;
+ break;
+
+ case SnapToASixteenthBeat:
+ return 1.0 / (double)16.0;
+ break;
+
+ case SnapToAEighthBeat:
+ return 1.0 / (double)8.0;
+ break;
+
+ case SnapToAQuarterBeat:
+ return 1.0 / (double)4.0;
+ break;
+
+ case SnapToAThirdBeat:
+ return 1.0 / (double)3.0;
+
+ default:
+ return 1.0;
+ }
+}
+
void
Editor::setup_toolbar ()
{
diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h
index 62d25cb5e5..8bf814a472 100644
--- a/gtk2_ardour/editor.h
+++ b/gtk2_ardour/editor.h
@@ -71,7 +71,7 @@ namespace ARDOUR {
class TempoSection;
class NamedSelection;
class Session;
- class AudioFilter;
+ class Filter;
class Crossfade;
class ChanCount;
}
@@ -746,7 +746,7 @@ class Editor : public PublicEditor
/* snapshots */
- Gtk::ScrolledWindow snapshot_display_scroller;
+ Gtk::ScrolledWindow snapshot_display_scroller;
struct SnapshotDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
SnapshotDisplayModelColumns() {
add (visible_name);
@@ -892,6 +892,7 @@ class Editor : public PublicEditor
void reverse_regions ();
void normalize_regions ();
void denormalize_regions ();
+ void quantize_regions ();
void audition_region_from_region_list ();
void hide_region_from_region_list ();
@@ -1288,6 +1289,8 @@ class Editor : public PublicEditor
snap_to (first64, direction, for_mark);
first = (nframes_t) first64;
}
+
+ double snap_length_beats (nframes_t start);
uint32_t bbt_beat_subdivision;
@@ -1805,7 +1808,7 @@ class Editor : public PublicEditor
/* audio filters */
- void apply_filter (ARDOUR::AudioFilter&, string cmd);
+ void apply_filter (ARDOUR::Filter&, string cmd);
/* handling cleanup */
diff --git a/gtk2_ardour/editor_actions.cc b/gtk2_ardour/editor_actions.cc
index 86778fa11f..ee99ff6892 100644
--- a/gtk2_ardour/editor_actions.cc
+++ b/gtk2_ardour/editor_actions.cc
@@ -254,6 +254,8 @@ Editor::register_actions ()
ActionManager::session_sensitive_actions.push_back (act);
act = ActionManager::register_action (editor_actions, "normalize-region", _("Normalize Regions"), mem_fun(*this, &Editor::normalize_regions));
ActionManager::session_sensitive_actions.push_back (act);
+ act = ActionManager::register_action (editor_actions, "quantize-region", _("Quantize Regions"), mem_fun(*this, &Editor::quantize_regions));
+ ActionManager::session_sensitive_actions.push_back (act);
act = ActionManager::register_action (editor_actions, "crop", _("crop"), mem_fun(*this, &Editor::crop_region_to_selection));
ActionManager::session_sensitive_actions.push_back (act);
act = ActionManager::register_action (editor_actions, "insert-chunk", _("Insert Chunk"), bind (mem_fun(*this, &Editor::paste_named_selection), 1.0f));
diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc
index ccfcdbd6c5..a82ca0260a 100644
--- a/gtk2_ardour/editor_ops.cc
+++ b/gtk2_ardour/editor_ops.cc
@@ -48,6 +48,7 @@
#include <ardour/region_factory.h>
#include <ardour/playlist_factory.h>
#include <ardour/reverse.h>
+#include <ardour/quantize.h>
#include "ardour_ui.h"
#include "editor.h"
@@ -56,6 +57,7 @@
#include "automation_time_axis.h"
#include "streamview.h"
#include "audio_region_view.h"
+#include "midi_region_view.h"
#include "rgb_macros.h"
#include "selection_templates.h"
#include "selection.h"
@@ -3281,8 +3283,21 @@ Editor::reverse_regions ()
apply_filter (rev, _("reverse regions"));
}
+
+void
+Editor::quantize_regions ()
+{
+ if (!session) {
+ return;
+ }
+
+ // FIXME: varying meter?
+ Quantize quant (*session, snap_length_beats(0));
+ apply_filter (quant, _("quantize regions"));
+}
+
void
-Editor::apply_filter (AudioFilter& filter, string command)
+Editor::apply_filter (Filter& filter, string command)
{
if (selection->regions.empty()) {
return;
@@ -3293,26 +3308,31 @@ Editor::apply_filter (AudioFilter& filter, string command)
track_canvas.get_window()->set_cursor (*wait_cursor);
gdk_flush ();
+ /* this is ugly. */
for (RegionSelection::iterator r = selection->regions.begin(); r != selection->regions.end(); ) {
- AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*r);
- if (!arv)
- continue;
+ RegionSelection::iterator tmp = r;
+ ++tmp;
- boost::shared_ptr<Playlist> playlist = arv->region()->playlist();
+ MidiRegionView* const mrv = dynamic_cast<MidiRegionView*>(*r);
+ if (mrv) {
+ if (mrv->midi_region()->apply(filter) == 0) {
+ mrv->redisplay_model();
+ }
+ }
- RegionSelection::iterator tmp;
-
- tmp = r;
- ++tmp;
+ AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*r);
+ if (arv) {
+ boost::shared_ptr<Playlist> playlist = arv->region()->playlist();
- if (arv->audio_region()->apply (filter) == 0) {
+ if (arv->audio_region()->apply (filter) == 0) {
- XMLNode &before = playlist->get_state();
- playlist->replace_region (arv->region(), filter.results.front(), arv->region()->position());
- XMLNode &after = playlist->get_state();
- session->add_command(new MementoCommand<Playlist>(*playlist, &before, &after));
- } else {
- goto out;
+ XMLNode &before = playlist->get_state();
+ playlist->replace_region (arv->region(), filter.results.front(), arv->region()->position());
+ XMLNode &after = playlist->get_state();
+ session->add_command(new MementoCommand<Playlist>(*playlist, &before, &after));
+ } else {
+ goto out;
+ }
}
r = tmp;
diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc
index 5937b12ad9..64693c7e6f 100644
--- a/gtk2_ardour/midi_region_view.cc
+++ b/gtk2_ardour/midi_region_view.cc
@@ -423,12 +423,6 @@ MidiRegionView::set_y_position_and_height (double y, double h)
}
}
-void
-MidiRegionView::show_region_editor ()
-{
- cerr << "No MIDI region editor." << endl;
-}
-
GhostRegion*
MidiRegionView::add_ghost (AutomationTimeAxisView& atv)
{
diff --git a/gtk2_ardour/midi_region_view.h b/gtk2_ardour/midi_region_view.h
index d8c62abfe5..f74272a409 100644
--- a/gtk2_ardour/midi_region_view.h
+++ b/gtk2_ardour/midi_region_view.h
@@ -68,8 +68,8 @@ class MidiRegionView : public RegionView
{ return midi_view()->midi_view(); }
void set_y_position_and_height (double, double);
-
- void show_region_editor ();
+
+ void redisplay_model();
GhostRegion* add_ghost (AutomationTimeAxisView&);
@@ -164,7 +164,6 @@ class MidiRegionView : public RegionView
private:
- void redisplay_model();
void clear_events();
bool canvas_event(GdkEvent* ev);
diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h
index 746df6aaa9..97618dcbc2 100644
--- a/gtk2_ardour/public_editor.h
+++ b/gtk2_ardour/public_editor.h
@@ -115,6 +115,9 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulThingWithGoingAway
/** Snap a value according to the current snap setting. */
virtual void snap_to (nframes_t& first, int32_t direction = 0, bool for_mark = false) = 0;
+
+ /** Get the current snap value in beats */
+ virtual double snap_length_beats (nframes_t start) = 0;
/** Undo some transactions.
* @param n Number of transactions to undo.
diff --git a/gtk2_ardour/region_view.h b/gtk2_ardour/region_view.h
index 426529c528..28a2b11c0c 100644
--- a/gtk2_ardour/region_view.h
+++ b/gtk2_ardour/region_view.h
@@ -70,7 +70,7 @@ class RegionView : public TimeAxisViewItem
bool set_position(nframes_t pos, void* src, double* delta = 0);
void fake_set_opaque (bool yn);
- virtual void show_region_editor () = 0;
+ virtual void show_region_editor () {}
virtual void hide_region_editor();
virtual void region_changed (ARDOUR::Change);