QString sf2Instrument::getCurrentPatchName() { int iBankSelected = m_bankNum.value(); int iProgSelected = m_patchNum.value(); // For all soundfonts (in reversed stack order) fill the available programs... int cSoundFonts = ::fluid_synth_sfcount( m_synth ); for( int i = 0; i < cSoundFonts; i++ ) { fluid_sfont_t *pSoundFont = fluid_synth_get_sfont( m_synth, i ); if ( pSoundFont ) { #ifdef CONFIG_FLUID_BANK_OFFSET int iBankOffset = fluid_synth_get_bank_offset( m_synth, fluid_sfont_get_id(pSoundFont) ); #endif fluid_sfont_iteration_start( pSoundFont ); #if FLUIDSYNTH_VERSION_MAJOR < 2 fluid_preset_t preset; fluid_preset_t *pCurPreset = &preset; #else fluid_preset_t *pCurPreset; #endif while ((pCurPreset = fluid_sfont_iteration_next_wrapper(pSoundFont, pCurPreset))) { int iBank = fluid_preset_get_banknum( pCurPreset ); #ifdef CONFIG_FLUID_BANK_OFFSET iBank += iBankOffset; #endif int iProg = fluid_preset_get_num( pCurPreset ); if( iBank == iBankSelected && iProg == iProgSelected ) { return fluid_preset_get_name( pCurPreset ); } } } } return ""; }
QString sf2Instrument::getCurrentPatchName() { int iBankSelected = m_bankNum.value(); int iProgSelected = m_patchNum.value(); fluid_preset_t preset; // For all soundfonts (in reversed stack order) fill the available programs... int cSoundFonts = ::fluid_synth_sfcount( m_synth ); for( int i = 0; i < cSoundFonts; i++ ) { fluid_sfont_t *pSoundFont = fluid_synth_get_sfont( m_synth, i ); if ( pSoundFont ) { #ifdef CONFIG_FLUID_BANK_OFFSET int iBankOffset = fluid_synth_get_bank_offset( m_synth, pSoundFont->id ); #endif pSoundFont->iteration_start( pSoundFont ); while( pSoundFont->iteration_next( pSoundFont, &preset ) ) { int iBank = preset.get_banknum( &preset ); #ifdef CONFIG_FLUID_BANK_OFFSET iBank += iBankOffset; #endif int iProg = preset.get_num( &preset ); if( iBank == iBankSelected && iProg == iProgSelected ) { return preset.get_name( &preset ); } } } } return ""; }
/* * Class: org_tritonus_midi_sb_fluidsynth_FluidSoundbank * Method: nGetInstruments * Signature: (I)[Lorg/tritonus/midi/sb/fluidsynth/FluidSoundbank/FluidInstrument; */ JNIEXPORT jobjectArray JNICALL Java_org_tritonus_midi_sb_fluidsynth_FluidSoundbank_nGetInstruments (JNIEnv *env, jobject obj, jint sfontID) { //printf("3a\n"); //printf("4"); jclass fluidsoundbankclass; jfieldID synthFieldID; jobject synthobj; jclass fluidinstrclass; jmethodID initid; int count = 0; jobjectArray instruments; jstring instrname; jobject instrument; fluid_sfont_t* sfont; fluid_preset_t preset; int offset; int i = 0; fluid_synth_t* synth; fluidsoundbankclass = (*env)->FindClass(env, "org/tritonus/midi/sb/fluidsynth/FluidSoundbank"); synthFieldID = (*env)->GetFieldID(env, fluidsoundbankclass, "synth", "Lorg/tritonus/midi/device/fluidsynth/FluidSynthesizer;"); synthobj = (*env)->GetObjectField(env, obj, synthFieldID); synth = get_synth(env, synthobj); #ifdef VARIADIC_MACROS out("nGetInstruments: synth: %p\n", synth); #else if (debug_flag) { fprintf(debug_file, "nGetInstruments: synth: %p\n", synth); fflush(debug_file); } #endif if (synth) { fluidinstrclass = (*env)->FindClass(env, "org/tritonus/midi/sb/fluidsynth/FluidSoundbank$FluidInstrument"); if (!fluidinstrclass) printf("could not get class id"); //printf("5"); initid = (*env)->GetMethodID(env, fluidinstrclass, "<init>", "(Lorg/tritonus/midi/sb/fluidsynth/FluidSoundbank;IILjava/lang/String;)V"); if (!initid) printf("could not get method id"); //printf("6"); sfont = fluid_synth_get_sfont_by_id(synth, sfontID); if (sfont != NULL) { sfont->iteration_start(sfont); while (sfont->iteration_next(sfont, &preset)) { count++; } } //printf("7"); instruments = (*env)->NewObjectArray(env, count, fluidinstrclass, NULL); sfont = fluid_synth_get_sfont_by_id(synth, sfontID); offset = fluid_synth_get_bank_offset(synth, sfontID); if (sfont == NULL) return 0; sfont->iteration_start(sfont); while (sfont->iteration_next(sfont, &preset)) { instrname = (*env)->NewStringUTF(env, // fluid_preset_get_name(&preset) preset.get_name(&preset) ); instrument = (*env)->NewObject(env, fluidinstrclass, initid, obj, // (jint) fluid_preset_get_banknum(&preset) + offset, (jint) (preset.get_banknum(&preset) + offset), // (jint) fluid_preset_get_num(&preset), (jint) (preset.get_num(&preset)), (jobject) instrname); (*env)->SetObjectArrayElement(env, instruments, i++, instrument); } return instruments; } else return NULL; }