File: create_sf2.c

package info (click to toggle)
libinstpatch 1.1.7-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 3,384 kB
  • sloc: ansic: 50,922; python: 429; xml: 130; makefile: 10
file content (121 lines) | stat: -rw-r--r-- 3,932 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/*
 * Example of creating a SoundFont from multiple audio samples
 *
 * Updated on Oct 14, 2010
 * Some API changes and additional comments in code.
 *
 * Updated on Nov 12, 2004
 * Now uses more convenient converter functions.
 *
 * Joshua "Element" Green - Sep 14, 2004
 * Use this example as you please (public domain)
 */
#include <stdio.h>
#include <libinstpatch/libinstpatch.h>

int
main(int argc, char *argv[])
{
    IpatchSF2 *sf2;
    IpatchFileHandle *fhandle;
    IpatchSF2File *sffile;
    GObject *sample;	/* IpatchSF2Sample */
    IpatchSF2Inst *inst;
    IpatchSF2Preset *preset;
    GError *err = NULL;
    char *fname, *name;
    int i;

    if(argc < 2)
    {
        fprintf(stderr, "Usage: create_sf2 sample1.wav [sample2.wav sample3.aiff ..]\n");
        return (1);
    }

    /* initialize libInstPatch */
    ipatch_init();

    sf2 = ipatch_sf2_new();	/* ++ ref new SoundFont object */

    /* loop over file names (command line args) */
    for(i = 1; i < argc; i++)
    {
        fname = argv[i];

        /* ++ identify file type and open handle to file object */
        fhandle = ipatch_file_identify_open(fname, &err);

        if(!fhandle)
        {
            fprintf(stderr, "Failed to identify file '%s': %s\n", fname,
                    ipatch_gerror_message(err));
            g_clear_error(&err);
            continue;
        }

        /* try to convert file to a SoundFont sample */
        sample = ipatch_convert_object_to_type(G_OBJECT(fhandle->file),
                                               IPATCH_TYPE_SF2_SAMPLE, &err);

        if(!sample)
        {
            fprintf(stderr, "Failed to convert file '%s' to SoundFont sample: %s\n",
                    fname, ipatch_gerror_message(err));
            g_clear_error(&err);
            ipatch_file_close(fhandle);   /* -- close file */
            continue;
        }

        /* append sample to SoundFont (ensure that its name is unique) */
        ipatch_container_add_unique(IPATCH_CONTAINER(sf2), IPATCH_ITEM(sample));

        g_object_get(sample, "name", &name, NULL);  /* get the sample's name */

        /* create new SoundFont instrument (++ ref) */
        inst = ipatch_sf2_inst_new();
        g_object_set(inst, "name", name, NULL);  /* set instrument name */

        /* create new instrument zone and link sample to it */
        ipatch_sf2_inst_new_zone(inst, IPATCH_SF2_SAMPLE(sample));

        g_object_unref(sample);  /* -- unref SoundFont sample */

        /* append instrument to SoundFont (ensure that its name is unique) */
        ipatch_container_add_unique(IPATCH_CONTAINER(sf2), IPATCH_ITEM(inst));

        /* create new SoundFont preset (++ ref) */
        preset = ipatch_sf2_preset_new();
        g_object_set(preset, "name", name, NULL);  /* set preset name */

        /* create new preset zone and link instrument to it */
        ipatch_sf2_preset_new_zone(preset, inst);

        g_object_unref(inst);	/* -- unref SoundFont instrument */

        /* append preset to SoundFont (ensure name/bank/preset # are unique) */
        ipatch_container_add_unique(IPATCH_CONTAINER(sf2), IPATCH_ITEM(preset));
        g_object_unref(preset);

        g_free(name);   /* free the name (returned from g_object_get) */

        ipatch_file_close(fhandle);   /* -- close file */
    }


    /* create SoundFont file object, set its name and open for writing */
    sffile = ipatch_sf2_file_new();
    ipatch_file_set_name(IPATCH_FILE(sffile), "output.sf2");

    /* Save SoundFont to file using converter system */
    if(!ipatch_convert_objects(G_OBJECT(sf2), G_OBJECT(sffile), &err))
    {
        fprintf(stderr, "Failed to save SoundFont to file: %s\n",
                ipatch_gerror_message(err));
        g_clear_error(&err);
    }

    g_object_unref(sffile);	/* -- unref SoundFont file */
    g_object_unref(sf2);		/* -- unref SoundFont object */

    return (0);			/* we done, yeah! :) */
}