Example #1
0
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 "";
}
Example #2
0
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;
}