Push2: Add "fixed" and "rooted" note grid option

This commit is contained in:
David Robillard 2021-06-19 15:12:12 -04:00 committed by Paul Davis
parent ecd1a9660b
commit e4e874bed0
4 changed files with 89 additions and 10 deletions

View File

@ -214,7 +214,7 @@ Push2::begin_using_device ()
init_buttons (true);
init_touch_strip ();
set_pad_scale (_scale_root, _root_octave, _mode, _row_interval, _in_key);
set_pad_scale (_scale_root, _root_octave, _mode, _note_grid_origin, _row_interval, _in_key);
splash ();
/* catch current selection, if any so that we can wire up the pads if appropriate */
@ -1318,7 +1318,7 @@ Push2::update_selection_color ()
void
Push2::reset_pad_colors ()
{
set_pad_scale (_scale_root, _root_octave, _mode, _row_interval, _in_key);
set_pad_scale (_scale_root, _root_octave, _mode, _note_grid_origin, _row_interval, _in_key);
}
void
@ -1437,13 +1437,17 @@ void
Push2::set_pad_scale_in_key (const int scale_root,
const int octave,
const MusicalMode::Type mode,
const NoteGridOrigin origin,
const int ideal_vertical_semitones)
{
const std::vector<int> notes = mode_notes_vector (scale_root, octave, mode);
const int ideal_first_note = origin == Fixed ? 36 : scale_root + (12 * octave);
for (int row = 0; row < 8; ++row) {
// The ideal leftmost note in a row is based only on the "tuning"
const int ideal_leftmost_note = 36 + (ideal_vertical_semitones * row);
const int ideal_leftmost_note =
ideal_first_note + (ideal_vertical_semitones * row);
// If that's in the scale, use it, otherwise use the closest higher note
std::vector<int>::const_iterator n =
@ -1472,13 +1476,16 @@ void
Push2::set_pad_scale_chromatic (const int scale_root,
const int octave,
const MusicalMode::Type mode,
const NoteGridOrigin origin,
const int vertical_semitones)
{
const std::bitset<128> notes = mode_notes_bitset (scale_root, octave, mode);
const int first_note = origin == Fixed ? 36 : scale_root + (12 * octave);
for (int row = 0; row < 8; ++row) {
// The leftmost note in a row is just based only on the "tuning"
const int leftmost_note = 36 + (vertical_semitones * row);
const int leftmost_note = first_note + (vertical_semitones * row);
// Set up the the following columns in the row using the scale
for (int col = 0; col < 8; ++col) {
@ -1505,6 +1512,7 @@ void
Push2::set_pad_scale (const int scale_root,
const int octave,
const MusicalMode::Type mode,
const NoteGridOrigin origin,
const RowInterval row_interval,
const bool inkey)
{
@ -1514,9 +1522,9 @@ Push2::set_pad_scale (const int scale_root,
const int vertical_semitones = row_interval_semitones(row_interval);
if (inkey) {
set_pad_scale_in_key(scale_root, octave, mode, vertical_semitones);
set_pad_scale_in_key(scale_root, octave, mode, origin, vertical_semitones);
} else {
set_pad_scale_chromatic(scale_root, octave, mode, vertical_semitones);
set_pad_scale_chromatic(scale_root, octave, mode, origin, vertical_semitones);
}
// Store state
@ -1539,6 +1547,10 @@ Push2::set_pad_scale (const int scale_root,
_mode = mode;
changed = true;
}
if (_note_grid_origin != origin) {
_note_grid_origin = origin;
changed = true;
}
if (_row_interval != row_interval) {
_row_interval = row_interval;
changed = true;
@ -1553,7 +1565,12 @@ void
Push2::set_percussive_mode (bool yn)
{
if (!yn) {
set_pad_scale (_scale_root, _root_octave, _mode, _row_interval, _in_key);
set_pad_scale (_scale_root,
_root_octave,
_mode,
_note_grid_origin,
_row_interval,
_in_key);
_percussion = false;
return;
}

View File

@ -325,6 +325,17 @@ class Push2 : public ARDOUR::ControlProtocol
void update_selection_color ();
/** The "origin" or "root" of the note grid.
*
* This controls whether the grid is "fixed" in terms of the notes that it
* plays (so changing the scale is effectively just an overlay), or
* "rooted" so the root note of the scale is in the bottom left.
*/
enum NoteGridOrigin {
Fixed, ///< Bottom left pad is always C, or as close as possible
Rooted, ///< Bottom left pad is the scale root
};
/** Interval between vertically adjacent note pads ("layout").
*
* The comments describe the ideal interval that is used in chromatic mode.
@ -367,6 +378,7 @@ class Push2 : public ARDOUR::ControlProtocol
void set_pad_scale_in_key (int root,
int octave,
MusicalMode::Type mode,
NoteGridOrigin origin,
int ideal_vertical_semitones);
/** Set a "chromatic" scale on the pads.
@ -389,17 +401,20 @@ class Push2 : public ARDOUR::ControlProtocol
void set_pad_scale_chromatic (int root,
int octave,
MusicalMode::Type mode,
NoteGridOrigin origin,
int vertical_semitones);
void set_pad_scale (int root,
int octave,
MusicalMode::Type mode,
NoteGridOrigin origin,
RowInterval row_interval,
bool inkey);
PBD::Signal0<void> ScaleChange;
MusicalMode::Type mode() const { return _mode; }
NoteGridOrigin note_grid_origin() { return _note_grid_origin; }
RowInterval row_interval() const { return _row_interval; }
int scale_root() const { return _scale_root; }
int root_octave() const { return _root_octave; }
@ -640,6 +655,7 @@ class Push2 : public ARDOUR::ControlProtocol
void stripable_selection_changed ();
MusicalMode::Type _mode;
NoteGridOrigin _note_grid_origin;
RowInterval _row_interval;
int _scale_root;
int _root_octave;

View File

@ -101,6 +101,18 @@ ScaleLayout::ScaleLayout (Push2& p, Session & s, std::string const & name)
_chromatic_text->set_color (_p2.get_color (Push2::LightBackground));
_chromatic_text->set (_("Chromatic"));
_fixed_text = new Text (this);
_fixed_text->set_font_description (fd2);
_fixed_text->set_position (Duple (10 + (7 * Push2Canvas::inter_button_spacing()), 140));
_fixed_text->set_color (_p2.get_color (Push2::LightBackground));
_fixed_text->set (_("Fixed"));
_rooted_text = new Text (this);
_rooted_text->set_font_description (fd2);
_rooted_text->set_position (Duple (45 + (7 * Push2Canvas::inter_button_spacing()), 140));
_rooted_text->set_color (_p2.get_color (Push2::LightBackground));
_rooted_text->set (_("Rooted"));
_row_interval_text = new Text (this);
_row_interval_text->set_font_description (fd);
_row_interval_text->set_position (Duple (10, 70));
@ -241,6 +253,7 @@ ScaleLayout::button_upper (uint32_t n)
_p2.set_pad_scale (root,
_p2.root_octave (),
_p2.mode (),
_p2.note_grid_origin (),
_p2.row_interval (),
_p2.in_key ());
}
@ -252,12 +265,14 @@ ScaleLayout::button_lower (uint32_t n)
_p2.set_pad_scale (_p2.scale_root (),
_p2.root_octave (),
_p2.mode (),
_p2.note_grid_origin (),
_p2.row_interval (),
!_p2.in_key ());
return;
}
int root = 0;
int root = _p2.scale_root();
Push2::NoteGridOrigin origin = _p2.note_grid_origin ();
switch (n) {
case 1:
@ -286,12 +301,14 @@ ScaleLayout::button_lower (uint32_t n)
break;
case 7:
/* fixed mode */
return;
origin = (origin == Push2::Fixed) ? Push2::Rooted : Push2::Fixed;
break;
}
_p2.set_pad_scale (root,
_p2.root_octave (),
_p2.mode (),
origin,
_p2.row_interval (),
_p2.in_key ());
}
@ -356,6 +373,7 @@ ScaleLayout::show ()
}
show_root_state ();
show_fixed_state ();
Container::show ();
}
@ -409,6 +427,7 @@ ScaleLayout::strip_vpot (int n, int delta)
_p2.set_pad_scale (_p2.scale_root (),
_p2.root_octave (),
_p2.mode (),
_p2.note_grid_origin (),
row_interval,
_p2.in_key ());
@ -629,13 +648,37 @@ ScaleLayout::show_root_state ()
}
_scale_menu->set_active ((uint32_t) _p2.mode ());
show_fixed_state ();
}
void
ScaleLayout::show_fixed_state ()
{
if (!parent()) {
/* don't do this stuff if we're not visible */
return;
}
if (_p2.note_grid_origin() == Push2::Fixed) {
_rooted_text->set_color (change_alpha (_fixed_text->color(), unselected_root_alpha));
_fixed_text->set_color (change_alpha (_rooted_text->color(), 1.0));
} else {
_fixed_text->set_color (change_alpha (_fixed_text->color(), unselected_root_alpha));
_rooted_text->set_color (change_alpha (_rooted_text->color(), 1.0));
}
}
void
ScaleLayout::mode_changed ()
{
MusicalMode::Type m = (MusicalMode::Type) _scale_menu->active();
_p2.set_pad_scale (_p2.scale_root(), _p2.root_octave(), m, _p2.row_interval(), _p2.in_key());
_p2.set_pad_scale (_p2.scale_root (),
_p2.root_octave (),
m,
_p2.note_grid_origin (),
_p2.row_interval (),
_p2.in_key ());
}
void

View File

@ -59,6 +59,8 @@ class ScaleLayout : public Push2Layout
ArdourCanvas::Text* _right_scroll_text;
ArdourCanvas::Text* _inkey_text;
ArdourCanvas::Text* _chromatic_text;
ArdourCanvas::Text* _fixed_text;
ArdourCanvas::Text* _rooted_text;
ArdourCanvas::Text* _row_interval_text;
ArdourCanvas::Text* _close_text;
Push2Menu* _scale_menu;
@ -72,6 +74,7 @@ class ScaleLayout : public Push2Layout
void mode_changed ();
void menu_rearranged ();
void show_root_state ();
void show_fixed_state ();
void update_cursor_buttons ();
};