Add Transpose class that can be used by apply_midi_note_edit_op.
authorAndré Nusser <andre.nusser@googlemail.com>
Thu, 15 Oct 2015 13:41:11 +0000 (15:41 +0200)
committerPaul Davis <paul@linuxaudiosystems.com>
Sun, 18 Oct 2015 02:12:55 +0000 (22:12 -0400)
libs/ardour/ardour/transpose.h [new file with mode: 0644]
libs/ardour/transpose.cc [new file with mode: 0644]
libs/ardour/wscript

diff --git a/libs/ardour/ardour/transpose.h b/libs/ardour/ardour/transpose.h
new file mode 100644 (file)
index 0000000..17f8328
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+    Copyright (C) 2015 Paul Davis
+    Author: André Nusser
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __ardour_transpose_h__
+#define __ardour_transpose_h__
+
+#include "ardour/libardour_visibility.h"
+#include "ardour/midi_model.h"
+#include "ardour/midi_operator.h"
+
+namespace ARDOUR {
+
+class LIBARDOUR_API Transpose : public MidiOperator {
+public:
+       typedef Evoral::Sequence<Evoral::Beats>::NotePtr     NotePtr;
+       typedef Evoral::Sequence<Evoral::Beats>::Notes       Notes;
+
+       Transpose (int semitones);
+
+       Command* operator() (boost::shared_ptr<ARDOUR::MidiModel> model,
+                            Evoral::Beats                        position,
+                            std::vector<Notes>&                  seqs);
+
+       std::string name () const { return std::string ("transpose"); }
+
+private:
+       int _semitones;
+};
+
+} /* namespace */
+
+#endif /* __ardour_transpose_h__ */
diff --git a/libs/ardour/transpose.cc b/libs/ardour/transpose.cc
new file mode 100644 (file)
index 0000000..ca0b7ab
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+    Copyright (C) 2015 Paul Davis
+    Author: André Nusser
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "ardour/transpose.h"
+
+namespace ARDOUR {
+
+Transpose::Transpose(int semitones)
+       : _semitones(semitones)
+{}
+
+Command*
+Transpose::operator()(boost::shared_ptr<MidiModel> model,
+                      Evoral::Beats                position,
+                      std::vector<Notes>&          seqs)
+{
+       typedef MidiModel::NoteDiffCommand Command;
+
+       Command* cmd = new Command(model, name());
+
+       for (std::vector<Notes>::iterator s = seqs.begin(); s != seqs.end(); ++s) {
+               for (Notes::const_iterator i = (*s).begin(); i != (*s).end(); ++i) {
+
+                       const NotePtr note = *i;
+
+                       model->transpose (cmd, *i, _semitones);
+               }
+       }
+
+       return cmd;
+}
+
+}  // namespace ARDOUR
index af5b266987882ca54138e9d745df10aa18d2aece..dccdd303455d9e3c0749154017cb6d01c8a9884a 100644 (file)
@@ -216,6 +216,7 @@ libardour_sources = [
         'track.cc',
         'transient_detector.cc',
         'transform.cc',
+        'transpose.cc',
         'unknown_processor.cc',
         'user_bundle.cc',
         'utils.cc',