static gboolean cbox_instrument_output_process_cmd(struct cbox_instrument *instr, struct cbox_instrument_output *output, struct cbox_command_target *fb, struct cbox_osc_command *cmd, const char *subcmd, GError **error) { if (!strcmp(subcmd, "/status") && !strcmp(cmd->arg_types, "")) { if (!(cbox_execute_on(fb, NULL, "/gain_linear", "f", error, output->gain) && cbox_execute_on(fb, NULL, "/gain", "f", error, gain2dB_simple(output->gain)) && cbox_execute_on(fb, NULL, "/output", "i", error, output->output_bus + 1))) return FALSE; return cbox_module_slot_process_cmd(&output->insert, fb, cmd, subcmd, CBOX_GET_DOCUMENT(instr->scene), instr->scene->rt, instr->scene->engine, error); } if (!strcmp(subcmd, "/gain") && !strcmp(cmd->arg_types, "f")) { output->gain = dB2gain_simple(CBOX_ARG_F(cmd, 0)); return TRUE; } if (!strcmp(subcmd, "/output") && !strcmp(cmd->arg_types, "i")) { int obus = CBOX_ARG_I(cmd, 0); // XXXKF add error checking output->output_bus = obus - 1; return TRUE; } if (!strncmp(subcmd, "/rec_dry/", 9)) return cbox_execute_sub(&output->rec_dry.cmd_target, fb, cmd, subcmd + 8, error); if (!strncmp(subcmd, "/rec_wet/", 9)) return cbox_execute_sub(&output->rec_wet.cmd_target, fb, cmd, subcmd + 8, error); return cbox_module_slot_process_cmd(&output->insert, fb, cmd, subcmd, CBOX_GET_DOCUMENT(instr->scene), instr->scene->rt, instr->scene->engine, error); }
gboolean cbox_song_process_cmd(struct cbox_command_target *ct, struct cbox_command_target *fb, struct cbox_osc_command *cmd, GError **error) { struct cbox_song *song = ct->user_data; if (!strcmp(cmd->command, "/status") && !strcmp(cmd->arg_types, "")) { if (!cbox_check_fb_channel(fb, cmd->command, error)) return FALSE; for(GList *p = song->tracks; p; p = g_list_next(p)) { struct cbox_track *trk = p->data; if (!cbox_execute_on(fb, NULL, "/track", "sio", error, trk->name, g_list_length(trk->items), trk)) return FALSE; } for(GList *p = song->patterns; p; p = g_list_next(p)) { struct cbox_midi_pattern *pat = p->data; if (!cbox_execute_on(fb, NULL, "/pattern", "sio", error, pat->name, pat->loop_end, pat)) return FALSE; } uint32_t pos = 0; for(GList *p = song->master_track_items; p; p = g_list_next(p)) { struct cbox_master_track_item *mti = p->data; // Omit dummy item at 0 position. if (pos || (mti->timesig_num && mti->timesig_denom) || mti->tempo) { if (!cbox_execute_on(fb, NULL, "/mti", "ifii", error, pos, mti->tempo, mti->timesig_num, mti->timesig_denom)) return FALSE; } pos += mti->duration_ppqn; } return cbox_execute_on(fb, NULL, "/loop_start", "i", error, (int)song->loop_start_ppqn) && cbox_execute_on(fb, NULL, "/loop_end", "i", error, (int)song->loop_end_ppqn) && CBOX_OBJECT_DEFAULT_STATUS(song, fb, error); } else if (!strcmp(cmd->command, "/set_loop") && !strcmp(cmd->arg_types, "ii")) { song->loop_start_ppqn = CBOX_ARG_I(cmd, 0); song->loop_end_ppqn = CBOX_ARG_I(cmd, 1); return TRUE; } else if (!strcmp(cmd->command, "/set_mti") && !strcmp(cmd->arg_types, "ifii")) { cbox_song_set_mti(song, CBOX_ARG_I(cmd, 0), CBOX_ARG_F(cmd, 1), CBOX_ARG_I(cmd, 2), CBOX_ARG_I(cmd, 3)); return TRUE; } else if (!strcmp(cmd->command, "/clear") && !strcmp(cmd->arg_types, "")) { cbox_song_clear(song); return TRUE; } else if (!strcmp(cmd->command, "/add_track") && !strcmp(cmd->arg_types, "")) { if (!cbox_check_fb_channel(fb, cmd->command, error)) return FALSE; struct cbox_track *track = cbox_track_new(CBOX_GET_DOCUMENT(song)); cbox_song_add_track(song, track); if (!cbox_execute_on(fb, NULL, "/uuid", "o", error, track)) { CBOX_DELETE(track); return FALSE; } return TRUE; } else if (!strcmp(cmd->command, "/load_pattern") && !strcmp(cmd->arg_types, "si")) { if (!cbox_check_fb_channel(fb, cmd->command, error)) return FALSE; struct cbox_midi_pattern *pattern = cbox_midi_pattern_load(song, CBOX_ARG_S(cmd, 0), CBOX_ARG_I(cmd, 1), app.engine->master->ppqn_factor); if (!cbox_execute_on(fb, NULL, "/uuid", "o", error, pattern)) { CBOX_DELETE(pattern); return FALSE; } return TRUE; } else if (!strcmp(cmd->command, "/load_track") && !strcmp(cmd->arg_types, "si")) { if (!cbox_check_fb_channel(fb, cmd->command, error)) return FALSE; struct cbox_midi_pattern *pattern = cbox_midi_pattern_load_track(song, CBOX_ARG_S(cmd, 0), CBOX_ARG_I(cmd, 1), app.engine->master->ppqn_factor); if (!cbox_execute_on(fb, NULL, "/uuid", "o", error, pattern)) { CBOX_DELETE(pattern); return FALSE; } return TRUE; } else if (!strcmp(cmd->command, "/load_metronome") && !strcmp(cmd->arg_types, "i")) { if (!cbox_check_fb_channel(fb, cmd->command, error)) return FALSE; struct cbox_midi_pattern *pattern = cbox_midi_pattern_new_metronome(song, CBOX_ARG_I(cmd, 0), app.engine->master->ppqn_factor); if (!cbox_execute_on(fb, NULL, "/uuid", "o", error, pattern)) { CBOX_DELETE(pattern); return FALSE; } return TRUE; } else if (!strcmp(cmd->command, "/load_blob") && !strcmp(cmd->arg_types, "bi")) { if (!cbox_check_fb_channel(fb, cmd->command, error)) return FALSE; struct cbox_midi_pattern *pattern = cbox_midi_pattern_new_from_blob(song, CBOX_ARG_B(cmd, 0), CBOX_ARG_I(cmd, 1), app.engine->master->ppqn_factor); if (!cbox_execute_on(fb, NULL, "/uuid", "o", error, pattern)) { CBOX_DELETE(pattern); return FALSE; } return TRUE; } else return cbox_object_default_process_cmd(ct, fb, cmd, error); return TRUE; }