pattern interpolation, transpose octaves
This commit is contained in:
parent
a3b045695d
commit
663df8bccf
|
@ -65,10 +65,15 @@ Q2W3ER5T6Y7U: Set notes in note columns (Octave +1).
|
|||
Alt+Del: Move all values below cursor up
|
||||
by one row in all channels.
|
||||
Shift+NumPad
|
||||
Plus/Minus: Transpose Notes Up/Down
|
||||
Plus/Minus: Transpose notes up/down by a semitone.
|
||||
Shift+Alt+
|
||||
NumPad Plus/
|
||||
Minus: Transpose notes up/down by an octave.
|
||||
|
||||
Ctrl+I: Interpolate values.
|
||||
|
||||
Ctrl+NumPad
|
||||
Plus/Minus: Add/Remove Voice Channel
|
||||
Plus/Minus: Add/remove voice channel.
|
||||
|
||||
Ctrl+C: Copy events in selection to clipboard.
|
||||
Ctrl+V: Paste events from clipboard at cursor.
|
||||
|
|
|
@ -1190,6 +1190,42 @@ bool PatternView::on_button_release_event(GdkEventButton* event) {
|
|||
return false;
|
||||
}
|
||||
|
||||
void PatternView::interpolate() {
|
||||
if (!selection.get_active())
|
||||
return;
|
||||
selection.sort();
|
||||
if (selection.p0.get_channel() != selection.p1.get_channel())
|
||||
return;
|
||||
if (selection.p0.get_param() != selection.p1.get_param())
|
||||
return;
|
||||
Pattern::iterator iter;
|
||||
iter = get_event(selection.p0);
|
||||
if (iter == get_pattern()->end())
|
||||
return;
|
||||
int v0 = iter->second.value;
|
||||
iter = get_event(selection.p1);
|
||||
if (iter == get_pattern()->end())
|
||||
return;
|
||||
int v1 = iter->second.value;
|
||||
|
||||
int start_row = selection.p0.get_row();
|
||||
int end_row = selection.p1.get_row();
|
||||
double scale = (double)(v1 - v0) / (double)(end_row - start_row);
|
||||
|
||||
clear_block();
|
||||
|
||||
for (int i = start_row; i <= end_row; ++i) {
|
||||
Pattern::Event event;
|
||||
event.frame = i;
|
||||
event.channel = selection.p0.get_channel();
|
||||
event.param = selection.p0.get_param();
|
||||
event.value = int((double)v0 + scale * (double)(i - start_row) + 0.5);
|
||||
get_pattern()->add_event(event);
|
||||
}
|
||||
|
||||
invalidate_selection();
|
||||
}
|
||||
|
||||
void PatternView::transpose(int step) {
|
||||
Pattern::iterator iter;
|
||||
for (Pattern::iterator iter = get_pattern()->begin();
|
||||
|
@ -1460,6 +1496,7 @@ bool PatternView::on_key_press_event(GdkEventKey* event) {
|
|||
case GDK_c: copy_block(); return true;
|
||||
case GDK_v: paste_block(); return true;
|
||||
case GDK_d: clear_block(); return true;
|
||||
case GDK_i: interpolate(); return true;
|
||||
case GDK_plus:
|
||||
case GDK_KP_Add:
|
||||
{
|
||||
|
@ -1486,6 +1523,19 @@ bool PatternView::on_key_press_event(GdkEventKey* event) {
|
|||
case GDK_End: set_octave(get_octave()+1); return true;
|
||||
case GDK_Insert: move_frames(1,true); return true;
|
||||
case GDK_Delete: move_frames(-1,true); return true;
|
||||
case GDK_KP_Add:
|
||||
{
|
||||
if (shift_down)
|
||||
transpose(12);
|
||||
return true;
|
||||
} break;
|
||||
case GDK_minus:
|
||||
case GDK_KP_Subtract:
|
||||
{
|
||||
if (shift_down)
|
||||
transpose(-12);
|
||||
return true;
|
||||
} break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -306,6 +306,7 @@ public:
|
|||
void end_block();
|
||||
void cycle_block_selection();
|
||||
void transpose(int step);
|
||||
void interpolate();
|
||||
|
||||
void move_frames(int step, bool all_channels=false);
|
||||
void reset();
|
||||
|
|
Loading…
Reference in New Issue