# Audio 元素

## 1. 结构

```ts
interface AudioClip extends BaseClip {
  type: "audio";
  src: string | { $ref: string };
  source?: MediaSource;
  volume?: number;
  loop?: boolean;
  playbackRate?: number;
  fadeIn?: number;
  fadeOut?: number;
  pan?: number;
  detune?: number;
  gainEnvelope?: AudioEnvelopePoint[];
  ducking?: AudioDucking;
}
```

## 2. 支持的参数

### `src`
- 类型：`string | { $ref: string }`
- 必填：是

### `source.start`
- 类型：`number`
- 必填：否
- 单位：秒

### `source.end`
- 类型：`number`
- 必填：否
- 单位：秒

### `volume`
- 类型：`number`
- 必填：否
- 默认值：`1`

### `loop`
- 类型：`boolean`
- 必填：否
- 默认值：`false`

### `playbackRate`
- 类型：`number`
- 必填：否
- 默认值：`1`

### `fadeIn`
- 类型：`number`
- 必填：否
- 单位：秒

### `fadeOut`
- 类型：`number`
- 必填：否
- 单位：秒

### `pan`
- 类型：`number`
- 必填：否
- 范围：`-1` 到 `1`

### `detune`
- 类型：`number`
- 必填：否
- 单位：音分

### `gainEnvelope`
- 类型：`{ time: number; volume: number; easing?: EasingFunction }[]`
- 必填：否
- `time` 应按升序排列

### `ducking`
- 类型：`{ targets: string[]; amount?: number; attack?: number; release?: number }`
- 必填：否
- 用于在当前音频播放时压低目标音频轨道

## 3. 当前真实行为

- `source.start` 已生效
- `source.end` 已生效
- `fadeIn` / `fadeOut` 已生效
- `loop` 已生效
- `playbackRate`、`detune`、`pan` 和 `gainEnvelope` 可用于控制播放速度、音高、声像和音量自动化
- `transition` 对音频不生效

## 4. 示例

```json
{
  "type": "audio",
  "start": 0,
  "duration": 10,
  "src": { "$ref": "bgm-main" },
  "volume": 0.6,
  "fadeIn": 1.2,
  "fadeOut": 1.5,
  "loop": true
}
```