static void finalize_smf(value s) { Smf_t *t = Smf_t_val(s); if (t->t) smf_delete(t->t); free(t); }
static int cmd_load(char *file_name) { char *decoded; if (file_name == NULL) { if (last_file_name == NULL) { g_critical("Please specify file name."); return (-1); } file_name = strdup(last_file_name); } else { file_name = strdup(file_name); } selected_track = NULL; selected_event = NULL; if (smf != NULL) { smf_delete(smf); smf = NULL; } if (last_file_name != NULL) free(last_file_name); last_file_name = strdup(file_name); smf = smf_load(file_name); if (smf == NULL) { g_critical("Couldn't load '%s'.", file_name); smf = smf_new(); if (smf == NULL) { g_critical("Cannot initialize smf_t."); return (-1); } return (-2); } g_message("File '%s' loaded.", file_name); decoded = smf_decode(smf); g_message("%s.", decoded); free(decoded); cmd_track("1"); free(file_name); return (0); }
static int ui_load_state(ui_t *ui, char *filename) { int i; smf_t *smf; smf_event_t *event; smf_track_t *track; jack_nframes_t frame; if (!filename) { ui->filename = ui_get_filename(ui, ".", "Load file: "); } if (ui->filename) { smf = smf_load(ui->filename); if (!smf) { free(ui->filename); ui->filename = NULL; return 0; } ui_send_clear(ui, ui->pattern); for (i = 0; i < 8; i++) { track = smf_get_track_by_number(smf, i + 1); if (!track) { continue; } while ((event = smf_track_get_next_event(track))) { if (smf_event_is_metadata(event) || event->midi_buffer[0] == NOTEOFF) { continue; } frame = ui_seconds_to_nframes(ui, event->time_seconds); ui_send_add(ui, event->midi_buffer[1], event->midi_buffer[2], frame ? frame / (88200 / ui->steps) + 1 : 0, MAX_LEN, i); } } smf_delete(smf); } return 1; }
static int ui_save_state(ui_t *ui, char *filename) { int i; smf_t *smf; smf_track_t *track; jack_nframes_t frame; double seconds; list_t *pattern, *lp; note_t *note; /* TODO: check if file exists */ if (!filename) { filename = ui_get_filename(ui, ".", "Save to: "); } ui->filename = filename; smf = smf_new(); if (!smf) { return 0; } for (i = 0; i < 8; i++) { track = smf_track_new(); if (!track) { smf_delete(smf); return 0; } smf_add_track(smf, track); pattern = ui->patterns[i]; if (!pattern) { continue; } for (lp = pattern; lp; lp = list_next(lp)) { note = (note_t *)list_data(lp); frame = 88200 / ui->steps * note->step; seconds = ui_nframes_to_seconds(ui, frame); note_event_save(note, track, 0x90, seconds); /* TODO: decide if and how noteoffs should be saved */ /* frame = 88200 / ui->steps */ /* * ((note->step + note->len) % ui->steps); */ /* seconds = ui_nframes_to_seconds(ui, frame); */ /* note_event_save(note, track, NOTEOFF, seconds); */ } if (smf_track_add_eot_seconds(track, 2)) { return 0; } } if (smf_save(smf, ui->filename)) { return 0; } return 1; }