Last active
April 2, 2022 03:42
-
-
Save pedrolcl/7cacab9c9b2be2182a95f226f6863c46 to your computer and use it in GitHub Desktop.
List instrument names from any SF2 soundfont file, using the FluidSynth 1 API. (doesn't compile with FluidSynth 2.x)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* FluidSynth Instruments - An example of using fluidsynth | |
* | |
* This code is in the public domain. | |
* | |
* To compile: | |
* gcc -o fluidsynth_instr fluidsynth_instr.c -lfluidsynth | |
* | |
* To run | |
* fluidsynth_instr soundfont | |
* | |
* [Pedro López-Cabanillas] | |
* | |
*/ | |
#include <stdio.h> | |
#include <fluidsynth.h> | |
int main(int argc, char** argv) | |
{ | |
fluid_settings_t* settings = NULL; | |
fluid_synth_t* synth = NULL; | |
fluid_sfont_t* sfont = NULL; | |
int err = 0, sfid = -1; | |
if (argc != 2) { | |
fprintf(stderr, "Usage: fluidsynth_instr [soundfont]\n"); | |
return 1; | |
} | |
/* Create the settings object. This example uses the default | |
* values for the settings. */ | |
settings = new_fluid_settings(); | |
if (settings == NULL) { | |
fprintf(stderr, "Failed to create the settings\n"); | |
err = 2; | |
goto cleanup; | |
} | |
/* Create the synthesizer */ | |
synth = new_fluid_synth(settings); | |
if (synth == NULL) { | |
fprintf(stderr, "Failed to create the synthesizer\n"); | |
err = 3; | |
goto cleanup; | |
} | |
/* Load the soundfont */ | |
sfid = fluid_synth_sfload(synth, argv[1], 1); | |
if (sfid == -1) { | |
fprintf(stderr, "Failed to load the SoundFont\n"); | |
err = 4; | |
goto cleanup; | |
} | |
/* Iterate soundfont's presets */ | |
sfont = fluid_synth_get_sfont_by_id(synth, sfid); | |
if (sfont) { | |
fluid_preset_t preset; | |
sfont->iteration_start(sfont); | |
while (sfont->iteration_next(sfont, &preset)) { | |
int bank = preset.get_banknum(&preset); | |
int prog = preset.get_num(&preset); | |
char* name = preset.get_name(&preset); | |
printf("bank: %d prog: %d name: %s\n", bank, prog, name); | |
} | |
} | |
printf("done\n"); | |
cleanup: | |
if (synth) { | |
delete_fluid_synth(synth); | |
} | |
if (settings) { | |
delete_fluid_settings(settings); | |
} | |
return err; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Originally published here: https://lists.nongnu.org/archive/html/fluid-dev/2014-08/msg00005.html