音频循环点

音频循环点允许您循环音频资源的一部分(或一节)。

虽然您可以使用 audio_sound_get_track_position 和 audio_sound_set_track_position 手动控制音频播放,但这对于循环一节是永远不会准确的,因为音频的处理速度要高得多,例如每秒 44100 或 48000 次 (采样率),这比默认的游戏速度 60 要高得多。这意味着在调用一个函数和下一个函数之间可能已经播放了许多样本。

通过使用为音频循环提供的功能,以音频速率在音频线程上执行循环。

注意 不能将基于缓冲区的音频队列或音频同步组与音频循环功能一起使用。所有其他类型的音频都可以毫无问题地使用, 包括缓冲声音

函数指南

以下是音频循环的 GML 代码函数:

循环部分

每个声音资源和声音实例都有一个循环部分,由以秒为单位的开始和结束时间定义。如果声音设置为循环,则此开始和结束之间的声音部分将播放循环。

使用任何 audio_play_sound_ 函数播放的每个声音都会在播放时从资源获取其默认循环开始时间和循环结束时间,例如: 

audio_sound_loop_start(snd_loop, 2);
audio_sound_loop_end(snd_loop, 6);
ins_sound = audio_play_sound(snd_loop, 100, true);
audio_sound_loop_end(ins_sound, 10);

默认情况下,声音设置为从头到尾循环。这对应于 0.0 秒的起始值和 0.0 秒的结束值 (对应于 audio_sound_length)。

循环结束位置必须在循环开始位置之后,除非它们都设置为 0.0 (即从开始循环到结束声音)。

启用/禁用循环

设置声音实例的循环状态可以通过两种方式完成。第一个是使用 audio_play_sound 或任何其他 audio_play_sound_ 函数播放声音时:

ins_sound = audio_play_sound(snd_loop, 100, true);

第二种方式是将函数 audio_sound_loop 称为已经在播放的声音:

audio_sound_loop(ins_sound, true);

注意 当声音的音轨位置到达循环结束位置时,GameMaker 会检查是否应该循环。如果此时其循环状态设置为 true,则声音将跳回循环开始位置。如果不是,它将继续播放声音直到结束,除非您更改轨道位置或循环结束。

示例

以下是使用音频循环点循环音频的几种方法。

前奏和尾声

在这种情况下,您有一个音频文件,其中有一个前奏、一个循环的中间部分和一个结尾。音频从头开始播放,首先播放前奏部分,然后移动到循环部分,并继续播放此循环部分,直到音频设置为不再循环。在这一点上,循环部分将完成最后一次播放,然后过渡到超出部分。

audio_sound_loop_start(snd_music, 10);
audio_sound_loop_end(snd_music, 20);
ins_sound = audio_play_sound(snd_music, 100, true);  // Play the sound looped

一旦声音进入循环部分,就可以将声音实例设置为不再循环:

audio_sound_loop(ins_sound, false);

更改此设置后,将播放循环部分的其余部分,然后播放尾声部分。

注意 声音停止播放 ins_sound 后,将不再引用有效的声音实例,您需要使用 audio_play_sound 播放新的声音实例。

多重循环

每个声音都有一个循环部分。您可以自己添加多个循环节,方法是将它们存储在结构中,并在任何给定时刻手动应用要使用的循环节的开始和结束:

loops = [
    {start: 0, end: 10},
    {start: 10, end: 20},
    {start: 20, end: 30}
];

section = 2;

audio_sound_loop_start(snd_several_sections, loops[section].start);
audio_sound_loop_end(snd_several_sections, loops[section].end);
ins_sound = audio_play(snd_several_sections, 200, true);

从 BPM 转换

使用一段音乐的 BPM,你可以计算出一个"节拍"所花费的时间。通过这种方式,您可以循环播放与音乐中的节拍或小节精确对应的声音部分:

var _bpm_to_sec = time_bpm_to_seconds(126);
var _beats_per_bar = 4;
var _bars = 4;
audio_sound_loop_start(snd_bgm, _bars * _beats_per_bars);

此代码将声音资源 snd_bgm 的循环开始位置设置为第五条的开始位置。

See: 

限制