static int cmd_eventaddeot(char *time) { double seconds; char *end; if (selected_track == NULL) { g_critical("Please select a track first, using 'track <number>' command."); return (-1); } if (time == NULL) { g_critical("Please specify the time, in seconds."); return (-2); } seconds = strtod(time, &end); if (end - time != strlen(time)) { g_critical("Time is supposed to be a number, without trailing characters."); return (-3); } if (smf_track_add_eot_seconds(selected_track, seconds)) { g_critical("smf_track_add_eot() failed."); return (-4); } g_message("Event created."); return (0); }
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; }