流体合成  1.1.11
fluidsynth_arpeggio.c

使用MIDI音序器API产生的琶音示例

/ * FluidSynth Arpeggio-音序器API示例
*
*此代码在公共领域。
*
* 编译:
* gcc -o fluidsynth_arpeggio -lfluidsynth fluidsynth_arpeggio.c
*
* 跑步:
* fluidsynth_arpeggio soundfont [步骤[持续时间]]
*
* [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;
/ *模式的持续时间,以滴答为单位。 * /
未签名 整型 持续时间= 1440;
/ *琶音的音符* /
未签名 整型 notes [] = {60,64,67,72,76,79,84,79,76,72,67,64};
/ *一种模式中的音符数* /
未签名 整型 pattern_size;
/ *原型* /
虚空
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_noteoff(整型 键, 未签名 整型 滴答声)
{
fluid_event_set_source (ev,-1);
fluid_event_set_dest (ev,synth_destination);
fluid_event_noteoff (ev,chan,key);
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);
}
/ *安排琶音's notes * /
虚空
schedule_pattern()
{
整型 我,note_time,note_duration;
note_time = time_marker;
note_duration =持续时间/ pattern_size;
对于 (i = 0;我<pattern_size; ++ i){
schedule_noteon(0,notes [i],note_time);
note_time + = note_duration;
schedule_noteoff(0,notes [i],note_time);
}
time_marker + =持续时间;
}
虚空
sequencer_callback(未签名 整型 时间, fluid_event_t *事件,
fluid_sequencer_t * seq, 虚空 *数据)
{
schedule_timer_event();
schedule_pattern();
}
虚空
用法(烧焦* prog_name)
{
printf("用法:%s soundfont.sf2 [步骤[持续时间]] \ n",prog_name);
printf("\ t(可选)步骤:样式注释的数量,从2到%d \ n",
pattern_size);
printf("\ t(可选)持续时间:模式的滴答声,默认为%d \ n",
持续时间);
}
整型
主要(整型 argc, 烧焦* argv [])
{
整型 n;
fluid_settings_t *设置;
设置= new_fluid_settings ();
pattern_size = 大小(笔记)/ 大小(整型);
如果 (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 (音序器,
"arpeggio",sequencer_callback,NULL);
/ *加载SoundFont * /
n = fluid_synth_sfload (合成,argv [1],1);
如果 (n!= -1){
如果 (argc> 2) {
n = atoi(argv [2]);
如果 ((n> 1) && (n <= pattern_size))pattern_size = n;
}
如果 (argc> 3) {
n = atoi(argv [3]);
如果 (n > 0) duration = 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;
}