コード例 #1
0
ファイル: smf_stubs.c プロジェクト: aplusbi/smf
static void finalize_smf(value s)
{
  Smf_t *t = Smf_t_val(s); 
  if (t->t)
    smf_delete(t->t);
  free(t);
}
コード例 #2
0
ファイル: smfsh.c プロジェクト: DanielAeolusLaude/ardour
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);
}
コード例 #3
0
ファイル: ui.c プロジェクト: hbkk/sequencer
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;
}
コード例 #4
0
ファイル: ui.c プロジェクト: hbkk/sequencer
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;
}