From f6efcdd98b32f1cd0d5a4a52abb333437c04b44f Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Mon, 15 Jan 2024 16:06:05 +0100 Subject: [WIP] Add decay control and attack/decay params on ch3 --- src/clipboard.c | 135 ++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 92 insertions(+), 43 deletions(-) (limited to 'src/clipboard.c') diff --git a/src/clipboard.c b/src/clipboard.c index d82f576..e92d4c5 100644 --- a/src/clipboard.c +++ b/src/clipboard.c @@ -37,20 +37,25 @@ clipboard_paste(void) { case 0: { pat_dst->ch1.notes[trig_selection_loc] = pat_src->ch1.notes[clipboard.src_trig]; pat_dst->ch1.params[trig_selection_loc] = pat_src->ch1.params[clipboard.src_trig]; - send_notif("PASTED NOTE & PARAMS"); } break; case 1: { pat_dst->ch2.notes[trig_selection_loc] = pat_src->ch1.notes[clipboard.src_trig]; - pat_dst->ch2.params[trig_selection_loc] = pat_src->ch1.params[clipboard.src_trig]; - send_notif("PASTED NOTE & PARAMS"); + pat_dst->ch2.params[trig_selection_loc].env_volume = pat_src->ch1.params[clipboard.src_trig].env_volume; + pat_dst->ch2.params[trig_selection_loc].env_time = pat_src->ch1.params[clipboard.src_trig].env_time; + pat_dst->ch2.params[trig_selection_loc].env_direction = pat_src->ch1.params[clipboard.src_trig].env_direction; + pat_dst->ch2.params[trig_selection_loc].duty_cycle = pat_src->ch1.params[clipboard.src_trig].duty_cycle; + pat_dst->ch2.params[trig_selection_loc].prob = pat_src->ch1.params[clipboard.src_trig].prob; + pat_dst->ch2.params[trig_selection_loc].pan = pat_src->ch1.params[clipboard.src_trig].pan; } break; case 2: { pat_dst->ch3.notes[trig_selection_loc] = pat_src->ch1.notes[clipboard.src_trig]; - send_notif("PASTED NOTE"); + pat_dst->ch3.params[trig_selection_loc].prob = pat_src->ch1.params[clipboard.src_trig].prob; + pat_dst->ch3.params[trig_selection_loc].pan = pat_src->ch1.params[clipboard.src_trig].pan; } break; case 3: { pat_dst->ch4.notes[trig_selection_loc] = pat_src->ch1.notes[clipboard.src_trig]; - send_notif("PASTED NOTE"); + pat_dst->ch4.params[trig_selection_loc].prob = pat_src->ch1.params[clipboard.src_trig].prob; + pat_dst->ch4.params[trig_selection_loc].pan = pat_src->ch1.params[clipboard.src_trig].pan; } break; } } break; @@ -62,20 +67,22 @@ clipboard_paste(void) { pat_dst->ch1.params[trig_selection_loc].env_time = pat_src->ch2.params[clipboard.src_trig].env_time; pat_dst->ch1.params[trig_selection_loc].env_direction = pat_src->ch2.params[clipboard.src_trig].env_direction; pat_dst->ch1.params[trig_selection_loc].duty_cycle = pat_src->ch2.params[clipboard.src_trig].duty_cycle; - send_notif("PASTED NOTE & PARAMS"); + pat_dst->ch1.params[trig_selection_loc].prob = pat_src->ch2.params[clipboard.src_trig].prob; + pat_dst->ch1.params[trig_selection_loc].pan = pat_src->ch2.params[clipboard.src_trig].pan; } break; case 1: { pat_dst->ch2.notes[trig_selection_loc] = pat_src->ch2.notes[clipboard.src_trig]; pat_dst->ch2.params[trig_selection_loc] = pat_src->ch2.params[clipboard.src_trig]; - send_notif("PASTED NOTE & PARAMS"); } break; case 2: { pat_dst->ch3.notes[trig_selection_loc] = pat_src->ch2.notes[clipboard.src_trig]; - send_notif("PASTED NOTE"); + pat_dst->ch3.params[trig_selection_loc].prob = pat_src->ch2.params[clipboard.src_trig].prob; + pat_dst->ch3.params[trig_selection_loc].pan = pat_src->ch2.params[clipboard.src_trig].pan; } break; case 3: { pat_dst->ch4.notes[trig_selection_loc] = pat_src->ch2.notes[clipboard.src_trig]; - send_notif("PASTED NOTE"); + pat_dst->ch4.params[trig_selection_loc].prob = pat_src->ch2.params[clipboard.src_trig].prob; + pat_dst->ch4.params[trig_selection_loc].pan = pat_src->ch2.params[clipboard.src_trig].pan; } break; } } break; @@ -83,20 +90,22 @@ clipboard_paste(void) { switch (channel_selection_loc) { case 0: { pat_dst->ch1.notes[trig_selection_loc] = pat_src->ch3.notes[clipboard.src_trig]; - send_notif("PASTED NOTE"); + pat_dst->ch1.params[trig_selection_loc].prob = pat_src->ch3.params[clipboard.src_trig].prob; + pat_dst->ch1.params[trig_selection_loc].pan = pat_src->ch3.params[clipboard.src_trig].pan; } break; case 1: { pat_dst->ch2.notes[trig_selection_loc] = pat_src->ch3.notes[clipboard.src_trig]; - send_notif("PASTED NOTE"); + pat_dst->ch2.params[trig_selection_loc].prob = pat_src->ch3.params[clipboard.src_trig].prob; + pat_dst->ch2.params[trig_selection_loc].pan = pat_src->ch3.params[clipboard.src_trig].pan; } break; case 2: { pat_dst->ch3.notes[trig_selection_loc] = pat_src->ch3.notes[clipboard.src_trig]; pat_dst->ch3.params[trig_selection_loc] = pat_src->ch3.params[clipboard.src_trig]; - send_notif("PASTED NOTE & PARAMS"); } break; case 3: { pat_dst->ch4.notes[trig_selection_loc] = pat_src->ch3.notes[clipboard.src_trig]; - send_notif("PASTED NOTE"); + pat_dst->ch4.params[trig_selection_loc].prob = pat_src->ch3.params[clipboard.src_trig].prob; + pat_dst->ch4.params[trig_selection_loc].pan = pat_src->ch3.params[clipboard.src_trig].pan; } break; } } break; @@ -104,37 +113,44 @@ clipboard_paste(void) { switch (channel_selection_loc) { case 0: { pat_dst->ch1.notes[trig_selection_loc] = pat_src->ch4.notes[clipboard.src_trig]; - send_notif("PASTED NOTE"); + pat_dst->ch1.params[trig_selection_loc].prob = pat_src->ch4.params[clipboard.src_trig].prob; + pat_dst->ch1.params[trig_selection_loc].pan = pat_src->ch4.params[clipboard.src_trig].pan; } break; case 1: { pat_dst->ch2.notes[trig_selection_loc] = pat_src->ch4.notes[clipboard.src_trig]; - send_notif("PASTED NOTE"); + pat_dst->ch2.params[trig_selection_loc].prob = pat_src->ch4.params[clipboard.src_trig].prob; + pat_dst->ch2.params[trig_selection_loc].pan = pat_src->ch4.params[clipboard.src_trig].pan; } break; case 2: { pat_dst->ch3.notes[trig_selection_loc] = pat_src->ch4.notes[clipboard.src_trig]; - send_notif("PASTED NOTE"); + pat_dst->ch3.params[trig_selection_loc].prob = pat_src->ch4.params[clipboard.src_trig].prob; + pat_dst->ch3.params[trig_selection_loc].pan = pat_src->ch4.params[clipboard.src_trig].pan; } break; case 3: { pat_dst->ch4.notes[trig_selection_loc] = pat_src->ch4.notes[clipboard.src_trig]; pat_dst->ch4.params[trig_selection_loc] = pat_src->ch4.params[clipboard.src_trig]; - send_notif("PASTED NOTE & PARAMS"); } break; } } break; } + send_notif("PASTED NOTE & PARAMS"); } // Only paste the params for the respective trigger. if (clipboard.type == CLIP_PARAM_CH1) { switch (channel_selection_loc) { case 0: { pat_dst->ch1.params[trig_selection_loc] = pat_src->ch1.params[clipboard.src_trig]; - send_notif("PASTED PARAMS"); } break; case 1: { - pat_dst->ch2.params[trig_selection_loc] = pat_src->ch1.params[clipboard.src_trig]; - send_notif("PASTED PARAMS"); + pat_dst->ch2.params[trig_selection_loc].env_volume = pat_src->ch1.params[clipboard.src_trig].env_volume; + pat_dst->ch2.params[trig_selection_loc].env_time = pat_src->ch1.params[clipboard.src_trig].env_time; + pat_dst->ch2.params[trig_selection_loc].env_direction = pat_src->ch1.params[clipboard.src_trig].env_direction; + pat_dst->ch2.params[trig_selection_loc].duty_cycle = pat_src->ch1.params[clipboard.src_trig].duty_cycle; + pat_dst->ch2.params[trig_selection_loc].prob = pat_src->ch1.params[clipboard.src_trig].prob; + pat_dst->ch2.params[trig_selection_loc].pan = pat_src->ch1.params[clipboard.src_trig].pan; } break; } + send_notif("PASTED PARAMS"); } if (clipboard.type == CLIP_PARAM_CH2) { switch (channel_selection_loc) { @@ -143,13 +159,14 @@ clipboard_paste(void) { pat_dst->ch1.params[trig_selection_loc].env_time = pat_src->ch2.params[clipboard.src_trig].env_time; pat_dst->ch1.params[trig_selection_loc].env_direction = pat_src->ch2.params[clipboard.src_trig].env_direction; pat_dst->ch1.params[trig_selection_loc].duty_cycle = pat_src->ch2.params[clipboard.src_trig].duty_cycle; - send_notif("PASTED PARAMS"); + pat_dst->ch1.params[trig_selection_loc].prob = pat_src->ch2.params[clipboard.src_trig].prob; + pat_dst->ch1.params[trig_selection_loc].pan = pat_src->ch2.params[clipboard.src_trig].pan; } break; case 1: { pat_dst->ch2.params[trig_selection_loc] = pat_src->ch2.params[clipboard.src_trig]; - send_notif("PASTED PARAMS"); } break; } + send_notif("PASTED PARAMS"); } if (clipboard.type == CLIP_PARAM_CH3 && channel_selection_loc == clipboard.src_chan) { pat_dst->ch3.params[trig_selection_loc] = pat_src->ch3.params[clipboard.src_trig]; @@ -170,6 +187,8 @@ clipboard_paste(void) { pat_dst->ch1.params[trig_selection_loc].env_time = pat_src->ch2.params[clipboard.src_trig].env_time; pat_dst->ch1.params[trig_selection_loc].env_direction = pat_src->ch2.params[clipboard.src_trig].env_direction; pat_dst->ch1.params[trig_selection_loc].duty_cycle = pat_src->ch2.params[clipboard.src_trig].duty_cycle; + pat_dst->ch1.params[trig_selection_loc].prob = pat_src->ch2.params[clipboard.src_trig].prob; + pat_dst->ch1.params[trig_selection_loc].pan = pat_src->ch2.params[clipboard.src_trig].pan; send_notif("PASTED PARAMS"); draw_parameters(); } else if (input_handler == handle_param_selection_sq2 && clipboard.type == CLIP_PARAM_CH2) { @@ -177,7 +196,12 @@ clipboard_paste(void) { send_notif("PASTED PARAMS"); draw_parameters(); } else if (input_handler == handle_param_selection_sq2 && clipboard.type == CLIP_PARAM_CH1) { - pat_dst->ch2.params[trig_selection_loc] = pat_src->ch1.params[clipboard.src_trig]; + pat_dst->ch2.params[trig_selection_loc].env_volume = pat_src->ch1.params[clipboard.src_trig].env_volume; + pat_dst->ch2.params[trig_selection_loc].env_time = pat_src->ch1.params[clipboard.src_trig].env_time; + pat_dst->ch2.params[trig_selection_loc].env_direction = pat_src->ch1.params[clipboard.src_trig].env_direction; + pat_dst->ch2.params[trig_selection_loc].duty_cycle = pat_src->ch1.params[clipboard.src_trig].duty_cycle; + pat_dst->ch2.params[trig_selection_loc].prob = pat_src->ch1.params[clipboard.src_trig].prob; + pat_dst->ch2.params[trig_selection_loc].pan = pat_src->ch1.params[clipboard.src_trig].pan; send_notif("PASTED PARAMS"); draw_parameters(); } else if (input_handler == handle_param_selection_wave && clipboard.type == CLIP_PARAM_CH3) { @@ -198,7 +222,6 @@ clipboard_paste(void) { case 2: { pat_dst->ch3 = pat_src->ch3; } break; case 3: { pat_dst->ch4 = pat_src->ch4; } break; } - send_notif("PASTED NOTES & PARAMS"); } else { switch (clipboard.src_chan) { case 0: { @@ -208,26 +231,31 @@ clipboard_paste(void) { pat_dst->ch1.notes[i] = pat_src->ch1.notes[i]; pat_dst->ch1.params[i] = pat_src->ch1.params[i]; } - send_notif("PASTED NOTES & PARAMS"); } break; case 1: { for (size_t i = 0; i < 16; i++) { pat_dst->ch2.notes[i] = pat_src->ch1.notes[i]; - pat_dst->ch2.params[i] = pat_src->ch1.params[i]; + pat_dst->ch2.params[i].env_volume = pat_src->ch1.params[i].env_volume; + pat_dst->ch2.params[i].env_time = pat_src->ch1.params[i].env_time; + pat_dst->ch2.params[i].env_direction = pat_src->ch1.params[i].env_direction; + pat_dst->ch2.params[i].duty_cycle = pat_src->ch1.params[i].duty_cycle; + pat_dst->ch2.params[i].prob = pat_src->ch1.params[i].prob; + pat_dst->ch2.params[i].pan = pat_src->ch1.params[i].pan; } - send_notif("PASTED NOTES & PARAMS"); } break; case 2: { for (size_t i = 0; i < 16; i++) { pat_dst->ch3.notes[i] = pat_src->ch1.notes[i]; + pat_dst->ch3.params[i].prob = pat_src->ch1.params[i].prob; + pat_dst->ch3.params[i].pan = pat_src->ch1.params[i].pan; } - send_notif("PASTED NOTES"); } break; case 3: { for (size_t i = 0; i < 16; i++) { pat_dst->ch4.notes[i] = pat_src->ch1.notes[i]; + pat_dst->ch4.params[i].prob = pat_src->ch1.params[i].prob; + pat_dst->ch4.params[i].pan = pat_src->ch1.params[i].pan; } - send_notif("PASTED NOTES"); } break; } } break; @@ -240,27 +268,29 @@ clipboard_paste(void) { pat_dst->ch1.params[i].env_time = pat_src->ch2.params[i].env_time; pat_dst->ch1.params[i].env_direction = pat_src->ch2.params[i].env_direction; pat_dst->ch1.params[i].duty_cycle = pat_src->ch2.params[i].duty_cycle; + pat_dst->ch1.params[i].prob = pat_src->ch2.params[i].prob; + pat_dst->ch1.params[i].pan = pat_src->ch2.params[i].pan; } - send_notif("PASTED NOTES & PARAMS"); } break; case 1: { for (size_t i = 0; i < 16; i++) { pat_dst->ch2.notes[i] = pat_src->ch2.notes[i]; pat_dst->ch2.params[i] = pat_src->ch2.params[i]; } - send_notif("PASTED NOTES & PARAMS"); } break; case 2: { for (size_t i = 0; i < 16; i++) { pat_dst->ch3.notes[i] = pat_src->ch2.notes[i]; + pat_dst->ch3.params[i].prob = pat_src->ch2.params[i].prob; + pat_dst->ch3.params[i].pan = pat_src->ch2.params[i].pan; } - send_notif("PASTED NOTES"); } break; case 3: { for (size_t i = 0; i < 16; i++) { pat_dst->ch4.notes[i] = pat_src->ch2.notes[i]; + pat_dst->ch4.params[i].prob = pat_src->ch2.params[i].prob; + pat_dst->ch4.params[i].pan = pat_src->ch2.params[i].pan; } - send_notif("PASTED NOTES"); } break; } } break; @@ -269,27 +299,29 @@ clipboard_paste(void) { case 0: { for (size_t i = 0; i < 16; i++) { pat_dst->ch1.notes[i] = pat_src->ch3.notes[i]; + pat_dst->ch1.params[i].prob = pat_src->ch3.params[i].prob; + pat_dst->ch1.params[i].pan = pat_src->ch3.params[i].pan; } - send_notif("PASTED NOTES"); } break; case 1: { for (size_t i = 0; i < 16; i++) { pat_dst->ch2.notes[i] = pat_src->ch3.notes[i]; + pat_dst->ch2.params[i].prob = pat_src->ch3.params[i].prob; + pat_dst->ch2.params[i].pan = pat_src->ch3.params[i].pan; } - send_notif("PASTED NOTES"); } break; case 2: { for (size_t i = 0; i < 16; i++) { pat_dst->ch3.notes[i] = pat_src->ch3.notes[i]; pat_dst->ch3.params[i] = pat_src->ch3.params[i]; } - send_notif("PASTED NOTES & PARAMS"); } break; case 3: { for (size_t i = 0; i < 16; i++) { pat_dst->ch4.notes[i] = pat_src->ch3.notes[i]; + pat_dst->ch4.params[i].prob = pat_src->ch3.params[i].prob; + pat_dst->ch4.params[i].pan = pat_src->ch3.params[i].pan; } - send_notif("PASTED NOTES"); } break; } } break; @@ -298,32 +330,35 @@ clipboard_paste(void) { case 0: { for (size_t i = 0; i < 16; i++) { pat_dst->ch1.notes[i] = pat_src->ch4.notes[i]; + pat_dst->ch1.params[i].prob = pat_src->ch4.params[i].prob; + pat_dst->ch1.params[i].pan = pat_src->ch4.params[i].pan; } - send_notif("PASTED NOTES"); } break; case 1: { for (size_t i = 0; i < 16; i++) { pat_dst->ch2.notes[i] = pat_src->ch4.notes[i]; + pat_dst->ch2.params[i].prob = pat_src->ch4.params[i].prob; + pat_dst->ch2.params[i].pan = pat_src->ch4.params[i].pan; } - send_notif("PASTED NOTES"); } break; case 2: { for (size_t i = 0; i < 16; i++) { pat_dst->ch3.notes[i] = pat_src->ch4.notes[i]; + pat_dst->ch3.params[i].prob = pat_src->ch4.params[i].prob; + pat_dst->ch3.params[i].pan = pat_src->ch4.params[i].pan; } - send_notif("PASTED NOTES"); } break; case 3: { for (size_t i = 0; i < 16; i++) { pat_dst->ch4.notes[i] = pat_src->ch4.notes[i]; pat_dst->ch4.params[i] = pat_src->ch4.params[i]; } - send_notif("PASTED NOTES & PARAMS"); } break; } } break; } } + send_notif("PASTED NOTES & PARAMS"); draw_channels(); draw_triggers(); } else if (input_handler == handle_channel_selection) { @@ -344,11 +379,15 @@ clipboard_paste(void) { ch1_params.env_time = pat_src->ch2.params[clipboard.src_trig].env_time; ch1_params.env_direction = pat_src->ch2.params[clipboard.src_trig].env_direction; ch1_params.duty_cycle = pat_src->ch2.params[clipboard.src_trig].duty_cycle; + ch1_params.prob = pat_src->ch2.params[clipboard.src_trig].prob; + ch1_params.pan = pat_src->ch2.params[clipboard.src_trig].pan; for (size_t i = 0; i < 16; i++) { pat_dst->ch1.params[i].env_volume = pat_src->ch2.params[clipboard.src_trig].env_volume; pat_dst->ch1.params[i].env_time = pat_src->ch2.params[clipboard.src_trig].env_time; pat_dst->ch1.params[i].env_direction = pat_src->ch2.params[clipboard.src_trig].env_direction; pat_dst->ch1.params[i].duty_cycle = pat_src->ch2.params[clipboard.src_trig].duty_cycle; + pat_dst->ch1.params[i].prob = pat_src->ch2.params[clipboard.src_trig].prob; + pat_dst->ch1.params[i].pan = pat_src->ch2.params[clipboard.src_trig].pan; } send_notif("PASTED PARAMS"); } @@ -359,9 +398,19 @@ clipboard_paste(void) { clipboard.type == CLIP_PARAM_CH1 || clipboard.type == CLIP_PARAM_CH2) { if (clipboard.src_chan == 0) { - ch2_params = pat_src->ch1.params[clipboard.src_trig]; + ch2_params.env_volume = pat_src->ch1.params[clipboard.src_trig].env_volume; + ch2_params.env_time = pat_src->ch1.params[clipboard.src_trig].env_time; + ch2_params.env_direction = pat_src->ch1.params[clipboard.src_trig].env_direction; + ch2_params.duty_cycle = pat_src->ch1.params[clipboard.src_trig].duty_cycle; + ch2_params.prob = pat_src->ch1.params[clipboard.src_trig].prob; + ch2_params.pan = pat_src->ch1.params[clipboard.src_trig].pan; for (size_t i = 0; i < 16; i++) { - pat_dst->ch2.params[i] = pat_src->ch1.params[clipboard.src_trig]; + pat_dst->ch2.params[i].env_volume = pat_src->ch1.params[clipboard.src_trig].env_volume; + pat_dst->ch2.params[i].env_time = pat_src->ch1.params[clipboard.src_trig].env_time; + pat_dst->ch2.params[i].env_direction = pat_src->ch1.params[clipboard.src_trig].env_direction; + pat_dst->ch2.params[i].duty_cycle = pat_src->ch1.params[clipboard.src_trig].duty_cycle; + pat_dst->ch2.params[i].prob = pat_src->ch1.params[clipboard.src_trig].prob; + pat_dst->ch2.params[i].pan = pat_src->ch1.params[clipboard.src_trig].pan; } send_notif("PASTED PARAMS"); } -- cgit v1.2.1