Не итеративное получение списка инструментов в звуковом шрифте с использованием FluidSynth
Есть ли функция, которая может возвращать список всех инструментов (названий пресетов) в файле звукового шрифта в FluidSynth или, по крайней мере, количество пресетов в каждом звуковом банке?
3 ответа
Это не совсем "не итеративно", но это единственный способ найти список всех пресетов в файле звукового шрифта.
fluid_preset_t* preset = new fluid_preset_t();
// Reset the iteration
sf->iteration_start(sf);
// Go through all the presets within the soundfont
int more = 1;
while (more) {
more = sf->iteration_next(sf, preset); // Will return 0 if no more soundfonts left
if (more) {
// Get preset name
char* presetname = preset->get_name(preset);
int banknum = preset->get_banknum(preset);
int num = preset->get_num(preset);
// Do something with the presetname, bank number and program number
// Such as add it to some list so that you can refer to it later
}
}
... где sf - объект звукового шрифта.
Обнаружил это, просматривая документацию по API по адресу http://fluidsynth.sourceforge.net/api/index.html. Обратите внимание на меню в верхней части со ссылками на структуры данных, файлы и т. Д.
Я смог получить названия инструментов и банки, используя Fluidsynth. Командой, которую вы хотите отправить, является "inst 1" (получите все инструменты для звукового шрифта, загруженного в позиции 1).
$ echo "inst 1" | fluidsynth /path/to/FluidR3_GM.sf2
FluidSynth version 1.1.6
Copyright (C) 2000-2012 Peter Hanappe and others.
Distributed under the LGPL license.
SoundFont(R) is a registered trademark of E-mu Systems, Inc.
Type 'help' for help topics.
000-000 Yamaha Grand Piano
000-001 Bright Yamaha Grand
000-002 Electric Piano
000-003 Honky Tonk
000-004 Rhodes EP
000-005 Legend EP 2
000-006 Harpsichord
000-007 Clavinet
...
...
...
128-035 Jazz 3
128-036 Jazz 4
128-040 Brush
128-041 Brush 1
128-042 Brush 2
128-048 Orchestra Kit
Я пробовал это:
static void inspectsoundfont()
{
fluid_sfont_t* sfont = fluid_synth_get_sfont_by_id(synth, font_id);
for (int bank = 0; bank < 16384; bank++)
{
for (int num = 0; num < 128; num++)
{
fluid_preset_t* preset = fluid_sfont_get_preset(sfont, bank, num);
if (preset == nullptr)
continue;
const char* name = fluid_preset_get_name(preset);
std::cout << "bank: " << bank << " index: " << num << " " << name << std::endl;
}
}
}
synth - это объект синтезатора, а font_id - из fluid_synth_sfload. Дали мне список банков и названий пресетов.