Add modulus operator to MIDI transformer.
authorDavid Robillard <d@drobilla.net>
Wed, 7 Jan 2015 04:04:28 +0000 (23:04 -0500)
committerDavid Robillard <d@drobilla.net>
Wed, 7 Jan 2015 04:04:28 +0000 (23:04 -0500)
Useful for doing things like making alternating bowing patterns.

gtk2_ardour/transform_dialog.cc
libs/ardour/ardour/transform.h
libs/ardour/transform.cc

index 35df027187968669429d827bda423b2e7b444893..762f504aa2d2df00e7b86b48ff928e327e94cf7c 100644 (file)
@@ -69,7 +69,7 @@ TransformDialog::Model::Model()
        }
 
        static const char* operator_labels[] = {
-               /* no PUSH */ "+", "-", "*", "/", NULL
+               /* no PUSH */ "+", "-", "*", "/", "mod", NULL
        };
        for (int o = 0; operator_labels[o]; ++o) {
                Gtk::TreeModel::Row row = *(operator_list->append());
index 2b63bb6af035978cff3b7f7de8d4154453f17922..08e4a435215f0320b923b90bb93735631bf2d40f 100644 (file)
@@ -106,7 +106,8 @@ public:
                        ADD,   ///< Add top two values
                        SUB,   ///< Subtract top from second-top
                        MULT,  ///< Multiply top two values
-                       DIV    ///< Divide second-top by top
+                       DIV,   ///< Divide second-top by top
+                       MOD    ///< Modulus (division remainder)
                };
 
                Operation(Operator o, const Value& a=Value()) : op(o), arg(a) {}
index 9a91a657317170e96065189ac98cf6878e66d5cb..3b4f53c8605b5aa0b9f0d82a810a20e5c12f5e0d 100644 (file)
@@ -106,6 +106,12 @@ Transform::Operation::eval(Context& ctx) const
                }
                value /= rhs.to_double();
                break;
+       case MOD:
+               if (rhs.to_double() == 0.0) {
+                       return;  // Program will fail safely
+               }
+               value = fmod(value, rhs.to_double());
+               break;
        default: break;
        }