流体合成  1.1.11
流体合成器.c

使用MIDI音序器API的简单节拍器示例

/ * FluidSynth节拍器-音序器API示例
*
*此代码在公共领域。
*
* 编译:
* gcc -o 流体合成器 -lfluidsynth 流体合成器.c
*
* 跑步:
* 流体合成器声音字体[节拍[节奏]]
*
* [Pedro Lopez-Cabanillas<[email protected]>]
* /
#包括<stdlib.h>
#包括<stdio.h>
#包括<fluidsynth.h>
fluid_synth_t *合成器;
fluid_audio_driver_t *音频驱动程序;
fluid_sequencer_t *音序器;
synth_destination,client_destination;
未签名 整型 time_marker;
/ *默认速度,每分钟节拍* /
#定义TEMPO 120
未签名 整型 note_duration = 60000 / TEMPO;
/ *节拍器点击/响铃* /
未签名 整型 weak_note = 33;
未签名 整型 strong_note = 34;
/ *一种模式中的音符数* /
未签名 整型 pattern_size = 4;
/ *原型* /
虚空
sequencer_callback(未签名 整型 时间, fluid_event_t *事件,
fluid_sequencer_t * seq, 虚空 *数据);
/ *安排留言注释* /
虚空
schedule_noteon(整型 键, 未签名 整型 滴答声)
{
fluid_event_set_source (ev,-1);
fluid_event_set_dest (ev,synth_destination);
fluid_event_noteon (ev,chan,key,127);
fluid_sequencer_send_at (音序器,ev,刻度线,1);
}
/ *安排一个计时器事件(将触发回调)* /
虚空
schedule_timer_event()
{
fluid_event_set_source (ev,-1);
fluid_event_set_dest (ev,client_destination);
fluid_event_timer (ev,NULL);
fluid_sequencer_send_at (sequencer,ev,time_marker,1);
}
/ *安排节拍器模式* /
虚空
schedule_pattern()
{
整型 我,note_time;
note_time = time_marker;
对于 (i = 0;我<pattern_size; ++ i){
schedule_noteon(9,我??weak_note:strong_note,note_time);
note_time + = note_duration;
}
time_marker = note_time;
}
虚空
sequencer_callback(未签名 整型 时间, fluid_event_t *事件,
fluid_sequencer_t * seq, 虚空 *数据)
{
schedule_timer_event();
schedule_pattern();
}
虚空
用法(烧焦* prog_name)
{
printf("用法:%s soundfont.sf2 [beats [tempo]] \ n",prog_name);
printf("\ t(可选)节拍:模式节拍数,默认为%d \ n",
pattern_size);
printf("\ t(可选)速度:BPM(每分钟节拍数),默认为%d \ n",TEMPO);
}
整型
主要(整型 argc, 烧焦 * argv [])
{
整型 n;
fluid_settings_t *设置;
设置= new_fluid_settings ();
如果 (argc< 2) {
用法(argv [0]);
} 其他 {
/ *创建合成器,驱动器和音序器实例* /
合成= new_fluid_synth (设置);
音频驱动程序= new_fluid_audio_driver (设置,合成器);
音序器= new_fluid_sequencer ();
/ *向音序器注册合成器* /
synth_destination = fluid_sequencer_register_fluidsynth (音序器,
合成器);
/ *注册客户端名称和回调* /
client_destination = fluid_sequencer_register_client (音序器,
"fluidsynth_metronome",sequencer_callback,NULL);
/ *加载SoundFont * /
n = fluid_synth_sfload (合成,argv [1],1);
如果 (n!= -1){
如果 (argc> 2) {
n = atoi(argv [2]);
如果 (n >0)pattern_size = n;
}
如果 (argc> 3) {
n = atoi(argv [3]);
如果 (n >0)note_duration = 60000 / n;
}
/ *获取当前时间(以滴答为单位)* /
time_marker = fluid_sequencer_get_tick (音序器);
/ *排程模式* /
schedule_pattern();
schedule_timer_event();
schedule_pattern();
/ *等待用户输入* /
printf("press <Enter> to stop\n");
n = getchar();
}
/ *清理并退出* /
delete_fluid_sequencer (音序器);
delete_fluid_audio_driver (音频驱动程序);
delete_fluid_synth (合成);
}
delete_fluid_settings (设置);
返回 0;
}