As a followup to the last post: I can now play Midi files and sing along with no noticeable latency using PulseAudio. To direct the (default) microphone to the (default) speaker load the module_loopback (thanks to rusty0101):
pactl load-module module-loopback latency_msec=1
Everything you speak/sing/holler will then be played on the speaker.
For Midi file playback I discovered FluidSynth. The following program will play a Midi file:
// See http://fluidsynth.sourceforge.net/api/
// Run by ./PlayFile /usr/share/soundfonts/FluidR3_GM.sf2 ../54150.mid
int main(int argc, char** argv)
{
int i;
fluid_settings_t* settings;
fluid_synth_t* synth;
fluid_player_t* player;
fluid_audio_driver_t* adriver;
settings = new_fluid_settings();
synth = new_fluid_synth(settings);
player = new_fluid_player(synth);
fluid_settings_setstr(settings, "audio.driver", "pulseaudio");
// Use paman to find output device's name
fluid_settings_setstr(settings, "audio.pulseaudio.device",
"alsa_output.pci-0000_00_1b.0.analog-stereo");
adriver = new_fluid_audio_driver(settings, synth);
/* process command line arguments */
for (i = 1; i < argc; i++) {
if (fluid_is_soundfont(argv[i])) {
fluid_synth_sfload(synth, argv[1], 1);
}
if (fluid_is_midifile(argv[i])) {
fluid_player_add(player, argv[i]);
}
}
/* play the midi files, if any */
fluid_player_play(player);
/* wait for playback termination */
fluid_player_join(player);
/* cleanup */
delete_fluid_audio_driver(adriver);
delete_fluid_player(player);
delete_fluid_synth(synth);
delete_fluid_settings(settings);
return 0;
}
And whadda-you-know? It all works fine.
There's just the matter of hooking up a GUI, and a few thousand lines of code. But at least I'm starting from a good base, and I now realise the Java Sound framework can't give me that, sad to say.
No comments:
Post a Comment