void clipboard_paste(void); void clipboard_copy(void); typedef enum ClipboardType { CLIP_EMPTY, CLIP_TRIG, CLIP_PARAM_CH1, CLIP_PARAM_CH2, CLIP_PARAM_CH3, CLIP_PARAM_CH4, CLIP_PATTERN, CLIP_CHANNEL, } ClipboardType; typedef struct Clipboard { ClipboardType type; u8 src_pat; u8 src_chan; u8 src_trig; } Clipboard; static Clipboard clipboard = {CLIP_EMPTY, 0, 0, 0}; void send_notif(char *msg); void clipboard_paste(void) { Pattern *pat_dst = &patterns[pattern_selection_loc]; Pattern *pat_src = &patterns[clipboard.src_pat]; if (input_handler == handle_trigger_selection) { if (clipboard.type == CLIP_TRIG) { // Copy notes or parameters when applicable. switch (clipboard.src_chan) { case 0: { switch (channel_selection_loc) { 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]; } break; case 1: { pat_dst->ch2.notes[trig_selection_loc] = pat_src->ch1.notes[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; } break; case 2: { pat_dst->ch3.notes[trig_selection_loc] = pat_src->ch1.notes[clipboard.src_trig]; 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]; 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; case 1: { switch (channel_selection_loc) { case 0: { pat_dst->ch1.notes[trig_selection_loc] = pat_src->ch2.notes[clipboard.src_trig]; pat_dst->ch1.params[trig_selection_loc].env_volume = pat_src->ch2.params[clipboard.src_trig].env_volume; 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; } 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]; } break; case 2: { pat_dst->ch3.notes[trig_selection_loc] = pat_src->ch2.notes[clipboard.src_trig]; 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]; 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; case 2: { switch (channel_selection_loc) { case 0: { pat_dst->ch1.notes[trig_selection_loc] = pat_src->ch3.notes[clipboard.src_trig]; 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]; 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]; } break; case 3: { pat_dst->ch4.notes[trig_selection_loc] = pat_src->ch3.notes[clipboard.src_trig]; 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; case 3: { switch (channel_selection_loc) { case 0: { pat_dst->ch1.notes[trig_selection_loc] = pat_src->ch4.notes[clipboard.src_trig]; 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]; 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]; 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]; } 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]; } break; case 1: { 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) { case 0: { pat_dst->ch1.params[trig_selection_loc].env_volume = pat_src->ch2.params[clipboard.src_trig].env_volume; 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; } break; case 1: { pat_dst->ch2.params[trig_selection_loc] = pat_src->ch2.params[clipboard.src_trig]; } 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]; send_notif("PASTED PARAMS"); } if (clipboard.type == CLIP_PARAM_CH4 && channel_selection_loc == clipboard.src_chan) { pat_dst->ch4.params[trig_selection_loc] = pat_src->ch4.params[clipboard.src_trig]; send_notif("PASTED PARAMS"); } draw_triggers(); draw_parameters(); } else if (input_handler == handle_param_selection_sq1 && clipboard.type == CLIP_PARAM_CH1) { pat_dst->ch1.params[trig_selection_loc] = pat_src->ch1.params[clipboard.src_trig]; send_notif("PASTED PARAMS"); draw_parameters(); } else if (input_handler == handle_param_selection_sq1 && clipboard.type == CLIP_PARAM_CH2) { pat_dst->ch1.params[trig_selection_loc].env_volume = pat_src->ch2.params[clipboard.src_trig].env_volume; 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) { pat_dst->ch2.params[trig_selection_loc] = pat_src->ch2.params[clipboard.src_trig]; 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].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) { pat_dst->ch3.params[trig_selection_loc] = pat_src->ch3.params[clipboard.src_trig]; send_notif("PASTED PARAMS"); draw_parameters(); } else if (input_handler == handle_param_selection_noise && clipboard.type == CLIP_PARAM_CH4) { pat_dst->ch4.params[trig_selection_loc] = pat_src->ch4.params[clipboard.src_trig]; send_notif("PASTED PARAMS"); draw_parameters(); } else if (input_handler == handle_channel_selection && clipboard.type == CLIP_CHANNEL) { // Copy notes from a different channel OR notes and parameters // from a different pattern. if (clipboard.src_chan == channel_selection_loc) { switch (clipboard.src_chan) { case 0: { pat_dst->ch1 = pat_src->ch1; } break; case 1: { pat_dst->ch2 = pat_src->ch2; } break; case 2: { pat_dst->ch3 = pat_src->ch3; } break; case 3: { pat_dst->ch4 = pat_src->ch4; } break; } } else { switch (clipboard.src_chan) { case 0: { switch (channel_selection_loc) { case 0: { for (size_t i = 0; i < 16; i++) { pat_dst->ch1.notes[i] = pat_src->ch1.notes[i]; pat_dst->ch1.params[i] = pat_src->ch1.params[i]; } } 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].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; } } 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; } } 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; } } break; } } break; case 1: { switch (channel_selection_loc) { case 0: { for (size_t i = 0; i < 16; i++) { pat_dst->ch1.notes[i] = pat_src->ch2.notes[i]; pat_dst->ch1.params[i].env_volume = pat_src->ch2.params[i].env_volume; 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; } } 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]; } } 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; } } 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; } } break; } } break; case 2: { switch (channel_selection_loc) { 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; } } 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; } } 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]; } } 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; } } break; } } break; case 3: { switch (channel_selection_loc) { 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; } } 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; } } 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; } } 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]; } } break; } } break; } } send_notif("PASTED NOTES & PARAMS"); draw_channels(); draw_triggers(); } else if (input_handler == handle_channel_selection) { switch (channel_selection_loc) { case 0: { if (clipboard.type == CLIP_TRIG || clipboard.type == CLIP_PARAM_CH1 || clipboard.type == CLIP_PARAM_CH2) { if (clipboard.src_chan == 0) { ch1_params = pat_src->ch1.params[clipboard.src_trig]; for (size_t i = 0; i < 16; i++) { pat_dst->ch1.params[i] = pat_src->ch1.params[clipboard.src_trig]; } send_notif("PASTED PARAMS"); } if (clipboard.src_chan == 1) { ch1_params.env_volume = pat_src->ch2.params[clipboard.src_trig].env_volume; 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"); } } } break; case 1: { if (clipboard.type == CLIP_TRIG || clipboard.type == CLIP_PARAM_CH1 || clipboard.type == CLIP_PARAM_CH2) { if (clipboard.src_chan == 0) { 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].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"); } if (clipboard.src_chan == 1) { ch2_params = pat_src->ch2.params[clipboard.src_trig]; for (size_t i = 0; i < 16; i++) { pat_dst->ch2.params[i] = pat_src->ch2.params[clipboard.src_trig]; } send_notif("PASTED PARAMS"); } } } break; case 2: { if (clipboard.src_chan != channel_selection_loc) { return; } if (clipboard.type == CLIP_TRIG || clipboard.type == CLIP_PARAM_CH3) { ch3_params = pat_src->ch3.params[clipboard.src_trig]; for (size_t i = 0; i < 16; i++) { pat_dst->ch3.params[i] = pat_src->ch3.params[clipboard.src_trig]; } send_notif("PASTED PARAMS"); } } break; case 3: { if (clipboard.src_chan != channel_selection_loc) { return; } if (clipboard.type == CLIP_TRIG || clipboard.type == CLIP_PARAM_CH4) { ch4_params = pat_src->ch4.params[clipboard.src_trig]; for (size_t i = 0; i < 16; i++) { pat_dst->ch4.params[i] = pat_src->ch4.params[clipboard.src_trig]; } send_notif("PASTED PARAMS"); } } break; } } else if (input_handler == handle_pattern_selection && clipboard.type == CLIP_PATTERN) { // Copy an entire pattern. if (pattern_selection_loc != clipboard.src_pat) { *pat_dst = *pat_src; draw_channels(); draw_triggers(); send_notif("PASTED PATTERN"); } } } void clipboard_copy(void) { if (input_handler == handle_trigger_selection) { clipboard.type = CLIP_TRIG; clipboard.src_pat = pattern_selection_loc; clipboard.src_chan = channel_selection_loc; clipboard.src_trig = trig_selection_loc; send_notif("COPIED TRIGGER"); } else if (input_handler == handle_param_selection_sq1) { clipboard.type = CLIP_PARAM_CH1; clipboard.src_pat = pattern_selection_loc; clipboard.src_chan = channel_selection_loc; clipboard.src_trig = trig_selection_loc; send_notif("COPIED CH1 PARAMS"); } else if (input_handler == handle_param_selection_sq2) { clipboard.type = CLIP_PARAM_CH2; clipboard.src_pat = pattern_selection_loc; clipboard.src_chan = channel_selection_loc; clipboard.src_trig = trig_selection_loc; send_notif("COPIED CH2 PARAMS"); } else if (input_handler == handle_param_selection_wave) { clipboard.type = CLIP_PARAM_CH3; clipboard.src_pat = pattern_selection_loc; clipboard.src_chan = channel_selection_loc; clipboard.src_trig = trig_selection_loc; send_notif("COPIED CH3 PARAMS"); } else if (input_handler == handle_param_selection_noise) { clipboard.type = CLIP_PARAM_CH4; clipboard.src_pat = pattern_selection_loc; clipboard.src_chan = channel_selection_loc; clipboard.src_trig = trig_selection_loc; send_notif("COPIED CH4 PARAMS"); } else if (input_handler == handle_channel_selection) { clipboard.type = CLIP_CHANNEL; clipboard.src_pat = pattern_selection_loc; clipboard.src_chan = channel_selection_loc; send_notif("COPIED CHANNEL"); } else if (input_handler == handle_pattern_selection) { clipboard.type = CLIP_PATTERN; clipboard.src_pat = pattern_selection_loc; send_notif("COPIED PATTERN"); } }