Hi Kjetil, Thanks for the immediate response. libgig and the code sample really looks good, simple and easy. However, libgig is under the GPL license. Our software is a commercial software where we use the libfluidsynth library strictly under the LGPL license. libgig does not offer the LGPL license but only the GPL license which we therefore cannot use.
Reinhold -----Ursprüngliche Nachricht----- Von: fluid-dev [mailto:fluid-dev-bounces+reinhold=notation....@nongnu.org] Im Auftrag von Kjetil Matheussen Gesendet: Donnerstag, 11. Juli 2019 10:54 An: FluidSynth mailing list Betreff: Re: [fluid-dev] Getting all instrument names from a loaded soundfont file On Thu, Jul 11, 2019 at 10:26 AM Reinhold Hoffmann <reinh...@notation.com> wrote: > > Hi, > > > > I want to display to the user the instrument names of the samples of a loaded soundfont file (sf2, sf3 format). > > > > Is there a public interface available in the libfluidsynth library where the instrument names of the soundfont samples can be obtained after a soundfont file is loaded with fluid_synth_sfload to a fluidsynth synthesizer? It looks as if those sample names are handled internally but I am not sure if those instrument sample names can be read using the public interface. > > > > Any idea, help, advice or code example is highly appreciated. > libgig has a pretty clear interface to parse sf2 files This is from sf2dump.cpp in libgig: void PrintPeresets(sf2::File* sf) { cout << "Presets (" << sf->GetPresetCount() << "): " << endl; for (int i = 0; i < sf->GetPresetCount(); i++) { /* exclude the terminal header - EOP */ sf2::Preset* p = sf->GetPreset(i); cout << "\t" << p->Name << " (Preset: " << p->PresetNum << ", Bank: " << p->Bank; if (p->pGlobalRegion) PrintRegion(-1, p->pGlobalRegion); for (int j = 0; j < p->GetRegionCount(); j++) { PrintRegion(j, p->GetRegion(j)); } cout << endl; cout << endl; } } void PrintInstruments(sf2::File* sf) { cout << "Instruments (" << sf->GetInstrumentCount() << "): " << endl; for (int i = 0; i < sf->GetInstrumentCount(); i++) { sf2::Instrument* instr = sf->GetInstrument(i); cout << "Instrument bag: " << instr->InstBagNdx << ")" << endl; cout << "\t Regions (" << instr->GetRegionCount() << ")" << endl; if (instr->pGlobalRegion) PrintRegion(-1, instr->pGlobalRegion); for (int j = 0; j < instr->GetRegionCount(); j++) { PrintRegion(j, instr->GetRegion(j)); } cout << "\t" << instr->Name << " ("; cout << endl; } } To find out which samples are used in instruments and presets, you look at the regions: void PrintRegion(int idx, sf2::Region* reg) { if (idx == -1) cout << "\t\tGlobal Region " << endl; else cout << "\t\tRegion " << idx << endl; sf2::Sample* s = reg->GetSample(); if (s != NULL) { cout << "\t\t Sample: " << s->Name << ", Fine Tune: " << reg->fineTune; ... cout << endl; } ... } void PrintSamples(sf2::File* sf) { cout << "Samples (" << sf->GetSampleCount() << "): " << endl; for (int i = 0; i < sf->GetSampleCount(); i++) { sf2::Sample* s = sf->GetSample(i); cout << "\t" << s->Name << " (Depth: " << ((s->GetFrameSize() / s->GetChannelCount()) * 8); ... } } _______________________________________________ fluid-dev mailing list fluid-dev@nongnu.org https://lists.nongnu.org/mailman/listinfo/fluid-dev _______________________________________________ fluid-dev mailing list fluid-dev@nongnu.org https://lists.nongnu.org/mailman/listinfo/fluid-dev