# Audio

Game tidak memutar audio sendiri. Game meminta platform memutarnya lewat `ctx.audio`, dan platform mencampurnya di tiga bus dengan tombol bisu host. Dengan begitu semua game terdengar setara, dan bisu host berlaku untuk semuanya.

## Bunyi platform

Siap pakai, tanpa file:

`tick` · `select` · `back` · `join` · `logo` · `start` · `coin` · `trophy` · `error` · `jump` · `count` · `go`

```ts
ctx.audio.play('tick');
```

## Bunyi milik game

Taruh file di `assets/` dan panggil dengan path-nya di dalam bundel:

```ts
ctx.audio.preload('audio/ledakan.ogg'); // di preload: unduh dan dekode sekarang
ctx.audio.play('audio/ledakan.ogg');
ctx.audio.play('audio/musik.ogg', { bus: 'music', loop: true });
ctx.audio.stop('audio/musik.ogg');
```

| Opsi   | Arti                         | Bawaan  |
| ------ | ---------------------------- | ------- |
| `bus`  | `sfx`, `music`, atau `voice` | `sfx`   |
| `loop` | Ulang terus sampai `stop`    | `false` |
| `rate` | Kecepatan dan nada, 0,5–2    | 1       |
| `gain` | Penguatan di atas bus, 0–2   | 1       |

- Format: `.ogg`/`.opus` paling hemat; `.mp3`, `.m4a`, dan `.wav` juga diterima.
- Path bunyi paling panjang 64 karakter. Perintah dengan path lebih panjang diabaikan.
- Panggil `preload` untuk bunyi yang harus tepat waktu. Tanpa itu, `play` pertama menunggu unduhan.
- Semua bunyi game berhenti sendiri saat game selesai.

## Tiga bus

| Bus     | Untuk             | Tingkat                                                  |
| ------- | ----------------- | -------------------------------------------------------- |
| `music` | Musik latar       | Lebih pelan dari efek, supaya efek selalu terdengar      |
| `sfx`   | Efek              | Acuan                                                    |
| `voice` | Announcer, narasi | Sedikit di atas efek, supaya terdengar di atas keramaian |

Samakan kenyaringan file dalam satu bus menurut **loudness** (LUFS), bukan puncak. Dua efek dengan puncak sama bisa terdengar sangat berbeda kerasnya.

## Panggung musik: `mix`

Untuk meredam musik sesaat, misalnya saat jeda atau saat announcer bicara:

```ts
onPause(ctx) {
  ctx.audio.mix({ db: -10, lowpassHz: 600, rampMs: 300 });
},
onResume(ctx) {
  ctx.audio.mix({ db: 0, lowpassHz: null, rampMs: 300 });
},
```

| Field       | Rentang                                 |
| ----------- | --------------------------------------- |
| `db`        | −40 sampai 0                            |
| `lowpassHz` | 100 sampai 22050, atau `null` (terbuka) |
| `rampMs`    | 0 sampai 5000                           |

`mix` hanya memengaruhi bunyi game di bus `music`, dan dikembalikan ke semula saat game selesai.

## Di Ralystudioo

Browser baru mengizinkan audio setelah halaman disentuh. Klik sekali di layar host simulator untuk menyalakan suara.
