1
Fork 0

pattern interpolation, transpose octaves

This commit is contained in:
Leonard Ritter 2010-10-01 17:18:43 +02:00
parent a3b045695d
commit 663df8bccf
3 changed files with 58 additions and 2 deletions

View File

@ -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.

View File

@ -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;
}
}

View File

@ -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();