流体合成  1.1.11
fluidsynth_fx.c

在流体合成中使用效果的示例

/ * FluidSynth FX-在fluidsynth中使用效果的示例
*
*此代码在公共领域。
*
* 编译:
* gcc -g -O -o fluidsynth_fx fluidsynth_fx.c -lfluidsynth
*
* 跑步
* fluidsynth_fx声音字体增益
*
* [Peter Hanappe]
* /
#包括<stdio.h>
#包括<stdlib.h>
#包括<fluidsynth.h>
/ *具有效果数据的结构。本示例仅适用于
* linear gain the to synthesizer 出put. * /
结构 fx_data_t {
fluid_synth_t*合成器;
浮动 获得;
} fx_data_t;
/ *此函数实现音频驱动程序的回调函数
*(请参阅下面的new_fluid_audio_driver2)。数据参数是一个指针
*为您的私人数据结构。'len'是中的样本数
*缓冲区。'nin' and 'nout'是输入和输出的数量
*音频缓冲区。'in' and 'out'是具有以下内容的浮点缓冲区的数组
*样本。音频驱动程序填充'in'缓冲传入
*音频。的'out'缓冲区应由您的函数填充。的
* 'out' buffers will be sent to the audio 出put of the sound card.
*
*重要说明:API设计为通用,但没有一个
*音频驱动程序当前处理音频输入。要么'nin' will be
*零,否则缓冲区将填充零样本。
* /
整型 fx_function(虚空*数据, 整型 伦,
整型 宁, 浮动**在
整型 努特, 浮动** 出)
{
结构 fx_data_t * fx_data =(结构 fx_data_t *)数据;
整型 我知道;
浮动* 出_i;
/* Call the synthesizer to fill the 出put buffers with its
* audio 出put. * /
如果 (fluid_synth_process(fx_data->synth, 伦, 宁, in, 努特, 出) != 0) {
/ *发生某些错误。不过,极不可能发生。 * /
返回 -1;
}
/ *在此处应用您的效果。在此示例中,增益为
* applied to all the 出put buffers. * /
对于 (i = 0;我< 努特; i++) {
出_i = 出[i];
对于 (k = 0; k< 伦; k++) {
出_i[k] *= fx_data->gain;
}
}
返回 0;
}
整型 主要(整型 argc, 烧焦** argv)
{
fluid_settings_t*设置;
fluid_synth_t* 合成= NULL;
fluid_audio_driver_t* 驱动程序= NULL;
整型 err = 0;
结构 fx_data_t fx_data;
如果 (argc!= 3){
fprintf(stderr, "用法:fluidsynth_simple [soundfont] [gain] \ n");
返回 1;
}
/ *创建设置对象。本示例使用默认
*设置值。 * /
设置= new_fluid_settings();
如果 (设置== NULL){
fprintf(stderr, "无法创建设置\ n");
err = 2;
清理;
}
/ *创建合成器* /
合成= new_fluid_synth(设置);
如果 (合成== NULL){
fprintf(stderr, "无法创建合成器\ n");
err = 3;
清理;
}
/ *加载soundfont * /
如果 (fluid_synth_sfload(synth,argv [1],1)== -1){
fprintf(stderr, "无法加载SoundFont \ n");
err = 4;
清理;
}
/ *填写效果器的数据* /
fx_data.synth =合成器;
fx_data.gain = atof(argv [2]);
/ *创建音频驱动程序。音频驱动程序一经启动
*创建后,可以播放合成器。 * /
驱动程序= new_fluid_audio_driver2(设置,fx_function,(虚空*) &fx_data);
如果 (adriver == NULL){
fprintf(stderr, "创建音频驱动程序失败\ n");
err = 5;
清理;
}
/ *播放笔记* /
fluid_synth_noteon(synth,0,60,100);
printf("Press \"Enter\" to stop: ");
fgetc(stdin);
printf("done\n");
清理:
如果 (一个司机) {
delete_fluid_audio_driver(一个司机);
}
如果 (合成){
delete_fluid_synth(合成);
}
如果 (设置){
delete_fluid_settings(设置);
}
返回 呃;
}